import React from "react" import { useFavorites } from "@/features/app-state" import { useEffectsAdapter as useUnifiedEffectsAdapter } from "@/features/browser/hooks/use-resources" import { useDraggable } from "@/features/drag-drop" import { EffectPreview } from "@/features/effects/components/effect-preview" import { BaseEffect } from "@/features/effects/types" import type { ListAdapter, ListItem, PreviewComponentProps } from "../types/list" // Адаптер типа для BaseEffect чтобы соответствовать ListItem type EffectListItem = BaseEffect & ListItem /** * Компонент превью для эффектов */ const EffectPreviewWrapper: React.FC> = ({ item: effect, size, viewMode, onClick, }) => { const handleClick = () => { onClick?.(effect) } // Используем DragDropManager для перетаскивания const dragProps = useDraggable( "effect", () => effect, () => ({ url: `/effects/${effect.id}.png`, // Preview URL if available width: 120, height: 80, }), ) // Для эффектов EffectPreview ожидает другие пропсы const previewSize = typeof size === "number" ? size : size.width const previewWidth = typeof size === "number" ? size : size.width const previewHeight = typeof size === "number" ? size : size.height if (viewMode === "list") { return (
{/* Effect Preview */}
{/* Effect Info */}
{effect.name?.ru || effect.name?.en || ""}
{effect.description?.ru || effect.description?.en || ""}
{/* Category */}
{effect.category}
{/* Complexity */}
{effect.complexity}
) } // Thumbnails mode return (
{/* Effect Preview */} {/* Effect Info */}
{effect.name?.ru || effect.name?.en || ""}
{effect.category}
) } /** * Хук для создания адаптера эффектов * Мигрирован на унифицированную систему browser-хуков */ export function useEffectsAdapter(): ListAdapter { const { isItemFavorite } = useFavorites() // Используем унифицированный адаптер с конфигурацией для эффектов const adapter = useUnifiedEffectsAdapter({ PreviewComponent: EffectPreviewWrapper, customHandlers: { getSortValue: (effect: BaseEffect, sortBy: string) => { switch (sortBy) { case "name": // effect.name - это объект с локализацией, используем английскую версию return (effect.name?.en || effect.name?.ru || "").toLowerCase() case "category": return effect.category.toLowerCase() case "complexity": // Определяем порядок сложности: basic < intermediate < advanced const complexityOrder: Record = { low: 0, medium: 1, high: 2, extreme: 3 } return complexityOrder[effect.complexity || "low"] case "processingType": return effect.processingType default: return (effect.name?.en || effect.name?.ru || "").toLowerCase() } }, getSearchableText: (effect: BaseEffect) => { const texts = [ effect.name?.ru || "", effect.name?.en || "", // labels removed - not in BaseEffect effect.description?.ru || "", effect.description?.en || "", effect.category, effect.processingType, ...(effect.tags || []), ] return texts.filter(Boolean) }, getGroupValue: (effect: BaseEffect, groupBy: string) => { switch (groupBy) { case "category": return effect.category || "other" case "complexity": return effect.complexity || "basic" case "processingType": return effect.processingType || "render" case "tags": // Группируем по первому тегу или "untagged" return effect.tags && effect.tags.length > 0 ? effect.tags[0] : "untagged" default: return "" } }, matchesFilter: (effect: BaseEffect, filterType: string) => { if (filterType === "all") return true // Фильтрация по сложности if (["basic", "intermediate", "advanced"].includes(filterType)) { return (effect.complexity || "basic") === filterType } // Фильтрация по категории if ( ["color-correction", "artistic", "vintage", "cinematic", "creative", "technical", "distortion"].includes( filterType, ) ) { return effect.category === filterType } return true }, }, }) // Adapter data ready // Извлекаем только поля, соответствующие ListAdapter const listAdapter: ListAdapter = { useData: () => { const result = adapter.useData() return { ...result, items: result.items as EffectListItem[], error: result.error ? new Error(result.error) : null, } }, PreviewComponent: EffectPreviewWrapper as unknown as React.ComponentType>, getSortValue: adapter.getSortValue, getSearchableText: adapter.getSearchableText, getGroupValue: adapter.getGroupValue, matchesFilter: adapter.matchesFilter, importHandlers: adapter.importHandlers, favoriteType: adapter.favoriteType, // Проверка избранного (переопределяем) isFavorite: (effect: EffectListItem) => isItemFavorite(effect, "effect"), } return listAdapter }