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