fix(home): force agent launch and ensure canvas auto-send trigger
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-02-22 13:07:02 +08:00
parent d6637135f1
commit fb7b9a2009
2 changed files with 23 additions and 89 deletions

View File

@ -1181,6 +1181,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
const hiddenPromptRef = useRef<string | null>(null);
const autoContextRef = useRef<string | null>(null);
const pendingLaunchRef = useRef<CanvasLaunchPayload | null>(null);
const [launchAutoSendTick, setLaunchAutoSendTick] = useState(0);
const sessionMenuRef = useRef<HTMLDivElement>(null);
const historyScrollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
@ -1679,6 +1680,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
selectedModelId: parsed.selectedModelId,
imageParams: parsed.imageParams,
};
setLaunchAutoSendTick((value) => value + 1);
}
normalizedAttachments.forEach(async (attachment, index) => {
@ -2614,7 +2616,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
if (editableDiv) {
editableDiv.innerHTML = "";
}
}, [selectedModelId, status, sendMessage, clearSelection]);
}, [selectedModelId, status, sendMessage, clearSelection, launchAutoSendTick]);
// 当历史消息加载完成后,更新消息列表(支持同一会话的增量刷新)
const loadedHistorySignatureRef = useRef<string>("");

View File

@ -343,7 +343,6 @@ export function LovartHome({
const [usageFilter, setUsageFilter] = useState<"all" | "consumed" | "earned">("all");
const [billingCycle, setBillingCycle] = useState<"monthly" | "annual">("monthly");
const [creatingPaymentPackageId, setCreatingPaymentPackageId] = useState<string | null>(null);
const [selectedModelId, setSelectedModelId] = useState<string>("");
const [imageParams, setImageParams] = useState<ImageGenerationParams>({
aspectRatio: "auto",
imageSize: "2K",
@ -457,11 +456,6 @@ export function LovartHome({
const membershipPlans = membershipConfig?.plans || [];
const currentPlan = membershipData?.currentPlan;
const imageModels = useMemo(
() => (modelsData?.models || []).filter((model) => model.supportsImageGen),
[modelsData?.models]
);
const autoComposerModel = useMemo<ModelOption>(
() => ({
id: "auto",
@ -475,24 +469,8 @@ export function LovartHome({
[modelsData?.agentModel?.avatarUrl, modelsData?.agentModel?.imageGenConfig]
);
const allComposerModels = useMemo<ModelOption[]>(
() => [autoComposerModel, ...imageModels],
[autoComposerModel, imageModels]
);
const composerModelValue = useMemo(() => {
if (!selectedModelId) return "auto";
if (allComposerModels.some((model) => model.id === selectedModelId)) {
return selectedModelId;
}
return "auto";
}, [allComposerModels, selectedModelId]);
const triggerComposerModel = useMemo(
() =>
allComposerModels.find((model) => model.id === composerModelValue) ||
allComposerModels.find((model) => model.id === "auto"),
[allComposerModels, composerModelValue]
);
const composerModelValue = "auto";
const triggerComposerModel = autoComposerModel;
const isMembershipEnabled = siteSettingsData?.membershipConfig?.enabled !== false;
const discoveryTabs = useMemo(() => {
@ -682,19 +660,6 @@ export function LovartHome({
window.location.replace("/");
};
useEffect(() => {
if (selectedModelId) return;
const defaultModelId = siteSettingsData?.canvasDefaultModelId || "auto";
setSelectedModelId(defaultModelId);
}, [selectedModelId, siteSettingsData?.canvasDefaultModelId]);
useEffect(() => {
if (!selectedModelId) return;
if (allComposerModels.length === 0) return;
if (allComposerModels.some((model) => model.id === selectedModelId)) return;
setSelectedModelId("auto");
}, [allComposerModels, selectedModelId]);
useEffect(() => {
if (!isAuthenticated) return;
setLoginDialogOpen(false);
@ -1078,7 +1043,7 @@ export function LovartHome({
attachments: uploadedAttachments,
autoSend: true,
createdAt: Date.now(),
selectedModelId: composerModelValue,
selectedModelId: "auto",
imageParams,
})
);
@ -1665,57 +1630,24 @@ export function LovartHome({
/>
</label>
<Select value={composerModelValue} onValueChange={setSelectedModelId}>
<SelectTrigger className="h-8 w-auto min-w-[130px] rounded-full border border-blue-100 bg-blue-50 px-2 text-xs text-blue-600">
<div className="flex min-w-0 items-center gap-1.5">
<span className="h-5 w-5 overflow-hidden rounded-full border border-blue-200 bg-white">
{triggerComposerModel?.avatarUrl ? (
<img
src={triggerComposerModel.avatarUrl}
alt={triggerComposerModel.displayName || "模型头像"}
className="h-full w-full object-cover"
/>
) : (
<span className="flex h-full w-full items-center justify-center text-[10px] font-medium text-blue-500">
{(triggerComposerModel?.displayName || "A").slice(0, 1)}
</span>
)}
<div className="inline-flex h-8 min-w-[130px] items-center gap-1.5 rounded-full border border-blue-100 bg-blue-50 px-2 text-xs text-blue-600">
<span className="h-5 w-5 overflow-hidden rounded-full border border-blue-200 bg-white">
{triggerComposerModel?.avatarUrl ? (
<img
src={triggerComposerModel.avatarUrl}
alt={triggerComposerModel.displayName || "模型头像"}
className="h-full w-full object-cover"
/>
) : (
<span className="flex h-full w-full items-center justify-center text-[10px] font-medium text-blue-500">
{(triggerComposerModel?.displayName || "A").slice(0, 1)}
</span>
<span className="max-w-[95px] truncate">
{triggerComposerModel?.displayName || "Agent模式"}
</span>
</div>
</SelectTrigger>
<SelectContent className="w-[238px] max-h-[340px] overflow-hidden rounded-[18px] border border-[#cfd4dc] bg-[#f3f4f6]/90 p-1.5 shadow-[0_8px_20px_rgba(15,23,42,0.13)]">
<div className="max-h-[312px] space-y-0.5 overflow-y-auto pr-1">
{allComposerModels.map((model) => (
<SelectItem
key={model.id}
value={model.id}
className="h-[34px] rounded-xl px-2.5 text-[#2f3640] [&>span:first-child]:hidden [&>span:last-child]:block [&>span:last-child]:w-full focus:bg-[#e7ebf0] focus:text-[#1f2937] data-[state=checked]:bg-[#e7ebf0] data-[state=checked]:text-[#1f2937]"
>
<span className="flex w-full items-center justify-between gap-2">
<span className="flex min-w-0 items-center gap-2">
<span className="h-5 w-5 overflow-hidden rounded-full border border-[#d4d9df] bg-white">
{model.avatarUrl ? (
<img src={model.avatarUrl} alt={model.displayName} className="h-full w-full object-cover" />
) : (
<span className="flex h-full w-full items-center justify-center text-[9px] font-medium text-[#6b7280]">
{model.id === "auto" ? "A" : model.displayName.slice(0, 1)}
</span>
)}
</span>
<span className="truncate text-[12px] font-medium leading-none">{model.displayName}</span>
</span>
{composerModelValue === model.id ? (
<span className="text-sm font-semibold text-[#1f2937]">✓</span>
) : null}
</span>
</SelectItem>
))}
</div>
</SelectContent>
</Select>
)}
</span>
<span className="max-w-[95px] truncate">
{triggerComposerModel?.displayName || "Agent模式"}
</span>
</div>
<div className="min-w-0 flex-1 overflow-hidden">
<ImageParamsBar