App.tsx had 539 lines and 112 git touches in 30 days — highest churn in the codebase. Two self-contained hooks were defined inline with no dependency on App internals: - useEditorSaveWithLinks: wraps useEditorSave to also extract and update outgoing wikilinks on save. Moved to src/hooks/useEditorSaveWithLinks.ts. - useNavigationGestures: registers mouse button 3/4 back/forward and macOS trackpad horizontal swipe listeners. Moved to src/hooks/useNavigationGestures.ts. App.tsx shrinks from 539 → 473 lines (-66 lines). Both hooks are now independently testable and reusable. Co-authored-by: Test <test@test.com>
33 lines
1.5 KiB
TypeScript
33 lines
1.5 KiB
TypeScript
import { useCallback, useRef } from 'react'
|
|
import { useEditorSave } from './useEditorSave'
|
|
import { extractOutgoingLinks } from '../utils/wikilinks'
|
|
import type { VaultEntry } from '../types'
|
|
|
|
export function useEditorSaveWithLinks(config: {
|
|
updateContent: (path: string, content: string) => void
|
|
updateEntry: (path: string, patch: Partial<VaultEntry>) => void
|
|
setTabs: Parameters<typeof useEditorSave>[0]['setTabs']
|
|
setToastMessage: (msg: string | null) => void
|
|
onAfterSave: () => void
|
|
onNotePersisted?: (path: string) => void
|
|
}) {
|
|
const { updateContent, updateEntry } = config
|
|
const saveContent = useCallback((path: string, content: string) => {
|
|
updateContent(path, content)
|
|
updateEntry(path, { outgoingLinks: extractOutgoingLinks(content) })
|
|
}, [updateContent, updateEntry])
|
|
const editor = useEditorSave({ updateVaultContent: saveContent, setTabs: config.setTabs, setToastMessage: config.setToastMessage, onAfterSave: config.onAfterSave, onNotePersisted: config.onNotePersisted })
|
|
const { handleContentChange: rawOnChange } = editor
|
|
const prevLinksKeyRef = useRef('')
|
|
const handleContentChange = useCallback((path: string, content: string) => {
|
|
rawOnChange(path, content)
|
|
const links = extractOutgoingLinks(content)
|
|
const key = links.join('\0')
|
|
if (key !== prevLinksKeyRef.current) {
|
|
prevLinksKeyRef.current = key
|
|
updateEntry(path, { outgoingLinks: links })
|
|
}
|
|
}, [rawOnChange, updateEntry])
|
|
return { ...editor, handleContentChange }
|
|
}
|