import { Button, Tooltip } from "@prismicio/editor-ui"; import { SharedSlice } from "@prismicio/types-internal/lib/customtypes"; import { ReactNode } from "react"; import { Card, CardFooter, CardMedia } from "@/components/Card"; import { FigmaIconSquare } from "@/icons/FigmaIconSquare"; interface SliceCardProps { slice: Slice; } export function SliceCard(props: SliceCardProps) { const { slice } = props; const loading = slice.status === "uploading" || slice.status === "generating"; const error = slice.status === "uploadError" || slice.status === "generateError" || slice.status === "cancelled"; const hasThumbnail = slice.status === "pending" || slice.status === "generateError" || slice.status === "generating" || slice.status === "success" || slice.status === "cancelled"; let action: ReactNode | undefined; if (error) { action = ( ); } else if (slice.source === "figma") { action = ( ); } return ( {hasThumbnail ? ( ) : ( )} ); } export type Slice = { image: File; source: "upload" | "figma" } & ( | { status: "uploading" } | { status: "uploadError"; onRetry: () => void } | { status: "pending"; thumbnailUrl: string } | { status: "generating"; thumbnailUrl: string; requestId: string } | { status: "generateError"; thumbnailUrl: string; onRetry: () => void } | { status: "cancelled"; thumbnailUrl: string; onRetry: () => void } | { status: "success"; thumbnailUrl: string; model: SharedSlice; langSmithUrl?: string; } ); function getTitle(slice: Slice) { if (slice.status === "success") { return slice.model.name; } if (slice.source === "figma") { return slice.image.name.split(".")[0]; } return slice.image.name; } function getStartIcon(status: Slice["status"]) { switch (status) { case "uploadError": case "generateError": case "cancelled": return "close"; case "pending": return "image"; case "success": return "check"; default: return undefined; } } function formatFileSize(bytes: number): string { if (bytes < 1024) { return `${bytes} B`; } if (bytes < 1024 * 1024) { return `${(bytes / 1024).toFixed(1)} kB`; } return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; } function getSubtitle(slice: Slice) { switch (slice.status) { case "uploading": return "Uploading..."; case "pending": return formatFileSize(slice.image.size); case "uploadError": return "Unable to upload image"; case "generating": return "Generating..."; case "generateError": return "Something went wrong"; case "cancelled": return "Cancelled"; case "success": return "Generated"; } }