import { useState, useEffect } from 'react'; import { Building2, CheckCircle2, XCircle, Clock, PhoneCall, Filter, X, Plus, ShieldCheck } from 'lucide-react'; import { toast } from 'react-hot-toast'; import api from '../services/api'; import Spinner from '../components/ui/Spinner'; import type { B2BInquiry, PartnerAccount } from '../types/admin'; export default function B2BManager() { const [activeTab, setActiveTab] = useState<'inquiries' | 'partners'>('inquiries'); // Inquiries State const [inquiries, setInquiries] = useState([]); const [isInquiriesLoading, setIsInquiriesLoading] = useState(true); const [statusFilter, setStatusFilter] = useState('ALL'); // Inquiry Review Modal State const [selectedInquiry, setSelectedInquiry] = useState(null); const [inquiryStatus, setInquiryStatus] = useState<'PENDING' | 'CONTACTED' | 'APPROVED' | 'REJECTED'>('CONTACTED'); const [inquiryAdminNotes, setInquiryAdminNotes] = useState(''); const [isInquirySubmitting, setIsInquirySubmitting] = useState(false); // Partners State const [partners, setPartners] = useState([]); const [isPartnersLoading, setIsPartnersLoading] = useState(false); const [isPartnerModalOpen, setIsPartnerModalOpen] = useState(false); const [partnerFormData, setPartnerFormData] = useState({ userId: '', companyName: '', taxId: '', creditLimit: '100000000', discountTier: 'tier1', status: 'ACTIVE', }); const [isPartnerSubmitting, setIsPartnerSubmitting] = useState(false); const fetchInquiries = async () => { try { const res = await api.get('/b2b/inquiries'); const data = Array.isArray(res.data) ? res.data : (res.data?.data || []); setInquiries(data); } catch (err) { console.error('Failed to fetch B2B inquiries:', err); toast.error('خطا در دریافت لیست درخواست‌های B2B'); } finally { setIsInquiriesLoading(false); } }; const fetchPartners = async () => { try { const res = await api.get('/b2b/partners'); const data = Array.isArray(res.data) ? res.data : (res.data?.data || []); setPartners(data); } catch (err) { console.warn('Failed to fetch partner accounts:', err); // Fallback empty if backend endpoint not populated setPartners([]); } finally { setIsPartnersLoading(false); } }; useEffect(() => { let isMounted = true; if (activeTab === 'inquiries') { api.get('/b2b/inquiries') .then(res => { if (!isMounted) return; const data = Array.isArray(res.data) ? res.data : (res.data?.data || []); setInquiries(data); }) .catch(err => { console.error('Failed to fetch B2B inquiries:', err); toast.error('خطا در دریافت لیست درخواست‌های B2B'); }) .finally(() => { if (isMounted) setIsInquiriesLoading(false); }); } else { api.get('/b2b/partners') .then(res => { if (!isMounted) return; const data = Array.isArray(res.data) ? res.data : (res.data?.data || []); setPartners(data); }) .catch(err => { console.warn('Failed to fetch partner accounts:', err); if (isMounted) setPartners([]); }) .finally(() => { if (isMounted) setIsPartnersLoading(false); }); } return () => { isMounted = false; }; }, [activeTab]); const openInquiryReview = (inquiry: B2BInquiry) => { setSelectedInquiry(inquiry); setInquiryStatus(inquiry.status || 'CONTACTED'); setInquiryAdminNotes(inquiry.adminNotes || ''); }; const handleInquiryReviewSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedInquiry) return; try { setIsInquirySubmitting(true); await api.patch(`/b2b/inquiries/${selectedInquiry.id}`, { status: inquiryStatus, adminNotes: inquiryAdminNotes.trim() || undefined, }); toast.success('وضعیت درخواست B2B بروزرسانی شد'); setSelectedInquiry(null); fetchInquiries(); } catch (err) { console.error('Failed to review B2B inquiry:', err); toast.error('خطا در بروزرسانی وضعیت درخواست B2B'); } finally { setIsInquirySubmitting(false); } }; const handlePartnerSave = async (e: React.FormEvent) => { e.preventDefault(); if (!partnerFormData.userId.trim() || !partnerFormData.companyName.trim()) { toast.error('شناسه کاربر و نام شرکت اجباری هستند'); return; } try { setIsPartnerSubmitting(true); await api.post('/admin/b2b/partners', partnerFormData); toast.success('حساب همکار B2B جدید ایجاد شد'); setIsPartnerModalOpen(false); fetchPartners(); } catch (err) { console.error('Failed to create partner account:', err); toast.error('خطا در ثبت حساب همکار B2B'); } finally { setIsPartnerSubmitting(false); } }; const filteredInquiries = inquiries.filter(inq => { if (statusFilter === 'ALL') return true; return inq.status === statusFilter; }); return (

مدیریت همکاران عمده‌فروشی و B2B

بررسی درخواست‌های نمایندگی، تنظیم سقف اعتبار و اعطای کدهای تخفیف همکار

{/* Tab Toggle */}
{activeTab === 'inquiries' ? (
{[ { id: 'ALL', label: 'همه' }, { id: 'PENDING', label: 'جدید' }, { id: 'CONTACTED', label: 'تماس گرفته شده' }, { id: 'APPROVED', label: 'تایید شده' }, { id: 'REJECTED', label: 'رد شده' }, ].map(f => ( ))}
{isInquiriesLoading ? ( ) : filteredInquiries.length === 0 ? ( ) : ( filteredInquiries.map((inq) => ( )) )}
شرکت / رابط اطلاعات تماس نوع کسب‌وکار / حجم متقاضی متن پیام وضعیت عملیات
درخواستی یافت نشد
{inq.companyName} {inq.contactName}
{inq.phone} {inq.email}
{inq.businessType} {inq.estimatedVolume && {inq.estimatedVolume}}
{inq.message} {inq.status === 'APPROVED' ? ( تایید شده ) : inq.status === 'CONTACTED' ? ( تماس گرفته شده ) : inq.status === 'REJECTED' ? ( رد شده ) : ( در انتظار بررسی )}
) : (

فهرست حساب‌های تایید شده همکار

{isPartnersLoading ? ( ) : partners.length === 0 ? ( ) : ( partners.map((partner) => ( )) )}
نام شرکت / موسسه User ID کد اقتصادی (Tax ID) سقف اعتبار (تومان) سطح تخفیف وضعیت
هیچ حساب همکار B2B به صورت دستی تعریف نشده است
{partner.companyName} {partner.userId} {partner.taxId || '-'} {Number(partner.creditLimit).toLocaleString()} تومان {partner.discountTier} {partner.status}
)} {/* Inquiry Review Modal */} {selectedInquiry && (

بررسی درخواست B2B ({selectedInquiry.companyName})

شخص رابط: {selectedInquiry.contactName} ({selectedInquiry.phone})
پیام درخواست: {selectedInquiry.message}