"use client"; import { MODELS } from "@turbostarter/ai/image/constants"; import { useTranslation } from "@turbostarter/i18n"; import { Button } from "@turbostarter/ui-web/button"; import { Icons } from "@turbostarter/ui-web/icons"; import { ScrollArea } from "@turbostarter/ui-web/scroll-area"; import { ProviderIcons } from "~/modules/common/ai/icons"; import { Stopwatch } from "~/modules/common/stopwatch"; import { useImageGeneration } from "../../use-image-generation"; import { Details } from "./details"; import { Images } from "./images"; import type { ImageGeneration } from "../../use-image-generation"; interface ViewGenerationProps { id: string; initialGeneration?: ImageGeneration; } export const ViewGeneration = ({ id, initialGeneration, }: ViewGenerationProps) => { const { t } = useTranslation(["common", "ai"]); const { generation, stop, reload } = useImageGeneration({ id, initialGeneration, }); if (!generation) { return null; } const model = MODELS.find( (model) => model.id === generation.input?.options.model, ); const Icon = model ? ProviderIcons[model.provider] : null; return (
{Icon && } {model?.name}
{generation.createdAt && !generation.completedAt && ( )} {generation.completedAt && ( (generation.completedAt.getTime() - (generation.createdAt?.getTime() ?? 0)) / 1000 ).toFixed(1)} {`s`}
{generation.completedAt ? ( ) : ( )}

“{generation.input?.prompt}”

{["created", "loading"].includes(generation.status ?? "") ? ( ) : generation.status === "error" ? ( ) : generation.images?.length ? ( ({ ...image, generationId: id, description: generation.input?.prompt, aspectRatio: generation.input?.options.aspectRatio, model: generation.input?.options.model, }))} /> ) : ( )}
); };