import { useState, useEffect, useContext, useRef } from 'react' import { Tag, Plus, Edit2, Trash2, Upload, Image } from 'lucide-react' import { api } from '../utils/api' import { useLanguage } from '../i18n/LanguageContext' import { useAuth } from '../contexts/AuthContext' import { AppContext } from '../App' import Modal from '../components/Modal' import { SkeletonCard } from '../components/SkeletonLoader' const API_BASE = '/api' const EMPTY_BRAND = { name: '', name_ar: '', priority: 2, icon: '' } export default function Brands() { const { t, lang } = useLanguage() const { user } = useAuth() const { getBrandName } = useContext(AppContext) const isSuperadminOrManager = user?.role === 'superadmin' || user?.role === 'manager' const [brands, setBrands] = useState([]) const [loading, setLoading] = useState(true) const [showModal, setShowModal] = useState(false) const [editingBrand, setEditingBrand] = useState(null) const [brandForm, setBrandForm] = useState(EMPTY_BRAND) const [showDeleteModal, setShowDeleteModal] = useState(false) const [brandToDelete, setBrandToDelete] = useState(null) const [uploading, setUploading] = useState(false) const fileInputRef = useRef(null) useEffect(() => { loadBrands() }, []) const loadBrands = async () => { try { const data = await api.get('/brands') setBrands(Array.isArray(data) ? data : []) } catch (err) { console.error('Failed to load brands:', err) } finally { setLoading(false) } } const openNewBrand = () => { setEditingBrand(null) setBrandForm(EMPTY_BRAND) setShowModal(true) } const openEditBrand = (brand) => { setEditingBrand(brand) setBrandForm({ name: brand.name || '', name_ar: brand.name_ar || '', priority: brand.priority ?? 2, icon: brand.icon || '', }) setShowModal(true) } const saveBrand = async () => { try { const data = { name: brandForm.name, name_ar: brandForm.name_ar || null, priority: brandForm.priority ? Number(brandForm.priority) : 2, icon: brandForm.icon || null, } if (editingBrand) { await api.patch(`/brands/${editingBrand.Id || editingBrand._id || editingBrand.id}`, data) } else { await api.post('/brands', data) } setShowModal(false) setEditingBrand(null) loadBrands() } catch (err) { console.error('Failed to save brand:', err) } } const confirmDelete = async () => { if (!brandToDelete) return try { await api.delete(`/brands/${brandToDelete.Id || brandToDelete._id || brandToDelete.id}`) setBrandToDelete(null) setShowDeleteModal(false) loadBrands() } catch (err) { console.error('Failed to delete brand:', err) } } const handleLogoUpload = async (brand, file) => { const brandId = brand.Id || brand._id || brand.id setUploading(true) try { const formData = new FormData() formData.append('file', file) const res = await fetch(`${API_BASE}/brands/${brandId}/logo`, { method: 'POST', body: formData, credentials: 'include', }) if (!res.ok) throw new Error('Upload failed') loadBrands() } catch (err) { console.error('Failed to upload logo:', err) } finally { setUploading(false) } } const getBrandId = (brand) => brand.Id || brand._id || brand.id if (loading) { return (
{[...Array(3)].map((_, i) => )}
) } return (
{/* Header */}

{t('brands.manageBrands')}

{isSuperadminOrManager && ( )}
{/* Brand Cards Grid */} {brands.length === 0 ? (

{t('brands.noBrands')}

) : (
{brands.map(brand => { const displayName = lang === 'ar' && brand.name_ar ? brand.name_ar : brand.name return (
isSuperadminOrManager && openEditBrand(brand)} > {/* Logo area */}
{brand.logo ? ( {displayName} ) : (
{brand.icon || }
)} {isSuperadminOrManager && (
e.stopPropagation()}>
)}
{/* Card body */}
{brand.icon && {brand.icon}}

{displayName}

{brand.name_ar && lang !== 'ar' ? brand.name_ar : brand.name}

) })}
)} {/* Create/Edit Modal */} { setShowModal(false); setEditingBrand(null) }} title={editingBrand ? t('brands.editBrand') : t('brands.addBrand')} >
setBrandForm(f => ({ ...f, name: e.target.value }))} className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary" placeholder="Brand name in English" dir="ltr" />
setBrandForm(f => ({ ...f, name_ar: e.target.value }))} className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary" placeholder="اسم العلامة بالعربي" dir="rtl" />
setBrandForm(f => ({ ...f, priority: e.target.value }))} min="1" max="10" className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary" />
setBrandForm(f => ({ ...f, icon: e.target.value }))} className="w-full px-3 py-2 text-sm border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-primary/20 focus:border-brand-primary" placeholder="emoji" />
{/* Logo upload — only for existing brands */} {editingBrand && (
{editingBrand.logo && (
Logo
)}
{ const file = e.target.files?.[0] if (file) handleLogoUpload(editingBrand, file) e.target.value = '' }} />
)}
{/* Delete Confirmation */} { setShowDeleteModal(false); setBrandToDelete(null) }} title={t('brands.deleteBrand')} isConfirm danger confirmText={t('common.delete')} onConfirm={confirmDelete} > {t('brands.deleteBrandConfirm')}
) }