From 92206b9316a20439d9ff4d017f9ec6901f57d177 Mon Sep 17 00:00:00 2001 From: capJavert Date: Thu, 16 Jan 2025 16:16:51 +0100 Subject: [PATCH] feat: move timezone ignore setting to api --- .../streak/popup/ReadingStreakPopup.tsx | 14 +++++--------- .../shared/src/contexts/SettingsContext.tsx | 7 +++++-- packages/shared/src/graphql/settings.ts | 1 + .../src/hooks/streaks/useStreakTimezoneOk.ts | 19 +++++++++++-------- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/shared/src/components/streak/popup/ReadingStreakPopup.tsx b/packages/shared/src/components/streak/popup/ReadingStreakPopup.tsx index b67d2c2f47..a430c0a87e 100644 --- a/packages/shared/src/components/streak/popup/ReadingStreakPopup.tsx +++ b/packages/shared/src/components/streak/popup/ReadingStreakPopup.tsx @@ -27,18 +27,15 @@ import { } from '../../../lib/timezones'; import { SimpleTooltip } from '../../tooltips'; import { isTesting } from '../../../lib/constants'; -import { - timezoneMismatchIgnoreKey, - useStreakTimezoneOk, -} from '../../../hooks/streaks/useStreakTimezoneOk'; +import { useStreakTimezoneOk } from '../../../hooks/streaks/useStreakTimezoneOk'; import { usePrompt } from '../../../hooks/usePrompt'; -import usePersistentContext from '../../../hooks/usePersistentContext'; import { useLogContext } from '../../../contexts/LogContext'; import { LogEvent, StreakTimezonePromptAction, TargetId, } from '../../../lib/log'; +import { useSettingsContext } from '../../../contexts/SettingsContext'; const getStreak = ({ value, @@ -106,6 +103,7 @@ export function ReadingStreakPopup({ fullWidth, }: ReadingStreakPopupProps): ReactElement { const router = useRouter(); + const { flags, updateFlag } = useSettingsContext(); const isMobile = useViewSize(ViewSize.MobileL); const { user } = useAuthContext(); const { completeAction } = useActions(); @@ -117,8 +115,6 @@ export function ReadingStreakPopup({ const [showStreakConfig, toggleShowStreakConfig] = useToggle(false); const isTimezoneOk = useStreakTimezoneOk(); const { showPrompt } = usePrompt(); - const [timezoneMismatchIgnore, setTimezoneMismatchIgnore] = - usePersistentContext(timezoneMismatchIgnoreKey, ''); const { logEvent } = useLogContext(); const streaks = useMemo(() => { @@ -210,7 +206,7 @@ export function ReadingStreakPopup({ device_timezone: deviceTimezone, user_timezone: user?.timezone, timezone_ok: isTimezoneOk, - timezone_ignore: timezoneMismatchIgnore, + timezone_ignore: flags?.timezoneMismatchIgnore, }; logEvent({ @@ -253,7 +249,7 @@ export function ReadingStreakPopup({ }); if (!promptResult) { - setTimezoneMismatchIgnore(deviceTimezone); + updateFlag('timezoneMismatchIgnore', deviceTimezone); return; } diff --git a/packages/shared/src/contexts/SettingsContext.tsx b/packages/shared/src/contexts/SettingsContext.tsx index dea724033b..17430a863d 100644 --- a/packages/shared/src/contexts/SettingsContext.tsx +++ b/packages/shared/src/contexts/SettingsContext.tsx @@ -55,7 +55,10 @@ export interface SettingsContextData extends Omit { toggleAutoDismissNotifications: () => Promise; loadedSettings: boolean; updateCustomLinks: (links: string[]) => Promise; - updateFlag: (flag: keyof SettingsFlags, value: boolean) => Promise; + updateFlag: ( + flag: keyof SettingsFlags, + value: string | boolean, + ) => Promise; syncSettings: (bootUserId?: string) => Promise; onToggleHeaderPlacement(): Promise; setOnboardingChecklistView: (value: ChecklistViewState) => Promise; @@ -267,7 +270,7 @@ export const SettingsContextProvider = ({ ...settings, onboardingChecklistView: value, }), - updateFlag: (flag: keyof SettingsFlags, value: boolean) => + updateFlag: (flag: keyof SettingsFlags, value: string | boolean) => setSettings({ ...settings, flags: { diff --git a/packages/shared/src/graphql/settings.ts b/packages/shared/src/graphql/settings.ts index 43caaa3408..2ca50e2964 100644 --- a/packages/shared/src/graphql/settings.ts +++ b/packages/shared/src/graphql/settings.ts @@ -16,6 +16,7 @@ export type SettingsFlags = { sidebarResourcesExpanded: boolean; sidebarBookmarksExpanded: boolean; clickbaitShieldEnabled: boolean; + timezoneMismatchIgnore?: string; }; export enum SidebarSettingsFlags { diff --git a/packages/shared/src/hooks/streaks/useStreakTimezoneOk.ts b/packages/shared/src/hooks/streaks/useStreakTimezoneOk.ts index f072c80622..40a5e5bf9a 100644 --- a/packages/shared/src/hooks/streaks/useStreakTimezoneOk.ts +++ b/packages/shared/src/hooks/streaks/useStreakTimezoneOk.ts @@ -2,24 +2,22 @@ import { getTimezoneOffset } from 'date-fns-tz'; import { useEffect, useMemo } from 'react'; import { useAuthContext } from '../../contexts/AuthContext'; import { DEFAULT_TIMEZONE } from '../../lib/timezones'; -import usePersistentContext from '../usePersistentContext'; import { useActions } from '../useActions'; import { ActionType } from '../../graphql/actions'; import { useLogContext } from '../../contexts/LogContext'; import { LogEvent } from '../../lib/log'; - -export const timezoneMismatchIgnoreKey = 'timezoneMismatchIgnore'; +import { useSettingsContext } from '../../contexts/SettingsContext'; export const useStreakTimezoneOk = (): boolean => { const { user, isLoggedIn } = useAuthContext(); const { checkHasCompleted, isActionsFetched, completeAction } = useActions(); const { logEvent } = useLogContext(); + const { flags } = useSettingsContext(); - const [ignoredTimezone] = usePersistentContext(timezoneMismatchIgnoreKey, ''); const deviceTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; const isTimezoneOk = useMemo(() => { - if (ignoredTimezone === deviceTimezone) { + if (flags?.timezoneMismatchIgnore === deviceTimezone) { return true; } @@ -31,7 +29,12 @@ export const useStreakTimezoneOk = (): boolean => { getTimezoneOffset(user?.timezone || DEFAULT_TIMEZONE) === getTimezoneOffset(Intl.DateTimeFormat().resolvedOptions().timeZone) ); - }, [deviceTimezone, ignoredTimezone, isLoggedIn, user?.timezone]); + }, [ + deviceTimezone, + flags?.timezoneMismatchIgnore, + isLoggedIn, + user?.timezone, + ]); // once off check to see how many users with timezone mismatches we have in the wild useEffect(() => { @@ -53,14 +56,14 @@ export const useStreakTimezoneOk = (): boolean => { device_timezone: deviceTimezone, user_timezone: user?.timezone, timezone_ok: isTimezoneOk, - timezone_ignore: ignoredTimezone, + timezone_ignore: flags?.timezoneMismatchIgnore, }), }); completeAction(ActionType.StreakTimezoneMismatch); }, [ isTimezoneOk, - ignoredTimezone, + flags?.timezoneMismatchIgnore, isActionsFetched, checkHasCompleted, completeAction,