codemirror-outline.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. import { useCodeMirrorStateContext } from './codemirror-context'
  2. import React, { useEffect } from 'react'
  3. import { documentOutline } from '../languages/latex/document-outline'
  4. import { ProjectionStatus } from '../utils/tree-operations/projection'
  5. import useDebounce from '../../../shared/hooks/use-debounce'
  6. import { useOutlineContext } from '@/features/ide-react/context/outline-context'
  7. export const CodemirrorOutline = React.memo(function CodemirrorOutline() {
  8. const { setFlatOutline } = useOutlineContext()
  9. const state = useCodeMirrorStateContext()
  10. const debouncedState = useDebounce(state, 100)
  11. const outlineResult = debouncedState.field(documentOutline, false)
  12. // when the outline projection changes, calculate the flat outline
  13. useEffect(() => {
  14. if (outlineResult && outlineResult.status !== ProjectionStatus.Pending) {
  15. // We have a (potentially partial) outline.
  16. setFlatOutline({
  17. items: outlineResult.items.map(element => ({
  18. level: element.level,
  19. title: element.title,
  20. line: element.line,
  21. })),
  22. partial: outlineResult?.status === ProjectionStatus.Partial,
  23. })
  24. } else {
  25. setFlatOutline(undefined)
  26. }
  27. }, [outlineResult, setFlatOutline])
  28. return null
  29. })