返回 presentation-ai
useSlideOperations.ts
根目录 / src / hooks / presentation / useSlideOperations.ts
1 "use client";
2
3 import { nanoid } from "nanoid";
4
5 import { type PlateSlide } from "@/components/notebook/presentation/utils/parser";
6 import { getSlideAspectRatioForGenerationAspectRatio } from "@/lib/presentation/aspect-ratio";
7 import { usePresentationState } from "@/states/presentation-state";
8
9 export type InsertPosition = "before" | "after";
10
11 export function useSlideOperations() {
12 const setSlides = usePresentationState((s) => s.setSlides);
13 const setCurrentSlideId = usePresentationState((s) => s.setCurrentSlideId);
14 const buildSlide = (slide?: PlateSlide): PlateSlide => {
15 if (slide) {
16 return slide;
17 }
18
19 const { generationAspectRatio } = usePresentationState.getState();
20
21 return {
22 content: [
23 {
24 type: "h1",
25 children: [{ text: "" }],
26 },
27 ],
28 id: nanoid(),
29 alignment: "center",
30 formatCategory: "presentation",
31 aspectRatio: getSlideAspectRatioForGenerationAspectRatio(
32 generationAspectRatio,
33 ),
34 };
35 };
36
37 const addSlide = (
38 position: InsertPosition,
39 id: string,
40 slide?: PlateSlide,
41 ) => {
42 const newSlide = buildSlide(slide);
43 const { slides } = usePresentationState.getState();
44 const updatedSlides = [...slides];
45 const index = slides.findIndex((slide) => slide.id === id);
46 const insertIndex = position === "before" ? index : index + 1;
47 updatedSlides.splice(insertIndex, 0, newSlide);
48 setSlides(updatedSlides);
49 setCurrentSlideId(newSlide.id);
50 };
51
52 const addFirstSlide = (slide?: PlateSlide) => {
53 const newSlide = buildSlide(slide);
54 const { slides } = usePresentationState.getState();
55
56 if (slides.length === 0) {
57 setSlides([newSlide]);
58 setCurrentSlideId(newSlide.id);
59 return;
60 }
61
62 const updatedSlides = [...slides, newSlide];
63 setSlides(updatedSlides);
64 setCurrentSlideId(newSlide.id);
65 };
66
67 const deleteSlide = (id: string) => {
68 const { slides } = usePresentationState.getState();
69 const updatedSlides = [...slides];
70 const index = updatedSlides.findIndex((slide) => slide.id === id);
71 updatedSlides.splice(index, 1);
72 setSlides(updatedSlides);
73 };
74
75 return { addSlide, addFirstSlide, deleteSlide };
76 }
77
77 lines TYPESCRIPT