Fix up hide/show toggle state, WITH broadcast hacK

This commit is contained in:
Eric Bailey
2024-12-12 10:53:56 -06:00
parent e3d110207e
commit 99db939beb
7 changed files with 93 additions and 41 deletions
@@ -9,7 +9,10 @@ import {
useInAppBrowser,
useSetInAppBrowser,
} from '#/state/preferences/in-app-browser'
import {useTrendingTopicsSidebarSetting} from '#/state/trending'
import {
useTrendingSettings,
useTrendingSettingsApi,
} from '#/state/preferences/trending'
import * as SettingsList from '#/screens/Settings/components/SettingsList'
import * as Toggle from '#/components/forms/Toggle'
import {Bubbles_Stroke2_Corner2_Rounded as BubblesIcon} from '#/components/icons/Bubble'
@@ -31,7 +34,8 @@ export function ContentAndMediaSettingsScreen({}: Props) {
const setAutoplayDisabledPref = useSetAutoplayDisabled()
const inAppBrowserPref = useInAppBrowser()
const setUseInAppBrowser = useSetInAppBrowser()
const [showTrending, setShowTrending] = useTrendingTopicsSidebarSetting()
const {trendingSidebarHidden} = useTrendingSettings()
const {setTrendingSidebarHidden} = useTrendingSettingsApi()
return (
<Layout.Screen>
@@ -113,8 +117,8 @@ export function ContentAndMediaSettingsScreen({}: Props) {
<Toggle.Item
name="show_trending_topics"
label={_(msg`Show trending topics in your sidebar`)}
value={showTrending}
onChange={value => setShowTrending(value)}>
value={!trendingSidebarHidden}
onChange={value => setTrendingSidebarHidden(!value)}>
<SettingsList.Item>
<SettingsList.ItemIcon icon={Graph} />
<SettingsList.ItemText>
+4 -2
View File
@@ -63,8 +63,10 @@ export async function write<K extends keyof Schema>(
[key]: value,
})
writeToStorage(_state)
broadcast.postMessage({event: {type: UPDATE_EVENT, key}})
broadcast.postMessage({event: UPDATE_EVENT}) // Backcompat while upgrading
setTimeout(() => {
broadcast.postMessage({event: {type: UPDATE_EVENT, key}})
broadcast.postMessage({event: UPDATE_EVENT}) // Backcompat while upgrading
}, 0)
}
write satisfies PersistedApi['write']
+2 -1
View File
@@ -125,7 +125,7 @@ const schema = z.object({
subtitlesEnabled: z.boolean().optional(),
/** @deprecated */
mutedThreads: z.array(z.string()),
hideSidebarTrendingTopics: z.boolean().optional(),
trendingSidebarHidden: z.boolean().optional(),
})
export type Schema = z.infer<typeof schema>
@@ -171,6 +171,7 @@ export const defaults: Schema = {
kawaii: false,
hasCheckedForStarterPack: false,
subtitlesEnabled: true,
trendingSidebarHidden: false,
}
export function tryParse(rawData: string): Schema | undefined {
+4 -1
View File
@@ -10,6 +10,7 @@ import {Provider as KawaiiProvider} from './kawaii'
import {Provider as LanguagesProvider} from './languages'
import {Provider as LargeAltBadgeProvider} from './large-alt-badge'
import {Provider as SubtitlesProvider} from './subtitles'
import {Provider as TrendingSettingsProvider} from './trending'
import {Provider as UsedStarterPacksProvider} from './used-starter-packs'
export {
@@ -39,7 +40,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
<AutoplayProvider>
<UsedStarterPacksProvider>
<SubtitlesProvider>
<KawaiiProvider>{children}</KawaiiProvider>
<TrendingSettingsProvider>
<KawaiiProvider>{children}</KawaiiProvider>
</TrendingSettingsProvider>
</SubtitlesProvider>
</UsedStarterPacksProvider>
</AutoplayProvider>
+66
View File
@@ -0,0 +1,66 @@
import React from 'react'
import * as persisted from '#/state/persisted'
type StateContext = {
trendingSidebarHidden: persisted.Schema['trendingSidebarHidden']
}
type ApiContext = {
setTrendingSidebarHidden(
hidden: Exclude<persisted.Schema['trendingSidebarHidden'], undefined>,
): void
}
const StateContext = React.createContext<StateContext>({
trendingSidebarHidden: persisted.defaults.trendingSidebarHidden,
})
const ApiContext = React.createContext<ApiContext>({
setTrendingSidebarHidden() {},
})
export function Provider({children}: React.PropsWithChildren<{}>) {
const [trendingSidebarHidden, _setTrendingSidebarHidden] = React.useState(
() => {
return Boolean(persisted.get('trendingSidebarHidden'))
},
)
const setTrendingSidebarHidden = React.useCallback<
ApiContext['setTrendingSidebarHidden']
>(
hidden => {
_setTrendingSidebarHidden(hidden)
persisted.write('trendingSidebarHidden', hidden)
},
[_setTrendingSidebarHidden],
)
React.useEffect(() => {
return persisted.onUpdate('trendingSidebarHidden', hidden => {
_setTrendingSidebarHidden(Boolean(hidden))
})
}, [_setTrendingSidebarHidden])
const state = React.useMemo(
() => ({trendingSidebarHidden}),
[trendingSidebarHidden],
)
const api = React.useMemo(
() => ({setTrendingSidebarHidden}),
[setTrendingSidebarHidden],
)
return (
<StateContext.Provider value={state}>
<ApiContext.Provider value={api}>{children}</ApiContext.Provider>
</StateContext.Provider>
)
}
export function useTrendingSettings() {
return React.useContext(StateContext)
}
export function useTrendingSettingsApi() {
return React.useContext(ApiContext)
}
-28
View File
@@ -1,28 +0,0 @@
import React from 'react'
import * as persisted from '#/state/persisted'
// TODO only updates in other tabs, not current one
export function useTrendingTopicsSidebarSetting() {
const [_show, setShow] = React.useState(
() => !persisted.get('hideSidebarTrendingTopics'),
)
const set = React.useCallback(
(show: boolean) => {
setShow(show)
persisted.write('hideSidebarTrendingTopics', !show)
},
[setShow],
)
// persisted.write('hideSidebarTrendingTopics', undefined)
React.useEffect(() => {
return persisted.onUpdate('hideSidebarTrendingTopics', value => {
setShow(!value)
})
}, [setShow])
return [_show, set] as const
}
+9 -5
View File
@@ -5,8 +5,11 @@ import {useLingui} from '@lingui/react'
import {FEEDBACK_FORM_URL, HELP_DESK_URL} from '#/lib/constants'
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import {useKawaiiMode} from '#/state/preferences/kawaii'
import {
useTrendingSettings,
useTrendingSettingsApi,
} from '#/state/preferences/trending'
import {useSession} from '#/state/session'
import {useTrendingTopicsSidebarSetting} from '#/state/trending'
import {DesktopFeeds} from '#/view/shell/desktop/Feeds'
import {DesktopSearch} from '#/view/shell/desktop/Search'
import {atoms as a, useGutters, useTheme, web} from '#/alf'
@@ -116,9 +119,10 @@ function TrendingTopics() {
const {_} = useLingui()
const trendingPrompt = Prompt.usePromptControl()
const [showTrending, setShowTrending] = useTrendingTopicsSidebarSetting()
const {trendingSidebarHidden} = useTrendingSettings()
const {setTrendingSidebarHidden} = useTrendingSettingsApi()
return showTrending ? (
return trendingSidebarHidden ? null : (
<>
<View style={[a.gap_md]}>
<View style={[a.flex_row, a.align_center, a.gap_xs]}>
@@ -168,9 +172,9 @@ function TrendingTopics() {
msg`This is a device setting, and will apply to all accounts on this device. You can update this later from your settings.`,
)}
confirmButtonCta={_(msg`Hide`)}
onConfirm={() => setShowTrending(false)}
onConfirm={() => setTrendingSidebarHidden(true)}
/>
<Divider />
</>
) : null
)
}