use-codemirror-measurement.ts 903 B

123456789101112131415161718192021222324252627282930
  1. import { useCallback, useState } from 'react'
  2. import { useCodeMirrorViewContext } from '../components/codemirror-context'
  3. import { EditorView } from '@codemirror/view'
  4. import useEventListener from '../../../shared/hooks/use-event-listener'
  5. export default function useCodeMirrorMeasurement(
  6. key: string,
  7. measure: (view: EditorView) => number
  8. ) {
  9. const view = useCodeMirrorViewContext()
  10. const [measurement, setMeasurement] = useState(() => measure(view))
  11. useEventListener(
  12. 'editor:geometry-change',
  13. useCallback(() => {
  14. view.requestMeasure({
  15. key,
  16. read: () => measure(view),
  17. write(value) {
  18. // wrap the React state setter in a timeout so it doesn't run inside the CodeMirror update cycle
  19. window.setTimeout(() => {
  20. setMeasurement(value)
  21. })
  22. },
  23. })
  24. }, [view, measure, key])
  25. )
  26. return measurement
  27. }