use-codemirror-measurement.ts 738 B

123456789101112131415161718192021222324252627
  1. import { useCallback, useState } from 'react'
  2. import { useCodeMirrorViewContext } from '../components/codemirror-editor'
  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. setMeasurement(value)
  19. },
  20. })
  21. }, [view, measure, key])
  22. )
  23. return measurement
  24. }