we're basically done

This commit is contained in:
Maze Winther
2026-01-27 16:39:59 +01:00
parent af3100950e
commit 1f8391487e
70 changed files with 1230 additions and 699 deletions
+11 -3
View File
@@ -7,6 +7,10 @@ import { getDefaultShortcuts } from "@/lib/actions";
import { isTypableDOMElement } from "@/utils/browser";
import { isAppleDevice } from "@/utils/platform";
import type { KeybindingConfig, ShortcutKey } from "@/types/keybinding";
import {
runMigrations,
CURRENT_VERSION,
} from "./keybindings/migrations";
export const defaultKeybindings: KeybindingConfig = getDefaultShortcuts();
@@ -35,8 +39,6 @@ interface KeybindingsState {
action: TActionWithOptionalArgs,
) => KeybindingConflict | null;
getKeybindingsForAction: (action: TActionWithOptionalArgs) => ShortcutKey[];
// Utility
getKeybindingString: (ev: KeyboardEvent) => ShortcutKey | null;
}
@@ -143,7 +145,13 @@ export const useKeybindingsStore = create<KeybindingsState>()(
}),
{
name: "opencut-keybindings",
version: 2,
version: CURRENT_VERSION,
partialize: (state) => ({
keybindings: state.keybindings,
isCustomized: state.isCustomized,
}),
migrate: (persisted, version) =>
runMigrations({ state: persisted, fromVersion: version }),
},
),
);
@@ -0,0 +1,28 @@
import { v2ToV3 } from './v2-to-v3';
type MigrationFn = ({ state }: { state: unknown }) => unknown;
/**
* key = version we're migrating from
* value = migration function
*/
const migrations: Record<number, MigrationFn> = {
2: v2ToV3,
};
export const CURRENT_VERSION = 3;
export function runMigrations({
state,
fromVersion,
}: {
state: unknown;
fromVersion: number;
}): unknown {
let current = state;
for (let version = fromVersion; version < CURRENT_VERSION; version++) {
const migrate = migrations[version];
if (migrate) current = migrate({ state: current });
}
return current;
}
@@ -0,0 +1,26 @@
import type { KeybindingConfig, ShortcutKey } from "@/types/keybinding";
import type { TActionWithOptionalArgs } from "@/lib/actions";
interface V2State {
keybindings: KeybindingConfig;
isCustomized: boolean;
}
export function v2ToV3({ state }: { state: unknown }): unknown {
const v2 = state as V2State;
const renames: Record<string, string> = {
"split-selected": "split",
"split-selected-left": "split-left",
"split-selected-right": "split-right",
};
const migrated = { ...v2.keybindings };
for (const [key, action] of Object.entries(migrated)) {
if (action && renames[action]) {
migrated[key as ShortcutKey] = renames[action] as TActionWithOptionalArgs;
}
}
return { ...v2, keybindings: migrated };
}
-12
View File
@@ -7,12 +7,6 @@ import { create } from "zustand";
import type { ClipboardItem } from "@/types/timeline";
interface TimelineStore {
selectedElements: { trackId: string; elementId: string }[];
setSelectedElements: ({
elements,
}: {
elements: { trackId: string; elementId: string }[];
}) => void;
snappingEnabled: boolean;
toggleSnapping: () => void;
rippleEditingEnabled: boolean;
@@ -28,12 +22,6 @@ interface TimelineStore {
}
export const useTimelineStore = create<TimelineStore>((set) => ({
selectedElements: [],
setSelectedElements: ({ elements }) => {
set({ selectedElements: elements });
},
snappingEnabled: true,
toggleSnapping: () => {