返回 presentation-ai
RegenerateSlide.tsx
根目录 / src / components / presentation / agent / tools / RegenerateSlide.tsx
1 "use client";
2
3 import { getSlidesToUpdate } from "@/hooks/presentation/agentTools";
4 import { CheckCircle2, Layers } from "lucide-react";
5 import { useMemo } from "react";
6
7 type Scope = "all" | undefined;
8
9 export function PresentationRegenerateSlideCall({
10 slideIds,
11 scope,
12 loading,
13 }: {
14 slideIds?: string[];
15 scope?: Scope;
16 loading?: boolean;
17 }) {
18 const targetSlides = useMemo(
19 () => getSlidesToUpdate(scope, slideIds),
20 [scope, slideIds],
21 );
22
23 return (
24 <div
25 className={
26 "rounded-lg border bg-card shadow-2xs transition-opacity" +
27 (loading ? " opacity-60" : "")
28 }
29 >
30 <div className="flex items-center justify-between border-b bg-muted/30 px-4 py-3">
31 <div className="flex items-center gap-2">
32 <CheckCircle2 className="h-4 w-4 text-green-600" />
33 <span className="text-sm font-medium">Slides Regenerated</span>
34 </div>
35 </div>
36
37 <div className="space-y-4 p-4">
38 <div className="flex items-center gap-2 text-sm">
39 <Layers className="h-4 w-4 text-muted-foreground" />
40 <span className="text-muted-foreground">Target:</span>
41 <span className="font-medium">
42 {scope === "all" || (!scope && targetSlides?.length === 0)
43 ? `All slides (${targetSlides?.length ?? 0})`
44 : `${targetSlides?.length ?? 0} slide${targetSlides?.length !== 1 ? "s" : ""}`}
45 </span>
46 </div>
47 </div>
48 </div>
49 );
50 }
51
52 export function PresentationRegenerateSlideResult({
53 message,
54 }: {
55 message?: string;
56 }) {
57 return (
58 <div className="rounded-md border bg-accent/30 p-2 text-xs">
59 <div className="text-foreground">{message ?? "Slides regenerated"}</div>
60 </div>
61 );
62 }
63
63 lines Plain Text