17 lines
968 B
TypeScript
17 lines
968 B
TypeScript
import { useCallback, useContext, useSyncExternalStore } from "react";
|
|
import type { Spec } from "@json-render/core";
|
|
import type { AnswerViewStateScope } from "./answer-view-state-scope";
|
|
import { AnswerViewPersistenceContext } from "./answer-view-persistence-context";
|
|
|
|
export function useAnswerViewPersistence() { return useContext(AnswerViewPersistenceContext); }
|
|
export function useAnswerViewState(scope: AnswerViewStateScope, sessionId: string, messageId: string, blockId: string, spec: Spec, enabled = true) {
|
|
const entry = scope.entry(sessionId, messageId, blockId, spec);
|
|
const snapshot = useSyncExternalStore(
|
|
useCallback((listener: () => void) => scope.subscribe(entry, listener, enabled), [scope, entry, enabled]),
|
|
() => entry.snapshot,
|
|
() => entry.snapshot,
|
|
);
|
|
return { ...snapshot, update: scope.update.bind(scope, entry), retry: () => scope.retry(entry),
|
|
reload: () => scope.reload(entry), resave: () => scope.resave(entry) };
|
|
}
|