summaryrefslogtreecommitdiff
path: root/apps/web/src/actions/keybindings/persisted-state.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-29 00:37:56 +0200
committerMaze Winther <mazewinther@gmail.com>2026-05-02 03:27:23 +0200
commita9b9cf6bf50f08723896659634f2e6afc17bcd42 (patch)
tree9175b49ff21f4326872ac9e541d2765cc7994ebc /apps/web/src/actions/keybindings/persisted-state.ts
parentd6622dc6b3523a5658cd512b44f15f7a66fd540c (diff)
downloadopencut-a9b9cf6bf50f08723896659634f2e6afc17bcd42.tar.gz
chore: switch from biome to eslint + prettier; fix ton of lint issues
Diffstat (limited to 'apps/web/src/actions/keybindings/persisted-state.ts')
-rw-r--r--apps/web/src/actions/keybindings/persisted-state.ts37
1 files changed, 37 insertions, 0 deletions
diff --git a/apps/web/src/actions/keybindings/persisted-state.ts b/apps/web/src/actions/keybindings/persisted-state.ts
new file mode 100644
index 00000000..57d83f6d
--- /dev/null
+++ b/apps/web/src/actions/keybindings/persisted-state.ts
@@ -0,0 +1,37 @@
+export type PersistedKeybindingConfig = Record<string, string | undefined>;
+
+export interface PersistedKeybindingsState {
+ keybindings: PersistedKeybindingConfig;
+ isCustomized: boolean;
+}
+
+function isRecord(value: unknown): value is Record<string, unknown> {
+ return typeof value === "object" && value !== null && !Array.isArray(value);
+}
+
+export function getPersistedKeybindingsState({
+ state,
+}: {
+ state: unknown;
+}): PersistedKeybindingsState | null {
+ if (!isRecord(state)) return null;
+
+ const { keybindings, isCustomized } = state;
+ if (!isRecord(keybindings) || typeof isCustomized !== "boolean") {
+ return null;
+ }
+
+ const normalizedKeybindings: PersistedKeybindingConfig = {};
+ for (const [key, action] of Object.entries(keybindings)) {
+ if (action !== undefined && typeof action !== "string") {
+ return null;
+ }
+
+ normalizedKeybindings[key] = action;
+ }
+
+ return {
+ keybindings: normalizedKeybindings,
+ isCustomized,
+ };
+}