Files
tolaria/src/hooks/useViewMode.ts
lucaronin b229d59437 feat: replace NoteWindow with full App instance for note windows
Note windows now render the main App component with panels defaulted to
hidden (editor-only view, inspector collapsed). This gives note windows
full feature parity: zoom, all keyboard shortcuts, properties editing,
and panel toggles — eliminating the maintenance burden of a separate shell.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 18:30:38 +02:00

42 lines
1.4 KiB
TypeScript

import { useState, useCallback, useEffect } from 'react'
import { getVaultConfig, updateVaultConfigField, subscribeVaultConfig } from '../utils/vaultConfigStore'
export type ViewMode = 'editor-only' | 'editor-list' | 'all'
function isViewMode(v: string | null | undefined): v is ViewMode {
return v === 'editor-only' || v === 'editor-list' || v === 'all'
}
function loadViewMode(): ViewMode {
const stored = getVaultConfig().view_mode
if (isViewMode(stored)) return stored
// Fallback to localStorage during initial load (before vault config is ready)
try {
const ls = localStorage.getItem('laputa-view-mode')
if (isViewMode(ls)) return ls
} catch { /* ignore */ }
return 'all'
}
export function useViewMode(initialOverride?: ViewMode) {
const [viewMode, setViewModeState] = useState<ViewMode>(initialOverride ?? loadViewMode)
// Re-sync when vault config becomes available
useEffect(() => {
return subscribeVaultConfig(() => {
const stored = getVaultConfig().view_mode
if (isViewMode(stored)) setViewModeState(stored)
})
}, [])
const setViewMode = useCallback((mode: ViewMode) => {
setViewModeState(mode)
updateVaultConfigField('view_mode', mode)
}, [])
const sidebarVisible = viewMode === 'all'
const noteListVisible = viewMode === 'all' || viewMode === 'editor-list'
return { viewMode, setViewMode, sidebarVisible, noteListVisible }
}