import React, { useState } from 'react' import { Link } from 'react-router-dom' import { useComponents } from '../../contexts/ComponentContext' import { Plus, Search, Edit, Trash2, Eye, EyeOff, Filter, Calendar, Puzzle, CheckCircle, XCircle, View, } from 'lucide-react' import { ROUTES_ENUM } from '@/routes/route.constant' import { useLocalization } from '@/utils/hooks/useLocalization' const ComponentManager: React.FC = () => { const { components, updateComponent, deleteComponent } = useComponents() const [searchTerm, setSearchTerm] = useState('') const [filterActive, setFilterActive] = useState<'all' | 'active' | 'inactive'>('all') // Calculate statistics const totalComponents = components?.length const activeComponents = components?.filter((c) => c.isActive).length const inactiveComponents = totalComponents - activeComponents const { translate } = useLocalization() const stats = [ { name: translate('::App.DeveloperKit.Component.Total'), value: totalComponents, icon: Puzzle, color: 'text-purple-600', bgColor: 'bg-purple-100', }, { name: translate('::App.DeveloperKit.Component.Active'), value: activeComponents, icon: CheckCircle, color: 'text-emerald-600', bgColor: 'bg-emerald-100', }, { name: translate('::App.DeveloperKit.Component.Inactive'), value: inactiveComponents, icon: XCircle, color: 'text-slate-600', bgColor: 'bg-slate-100', }, ] const filteredComponents = components?.filter((component) => { const matchesSearch = component.name.toLowerCase().includes(searchTerm.toLowerCase()) || (component.description || '').toLowerCase().includes(searchTerm.toLowerCase()) const matchesFilter = filterActive === 'all' || (filterActive === 'active' && component.isActive) || (filterActive === 'inactive' && !component.isActive) return matchesSearch && matchesFilter }) const handleToggleActive = async (id: string, isActive: boolean) => { try { const component = components?.find((c) => c.id === id) if (component) { await updateComponent(id, { ...component, isActive }) } } catch (err) { console.error('Failed to toggle component status:', err) } } const handleDelete = async (id: string, name: string) => { if (window.confirm(translate('::App.DeveloperKit.Component.ConfirmDelete'))) { try { await deleteComponent(id) } catch (err) { console.error('Failed to delete component:', err) } } } return (
{translate('::App.DeveloperKit.Component.Description')}
{stat.name}
{stat.value}
{(() => { try { const parsed = JSON.parse(component.dependencies ?? '[]') return Array.isArray(parsed) && parsed.length > 0 ? `${parsed.join(', ')}` : translate('::App.DeveloperKit.Component.NoDependencies') } catch { return translate('::App.DeveloperKit.Component.NoDependencies') } })()}
{component.description && ({component.description}
)}{translate('::App.DeveloperKit.Component.PropsLabel')}
{component.props}
{searchTerm || filterActive !== 'all' ? translate('::App.DeveloperKit.Component.Empty.Filtered.Description') : translate('::App.DeveloperKit.Component.Empty.Initial.Description')}
{!searchTerm && filterActive === 'all' && (