summaryrefslogtreecommitdiff
path: root/apps/web/src/stores/panel-store.ts
diff options
context:
space:
mode:
authorMaze <167211895+mazeincoding@users.noreply.github.com>2026-01-31 00:20:04 +0100
committerGitHub <noreply@github.com>2026-01-31 00:20:04 +0100
commit7bf0984698e43b9aa2dd879f65951318ed410390 (patch)
treeccf2cd590a47d550152afc07129cb55c71a9ec35 /apps/web/src/stores/panel-store.ts
parent0173db99448d1c4c6415dcf15272e17551b48b04 (diff)
downloadopencut-7bf0984698e43b9aa2dd879f65951318ed410390.tar.gz
codebase overhaul (#697)
Diffstat (limited to 'apps/web/src/stores/panel-store.ts')
-rw-r--r--apps/web/src/stores/panel-store.ts292
1 files changed, 80 insertions, 212 deletions
diff --git a/apps/web/src/stores/panel-store.ts b/apps/web/src/stores/panel-store.ts
index ae09c13b..5d2621a4 100644
--- a/apps/web/src/stores/panel-store.ts
+++ b/apps/web/src/stores/panel-store.ts
@@ -1,225 +1,93 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
+import { PANEL_CONFIG } from "@/constants/editor-constants";
-export type PanelPreset =
- | "default"
- | "media"
- | "inspector"
- | "vertical-preview";
-
-interface PanelSizes {
- toolsPanel: number;
- previewPanel: number;
- propertiesPanel: number;
- mainContent: number;
- timeline: number;
+export interface PanelSizes {
+ tools: number;
+ preview: number;
+ properties: number;
+ mainContent: number;
+ timeline: number;
}
-export const PRESET_CONFIGS: Record<PanelPreset, PanelSizes> = {
- default: {
- toolsPanel: 25,
- previewPanel: 50,
- propertiesPanel: 25,
- mainContent: 70,
- timeline: 30,
- },
- media: {
- toolsPanel: 30,
- previewPanel: 45,
- propertiesPanel: 25,
- mainContent: 100,
- timeline: 25,
- },
- inspector: {
- toolsPanel: 30,
- previewPanel: 70,
- propertiesPanel: 30,
- mainContent: 75,
- timeline: 25,
- },
- "vertical-preview": {
- toolsPanel: 30,
- previewPanel: 40,
- propertiesPanel: 30,
- mainContent: 75,
- timeline: 25,
- },
-};
-
-interface PanelState extends PanelSizes {
- activePreset: PanelPreset;
- presetCustomSizes: Record<PanelPreset, Partial<PanelSizes>>;
- resetCounter: number;
-
- mediaViewMode: "grid" | "list";
-
- setToolsPanel: (size: number) => void;
- setPreviewPanel: (size: number) => void;
- setPropertiesPanel: (size: number) => void;
- setMainContent: (size: number) => void;
- setTimeline: (size: number) => void;
- setMediaViewMode: (mode: "grid" | "list") => void;
+export type PanelId = keyof PanelSizes;
- setActivePreset: (preset: PanelPreset) => void;
- resetPreset: (preset: PanelPreset) => void;
- getCurrentPresetSizes: () => PanelSizes;
+interface PanelState {
+ panels: PanelSizes;
+ setPanel: (panel: PanelId, size: number) => void;
+ setPanels: (sizes: Partial<PanelSizes>) => void;
+ resetPanels: () => void;
}
export const usePanelStore = create<PanelState>()(
- persist(
- (set, get) => ({
- ...PRESET_CONFIGS.default,
- activePreset: "default" as PanelPreset,
- presetCustomSizes: {
- default: {},
- media: {},
- inspector: {},
- "vertical-preview": {},
- },
- resetCounter: 0,
-
- mediaViewMode: "grid" as const,
-
- setToolsPanel: (size) => {
- const { activePreset, presetCustomSizes } = get();
- set({
- toolsPanel: size,
- presetCustomSizes: {
- ...presetCustomSizes,
- [activePreset]: {
- ...presetCustomSizes[activePreset],
- toolsPanel: size,
- },
- },
- });
- },
- setPreviewPanel: (size) => {
- const { activePreset, presetCustomSizes } = get();
- set({
- previewPanel: size,
- presetCustomSizes: {
- ...presetCustomSizes,
- [activePreset]: {
- ...presetCustomSizes[activePreset],
- previewPanel: size,
- },
- },
- });
- },
- setPropertiesPanel: (size) => {
- const { activePreset, presetCustomSizes } = get();
- set({
- propertiesPanel: size,
- presetCustomSizes: {
- ...presetCustomSizes,
- [activePreset]: {
- ...presetCustomSizes[activePreset],
- propertiesPanel: size,
- },
- },
- });
- },
- setMainContent: (size) => {
- const { activePreset, presetCustomSizes } = get();
- set({
- mainContent: size,
- presetCustomSizes: {
- ...presetCustomSizes,
- [activePreset]: {
- ...presetCustomSizes[activePreset],
- mainContent: size,
- },
- },
- });
- },
- setTimeline: (size) => {
- const { activePreset, presetCustomSizes } = get();
- set({
- timeline: size,
- presetCustomSizes: {
- ...presetCustomSizes,
- [activePreset]: {
- ...presetCustomSizes[activePreset],
- timeline: size,
- },
- },
- });
- },
- setMediaViewMode: (mode) => set({ mediaViewMode: mode }),
-
- setActivePreset: (preset) => {
- const {
- activePreset: currentPreset,
- presetCustomSizes,
- toolsPanel,
- previewPanel,
- propertiesPanel,
- mainContent,
- timeline,
- } = get();
-
- const updatedPresetCustomSizes = {
- ...presetCustomSizes,
- [currentPreset]: {
- toolsPanel,
- previewPanel,
- propertiesPanel,
- mainContent,
- timeline,
- },
- };
-
- const defaultSizes = PRESET_CONFIGS[preset];
- const customSizes = updatedPresetCustomSizes[preset] || {};
- const finalSizes = { ...defaultSizes, ...customSizes } as PanelSizes;
-
- set({
- activePreset: preset,
- presetCustomSizes: updatedPresetCustomSizes,
- ...finalSizes,
- });
- },
-
- resetPreset: (preset) => {
- const { presetCustomSizes, activePreset, resetCounter } = get();
- const defaultSizes = PRESET_CONFIGS[preset];
-
- const newPresetCustomSizes = {
- ...presetCustomSizes,
- [preset]: {},
- };
-
- const updates: Partial<PanelState> = {
- presetCustomSizes: newPresetCustomSizes,
- resetCounter: resetCounter + 1,
- };
+ persist(
+ (set) => ({
+ ...PANEL_CONFIG,
+ setPanel: (panel, size) =>
+ set((state) => ({
+ panels: {
+ ...state.panels,
+ [panel]: size,
+ },
+ })),
+ setPanels: (sizes) =>
+ set((state) => ({
+ panels: {
+ ...state.panels,
+ ...sizes,
+ },
+ })),
+ resetPanels: () => set({ ...PANEL_CONFIG }),
+ }),
+ {
+ name: "panel-sizes",
+ version: 2,
+ migrate: (persistedState) => {
+ const state = persistedState as
+ | {
+ panels?: Partial<PanelSizes> | null;
+ toolsPanel?: number;
+ previewPanel?: number;
+ propertiesPanel?: number;
+ mainContent?: number;
+ timeline?: number;
+ tools?: number;
+ preview?: number;
+ properties?: number;
+ }
+ | undefined
+ | null;
- if (preset === activePreset) {
- Object.assign(updates, defaultSizes);
- }
+ if (!state) return { panels: { ...PANEL_CONFIG.panels } };
- set(updates);
- },
+ if (state.panels && typeof state.panels === "object") {
+ return {
+ panels: {
+ ...PANEL_CONFIG.panels,
+ ...state.panels,
+ },
+ };
+ }
- getCurrentPresetSizes: () => {
- const {
- toolsPanel,
- previewPanel,
- propertiesPanel,
- mainContent,
- timeline,
- } = get();
- return {
- toolsPanel,
- previewPanel,
- propertiesPanel,
- mainContent,
- timeline,
- };
- },
- }),
- {
- name: "panel-sizes",
- }
- )
+ return {
+ panels: {
+ tools: state.tools ?? state.toolsPanel ?? PANEL_CONFIG.panels.tools,
+ preview:
+ state.preview ??
+ state.previewPanel ??
+ PANEL_CONFIG.panels.preview,
+ properties:
+ state.properties ??
+ state.propertiesPanel ??
+ PANEL_CONFIG.panels.properties,
+ mainContent: state.mainContent ?? PANEL_CONFIG.panels.mainContent,
+ timeline: state.timeline ?? PANEL_CONFIG.panels.timeline,
+ },
+ };
+ },
+ partialize: (state) => ({
+ panels: state.panels,
+ }),
+ },
+ ),
);