import React, { useState } from 'react' import { Link, useNavigate } from 'react-router-dom' import { useComponents } from '../../contexts/ComponentContext' import { FaPlus, FaSearch, FaRegEdit, FaTrashAlt, FaEye, FaEyeSlash, FaFilter, FaCalendarAlt, } from 'react-icons/fa' import Widget from '@/components/common/Widget' import { ROUTES_ENUM } from '@/routes/route.constant' import { useLocalization } from '@/utils/hooks/useLocalization' import { Loading } from '../../components/shared' import { APP_NAME } from '@/constants/app.constant' import { Helmet } from 'react-helmet' import { Button } from '@/components/ui' const ComponentManager: React.FC = () => { const { components, loading, updateComponent, deleteComponent } = useComponents() const navigate = useNavigate() const [searchTerm, setSearchTerm] = useState('') const [filterActive, setFilterActive] = useState<'all' | 'active' | 'inactive'>('all') // Calculate statistics const totalComponents = components?.length || 0 const activeComponents = components?.filter((c) => c.isActive).length || 0 const inactiveComponents = totalComponents - activeComponents const { translate } = useLocalization() 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) => { if (window.confirm(translate('::App.DeveloperKit.Component.ConfirmDelete'))) { try { await deleteComponent(id) } catch (err) { console.error('Failed to delete component:', err) } } } return (
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-2 py-1 border border-slate-300 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Components List */} {loading ? (
) : filteredComponents?.length > 0 ? (
{filteredComponents.map((component) => (
{/* Sol taraf */}

{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}

)}
{/* Sağ taraf */} {component.lastModificationTime && (
{new Date(component.lastModificationTime).toLocaleDateString() ?? ''}
)}
{/* 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.EmptyFilteredDescription') : translate('::App.DeveloperKit.Component.Empty.Initial.Description')}

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