| 123456789101112131415161718192021222324252627282930313233 |
- import { useCodeMirrorStateContext } from './codemirror-context'
- import React, { useEffect } from 'react'
- import { documentOutline } from '../languages/latex/document-outline'
- import { ProjectionStatus } from '../utils/tree-operations/projection'
- import useDebounce from '../../../shared/hooks/use-debounce'
- import { useOutlineContext } from '@/features/ide-react/context/outline-context'
- export const CodemirrorOutline = React.memo(function CodemirrorOutline() {
- const { setFlatOutline } = useOutlineContext()
- const state = useCodeMirrorStateContext()
- const debouncedState = useDebounce(state, 100)
- const outlineResult = debouncedState.field(documentOutline, false)
- // when the outline projection changes, calculate the flat outline
- useEffect(() => {
- if (outlineResult && outlineResult.status !== ProjectionStatus.Pending) {
- // We have a (potentially partial) outline.
- setFlatOutline({
- items: outlineResult.items.map(element => ({
- level: element.level,
- title: element.title,
- line: element.line,
- })),
- partial: outlineResult?.status === ProjectionStatus.Partial,
- })
- } else {
- setFlatOutline(undefined)
- }
- }, [outlineResult, setFlatOutline])
- return null
- })
|