ultisuite-client/lib/stores/mail-settings-store.ts
R3D347HR4Y 9266aa34cd huhu
2026-05-19 22:20:43 +02:00

89 lines
2.6 KiB
TypeScript

"use client"
import { create } from "zustand"
import { persist } from "zustand/middleware"
import { debouncedPersistJSONStorage } from "@/lib/stores/debounced-json-storage"
import { normalizeMailBackgroundId } from "@/lib/mail-settings/constants"
import type {
InboxSortMode,
MailBackgroundId,
MailDensity,
MailThemeMode,
ReadingPaneMode,
} from "@/lib/mail-settings/types"
type MailSettingsState = {
quickSettingsOpen: boolean
themeDialogOpen: boolean
density: MailDensity
themeMode: MailThemeMode
backgroundId: MailBackgroundId
inboxSort: InboxSortMode
readingPane: ReadingPaneMode
conversationMode: boolean
}
type MailSettingsActions = {
setQuickSettingsOpen: (open: boolean) => void
setThemeDialogOpen: (open: boolean) => void
setDensity: (density: MailDensity) => void
setThemeMode: (mode: MailThemeMode) => void
setBackgroundId: (id: MailBackgroundId) => void
setInboxSort: (sort: InboxSortMode) => void
setReadingPane: (mode: ReadingPaneMode) => void
setConversationMode: (enabled: boolean) => void
}
const defaults: MailSettingsState = {
quickSettingsOpen: false,
themeDialogOpen: false,
density: "default",
themeMode: "system",
backgroundId: "none",
inboxSort: "default",
readingPane: "none",
conversationMode: true,
}
export const useMailSettingsStore = create<
MailSettingsState & MailSettingsActions
>()(
persist(
(set) => ({
...defaults,
setQuickSettingsOpen: (open) => set({ quickSettingsOpen: open }),
setThemeDialogOpen: (open) => set({ themeDialogOpen: open }),
setDensity: (density) => set({ density }),
setThemeMode: (themeMode) => set({ themeMode }),
setBackgroundId: (backgroundId) => set({ backgroundId }),
setInboxSort: (inboxSort) => set({ inboxSort }),
setReadingPane: (readingPane) => set({ readingPane }),
setConversationMode: (conversationMode) => set({ conversationMode }),
}),
{
name: "ultimail-mail-settings",
storage: debouncedPersistJSONStorage,
partialize: (s) => ({
density: s.density,
themeMode: s.themeMode,
backgroundId: s.backgroundId,
inboxSort: s.inboxSort,
readingPane: s.readingPane,
conversationMode: s.conversationMode,
}),
merge: (persisted, current) => {
const p = persisted as Partial<MailSettingsState> | undefined
if (!p) return current
return {
...current,
...p,
backgroundId: normalizeMailBackgroundId(
(p.backgroundId as string) ?? "none"
),
}
},
}
)
)