Files
DndGamePlayer/app/renderer/shared/effects/useSceneMarkerState.ts
Ivan Fontosh 8b28a9b11a feat(control): инструмент «Маркер» на области видимости
Добавлена кисть маркера на пульте и презентации с настройками в панели эффектов; штрихи привязаны к жёлтой рамке, ластик и очистка работают с отдельным сессионным слоем.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 12:53:06 +08:00

38 lines
1.1 KiB
TypeScript

import { useEffect, useState } from 'react';
import { ipcChannels } from '../../../shared/ipc/contracts';
import type { SceneMarkerEvent, SceneMarkerState } from '../../../shared/types';
import { getDndApi } from '../dndApi';
export function useSceneMarkerState(): readonly [
SceneMarkerState | null,
{ dispatch: (event: SceneMarkerEvent) => Promise<void> },
] {
const api = getDndApi();
const [state, setState] = useState<SceneMarkerState | null>(null);
useEffect(() => {
void api.invoke(ipcChannels.sceneMarker.getState, {}).then((r) => {
setState((prev) => {
if (prev && prev.revision > r.state.revision) return prev;
return r.state;
});
});
return api.on(ipcChannels.sceneMarker.stateChanged, ({ state: next }) => {
setState((prev) => {
if (prev && prev.revision > next.revision) return prev;
return next;
});
});
}, [api]);
return [
state,
{
dispatch: async (event) => {
await api.invoke(ipcChannels.sceneMarker.dispatch, { event });
},
},
] as const;
}