diff --git a/src/renderer/stores/app-store.ts b/src/renderer/stores/app-store.ts new file mode 100644 index 0000000..9ad5feb --- /dev/null +++ b/src/renderer/stores/app-store.ts @@ -0,0 +1,35 @@ +import { create } from 'zustand'; +import { persist } from 'zustand/middleware'; + +export interface PaneSizes { + sidebar: number; + editor: number; + preview: number; +} + +interface AppState { + sidebarVisible: boolean; + previewVisible: boolean; + zenMode: boolean; + paneSizes: PaneSizes; + toggleSidebar: () => void; + togglePreview: () => void; + setZenMode: (value: boolean) => void; + setPaneSizes: (sizes: PaneSizes) => void; +} + +export const useAppStore = create()( + persist( + (set) => ({ + sidebarVisible: true, + previewVisible: true, + zenMode: false, + paneSizes: { sidebar: 20, editor: 50, preview: 30 }, + toggleSidebar: () => set((s) => ({ sidebarVisible: !s.sidebarVisible })), + togglePreview: () => set((s) => ({ previewVisible: !s.previewVisible })), + setZenMode: (value) => set({ zenMode: value }), + setPaneSizes: (sizes) => set({ paneSizes: sizes }), + }), + { name: 'mc-app-store' } + ) +); \ No newline at end of file diff --git a/tests/unit/stores/app-store.test.ts b/tests/unit/stores/app-store.test.ts new file mode 100644 index 0000000..ea7f27d --- /dev/null +++ b/tests/unit/stores/app-store.test.ts @@ -0,0 +1,35 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { useAppStore } from '@/stores/app-store'; + +describe('useAppStore', () => { + beforeEach(() => { + localStorage.clear(); + useAppStore.setState({ + sidebarVisible: true, + previewVisible: true, + zenMode: false, + paneSizes: { sidebar: 20, editor: 50, preview: 30 }, + }); + }); + + it('toggles sidebar visibility', () => { + expect(useAppStore.getState().sidebarVisible).toBe(true); + useAppStore.getState().toggleSidebar(); + expect(useAppStore.getState().sidebarVisible).toBe(false); + }); + + it('toggles preview visibility', () => { + useAppStore.getState().togglePreview(); + expect(useAppStore.getState().previewVisible).toBe(false); + }); + + it('updates pane sizes', () => { + useAppStore.getState().setPaneSizes({ sidebar: 25, editor: 50, preview: 25 }); + expect(useAppStore.getState().paneSizes).toEqual({ sidebar: 25, editor: 50, preview: 25 }); + }); + + it('enables and disables zen mode', () => { + useAppStore.getState().setZenMode(true); + expect(useAppStore.getState().zenMode).toBe(true); + }); +}); \ No newline at end of file