Adds a third editor mode (alongside WYSIWYG and Diff) that shows the raw markdown file in a monospaced textarea. Includes: - useRawMode hook with derived state (no setState-in-effect) and onFlushPending - RawEditorView: textarea with 500ms debounce, YAML error banner, wikilink autocomplete via [[ trigger, Cmd+S save - BreadcrumbBar Code icon toggles raw mode; mutual exclusion with diff mode - Command palette: "Toggle Raw Editor" (View group, requires active tab) - useEditorModeExclusion hook extracted to keep Editor.tsx under complexity threshold - buildViewCommands extracted from useCommandRegistry for same reason - RawToggleButton and RawModeEditorSection components extracted for clean CC Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
30 lines
1011 B
TypeScript
30 lines
1011 B
TypeScript
import { useState, useCallback } from 'react'
|
|
|
|
interface UseRawModeParams {
|
|
activeTabPath: string | null
|
|
/** Flush pending WYSIWYG edits to disk before entering raw mode. */
|
|
onFlushPending?: () => Promise<boolean>
|
|
}
|
|
|
|
/**
|
|
* Manages raw editor mode state.
|
|
* Raw mode is automatically inactive when the active tab changes,
|
|
* because rawMode is derived from whether the stored path matches the current tab.
|
|
*/
|
|
export function useRawMode({ activeTabPath, onFlushPending }: UseRawModeParams) {
|
|
// Track which path has raw mode active — automatically deactivates on tab switch
|
|
const [rawActivePath, setRawActivePath] = useState<string | null>(null)
|
|
const rawMode = rawActivePath !== null && rawActivePath === activeTabPath
|
|
|
|
const handleToggleRaw = useCallback(async () => {
|
|
if (rawMode) {
|
|
setRawActivePath(null)
|
|
} else {
|
|
await onFlushPending?.()
|
|
setRawActivePath(activeTabPath)
|
|
}
|
|
}, [rawMode, activeTabPath, onFlushPending])
|
|
|
|
return { rawMode, handleToggleRaw }
|
|
}
|