1import { useAtomSet, useAtomValue } from "@effect/atom-react";
2import { AsyncResult } from "effect/reactivity";
3import { useCallback } from "react";
4
5import { mobilePreferencesAtom, updateMobilePreferencesAtom } from "../../state/preferences";
6import { DEFAULT_PR_LIST_CONTROLS, type PullRequestListControls } from "./pullRequestList";
7
8/** The pull request list's environment and its filters, restored on the next launch. */
9export function usePullRequestListControls() {
10 const preferences = useAtomValue(mobilePreferencesAtom);
11 const savePreferences = useAtomSet(updateMobilePreferencesAtom);
12 const saved = AsyncResult.isSuccess(preferences)
13 ? preferences.value.pullRequestListFilters
14 : undefined;
15 const environmentId = saved?.environmentId ?? null;
16 const controlsFor = useCallback(
17 (environment: string | null) => saved?.controls[environment ?? ""] ?? DEFAULT_PR_LIST_CONTROLS,
18 [saved],
19 );
20 const setEnvironmentId = useCallback(
21 (next: string | null) =>
22 savePreferences({
23 transform: (current) => ({
24 pullRequestListFilters: {
25 controls: current.pullRequestListFilters?.controls ?? {},
26 environmentId: next,
27 },
28 }),
29 }),
30 [savePreferences],
31 );
32 const setControls = useCallback(
33 (environment: string | null, controls: PullRequestListControls) =>
34 savePreferences({
35 transform: (current) => ({
36 pullRequestListFilters: {
37 environmentId: current.pullRequestListFilters?.environmentId ?? null,
38 controls: {
39 ...current.pullRequestListFilters?.controls,
40 [environment ?? ""]: controls,
41 },
42 },
43 }),
44 }),
45 [savePreferences],
46 );
47 return { environmentId, controlsFor, setEnvironmentId, setControls } as const;
48}