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 (
{t('brands.manageBrands')}
{isSuperadminOrManager && ( )}{t('brands.noBrands')}
{brand.name_ar && lang !== 'ar' ? brand.name_ar : brand.name}