ultisuite-client/lib/stores/docs-keyboard-shortcuts-store.ts
R3D347HR4Y 79bb6193fc
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
menus1
2026-06-09 18:27:10 +02:00

85 lines
2.5 KiB
TypeScript

"use client"
import { create } from "zustand"
import { persist } from "zustand/middleware"
import { debouncedPersistJSONStorage } from "@/lib/stores/debounced-json-storage"
import {
DOCS_KEYBOARD_SHORTCUTS_STORAGE_KEY,
type DocsKeyboardShortcutsUserConfig,
type DocsShortcutBinding,
type DocsShortcutId,
} from "@/lib/drive/docs-keyboard-shortcuts-config"
import {
formatDocsShortcutId,
listDocsKeyboardShortcutCatalog,
matchDocsShortcutEvent,
resolveDocsShortcutBinding,
resolveDocsShortcutBindings,
sanitizeDocsKeyboardShortcutsUserConfig,
} from "@/lib/drive/docs-keyboard-shortcuts-runtime"
type DocsKeyboardShortcutsState = {
overrides: DocsKeyboardShortcutsUserConfig
}
type DocsKeyboardShortcutsActions = {
getBinding: (id: DocsShortcutId) => DocsShortcutBinding
getBindings: (id: DocsShortcutId) => DocsShortcutBinding[]
formatShortcut: (id: DocsShortcutId) => string
matchEvent: (
event: KeyboardEvent,
filter?: Parameters<typeof matchDocsShortcutEvent>[2]
) => DocsShortcutId | null
setBinding: (id: DocsShortcutId, binding: DocsShortcutBinding) => void
resetBinding: (id: DocsShortcutId) => void
resetAll: () => void
getCatalog: () => ReturnType<typeof listDocsKeyboardShortcutCatalog>
}
export const useDocsKeyboardShortcutsStore = create<
DocsKeyboardShortcutsState & DocsKeyboardShortcutsActions
>()(
persist(
(set, get) => ({
overrides: {},
getBinding: (id) => resolveDocsShortcutBinding(id, get().overrides),
getBindings: (id) => resolveDocsShortcutBindings(id, get().overrides),
formatShortcut: (id) => formatDocsShortcutId(id, get().overrides),
matchEvent: (event, filter) => matchDocsShortcutEvent(event, get().overrides, filter),
setBinding: (id, binding) => {
set((state) => ({
overrides: { ...state.overrides, [id]: binding },
}))
},
resetBinding: (id) => {
set((state) => {
const next = { ...state.overrides }
delete next[id]
return { overrides: next }
})
},
resetAll: () => set({ overrides: {} }),
getCatalog: () => listDocsKeyboardShortcutCatalog(get().overrides),
}),
{
name: DOCS_KEYBOARD_SHORTCUTS_STORAGE_KEY,
storage: debouncedPersistJSONStorage,
partialize: (state) => ({ overrides: state.overrides }),
merge: (persisted, current) => ({
...current,
overrides: sanitizeDocsKeyboardShortcutsUserConfig(
(persisted as DocsKeyboardShortcutsState | undefined)?.overrides
),
}),
}
)
)