修复新首页Agent显示并按会员开关隐藏升级入口
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-15 00:46:35 +08:00
parent 9a3b28fa8e
commit 2607c6c7a7

View File

@ -374,6 +374,9 @@ export function LovartHome({
canvasDefaultModelId?: string | null;
lovartComposerPrefix?: string | null;
lovartComposerPreviewTexts?: string[];
membershipConfig?: {
enabled?: boolean;
};
toolbox1Name?: string | null;
toolbox1Enabled?: boolean;
toolbox2Name?: string | null;
@ -424,10 +427,20 @@ export function LovartHome({
[imageModels]
);
const currentComposerModel = useMemo(
() => allComposerModels.find((model) => model.id === selectedModelId),
[allComposerModels, selectedModelId]
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 isMembershipEnabled = siteSettingsData?.membershipConfig?.enabled !== false;
const discoveryTabs = useMemo(() => {
const configured = (surpriseCategories || [])
@ -557,11 +570,10 @@ export function LovartHome({
useEffect(() => {
if (!selectedModelId) return;
if (!modelsData) return;
if (allComposerModels.length === 0) return;
if (allComposerModels.some((model) => model.id === selectedModelId)) return;
setSelectedModelId("auto");
}, [allComposerModels, selectedModelId, modelsData]);
}, [allComposerModels, selectedModelId]);
useEffect(() => {
if (!isAuthenticated) return;
@ -862,7 +874,7 @@ export function LovartHome({
attachments: uploadedAttachments,
autoSend: true,
createdAt: Date.now(),
selectedModelId: selectedModelId || "auto",
selectedModelId: composerModelValue,
imageParams,
})
);
@ -964,67 +976,69 @@ export function LovartHome({
<Bell className="h-3.5 w-3.5" />
</button>
<HoverCard openDelay={100} closeDelay={120}>
<HoverCardTrigger asChild>
<Button
variant="ghost"
onClick={() => setUpgradeDialogOpen(true)}
className="h-8 rounded-[14px] bg-[#1c1c1e] px-2.5 text-[14px] text-white hover:bg-black hover:text-white"
>
<span className="mr-1.5">升级</span>
<div className="inline-flex items-center gap-1 rounded-[9px] bg-white/10 px-1.5 py-0.5 text-xs text-white">
<Zap className="h-3 w-3 text-amber-300" />
{membershipData?.summary?.currentCredits ?? 0}
</div>
</Button>
</HoverCardTrigger>
<HoverCardContent
align="end"
sideOffset={10}
className="w-[300px] rounded-3xl border border-black/10 bg-white p-0 shadow-xl"
>
<div className="p-4">
<div className="mb-4 flex items-start justify-between">
<div>
<div className="text-[22px] font-semibold leading-none text-black">
{currentPlan?.name || "Free"}
</div>
</div>
{isMembershipEnabled ? (
<HoverCard openDelay={100} closeDelay={120}>
<HoverCardTrigger asChild>
<Button
size="sm"
className="h-8 rounded-2xl bg-[#2f3542] px-4 text-[13px] text-white hover:bg-[#242a36]"
variant="ghost"
onClick={() => setUpgradeDialogOpen(true)}
className="h-8 rounded-[14px] bg-[#1c1c1e] px-2.5 text-[14px] text-white hover:bg-black hover:text-white"
>
升级
<span className="mr-1.5">升级</span>
<div className="inline-flex items-center gap-1 rounded-[9px] bg-white/10 px-1.5 py-0.5 text-xs text-white">
<Zap className="h-3 w-3 text-amber-300" />
{membershipData?.summary?.currentCredits ?? 0}
</div>
</Button>
</div>
<div className="space-y-2.5 border-t border-black/10 pt-3 text-[14px]">
<div className="flex items-center justify-between">
<span className="inline-flex items-center gap-2 text-black/80">
<Sparkles className="h-3.5 w-3.5" />
积分
</span>
<span>{membershipData?.summary?.currentCredits ?? 0}</span>
</div>
<div className="flex items-center justify-between">
<span className="inline-flex items-center gap-2 text-black/80">
<Upload className="h-3.5 w-3.5" />
每日免费积分
</span>
<span>{membershipData?.summary?.dailyFreeCredits ?? 0}</span>
</div>
</div>
<button
type="button"
className="mt-4 inline-flex items-center gap-1 text-[12px] font-medium text-black/80 hover:text-black"
onClick={() => setUpgradeDialogOpen(true)}
</HoverCardTrigger>
<HoverCardContent
align="end"
sideOffset={10}
className="w-[300px] rounded-3xl border border-black/10 bg-white p-0 shadow-xl"
>
使用详情
<ChevronDown className="h-4 w-4 -rotate-90" />
</button>
</div>
</HoverCardContent>
</HoverCard>
<div className="p-4">
<div className="mb-4 flex items-start justify-between">
<div>
<div className="text-[22px] font-semibold leading-none text-black">
{currentPlan?.name || "Free"}
</div>
</div>
<Button
size="sm"
className="h-8 rounded-2xl bg-[#2f3542] px-4 text-[13px] text-white hover:bg-[#242a36]"
onClick={() => setUpgradeDialogOpen(true)}
>
升级
</Button>
</div>
<div className="space-y-2.5 border-t border-black/10 pt-3 text-[14px]">
<div className="flex items-center justify-between">
<span className="inline-flex items-center gap-2 text-black/80">
<Sparkles className="h-3.5 w-3.5" />
积分
</span>
<span>{membershipData?.summary?.currentCredits ?? 0}</span>
</div>
<div className="flex items-center justify-between">
<span className="inline-flex items-center gap-2 text-black/80">
<Upload className="h-3.5 w-3.5" />
每日免费积分
</span>
<span>{membershipData?.summary?.dailyFreeCredits ?? 0}</span>
</div>
</div>
<button
type="button"
className="mt-4 inline-flex items-center gap-1 text-[12px] font-medium text-black/80 hover:text-black"
onClick={() => setUpgradeDialogOpen(true)}
>
使用详情
<ChevronDown className="h-4 w-4 -rotate-90" />
</button>
</div>
</HoverCardContent>
</HoverCard>
) : null}
{isAuthenticated ? (
<HoverCard openDelay={80} closeDelay={120}>
@ -1248,15 +1262,17 @@ export function LovartHome({
<main className="mx-auto max-w-[1240px] px-6 pb-20 pt-[84px]">
<section className="mt-8 text-center">
<button
type="button"
onClick={() => setUpgradeDialogOpen(true)}
className="inline-flex items-center gap-2 rounded-full bg-[#fde8bf] px-4 py-2 text-sm text-black/80"
>
<span className="rounded-full bg-[#ff9d3d] px-2 py-0.5 text-[10px] font-semibold text-white">NEW</span>
{heroPromoText || "现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠"}
<span className="text-[#ff7a00]">{heroPromoActionText || "立即升级"}</span>
</button>
{isMembershipEnabled ? (
<button
type="button"
onClick={() => setUpgradeDialogOpen(true)}
className="inline-flex items-center gap-2 rounded-full bg-[#fde8bf] px-4 py-2 text-sm text-black/80"
>
<span className="rounded-full bg-[#ff9d3d] px-2 py-0.5 text-[10px] font-semibold text-white">NEW</span>
{heroPromoText || "现在升级,立享 Kling 3.0 与 Nano Banana Pro,最高 5 折优惠"}
<span className="text-[#ff7a00]">{heroPromoActionText || "立即升级"}</span>
</button>
) : null}
<div className="mt-8 flex items-center justify-center gap-2">
{siteLogo ? (
@ -1315,26 +1331,26 @@ export function LovartHome({
/>
</label>
<Select value={selectedModelId || "auto"} onValueChange={setSelectedModelId}>
<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">
<span className="flex min-w-0 items-center gap-1.5">
<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">
{currentComposerModel?.avatarUrl ? (
{triggerComposerModel?.avatarUrl ? (
<img
src={currentComposerModel.avatarUrl}
alt={currentComposerModel.displayName || "模型头像"}
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">
{(currentComposerModel?.displayName || "A").slice(0, 1)}
{(triggerComposerModel?.displayName || "A").slice(0, 1)}
</span>
)}
</span>
<span className="max-w-[95px] truncate">
{currentComposerModel?.displayName || "Agent模式"}
{triggerComposerModel?.displayName || "Agent模式"}
</span>
</span>
</div>
</SelectTrigger>
<SelectContent className="w-[238px] max-h-[340px] overflow-hidden rounded-[18px] border border-[#cfd4dc] bg-[#f3f4f6] 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">
@ -1357,7 +1373,7 @@ export function LovartHome({
</span>
<span className="truncate text-[12px] font-medium leading-none">{model.displayName}</span>
</span>
{(selectedModelId || "auto") === model.id ? (
{composerModelValue === model.id ? (
<span className="text-sm font-semibold text-[#1f2937]">✓</span>
) : null}
</span>
@ -1369,11 +1385,11 @@ export function LovartHome({
<div className="min-w-0 flex-1 overflow-hidden">
<ImageParamsBar
modelName={currentComposerModel?.displayName}
modelName={triggerComposerModel?.displayName}
initialParams={imageParams}
onParamsChange={handleImageParamsChange}
inline
providerType={currentComposerModel?.providerType}
providerType={triggerComposerModel?.providerType}
/>
</div>
</div>