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.Title')}

{translate('::App.DeveloperKit.Component.Description')}

{translate('::App.DeveloperKit.Component.New')}
{/* Statistics Cards */}
{stats.map((stat, index) => (

{stat.name}

{stat.value}

))}
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Components List */} {filteredComponents?.length > 0 ? (
{filteredComponents.map((component) => (

{component.name}

{(() => { 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}

)}
{component.lastModificationTime ? new Date(component.lastModificationTime).toLocaleDateString() : translate('::App.DeveloperKit.Component.DateNotAvailable')}
{/* Props Preview */} {component.props && (

{translate('::App.DeveloperKit.Component.PropsLabel')}

{component.props}
)} {/* Actions */}
))}
) : (

{searchTerm || filterActive !== 'all' ? translate('::App.DeveloperKit.Component.Empty.Filtered.Title') : translate('::App.DeveloperKit.Component.Empty.Initial.Title')}

{searchTerm || filterActive !== 'all' ? translate('::App.DeveloperKit.Component.Empty.Filtered.Description') : translate('::App.DeveloperKit.Component.Empty.Initial.Description')}

{!searchTerm && filterActive === 'all' && ( {translate('::App.DeveloperKit.Component.Empty.Initial.Action')} )}
)}
) } export default ComponentManager