From 4e752d7a9ec0cdf0fc499f1e7bb4e37a8cde9e55 Mon Sep 17 00:00:00 2001 From: BFlat Date: Wed, 25 Mar 2026 18:32:43 +0700 Subject: [PATCH] =?UTF-8?q?button=20to=20copy=20text=20prompt=20directly?= =?UTF-8?q?=20from=20image=20gen=20history=20and=20added=20=E2=80=A6=20(#1?= =?UTF-8?q?218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …icons next to model name {C9321025-FD31-4C46-A096-38E006009081} --- .../app/src/pages/PageImage/TextToImage.tsx | 44 ++++++++++++++----- .../src/pages/PageImage/TextToImageStore.ts | 5 +++ .../libs/components/badge/src/lib/badge.tsx | 7 ++- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/frontend/apps/artcraft/app/src/pages/PageImage/TextToImage.tsx b/frontend/apps/artcraft/app/src/pages/PageImage/TextToImage.tsx index 0b89ef9aec..79aaa83aa2 100644 --- a/frontend/apps/artcraft/app/src/pages/PageImage/TextToImage.tsx +++ b/frontend/apps/artcraft/app/src/pages/PageImage/TextToImage.tsx @@ -17,9 +17,14 @@ import { //ProviderSelector, //PROVIDER_LOOKUP_BY_PAGE, } from "@storyteller/ui-model-selector"; -import { ImageModel } from "@storyteller/model-list"; +import { ImageModel, getCreatorIcon } from "@storyteller/model-list"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faCircleExclamation, faXmark } from "@fortawesome/pro-solid-svg-icons"; +import { + faCheck, + faCircleExclamation, + faCopy, + faXmark, +} from "@fortawesome/pro-solid-svg-icons"; interface TextToImageProps { imageMediaId?: string; imageUrl?: string; @@ -42,6 +47,7 @@ import { useCostBreakdownModalStore, } from "@storyteller/ui-pricing-modal"; import { GenerationProvider } from "@storyteller/api-enums"; +import Button from "node_modules/@storyteller/ui-button/src/lib/button"; const PAGE_ID: ModelPage = ModelPage.TextToImage; @@ -54,6 +60,7 @@ const TextToImage = ({ imageMediaId, imageUrl }: TextToImageProps) => { const dismissBatch = useTextToImageStore((s) => s.dismissBatch); const resetBatches = useTextToImageStore((s) => s.reset); const [imageRowVisible, setImageRowVisible] = useState(false); + const [copiedBatchId, setCopiedBatchId] = useState(null); const promptContentRef = useRef(null); const [promptHeight, setPromptHeight] = useState(138); @@ -69,9 +76,9 @@ const TextToImage = ({ imageMediaId, imageUrl }: TextToImageProps) => { const jobContext: JobContextType = { jobTokens: [], - addJobToken: () => {}, - removeJobToken: () => {}, - clearJobTokens: () => {}, + addJobToken: () => { }, + removeJobToken: () => { }, + clearJobTokens: () => { }, }; const hasAnyBatches = batches.length > 0; @@ -264,10 +271,10 @@ const TextToImage = ({ imageMediaId, imageUrl }: TextToImageProps) => { length: Math.max( 0, 4 - - Math.max( - 1, - Math.min(4, batch.requestedCount ?? 4), - ), + Math.max( + 1, + Math.min(4, batch.requestedCount ?? 4), + ), ), }).map((_, i) => (
{
{batch.prompt}
-
+
+
@@ -365,7 +387,7 @@ const TextToImage = ({ imageMediaId, imageUrl }: TextToImageProps) => { credits={imageCredits} onEnqueuePressed={async (prompt, count, subscriberId) => { const modelLabel = selectedImageModel?.fullName ?? ""; - startBatch(prompt, count, modelLabel, subscriberId); + startBatch(prompt, count, modelLabel, subscriberId, selectedImageModel?.creator); }} />
diff --git a/frontend/apps/artcraft/app/src/pages/PageImage/TextToImageStore.ts b/frontend/apps/artcraft/app/src/pages/PageImage/TextToImageStore.ts index 4319ac2d22..c900486f53 100644 --- a/frontend/apps/artcraft/app/src/pages/PageImage/TextToImageStore.ts +++ b/frontend/apps/artcraft/app/src/pages/PageImage/TextToImageStore.ts @@ -1,5 +1,6 @@ import { create } from "zustand"; import type { GeneratedImage } from "@storyteller/tauri-events"; +import type { ModelCreator } from "@storyteller/model-list"; export type TextToImageBatch = { id: string; @@ -9,6 +10,7 @@ export type TextToImageBatch = { createdAt: number; requestedCount: number; modelLabel: string; + modelCreator?: ModelCreator; subscriberId: string; failureReason?: string; }; @@ -20,6 +22,7 @@ type TextToImageState = { requestedCount: number, modelLabel: string, subscriberId?: string, + modelCreator?: ModelCreator, ) => string; completeBatch: ( images: GeneratedImage[], @@ -38,6 +41,7 @@ export const useTextToImageStore = create((set, get) => ({ requestedCount: number, modelLabel: string, subscriberId?: string, + modelCreator?: ModelCreator, ) => { const id = subscriberId ? subscriberId @@ -52,6 +56,7 @@ export const useTextToImageStore = create((set, get) => ({ createdAt: Date.now(), requestedCount, modelLabel, + modelCreator, subscriberId: id, }; set((s) => ({ batches: [...s.batches, batch] })); diff --git a/frontend/libs/components/badge/src/lib/badge.tsx b/frontend/libs/components/badge/src/lib/badge.tsx index bc8ef8d89c..e885acc713 100644 --- a/frontend/libs/components/badge/src/lib/badge.tsx +++ b/frontend/libs/components/badge/src/lib/badge.tsx @@ -1,19 +1,22 @@ +import { ReactNode } from "react"; import { twMerge } from "tailwind-merge"; interface BadgeProps { label: string; color?: string; className?: string; + icon?: ReactNode; } -export const Badge = ({ label, className }: BadgeProps) => { +export const Badge = ({ label, className, icon }: BadgeProps) => { return (
+ {icon} {label}
);