fix: polish ecommerce generation states

This commit is contained in:
2026-06-12 18:15:58 +08:00
parent ad4bca31b1
commit 1f97167023
3 changed files with 44 additions and 23 deletions
+1 -4
View File
@@ -503,10 +503,7 @@ function App() {
<CloseOutlined /> <CloseOutlined />
</button> </button>
<span className="ecommerce-auth-modal__logo" aria-hidden="true"> <span className="ecommerce-auth-modal__logo" aria-hidden="true">
<i /> <img src="https://stringtest.oss-cn-hangzhou.aliyuncs.com/logo.png" alt="" />
<i />
<i />
<i />
</span> </span>
<h2 id="ecommerce-auth-title">{authMode === "login" ? "欢迎回来" : "创建账号"}</h2> <h2 id="ecommerce-auth-title">{authMode === "login" ? "欢迎回来" : "创建账号"}</h2>
<p className="ecommerce-auth-modal__subtitle">{authMode === "login" ? "登录后继续你的 AI 创作之旅" : "注册即可免费体验全部功能"}</p> <p className="ecommerce-auth-modal__subtitle">{authMode === "login" ? "登录后继续你的 AI 创作之旅" : "注册即可免费体验全部功能"}</p>
+26 -11
View File
@@ -106,7 +106,7 @@ const ecommerceInspirationAssets = ossAssets.ecommerce.inspiration;
const ecommerceInspirationRows = [ const ecommerceInspirationRows = [
{ {
title: "AI团队", title: "社区集锦",
desc: "不止作图,更懂转化。", desc: "不止作图,更懂转化。",
variant: "team", variant: "team",
cards: [ cards: [
@@ -3295,7 +3295,8 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
}, [openCloneBasicSelect]); }, [openCloneBasicSelect]);
useEffect(() => { useEffect(() => {
if (!composerMenu && !(status === "done" && !isCommandComposerCompact)) return undefined; const shouldAutoCompactComposer = (status === "generating" || status === "done") && !isCommandComposerCompact;
if (!composerMenu && !shouldAutoCompactComposer) return undefined;
const handlePointerDown = (event: PointerEvent) => { const handlePointerDown = (event: PointerEvent) => {
const target = event.target; const target = event.target;
@@ -3304,13 +3305,19 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
if (composer?.contains(target)) return; if (composer?.contains(target)) return;
if (composerMenu && composerMenu !== "settings") setComposerMenu(null); if (composerMenu && composerMenu !== "settings") setComposerMenu(null);
if (status === "done" && !isCommandComposerCompact) setIsCommandComposerCompact(true); if (shouldAutoCompactComposer) setIsCommandComposerCompact(true);
}; };
document.addEventListener("pointerdown", handlePointerDown); document.addEventListener("pointerdown", handlePointerDown);
return () => document.removeEventListener("pointerdown", handlePointerDown); return () => document.removeEventListener("pointerdown", handlePointerDown);
}, [composerMenu, isCommandComposerCompact, status]); }, [composerMenu, isCommandComposerCompact, status]);
useEffect(() => {
if ((status === "generating" || status === "done") && !isCommandComposerCompact) {
setIsCommandComposerCompact(true);
}
}, [isCommandComposerCompact, status]);
useEffect(() => { useEffect(() => {
if (composerMenuCloseTimeoutRef.current !== null) { if (composerMenuCloseTimeoutRef.current !== null) {
window.clearTimeout(composerMenuCloseTimeoutRef.current); window.clearTimeout(composerMenuCloseTimeoutRef.current);
@@ -4766,6 +4773,12 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
}; };
const showMainVideoWorkspace = cloneOutput === "video" && isVideoWorkspaceVisible; const showMainVideoWorkspace = cloneOutput === "video" && isVideoWorkspaceVisible;
const hasGenerationSurface = status === "generating" || status === "done" || canvasNodes.length > 0;
const showPreGenerationGuides =
(status === "idle" || status === "ready") &&
!showMainVideoWorkspace &&
!activeHistoryRecordId &&
canvasNodes.length === 0;
const scrollInspirationRow = (event: ReactMouseEvent<HTMLButtonElement>, direction: -1 | 1) => { const scrollInspirationRow = (event: ReactMouseEvent<HTMLButtonElement>, direction: -1 | 1) => {
const row = event.currentTarget.closest(".ecom-inspiration-row"); const row = event.currentTarget.closest(".ecom-inspiration-row");
@@ -5041,16 +5054,18 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
<section <section
ref={commandComposerWrapRef} ref={commandComposerWrapRef}
className={`clone-ai-bottom-input ecom-command-composer-wrap${status === "done" || canvasNodes.length > 0 ? " has-generated" : " is-before-generate"}${isCommandComposerCompact && (status === "done" || canvasNodes.length > 0) ? " is-compact" : ""}`} className={`clone-ai-bottom-input ecom-command-composer-wrap${hasGenerationSurface ? " has-generated" : " is-before-generate"}${isCommandComposerCompact && hasGenerationSurface ? " is-compact" : ""}`}
aria-label="生成指令" aria-label="生成指令"
onClick={() => { onClick={() => {
if (isCommandComposerCompact) setIsCommandComposerCompact(false); if (isCommandComposerCompact && status !== "generating") setIsCommandComposerCompact(false);
}} }}
> >
<h1 className={`ecom-command-title${status === "done" || canvasNodes.length > 0 ? " is-after-generate" : ""}`}> {!hasGenerationSurface ? (
{typewriterText} <h1 className="ecom-command-title">
<span className="typewriter-cursor" aria-hidden="true">|</span> {typewriterText}
</h1> <span className="typewriter-cursor" aria-hidden="true">|</span>
</h1>
) : null}
<input <input
ref={cloneReferenceInputRef} ref={cloneReferenceInputRef}
type="file" type="file"
@@ -5185,7 +5200,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
</div> </div>
{renderComposerMenu()} {renderComposerMenu()}
</div> </div>
{(status === "idle" || status === "ready") && !showMainVideoWorkspace ? ( {showPreGenerationGuides ? (
<section className="ecom-command-quick-board" aria-label="快捷功能"> <section className="ecom-command-quick-board" aria-label="快捷功能">
{[ {[
{ label: "A+/详情页", tone: "detail", icon: <LayoutOutlined />, onClick: openQuickDetailPage }, { label: "A+/详情页", tone: "detail", icon: <LayoutOutlined />, onClick: openQuickDetailPage },
@@ -5210,7 +5225,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
))} ))}
</section> </section>
) : null} ) : null}
{(status === "idle" || status === "ready") && !showMainVideoWorkspace ? ( {showPreGenerationGuides ? (
<section className="ecom-inspiration-lab" aria-label="电商灵感案例"> <section className="ecom-inspiration-lab" aria-label="电商灵感案例">
<div className="ecom-inspiration-rows"> <div className="ecom-inspiration-rows">
{ecommerceInspirationRows.map((row) => ( {ecommerceInspirationRows.map((row) => (
+17 -8
View File
@@ -455,19 +455,28 @@
.ecommerce-auth-modal__logo { .ecommerce-auth-modal__logo {
position: relative; position: relative;
display: block; display: grid;
place-items: center;
width: 58px; width: 58px;
height: 58px; height: 58px;
margin: 0 auto 14px; margin: 0 auto 14px;
overflow: hidden; overflow: visible;
border-radius: 13px; border-radius: 0;
background: transparent;
box-shadow: none;
} }
.ecommerce-auth-modal__logo i { .ecommerce-auth-modal__logo img {
position: absolute; display: block;
width: 35px; width: 58px;
height: 35px; height: 58px;
border-radius: 10px; object-fit: contain;
}
.ecommerce-auth-modal__logo i,
.ecommerce-auth-modal__logo::before {
content: none !important;
display: none !important;
} }
.ecommerce-auth-modal__logo i:nth-child(1) { .ecommerce-auth-modal__logo i:nth-child(1) {