返回 presentation-ai
CreateThemeFooter.tsx
根目录 / src / components / notebook / presentation / components / theme / create-theme / CreateThemeFooter.tsx
1 "use client";
2
3 import { ChevronDown, Copy, RotateCcw, Save } from "lucide-react";
4
5 import { Button } from "@/components/ui/button";
6 import { ButtonGroup } from "@/components/ui/button-group";
7 import {
8 DropdownMenu,
9 DropdownMenuContent,
10 DropdownMenuItem,
11 DropdownMenuTrigger,
12 } from "@/components/ui/dropdown-menu";
13 import { type CreateThemeStep } from "./create-theme-types";
14 import { CreateThemeStepper } from "./CreateThemeStepper";
15
16 interface CreateThemeFooterProps {
17 currentStep: CreateThemeStep;
18 isSubmitting: boolean;
19 onStepClick: (step: CreateThemeStep) => void;
20 onContinue: () => void;
21 onSave?: () => void;
22 onSaveAndCreateNew?: () => void;
23 onResetCustomization?: () => void;
24 isEditing?: boolean;
25 isCustomizing?: boolean;
26 }
27
28 export function CreateThemeFooter({
29 currentStep,
30 isSubmitting,
31 onStepClick,
32 onContinue,
33 onSave,
34 onSaveAndCreateNew,
35 onResetCustomization,
36 isEditing = false,
37 isCustomizing = false,
38 }: CreateThemeFooterProps) {
39 const showQuickSave = (isCustomizing || isEditing) && currentStep !== "save";
40 const showSaveSplitButton = isCustomizing && currentStep !== "save";
41 const saveLabel = isEditing && !isCustomizing ? "Save Edits" : "Save";
42
43 // Get the text for the continue/next button
44 const getContinueButtonText = () => {
45 if (currentStep === "save") {
46 if (isCustomizing) {
47 return "Save & Create New";
48 }
49 return isEditing ? "Save Edits" : "Publish Theme";
50 }
51 return isCustomizing ? "Next" : "Continue";
52 };
53
54 return (
55 <div className="flex items-center justify-between border-t border-border p-4">
56 <CreateThemeStepper currentStep={currentStep} onStepClick={onStepClick} />
57
58 <div className="flex items-center gap-2">
59 {showQuickSave &&
60 (showSaveSplitButton ? (
61 <ButtonGroup>
62 <Button
63 type="button"
64 onClick={onSave}
65 disabled={isSubmitting}
66 className="flex items-center gap-2 bg-blue-600 text-white hover:bg-blue-700"
67 >
68 <Save className="size-4" />
69 {saveLabel}
70 </Button>
71 <DropdownMenu>
72 <DropdownMenuTrigger asChild>
73 <Button
74 type="button"
75 disabled={isSubmitting}
76 className="bg-blue-600 px-2 text-white hover:bg-blue-700"
77 aria-label="More save options"
78 >
79 <ChevronDown className="size-4" />
80 </Button>
81 </DropdownMenuTrigger>
82 <DropdownMenuContent align="end" sideOffset={4}>
83 <DropdownMenuItem onClick={onSave} disabled={isSubmitting}>
84 <Save className="mr-2 size-4" />
85 Save
86 </DropdownMenuItem>
87 <DropdownMenuItem
88 onClick={onSaveAndCreateNew}
89 disabled={isSubmitting}
90 >
91 <Copy className="mr-2 size-4" />
92 Save & Create New
93 </DropdownMenuItem>
94 <DropdownMenuItem
95 onClick={onResetCustomization}
96 disabled={isSubmitting || !onResetCustomization}
97 >
98 <RotateCcw className="mr-2 size-4" />
99 Reset Customization
100 </DropdownMenuItem>
101 </DropdownMenuContent>
102 </DropdownMenu>
103 </ButtonGroup>
104 ) : (
105 <Button
106 type="button"
107 onClick={onSave}
108 disabled={isSubmitting}
109 className="flex items-center gap-2 bg-blue-600 text-white hover:bg-blue-700"
110 >
111 <Save className="size-4" />
112 {saveLabel}
113 </Button>
114 ))}
115
116 {/* Next/Continue button */}
117 <Button
118 type="button"
119 onClick={onContinue}
120 disabled={currentStep === "save" && isSubmitting}
121 className="flex items-center gap-2 bg-blue-600 text-white hover:bg-blue-700"
122 >
123 {getContinueButtonText()}
124 <ChevronDown className="size-4 -rotate-90" />
125 </Button>
126 </div>
127 </div>
128 );
129 }
130
130 lines Plain Text