();
if (presented !== question) {
setOutgoing(current.current);
setPresented(question);
if (immediately) setActive(question);
}
current.current = { children, question };
useEffect(() => {
if (active !== question) setActive(question);
}, [active, question]);
return (
{outgoing && (
setOutgoing(step => step?.question === outgoing.question ? undefined : step)}
>
{outgoing.children}
)}
{children}
);
}
function Undecided(
{ canEdit, connected, motion, value, wire, ...pointing }:
& {
canEdit: boolean;
connected: boolean;
motion?: QuestionStepMotion;
value: Questionnaire;
wire?: Transport;
}
& Pointing,
) {
let state = useQuestionnaire({
id: value.id,
bridge: wire,
connected,
definition: definition(value),
});
let answerable = connected && !!state.definition;
let editable = canEdit && answerable;
return (
(
{children}
)
: undefined}
status="open"
submitting={state.submitting}
{...pointing}
/>
);
}
function Decided(
{ resolved, value, ...pointing }: { resolved: Answer[]; value: Questionnaire } & Pointing,
) {
return (
}
>
);
}
function InlineQuestionnaire({ value }: { value: Questionnaire }) {
let options = useCellValue(widgets$);
return (
options.questions?.highlight(value.id, question)}
onQuestionLeave={() => options.questions?.clear()}
onQuestionSelect={question => options.questions?.reveal(value.id, question)}
places={options.questions?.counts(value.id)}
value={value}
wire={options.wire}
/>
);
}
export function renderQuestionnaire(node: QuestionnaireNode) {
// React renders decorators after Lexical's read transaction has ended.
return ;
}