1import { useAtomSet, useAtomValue } from "@effect/atom-react";
2import { AsyncResult } from "effect/reactivity";
3import { useCallback, useRef } from "react";
4
5import { mobilePreferencesAtom, updateMobilePreferencesAtom } from "../../state/preferences";
6
7/**
8 * Shared persisted shelf state for the compact Home list and iPad sidebar.
9 * Refs advance before persistence starts so consecutive presses always toggle
10 * the latest value, even if React has not rendered the optimistic patch yet.
11 */
12export function useThreadListV2ShelfPreferences() {
13 const preferencesResult = useAtomValue(mobilePreferencesAtom);
14 const savePreferences = useAtomSet(updateMobilePreferencesAtom);
15 const loaded = AsyncResult.isSuccess(preferencesResult);
16 const snoozedShelfExpanded =
17 loaded && preferencesResult.value.threadListSnoozedShelfExpanded === true;
18 const settledShelfExpanded =
19 loaded && preferencesResult.value.threadListSettledShelfExpanded === true;
20 // Working section beta: off until the preference loads and is enabled.
21 const workingShelfEnabled = loaded && preferencesResult.value.workingShelfEnabled === true;
22 const workingShelfExpanded =
23 loaded && preferencesResult.value.threadListWorkingShelfExpanded === true;
24 const snoozedShelfExpandedRef = useRef(snoozedShelfExpanded);
25 const settledShelfExpandedRef = useRef(settledShelfExpanded);
26 const workingShelfExpandedRef = useRef(workingShelfExpanded);
27 snoozedShelfExpandedRef.current = snoozedShelfExpanded;
28 settledShelfExpandedRef.current = settledShelfExpanded;
29 workingShelfExpandedRef.current = workingShelfExpanded;
30
31 const toggleSnoozedShelf = useCallback(() => {
32 if (!loaded) return;
33 const expanded = !snoozedShelfExpandedRef.current;
34 snoozedShelfExpandedRef.current = expanded;
35 savePreferences({ threadListSnoozedShelfExpanded: expanded });
36 }, [loaded, savePreferences]);
37 const toggleSettledShelf = useCallback(() => {
38 if (!loaded) return;
39 const expanded = !settledShelfExpandedRef.current;
40 settledShelfExpandedRef.current = expanded;
41 savePreferences({ threadListSettledShelfExpanded: expanded });
42 }, [loaded, savePreferences]);
43 const toggleWorkingShelf = useCallback(() => {
44 if (!loaded) return;
45 const expanded = !workingShelfExpandedRef.current;
46 workingShelfExpandedRef.current = expanded;
47 savePreferences({ threadListWorkingShelfExpanded: expanded });
48 }, [loaded, savePreferences]);
49
50 return {
51 loaded,
52 settledShelfExpanded,
53 snoozedShelfExpanded,
54 workingShelfEnabled,
55 workingShelfExpanded,
56 toggleSettledShelf,
57 toggleSnoozedShelf,
58 toggleWorkingShelf,
59 } as const;
60}