ai-chatbot/components/agents/AgentPageDark.tsx
Your Name 7eda4720d3
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: extend workflow category and card controls
2026-04-02 12:35:24 +08:00

139 lines
4.3 KiB
TypeScript

"use client";
import { useState } from "react";
import { motion, AnimatePresence } from "framer-motion";
import { AgentPresetPanelDark } from "./AgentPresetPanelDark";
import { AgentWorkflowPanelDark, type AgentWorkflowInputs } from "./AgentWorkflowPanelDark";
import { AgentGenerationWorkspaceDark } from "./AgentGenerationWorkspaceDark";
import {
createEmptyAgentWorkflowMaterialSelections,
normalizeAgentWorkflowMaterialSelections,
} from "@/lib/agents/workflow-material-config";
import type {
AgentWorkflowMaterialSelections,
AgentWorkflowStepKey,
AgentWorkflowComposerContext,
} from "@/types/agent";
interface AgentPageDarkProps {
projectId: string;
initialStage?: "preset" | "workflow" | "generate";
initialPresetId?: string | null;
workflowConfig?: any;
}
export function AgentPageDark({
projectId,
initialStage = "preset",
initialPresetId = null,
workflowConfig,
}: AgentPageDarkProps) {
const [stage, setStage] = useState<"preset" | "workflow" | "generate">(initialStage);
const [selectedPresetId, setSelectedPresetId] = useState<string | null>(initialPresetId);
// Workflow state
const [workflowInputs, setWorkflowInputs] = useState<AgentWorkflowInputs>({
primarySku: "",
secondarySku: "",
brand: "",
store: "",
thirdCategory: "",
priceBand: "",
});
const [workflowMaterials, setWorkflowMaterials] = useState<AgentWorkflowMaterialSelections>(
createEmptyAgentWorkflowMaterialSelections()
);
const [workflowSelections, setWorkflowSelections] = useState<
Partial<Record<AgentWorkflowStepKey, string>>
>({});
// Handle preset selection
const handleSelectPreset = (presetId: string | null) => {
setSelectedPresetId(presetId);
if (presetId) {
setStage("generate");
}
};
// Build workflow context
const workflowContext: AgentWorkflowComposerContext | null = {
inputs: workflowInputs,
materials: workflowMaterials,
selections: Object.entries(workflowSelections).map(([stepKey, optionKey]) => {
const step = workflowConfig?.steps?.find((s: any) => s.key === stepKey);
const option = step?.options?.find((o: any) => o.key === optionKey);
return {
stepKey,
stepTitle: step?.title || "",
optionKey: optionKey || "",
optionName: option?.buttonName || "",
promptFragment: option?.promptFragment || "",
};
}),
referenceImages: [],
summaryText: "",
promptText: "",
};
return (
<div className="bg-black min-h-screen">
<AnimatePresence mode="wait">
{stage === "preset" && (
<motion.div
key="preset"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0, x: -100 }}
transition={{ duration: 0.3 }}
>
<AgentPresetPanelDark
selectedPresetId={selectedPresetId}
onSelectPreset={handleSelectPreset}
/>
</motion.div>
)}
{stage === "workflow" && (
<motion.div
key="workflow"
initial={{ opacity: 0, x: 100 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -100 }}
transition={{ duration: 0.3 }}
>
<AgentWorkflowPanelDark
config={workflowConfig}
inputs={workflowInputs}
onInputsChange={setWorkflowInputs}
materials={workflowMaterials}
onMaterialsChange={setWorkflowMaterials}
selections={workflowSelections}
onSelectionsChange={setWorkflowSelections}
onNextStep={() => setStage("preset")}
onSkipStep={() => setStage("preset")}
/>
</motion.div>
)}
{stage === "generate" && (
<motion.div
key="generate"
initial={{ opacity: 0, x: 100 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -100 }}
transition={{ duration: 0.3 }}
>
<AgentGenerationWorkspaceDark
chatId={`canvas-${projectId}`}
projectId={projectId}
selectedAgentPresetId={selectedPresetId}
workflowContext={workflowContext}
onBack={() => setStage("preset")}
/>
</motion.div>
)}
</AnimatePresence>
</div>
);
}