diff options
Diffstat (limited to 'src/state')
-rw-r--r-- | src/state/persisted/schema.ts | 2 | ||||
-rw-r--r-- | src/state/preferences/autoplay.tsx | 42 | ||||
-rw-r--r-- | src/state/preferences/index.tsx | 11 |
3 files changed, 52 insertions, 3 deletions
diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index 67e082a95..1b77d138b 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -60,6 +60,7 @@ export const schema = z.object({ lastSelectedHomeFeed: z.string().optional(), pdsAddressHistory: z.array(z.string()).optional(), disableHaptics: z.boolean().optional(), + disableAutoplay: z.boolean().optional(), }) export type Schema = z.infer<typeof schema> @@ -96,4 +97,5 @@ export const defaults: Schema = { lastSelectedHomeFeed: undefined, pdsAddressHistory: [], disableHaptics: false, + disableAutoplay: false, } diff --git a/src/state/preferences/autoplay.tsx b/src/state/preferences/autoplay.tsx new file mode 100644 index 000000000..d5aa049f3 --- /dev/null +++ b/src/state/preferences/autoplay.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.disableAutoplay), +) +const setContext = React.createContext<SetContext>((_: boolean) => {}) + +export function Provider({children}: {children: React.ReactNode}) { + const [state, setState] = React.useState( + Boolean(persisted.get('disableAutoplay')), + ) + + const setStateWrapped = React.useCallback( + (autoplayDisabled: persisted.Schema['disableAutoplay']) => { + setState(Boolean(autoplayDisabled)) + persisted.write('disableAutoplay', autoplayDisabled) + }, + [setState], + ) + + React.useEffect(() => { + return persisted.onUpdate(() => { + setState(Boolean(persisted.get('disableAutoplay'))) + }) + }, [setStateWrapped]) + + return ( + <stateContext.Provider value={state}> + <setContext.Provider value={setStateWrapped}> + {children} + </setContext.Provider> + </stateContext.Provider> + ) +} + +export const useAutoplayDisabled = () => React.useContext(stateContext) +export const useSetAutoplayDisabled = () => React.useContext(setContext) diff --git a/src/state/preferences/index.tsx b/src/state/preferences/index.tsx index 804d0fc31..5c8fab2ad 100644 --- a/src/state/preferences/index.tsx +++ b/src/state/preferences/index.tsx @@ -1,9 +1,10 @@ import React from 'react' -import {Provider as AltTextRequiredProvider} from '../preferences/alt-text-required' -import {Provider as HiddenPostsProvider} from '../preferences/hidden-posts' +import {Provider as AltTextRequiredProvider} from './alt-text-required' +import {Provider as AutoplayProvider} from './autoplay' import {Provider as DisableHapticsProvider} from './disable-haptics' import {Provider as ExternalEmbedsProvider} from './external-embeds-prefs' +import {Provider as HiddenPostsProvider} from './hidden-posts' import {Provider as InAppBrowserProvider} from './in-app-browser' import {Provider as LanguagesProvider} from './languages' @@ -11,6 +12,8 @@ export { useRequireAltTextEnabled, useSetRequireAltTextEnabled, } from './alt-text-required' +export {useAutoplayDisabled, useSetAutoplayDisabled} from './autoplay' +export {useHapticsDisabled, useSetHapticsDisabled} from './disable-haptics' export { useExternalEmbedsPrefs, useSetExternalEmbedPref, @@ -26,7 +29,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { <ExternalEmbedsProvider> <HiddenPostsProvider> <InAppBrowserProvider> - <DisableHapticsProvider>{children}</DisableHapticsProvider> + <DisableHapticsProvider> + <AutoplayProvider>{children}</AutoplayProvider> + </DisableHapticsProvider> </InAppBrowserProvider> </HiddenPostsProvider> </ExternalEmbedsProvider> |