| 123456789101112131415161718192021222324252627282930 |
- import { useCallback, useState } from 'react'
- import { useCodeMirrorViewContext } from '../components/codemirror-context'
- import { EditorView } from '@codemirror/view'
- import useEventListener from '../../../shared/hooks/use-event-listener'
- export default function useCodeMirrorMeasurement(
- key: string,
- measure: (view: EditorView) => number
- ) {
- const view = useCodeMirrorViewContext()
- const [measurement, setMeasurement] = useState(() => measure(view))
- useEventListener(
- 'editor:geometry-change',
- useCallback(() => {
- view.requestMeasure({
- key,
- read: () => measure(view),
- write(value) {
- // wrap the React state setter in a timeout so it doesn't run inside the CodeMirror update cycle
- window.setTimeout(() => {
- setMeasurement(value)
- })
- },
- })
- }, [view, measure, key])
- )
- return measurement
- }
|