diff --git a/pickleglass_web/app/personalize/page.tsx b/pickleglass_web/app/personalize/page.tsx index 1a0d562..c24398b 100644 --- a/pickleglass_web/app/personalize/page.tsx +++ b/pickleglass_web/app/personalize/page.tsx @@ -1,8 +1,8 @@ 'use client' import { useState, useEffect } from 'react' -import { ChevronDown } from 'lucide-react' -import { getPresets, updatePreset, PromptPreset } from '@/utils/api' +import { ChevronDown, Plus, Copy } from 'lucide-react' +import { getPresets, updatePreset, createPreset, PromptPreset } from '@/utils/api' export default function PersonalizePage() { const [allPresets, setAllPresets] = useState([]); @@ -72,7 +72,6 @@ export default function PersonalizePage() { ) ); setIsDirty(false); - console.log('Save completed!'); } catch (error) { console.error("Save failed:", error); alert("Failed to save preset. See console for details."); @@ -81,6 +80,73 @@ export default function PersonalizePage() { } }; + const handleCreateNewPreset = async () => { + const title = prompt("Enter a title for the new preset:"); + if (!title) return; + + try { + setSaving(true); + const { id } = await createPreset({ + title, + prompt: "Enter your custom prompt here..." + }); + + const newPreset: PromptPreset = { + id, + uid: 'current_user', + title, + prompt: "Enter your custom prompt here...", + is_default: 0, + created_at: Date.now(), + sync_state: 'clean' + }; + + setAllPresets(prev => [...prev, newPreset]); + setSelectedPreset(newPreset); + setEditorContent(newPreset.prompt); + setIsDirty(false); + } catch (error) { + console.error("Failed to create preset:", error); + alert("Failed to create preset. See console for details."); + } finally { + setSaving(false); + } + }; + + const handleDuplicatePreset = async () => { + if (!selectedPreset) return; + + const title = prompt("Enter a title for the duplicated preset:", `${selectedPreset.title} (Copy)`); + if (!title) return; + + try { + setSaving(true); + const { id } = await createPreset({ + title, + prompt: editorContent + }); + + const newPreset: PromptPreset = { + id, + uid: 'current_user', + title, + prompt: editorContent, + is_default: 0, + created_at: Date.now(), + sync_state: 'clean' + }; + + setAllPresets(prev => [...prev, newPreset]); + setSelectedPreset(newPreset); + setIsDirty(false); + } catch (error) { + console.error("Failed to duplicate preset:", error); + alert("Failed to duplicate preset. See console for details."); + } finally { + setSaving(false); + } + }; + if (loading) { return (
@@ -98,19 +164,39 @@ export default function PersonalizePage() {

Presets

Personalize

- +
+ + {selectedPreset && ( + + )} + +
@@ -137,13 +223,18 @@ export default function PersonalizePage() { onClick={() => handlePresetClick(preset)} className={` p-4 rounded-lg cursor-pointer transition-all duration-200 bg-white - h-48 flex flex-col shadow-sm hover:shadow-md + h-48 flex flex-col shadow-sm hover:shadow-md relative ${selectedPreset?.id === preset.id ? 'border-2 border-blue-500 shadow-md' : 'border border-gray-200 hover:border-gray-300' } `} > + {preset.is_default === 1 && ( +
+ Default +
+ )}

{preset.title}

@@ -158,12 +249,24 @@ export default function PersonalizePage() {
-
+
+ {selectedPreset?.is_default === 1 && ( +
+
+
+

+ This is a default preset and cannot be edited. + Use the "Duplicate" button above to create an editable copy, or create a new preset. +

+
+
+ )}