hedgedoc/src/components/editor-page/renderer-pane/hooks/use-send-scroll-state.ts
Philip Molares ecffebc43c
docs: consolidate docs (#2182)
Signed-off-by: Philip Molares <philip.molares@udo.edu>
2022-07-21 22:36:46 +02:00

31 lines
1.3 KiB
TypeScript

/*
* SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file)
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { useCallback, useRef } from 'react'
import type { ScrollState } from '../../synced-scroll/scroll-props'
import { CommunicationMessageType } from '../../../render-page/window-post-message-communicator/rendering-message'
import { useEffectOnRendererReady } from '../../../render-page/window-post-message-communicator/hooks/use-effect-on-renderer-ready'
import equal from 'fast-deep-equal'
import { useEditorToRendererCommunicator } from '../../render-context/editor-to-renderer-communicator-context-provider'
/**
* Sends the given {@link ScrollState scroll state} to the renderer if the content changed.
*
* @param scrollState The scroll state to send
*/
export const useSendScrollState = (scrollState: ScrollState | undefined): void => {
const iframeCommunicator = useEditorToRendererCommunicator()
const oldScrollState = useRef<ScrollState | undefined>(undefined)
useEffectOnRendererReady(
useCallback(() => {
if (scrollState && !equal(scrollState, oldScrollState.current)) {
oldScrollState.current = scrollState
iframeCommunicator.sendMessageToOtherSide({ type: CommunicationMessageType.SET_SCROLL_STATE, scrollState })
}
}, [iframeCommunicator, scrollState])
)
}