import AskUserQuestionDialog from "@/components/AskUserQuestionDialog.vue";
import ConfirmDialog from "@/components/ConfirmDialog.vue";
import type {
AskUserQuestionPayload,
ConfirmDialogPayload,
DialogInstance,
DialogKind,
InteractionPayload,
InteractionUiHints,
QueueKind,
} from "./types";
interface DialogDefinition<TPayload> {
kind: DialogKind;
queueKind: QueueKind;
decode: (payload: InteractionPayload) => DialogInstance<TPayload> | null;
}
function resolveLayout(uiHints: InteractionUiHints | undefined, fallback: string) {
return uiHints?.layout ?? fallback;
}
const dialogRegistry: Record<DialogKind, DialogDefinition<unknown>> = {
"ask-user-question": {
kind: "ask-user-question",
queueKind: "question",
decode(payload) {
const request = payload.request as AskUserQuestionPayload;
const layout = resolveLayout(payload.uiHints, payload.kind);
return {
kind: "ask-user-question",
queueKind: "question",
component: AskUserQuestionDialog,
payload: {
id: payload.id,
...request,
layout,
},
};
},
},
"confirm-action": {
kind: "confirm-action",
queueKind: "confirm",
decode(payload) {
const request = payload.request as ConfirmDialogPayload;
const layout = resolveLayout(payload.uiHints, payload.kind);
return {
kind: "confirm-action",
queueKind: "confirm",
component: ConfirmDialog,
payload: {
id: payload.id,
...request,
layout,
},
};
},
},
};
/**
* 将后端发来的交互载荷转换为可渲染的对话框实例。
*/
export function decodeInteraction(payload: InteractionPayload): DialogInstance | null {
const def = dialogRegistry[payload.kind];
if (!def) {
return null;
}
return def.decode(payload);
}