import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/components/ui/sheet'; import { Textarea } from '@/components/ui/textarea'; import { useMitt } from '@/plugins/MittContext'; import useVideoEditorStore from '@/stores/VideoEditorStore'; import { Bold, Italic, Minus, Plus, Type } from 'lucide-react'; import { useEffect, useState } from 'react'; // Font configuration const DEFAULT_FONT_FAMILY = 'Montserrat'; const AVAILABLE_FONTS = [{ value: 'Montserrat', label: 'Montserrat' }]; export default function TextSidebar({ isOpen, onClose }) { const { selectedTextElement } = useVideoEditorStore(); const emitter = useMitt(); const [textValue, setTextValue] = useState(''); const [fontSize, setFontSize] = useState(24); const [fontFamily, setFontFamily] = useState(DEFAULT_FONT_FAMILY); const [isBold, setIsBold] = useState(true); const [isItalic, setIsItalic] = useState(false); // Font size constraints const MIN_FONT_SIZE = 8; const MAX_FONT_SIZE = 120; const FONT_SIZE_STEP = 2; // Update all state when selected element changes useEffect(() => { if (selectedTextElement) { setTextValue(selectedTextElement.text || ''); setFontSize(selectedTextElement.fontSize || 24); setFontFamily(selectedTextElement.fontFamily || DEFAULT_FONT_FAMILY); setIsBold(selectedTextElement.fontWeight === 'bold' || selectedTextElement.fontWeight === 700 || true); setIsItalic(selectedTextElement.fontStyle === 'italic' || false); } }, [selectedTextElement]); // Listen for fontSize changes from canvas transformations (separate from selection) useEffect(() => { const handleTextElementUpdate = (updatedElement) => { if (selectedTextElement && updatedElement.id === selectedTextElement.id) { // Update local state to reflect changes from canvas if (updatedElement.fontSize !== undefined) { setFontSize(updatedElement.fontSize); } if (updatedElement.text !== undefined) { setTextValue(updatedElement.text); } if (updatedElement.fontFamily !== undefined) { setFontFamily(updatedElement.fontFamily); } if (updatedElement.fontWeight !== undefined) { setIsBold(updatedElement.fontWeight === 'bold' || updatedElement.fontWeight === 700); } if (updatedElement.fontStyle !== undefined) { setIsItalic(updatedElement.fontStyle === 'italic'); } } }; // Listen for updates from canvas transforms (doesn't open sidebar) emitter.on('text-element-updated', handleTextElementUpdate); return () => { emitter.off('text-element-updated', handleTextElementUpdate); }; }, [emitter, selectedTextElement]); // Handle text changes const handleTextChange = (e) => { const newText = e.target.value; setTextValue(newText); if (selectedTextElement) { emitter.emit('text-update', { elementId: selectedTextElement.id, updates: { text: newText }, }); } }; // Handle font family changes const handleFontFamilyChange = (newFontFamily) => { setFontFamily(newFontFamily); if (selectedTextElement) { emitter.emit('text-update', { elementId: selectedTextElement.id, updates: { fontFamily: newFontFamily }, }); } }; // Handle font size changes const handleFontSizeChange = (newSize) => { const clampedSize = Math.max(MIN_FONT_SIZE, Math.min(MAX_FONT_SIZE, newSize)); setFontSize(clampedSize); if (selectedTextElement) { emitter.emit('text-update', { elementId: selectedTextElement.id, updates: { fontSize: clampedSize }, }); } }; // Handle bold toggle const handleBoldToggle = () => { const newBoldState = !isBold; setIsBold(newBoldState); if (selectedTextElement) { emitter.emit('text-update', { elementId: selectedTextElement.id, updates: { fontWeight: newBoldState ? 'bold' : 'normal' }, }); } }; // Handle italic toggle const handleItalicToggle = () => { const newItalicState = !isItalic; setIsItalic(newItalicState); if (selectedTextElement) { emitter.emit('text-update', { elementId: selectedTextElement.id, updates: { fontStyle: newItalicState ? 'italic' : 'normal' }, }); } }; // Increase font size const increaseFontSize = () => { handleFontSizeChange(fontSize + FONT_SIZE_STEP); }; // Decrease font size const decreaseFontSize = () => { handleFontSizeChange(fontSize - FONT_SIZE_STEP); }; return ( !open && onClose()}> Edit Text
{selectedTextElement ? ( <> {/* Text Content */}