From efcc15d5b5a22286c1b59d05b3007e9ce9beb4de Mon Sep 17 00:00:00 2001 From: Alf Eaton Date: Mon, 15 Nov 2021 12:25:19 +0000 Subject: [PATCH] Add CodeMirror 6 cursor/scroll position handling (#5653) GitOrigin-RevId: bf756a415dbf1e4b5bbd9f580700bdc799c6b1d6 --- .../js/shared/hooks/use-event-listener.js | 15 +++++++++++++ .../shared/hooks/use-scope-event-emitter.js | 22 +++++++++++++++++++ .../shared/hooks/use-scope-event-listener.js | 14 ++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 services/web/frontend/js/shared/hooks/use-event-listener.js create mode 100644 services/web/frontend/js/shared/hooks/use-scope-event-emitter.js create mode 100644 services/web/frontend/js/shared/hooks/use-scope-event-listener.js diff --git a/services/web/frontend/js/shared/hooks/use-event-listener.js b/services/web/frontend/js/shared/hooks/use-event-listener.js new file mode 100644 index 0000000000..0e4c0e9f99 --- /dev/null +++ b/services/web/frontend/js/shared/hooks/use-event-listener.js @@ -0,0 +1,15 @@ +import { useEffect } from 'react' + +/** + * @param {string} eventName + * @param {function} [listener] + */ +export default function useEventListener(eventName, listener) { + useEffect(() => { + window.addEventListener(eventName, listener) + + return () => { + window.removeEventListener(eventName, listener) + } + }, [eventName, listener]) +} diff --git a/services/web/frontend/js/shared/hooks/use-scope-event-emitter.js b/services/web/frontend/js/shared/hooks/use-scope-event-emitter.js new file mode 100644 index 0000000000..6036130195 --- /dev/null +++ b/services/web/frontend/js/shared/hooks/use-scope-event-emitter.js @@ -0,0 +1,22 @@ +import { useCallback } from 'react' +import { useIdeContext } from '../context/ide-context' + +/** + * @param {string} eventName + * @param {boolean} [broadcast] + * @returns function + */ +export default function useScopeEventEmitter(eventName, broadcast = true) { + const { $scope } = useIdeContext() + + return useCallback( + detail => { + if (broadcast) { + $scope.$broadcast(eventName, detail) + } else { + $scope.$emit(eventName, detail) + } + }, + [$scope, eventName, broadcast] + ) +} diff --git a/services/web/frontend/js/shared/hooks/use-scope-event-listener.js b/services/web/frontend/js/shared/hooks/use-scope-event-listener.js new file mode 100644 index 0000000000..2606b563b7 --- /dev/null +++ b/services/web/frontend/js/shared/hooks/use-scope-event-listener.js @@ -0,0 +1,14 @@ +import { useEffect } from 'react' +import { useIdeContext } from '../context/ide-context' + +/** + * @param {string} eventName + * @param {function} [listener] + */ +export default function useScopeEventListener(eventName, listener) { + const { $scope } = useIdeContext() + + useEffect(() => { + return $scope.$on(eventName, listener) + }, [$scope, eventName, listener]) +}