import { useCallback, useEffect, useState } from "react" import { useTranslation } from "react-i18next" import { BaseEffect } from "@/features/effects/types" import { allMigratedEffects, migratedEffects } from "../data/effects-loader" // Используем мигрированные эффекты из новой системы interface UseEffectsReturn { effects: BaseEffect[] loading: boolean error: string | null reload: () => void isReady: boolean } /** * Хук для загрузки и управления эффектами из новой унифицированной системы */ export function useEffects(): UseEffectsReturn { const { t } = useTranslation() const [effects, setEffects] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) /** * Загружает эффекты из новой унифицированной системы */ const loadEffects = useCallback(() => { try { setLoading(true) setError(null) // Используем мигрированные эффекты setEffects(allMigratedEffects) console.log( `✅ ${t("effects.messages.effectsLoaded", "Loaded {{count}} effects from unified system", { count: allMigratedEffects.length })}`, ) } catch (err) { const errorMessage = err instanceof Error ? err.message : t("effects.errors.unknownError", "Unknown error") setError(t("effects.errors.failedToLoadEffects", "Failed to load effects: {{error}}", { error: errorMessage })) // В случае ошибки используем пустой массив setEffects([]) console.error(`❌ ${t("effects.errors.fallbackEffects", "Failed to load effects")}:`, err) } finally { setLoading(false) } }, [t]) // Загружаем эффекты при монтировании компонента useEffect(() => { loadEffects() }, [loadEffects]) return { effects, loading, error, reload: loadEffects, isReady: !loading && effects.length > 0, } } /** * Хук для получения конкретного эффекта по ID * Примечание: Названо useEffectById, чтобы избежать конфликта с React.useEffect */ export function useEffectById(effectId: string): BaseEffect | null { const { effects, isReady } = useEffects() if (!isReady) { return null } return effects.find((effect) => effect.id === effectId) || null } /** * Хук для получения эффектов по категории */ export function useEffectsByCategory(category: string): BaseEffect[] { const { effects, isReady } = useEffects() if (!isReady) { return [] } return effects.filter((effect) => effect.category === category) } /** * Хук для поиска эффектов */ export function useEffectsSearch(query: string, lang: "ru" | "en" = "ru"): BaseEffect[] { const { effects, isReady } = useEffects() if (!isReady || !query.trim()) { return effects } const lowercaseQuery = query.toLowerCase() return effects.filter( (effect) => (effect.name[lang] || effect.name.en || "").toLowerCase().includes(lowercaseQuery) || (effect.description?.[lang] || effect.description?.en || "").toLowerCase().includes(lowercaseQuery) || (effect.tags || []).some((tag) => tag.toLowerCase().includes(lowercaseQuery)), ) } /** * Хук для получения эффектов по категориям */ export function useEffectCategories() { return { colorCorrection: migratedEffects.colorCorrection, vintage: migratedEffects.vintage, artistic: migratedEffects.artistic, cinematic: migratedEffects.cinematic, creative: migratedEffects.creative, technical: migratedEffects.technical, motion: migratedEffects.motion, distortion: migratedEffects.distortion, } }