import { ChevronDown, ChevronRight, Settings, Trash2 } from "lucide-react" import { useEffect, useMemo, useState } from "react" import { useTranslation } from "react-i18next" import { Button } from "@/components/ui/button" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { EffectPreset, VideoEffect } from "@/features/effects/types" interface EffectPresetsProps { effect: VideoEffect onApplyPreset: (presetName: string, parameters: Record) => void selectedPreset?: string } interface CustomPreset extends Omit { createdAt?: string | Date } /** * Компонент для отображения и выбора пресетов эффекта */ export function EffectPresets({ effect, onApplyPreset, selectedPreset }: EffectPresetsProps) { const { i18n, t } = useTranslation() const [isExpanded, setIsExpanded] = useState(false) const [customPresets, setCustomPresets] = useState([]) const currentLang = i18n.language as "ru" | "en" // Загружаем пользовательские пресеты из localStorage useEffect(() => { try { const storageKey = `effect_presets_${effect.id}` const savedPresets = localStorage.getItem(storageKey) if (savedPresets) { try { const parsed = JSON.parse(savedPresets) // Поддержка старого формата (объект) и нового (массив) if (Array.isArray(parsed)) { setCustomPresets(parsed) } else { // Конвертируем старый формат в новый const converted = Object.entries(parsed).map(([key, preset]: [string, any]) => ({ ...preset, id: key, })) setCustomPresets(converted) } } catch (parseError) { console.error("Error parsing custom presets:", parseError) } } } catch (storageError) { console.error("Error accessing localStorage:", storageError) } }, [effect.id]) // Объединяем встроенные и пользовательские пресеты const allPresets = useMemo(() => { const combined: CustomPreset[] = [] // Сначала добавляем встроенные пресеты if (effect.presets && Array.isArray(effect.presets)) { combined.push( ...effect.presets.map((preset) => ({ ...preset, createdAt: undefined, // Встроенные пресеты не имеют времени создания })), ) } // Затем добавляем пользовательские пресеты combined.push(...customPresets) return combined }, [effect.presets, customPresets]) // Обработчик удаления пользовательского пресета const handleDeleteCustomPreset = (presetId: string) => { const updatedPresets = customPresets.filter((preset) => preset.id !== presetId) setCustomPresets(updatedPresets) // Сохраняем обновленные пресеты в localStorage const storageKey = `effect_presets_${effect.id}` if (updatedPresets.length > 0) { localStorage.setItem(storageKey, JSON.stringify(updatedPresets)) } else { localStorage.removeItem(storageKey) } } if (allPresets.length === 0) { return null } return (
{/* Заголовок с кнопкой разворачивания */} {/* Список пресетов */} {isExpanded && (
{allPresets.map((preset) => { const isCustom = preset.isUserPreset || preset.createdAt !== undefined return (
{isCustom && ( )}
{preset.name[currentLang] || preset.name.en}
{preset.description && (
{preset.description[currentLang] || preset.description.en}
)}
{t("effects.detail.parameters", "Параметры")}:{" "} {preset.parameters ? Object.entries(preset.parameters) .map(([key, value]) => `${key}: ${String(value)}`) .join(", ") : t("effects.noParameters", "Нет параметров")}
{isCustom && preset.createdAt && (
{t("effects.createdAt", "Создано")}:{" "} {typeof preset.createdAt === "string" ? new Date(preset.createdAt).toLocaleDateString() : preset.createdAt.toLocaleDateString()}
)}
) })}
)}
) }