diff --git a/components/home/lovart-home.tsx b/components/home/lovart-home.tsx index d0ab4a6c7..3b953b3bc 100644 --- a/components/home/lovart-home.tsx +++ b/components/home/lovart-home.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useRouter } from "next/navigation"; import { signIn, signOut } from "next-auth/react"; import { useTheme } from "next-themes"; @@ -443,7 +443,11 @@ export function LovartHome({ imageSize: "2K", imageCount: 1, }); - const [composerModelId, setComposerModelId] = useState("auto"); + const [composerModelId, setComposerModelId] = useState(""); + const [hasComposerModelInteracted, setHasComposerModelInteracted] = + useState(false); + const [isComposerAgentModeActive, setIsComposerAgentModeActive] = + useState(false); const [loginDialogOpen, setLoginDialogOpen] = useState(false); const [loginEmail, setLoginEmail] = useState(""); const [loginPassword, setLoginPassword] = useState(""); @@ -699,9 +703,12 @@ export function LovartHome({ }); return [autoComposerModel, ...imageModels]; }, [autoComposerModel, modelsData?.models]); + const fallbackComposerModel = + composerModelOptions.find((model) => model.id !== "auto") || + autoComposerModel; const selectedComposerModel = composerModelOptions.find((model) => model.id === composerModelId) || - autoComposerModel; + fallbackComposerModel; const isMembershipEnabled = siteSettingsData?.membershipConfig?.enabled !== false; const discoveryTabs = useMemo(() => { @@ -942,11 +949,43 @@ export function LovartHome({ }, []); useEffect(() => { + const fallbackModelId = fallbackComposerModel.id || "auto"; + + if ( + !hasComposerModelInteracted && + !isComposerAgentModeActive && + composerModelId === "auto" && + fallbackModelId !== "auto" + ) { + setComposerModelId(fallbackModelId); + return; + } + if (composerModelOptions.some((model) => model.id === composerModelId)) { return; } - setComposerModelId("auto"); - }, [composerModelId, composerModelOptions]); + + setComposerModelId(fallbackModelId); + }, [ + composerModelId, + composerModelOptions, + fallbackComposerModel.id, + hasComposerModelInteracted, + isComposerAgentModeActive, + ]); + + const handleComposerModelChange = useCallback((modelId: string) => { + setHasComposerModelInteracted(true); + setIsComposerAgentModeActive(modelId === "auto"); + setComposerModelId(modelId); + }, []); + + const toggleComposerAgentMode = useCallback(() => { + setHasComposerModelInteracted(true); + const nextIsActive = !isComposerAgentModeActive; + setIsComposerAgentModeActive(nextIsActive); + setComposerModelId(nextIsActive ? "auto" : fallbackComposerModel.id || ""); + }, [fallbackComposerModel.id, isComposerAgentModeActive]); useEffect(() => { if (!featuredLoadMoreRef.current || !hasMoreFeatured) return; @@ -1340,7 +1379,9 @@ export function LovartHome({ attachments: uploadedAttachments, autoSend: true, createdAt: Date.now(), - selectedModelId: selectedComposerModel.id || "auto", + selectedModelId: isComposerAgentModeActive + ? "auto" + : selectedComposerModel.id || fallbackComposerModel.id || "", imageParams, }) ); @@ -1791,11 +1832,12 @@ export function LovartHome({ heroSubtitleText={heroSubtitleText} heroTitleText={heroTitleText} homeAnimationData={homeAnimationData} + isAgentModeActive={isComposerAgentModeActive} isMembershipEnabled={isMembershipEnabled} isSubmitting={isSubmitting} modelOptions={composerModelOptions} - onModelChange={setComposerModelId} - onStartAgentMode={() => setComposerModelId("auto")} + onModelChange={handleComposerModelChange} + onStartAgentMode={toggleComposerAgentMode} onSubmit={createCanvasFromComposer} openUpgradeDialog={() => setUpgradeDialogOpen(true)} prompt={prompt} diff --git a/components/home/lovart/lovart-hero-composer.tsx b/components/home/lovart/lovart-hero-composer.tsx index e951778b5..4a4485381 100644 --- a/components/home/lovart/lovart-hero-composer.tsx +++ b/components/home/lovart/lovart-hero-composer.tsx @@ -9,6 +9,7 @@ import { SelectTrigger, } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; +import { cn } from "@/lib/utils"; import type { ModelOption, UploadFileItem } from "./types"; import type { PROMPT_TAGS } from "./utils"; @@ -28,6 +29,7 @@ type LovartHeroComposerProps = { htmlContent?: string; fileName?: string; }; + isAgentModeActive: boolean; isMembershipEnabled: boolean; isSubmitting: boolean; onSubmit: () => void; @@ -54,6 +56,7 @@ export function LovartHeroComposer({ heroSubtitleText, heroTitleText, homeAnimationData, + isAgentModeActive, isMembershipEnabled, isSubmitting, onSubmit, @@ -153,7 +156,12 @@ export function LovartHeroComposer({