import { atom } from 'jotai'; import { atomFamily, atomWithStorage } from 'jotai/utils'; import type { CreateWorkspaceMode } from '../components/affine/create-workspace-modal'; import type { SettingProps } from '../components/affine/setting-modal'; // modal atoms export const openWorkspacesModalAtom = atom(false); export const openCreateWorkspaceModalAtom = atom(false); export const openQuickSearchModalAtom = atom(false); export const openOnboardingModalAtom = atom(false); export type SettingAtom = Pick & { open: boolean; }; export const openSettingModalAtom = atom({ open: false, }); export const openDisableCloudAlertModalAtom = atom(false); export { workspacesAtom } from './root'; type PageMode = 'page' | 'edgeless'; type PageLocalSetting = { mode: PageMode; }; type PartialPageLocalSettingWithPageId = Partial & { id: string; }; const pageSettingsBaseAtom = atomWithStorage( 'pageSettings', {} as Record ); // readonly atom by design export const pageSettingsAtom = atom(get => get(pageSettingsBaseAtom)); const recentPageSettingsBaseAtom = atomWithStorage( 'recentPageSettings', [] ); export const recentPageSettingsAtom = atom( get => { const recentPageIDs = get(recentPageSettingsBaseAtom); const pageSettings = get(pageSettingsAtom); return recentPageIDs.map(id => ({ ...pageSettings[id], id, })); } ); export const pageSettingFamily = atomFamily((pageId: string) => atom( get => get(pageSettingsBaseAtom)[pageId], ( get, set, patch: | Partial | ((prevSetting: PageLocalSetting | undefined) => void) ) => { set(recentPageSettingsBaseAtom, ids => { // pick 3 recent page ids return [...new Set([pageId, ...ids]).values()].slice(0, 3); }); set(pageSettingsBaseAtom, settings => ({ ...settings, [pageId]: { ...settings[pageId], ...(typeof patch === 'function' ? patch(settings[pageId]) : patch), }, })); } ) ); export const setPageModeAtom = atom( void 0, (get, set, pageId: string, mode: PageMode) => { set(pageSettingFamily(pageId), { mode }); } ); export type PageModeOption = 'all' | 'page' | 'edgeless'; export const allPageModeSelectAtom = atom('all');