"use client"; import React, { useState, useEffect } from 'react'; import { PlusCircle, Edit3, Trash2, ShoppingBag, Image as ImageIcon, Loader2, AlertCircle } from 'lucide-react'; import { Offer, OfferType } from '../../types'; import { toast } from 'react-hot-toast'; interface DashboardOffersProps { businessId: string; plan?: string; } const DashboardOffers = ({ businessId, plan = 'STARTER' }: DashboardOffersProps) => { const [offers, setOffers] = useState([]); const [loading, setLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); const [saving, setSaving] = useState(false); const [currentOffer, setCurrentOffer] = useState>({ title: '', price: 0, currency: 'XOF', type: OfferType.SERVICE, description: '', imageUrl: '', active: true }); const fetchOffers = async () => { if (!businessId || businessId === 'new') { setLoading(false); return; } setLoading(true); try { const res = await fetch(`/api/offers?businessId=${businessId}`); const data = await res.json(); if (data.error) { toast.error(data.error); } else { setOffers(data); } } catch (error) { console.error('Error fetching offers:', error); toast.error('Erreur lors du chargement des offres'); } finally { setLoading(false); } }; useEffect(() => { fetchOffers(); }, [businessId]); const handleDelete = async (id: string) => { if (window.confirm("Voulez-vous vraiment supprimer cette offre ?")) { try { const res = await fetch(`/api/offers/${id}`, { method: 'DELETE' }); const data = await res.json(); if (data.error) { toast.error(data.error); } else { setOffers(offers.filter(o => o.id !== id)); toast.success('Offre supprimée'); } } catch (error) { console.error('Delete error:', error); toast.error('Erreur lors de la suppression'); } } }; const handleEdit = (offer: Offer) => { setCurrentOffer(offer); setIsModalOpen(true); }; const openAddModal = () => { setCurrentOffer({ title: '', price: 0, currency: 'XOF', type: OfferType.SERVICE, description: '', imageUrl: '', active: true, businessId: businessId }); setIsModalOpen(true); }; const handleSave = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); try { const isEdit = !!currentOffer.id; const url = isEdit ? `/api/offers/${currentOffer.id}` : '/api/offers'; const method = isEdit ? 'PATCH' : 'POST'; // Generate a random image if none provided const finalImageUrl = currentOffer.imageUrl || `https://picsum.photos/400/300?random=${Date.now()}`; const payload = { ...currentOffer, businessId, imageUrl: finalImageUrl, price: Number(currentOffer.price) }; const res = await fetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const data = await res.json(); if (data.error) { toast.error(data.error); } else { if (isEdit) { setOffers(offers.map(o => o.id === data.id ? data : o)); } else { setOffers([data, ...offers]); } toast.success(isEdit ? 'Offre mise à jour' : 'Offre publiée'); setIsModalOpen(false); } } catch (error) { console.error('Save error:', error); toast.error('Erreur lors de la sauvegarde'); } finally { setSaving(false); } }; if (loading) { return (

Chargement de vos offres...

); } if (businessId === 'new') { return (

Pas encore d'entreprise

Veuillez d'abord créer votre fiche entreprise avant d'ajouter des offres.

); } const offerLimit = plan === 'BOOSTER' ? 10 : (plan === 'EMPIRE' ? 1000 : 1); const isLimitReached = offers.length >= offerLimit; return (

Mes Offres

Utilisation : {offers.length} / {offerLimit === 1000 ? 'Illimité' : offerLimit}

{isLimitReached && (

Vous avez atteint la limite de votre plan {plan}.

)} {/* List View */} {offers.length > 0 ? (
{offers.map(offer => (
{offer.title}
{offer.type === OfferType.PRODUCT ? 'Produit' : 'Service'}

{offer.title}

{new Intl.NumberFormat('fr-FR').format(offer.price)} {offer.currency}

{offer.description && (

{offer.description}

)}
{offer.active ? 'Actif' : 'Inactif'}
))}
) : (

Aucune offre

Commencez à vendre vos produits ou services.

)} {/* Modal */} {isModalOpen && (
setCurrentOffer({...currentOffer, title: e.target.value})} placeholder="Ex: Savon Karité Bio" />