()
| 62 | } |
| 63 | |
| 64 | export function NoteList(): JSX.Element { |
| 65 | const vault = useStore((s) => s.vault) |
| 66 | const notes = useStore((s) => s.notes) |
| 67 | const folders = useStore((s) => s.folders) |
| 68 | const assetFiles = useStore((s) => s.assetFiles) |
| 69 | const activeNote = useStore((s) => s.activeNote) |
| 70 | // Note-list row slot height tracks the Density tweak; the same DENSITY number |
| 71 | // feeds the virtualizer itemSize so windowing matches the painted rows. At |
| 72 | // compact the row card also drops to a single excerpt line so it doesn't clip. |
| 73 | const rowDensity = useStore((s) => densityFromTweaks(s.themeTweaks)) |
| 74 | const noteRowH = DENSITY[rowDensity].noteRow |
| 75 | const view = useStore((s) => s.view) |
| 76 | const vaultSettings = useStore((s) => s.vaultSettings) |
| 77 | const selectedPath = useStore((s) => s.selectedPath) |
| 78 | const selectNote = useStore((s) => s.selectNote) |
| 79 | const previewNote = useStore((s) => s.previewNote) |
| 80 | const createAndOpen = useStore((s) => s.createAndOpen) |
| 81 | const toggleNoteList = useStore((s) => s.toggleNoteList) |
| 82 | const refreshNotes = useStore((s) => s.refreshNotes) |
| 83 | const refreshAssets = useStore((s) => s.refreshAssets) |
| 84 | const deleteAssetAction = useStore((s) => s.deleteAsset) |
| 85 | const noteListWidth = useStore((s) => s.noteListWidth) |
| 86 | const setNoteListWidth = useStore((s) => s.setNoteListWidth) |
| 87 | const noteSortOrder = useStore((s) => s.noteSortOrder) |
| 88 | const renameNote = useStore((s) => s.renameNote) |
| 89 | const moveNote = useStore((s) => s.moveNote) |
| 90 | const tabsEnabled = useStore((s) => s.tabsEnabled) |
| 91 | const openNoteInTab = useStore((s) => s.openNoteInTab) |
| 92 | const openDatabase = useStore((s) => s.openDatabase) |
| 93 | const prefetchNotes = useStore((s) => s.prefetchNotes) |
| 94 | const focusedPanel = useStore((s) => s.focusedPanel) |
| 95 | const noteListCursorIndex = useStore((s) => s.noteListCursorIndex) |
| 96 | const setFocusedPanel = useStore((s) => s.setFocusedPanel) |
| 97 | const systemFolderLabels = useStore((s) => s.systemFolderLabels) |
| 98 | const workspaceMode = useStore((s) => s.workspaceMode) |
| 99 | const canRevealInFileManager = |
| 100 | window.zen.getAppInfo().runtime === 'desktop' && workspaceMode !== 'remote' |
| 101 | const canManageAssetFiles = |
| 102 | window.zen.getAppInfo().runtime === 'desktop' && |
| 103 | workspaceMode !== 'remote' && |
| 104 | typeof window.zen.renameAsset === 'function' && |
| 105 | typeof window.zen.moveAsset === 'function' && |
| 106 | typeof window.zen.duplicateAsset === 'function' |
| 107 | const canDeleteAssets = |
| 108 | window.zen.getAppInfo().runtime === 'desktop' && |
| 109 | workspaceMode !== 'remote' |
| 110 | const absolutePathLabel = |
| 111 | workspaceMode === 'remote' ? 'Copy Server Path' : 'Copy Absolute Path' |
| 112 | const folderLabels = useMemo( |
| 113 | () => resolveSystemFolderLabels(systemFolderLabels), |
| 114 | [systemFolderLabels] |
| 115 | ) |
| 116 | const [menu, setMenu] = useState<{ x: number; y: number; path: string } | null>(null) |
| 117 | const [assetMenu, setAssetMenu] = useState<{ x: number; y: number; path: string } | null>(null) |
| 118 | const [assetLayout, setAssetLayout] = useState<AssetLayout>(() => { |
| 119 | try { |
| 120 | const raw = localStorage.getItem(ASSET_LAYOUT_KEY) |
| 121 | return raw === 'list' ? 'list' : 'grid' |
nothing calls this directly
no test coverage detected