()
| 15 | }; |
| 16 | |
| 17 | export function useBanner(): UseBanner { |
| 18 | const { alerts, updateAlerts } = useContext(AlertContext); |
| 19 | const { user, isLoggedIn } = useAuthContext(); |
| 20 | |
| 21 | const { data: latestBanner } = useQuery({ |
| 22 | queryKey: generateQueryKey(RequestKey.Banner, null), |
| 23 | queryFn: () => |
| 24 | gqlClient.request(BANNER_QUERY, { lastSeen: alerts.lastBanner }), |
| 25 | enabled: !!alerts.banner, |
| 26 | }); |
| 27 | |
| 28 | const isHackathonBanner = |
| 29 | latestBanner?.banner?.title === 'daily.dev Hackathon'; |
| 30 | |
| 31 | const { data: hackathonParticipation, isPending } = useQuery({ |
| 32 | ...hackathonParticipationQueryOptions(user), |
| 33 | enabled: isLoggedIn && isHackathonBanner, |
| 34 | }); |
| 35 | |
| 36 | const isAvailable = useMemo(() => { |
| 37 | if ( |
| 38 | isHackathonBanner && |
| 39 | (isPending || !!hackathonParticipation?.whoami?.isHackathonParticipant) |
| 40 | ) { |
| 41 | return false; |
| 42 | } |
| 43 | |
| 44 | const lastSeenBannerDate = Date.parse(alerts?.lastBanner); |
| 45 | const latestBannerDate = Date.parse(latestBanner?.banner?.timestamp); |
| 46 | |
| 47 | if (Number.isNaN(latestBannerDate) || Number.isNaN(lastSeenBannerDate)) { |
| 48 | return false; |
| 49 | } |
| 50 | |
| 51 | return latestBannerDate > lastSeenBannerDate; |
| 52 | }, [ |
| 53 | alerts?.lastBanner, |
| 54 | hackathonParticipation?.whoami?.isHackathonParticipant, |
| 55 | isHackathonBanner, |
| 56 | isPending, |
| 57 | latestBanner?.banner?.timestamp, |
| 58 | ]); |
| 59 | |
| 60 | const dismissMutation = useMutation({ |
| 61 | mutationFn: () => { |
| 62 | const currentDate = new Date(); |
| 63 | |
| 64 | return updateAlerts({ |
| 65 | lastBanner: currentDate.toISOString(), |
| 66 | }); |
| 67 | }, |
| 68 | }); |
| 69 | |
| 70 | const dismiss = useCallback(async () => { |
| 71 | if (dismissMutation.isPending) { |
| 72 | return; |
| 73 | } |
| 74 |
no test coverage detected