* create dialog with flatlist in it * use alf for composer photos/camera/gif buttons * add gif icons * focus textinput on gif dialog close * add giphy API + gif grid * web support * add consent confirmation * track gif select * desktop web consent styles * use InlineLinkText instead of Link * add error/loading state * hide sideborders on web * disable composer buttons where necessary * skip cardyb and set thumbnail directly * switch legacy analytics to statsig * remove autoplay prop * disable photo/gif buttons if external media is present * memoize listmaybeplaceholder * fix pagination * don't set `value` of TextInput, clear via ref * remove console.log * close modal if press escape * pass alt text in the description * Fix typo * Rm dialog --------- Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
58 lines
1.4 KiB
TypeScript
58 lines
1.4 KiB
TypeScript
import React from 'react'
|
|
|
|
import * as persisted from '#/state/persisted'
|
|
import {EmbedPlayerSource} from 'lib/strings/embed-player'
|
|
|
|
type StateContext = persisted.Schema['externalEmbeds']
|
|
type SetContext = (
|
|
source: EmbedPlayerSource,
|
|
value: 'show' | 'hide' | undefined,
|
|
) => void
|
|
|
|
const stateContext = React.createContext<StateContext>(
|
|
persisted.defaults.externalEmbeds,
|
|
)
|
|
const setContext = React.createContext<SetContext>({} as SetContext)
|
|
|
|
export function Provider({children}: React.PropsWithChildren<{}>) {
|
|
const [state, setState] = React.useState(persisted.get('externalEmbeds'))
|
|
|
|
const setStateWrapped = React.useCallback(
|
|
(source: EmbedPlayerSource, value: 'show' | 'hide' | undefined) => {
|
|
setState(prev => {
|
|
persisted.write('externalEmbeds', {
|
|
...prev,
|
|
[source]: value,
|
|
})
|
|
|
|
return {
|
|
...prev,
|
|
[source]: value,
|
|
}
|
|
})
|
|
},
|
|
[setState],
|
|
)
|
|
|
|
React.useEffect(() => {
|
|
return persisted.onUpdate(() => {
|
|
setState(persisted.get('externalEmbeds'))
|
|
})
|
|
}, [setStateWrapped])
|
|
|
|
return (
|
|
<stateContext.Provider value={state}>
|
|
<setContext.Provider value={setStateWrapped}>
|
|
{children}
|
|
</setContext.Provider>
|
|
</stateContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function useExternalEmbedsPrefs() {
|
|
return React.useContext(stateContext)
|
|
}
|
|
|
|
export function useSetExternalEmbedPref() {
|
|
return React.useContext(setContext)
|
|
}
|