import { ClientWidgetApi, IWidgetApiAcknowledgeResponseData, IWidgetApiRequestData, } from 'matrix-widget-api'; import { useCallback, useEffect, useState } from 'react'; import { CallControl, CallControlEvent } from './CallControl'; import { CallControlState } from './CallControlState'; export const useClientWidgetApiEvent = ( api: ClientWidgetApi | undefined, type: string, callback: (event: CustomEvent) => void, ) => { useEffect(() => { api?.on(`action:${type}`, callback); return () => { api?.off(`action:${type}`, callback); }; }, [api, type, callback]); }; export const useSendClientWidgetApiAction = (api: ClientWidgetApi) => { const sendWidgetAction = useCallback( async ( action: string, data: T, ): Promise => api.transport.send(action, data), [api], ); return sendWidgetAction; }; const DEFAULT_CONTROL_STATE = new CallControlState(false, false, false); export const useCallControlState = (control: CallControl | undefined): CallControlState => { const [state, setState] = useState(control?.getState() ?? DEFAULT_CONTROL_STATE); useEffect(() => { if (!control) { setState(DEFAULT_CONTROL_STATE); return; } setState(control.getState()); const handleUpdate = () => setState(control.getState()); control.on(CallControlEvent.StateUpdate, handleUpdate); return () => { control.off(CallControlEvent.StateUpdate, handleUpdate); }; }, [control]); return state; };