diff options
Diffstat (limited to 'src/state')
-rw-r--r-- | src/state/persisted/schema.ts | 2 | ||||
-rw-r--r-- | src/state/preferences/index.tsx | 5 | ||||
-rw-r--r-- | src/state/preferences/opt-out-of-utm.tsx | 42 |
3 files changed, 48 insertions, 1 deletions
diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index 804017949..85a6bf8e2 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -124,6 +124,7 @@ const schema = z.object({ subtitlesEnabled: z.boolean().optional(), /** @deprecated */ mutedThreads: z.array(z.string()), + optOutOfUtm: z.boolean().optional(), }) export type Schema = z.infer<typeof schema> @@ -169,6 +170,7 @@ export const defaults: Schema = { kawaii: false, hasCheckedForStarterPack: false, subtitlesEnabled: true, + optOutOfUtm: false, } export function tryParse(rawData: string): Schema | undefined { diff --git a/src/state/preferences/index.tsx b/src/state/preferences/index.tsx index c7eaf2726..43a08926e 100644 --- a/src/state/preferences/index.tsx +++ b/src/state/preferences/index.tsx @@ -9,6 +9,7 @@ import {Provider as InAppBrowserProvider} from './in-app-browser' import {Provider as KawaiiProvider} from './kawaii' import {Provider as LanguagesProvider} from './languages' import {Provider as LargeAltBadgeProvider} from './large-alt-badge' +import {Provider as OutOutOfUtmProvider} from './opt-out-of-utm' import {Provider as SubtitlesProvider} from './subtitles' import {Provider as UsedStarterPacksProvider} from './used-starter-packs' @@ -39,7 +40,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { <AutoplayProvider> <UsedStarterPacksProvider> <SubtitlesProvider> - <KawaiiProvider>{children}</KawaiiProvider> + <OutOutOfUtmProvider> + <KawaiiProvider>{children}</KawaiiProvider> + </OutOutOfUtmProvider> </SubtitlesProvider> </UsedStarterPacksProvider> </AutoplayProvider> diff --git a/src/state/preferences/opt-out-of-utm.tsx b/src/state/preferences/opt-out-of-utm.tsx new file mode 100644 index 000000000..40144c8db --- /dev/null +++ b/src/state/preferences/opt-out-of-utm.tsx @@ -0,0 +1,42 @@ +import React from 'react' + +import * as persisted from '#/state/persisted' + +type StateContext = boolean +type SetContext = (v: boolean) => void + +const stateContext = React.createContext<StateContext>( + Boolean(persisted.defaults.optOutOfUtm), +) +const setContext = React.createContext<SetContext>((_: boolean) => {}) + +export function Provider({children}: {children: React.ReactNode}) { + const [state, setState] = React.useState( + Boolean(persisted.get('optOutOfUtm')), + ) + + const setStateWrapped = React.useCallback( + (optOutOfUtm: persisted.Schema['optOutOfUtm']) => { + setState(Boolean(optOutOfUtm)) + persisted.write('optOutOfUtm', optOutOfUtm) + }, + [setState], + ) + + React.useEffect(() => { + return persisted.onUpdate('optOutOfUtm', nextOptOutOfUtm => { + setState(Boolean(nextOptOutOfUtm)) + }) + }, [setStateWrapped]) + + return ( + <stateContext.Provider value={state}> + <setContext.Provider value={setStateWrapped}> + {children} + </setContext.Provider> + </stateContext.Provider> + ) +} + +export const useOptOutOfUtm = () => React.useContext(stateContext) +export const useSetOptOutOfUtm = () => React.useContext(setContext) |