import React, { useState, useEffect, useMemo } from 'react' import { Link } from 'react-router-dom' import { Ic } from '@/icons' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Badge } from '@/components/ui/badge' import { ShimmerBox, ShimmerLine } from '@/components/shared/shimmer_frontend' import { toFa } from '@/lib/utils' import { toast } from '@/stores/toast' import type { ServiceMeta } from '../ServicesPage' import { fetchSimCards, fetchSimCardOrdersCount, createSimCard, updateSimCard, deleteSimCard, type SimCardItem, type CreateSimCardInput, } from '../services/simcard-api' import { SimcardFormDialog } from './SimcardFormDialog' const COUNTRY_OPTIONS = [ { code: 'ALL', labelFa: 'همه کشورها', labelEn: 'All Countries', flag: '🌍' }, { code: 'IR', labelFa: 'ایران', labelEn: 'Iran', flag: '🇮🇷' }, { code: 'IQ', labelFa: 'عراق', labelEn: 'Iraq', flag: '🇮🇶' }, { code: 'SA', labelFa: 'عربستان سعودی', labelEn: 'Saudi Arabia', flag: '🇸🇦' }, ] as const const COUNTRY_FLAGS: Record = { IR: '🇮🇷', IQ: '🇮🇶', SA: '🇸🇦', SY: '🇸🇾', OM: '🇴🇲', OMN: '🇴🇲', KW: '🇰🇼', KWT: '🇰🇼', BH: '🇧🇭', BHR: '🇧🇭', } const COUNTRY_NAMES_FA: Record = { IR: 'ایران', IQ: 'عراق', SA: 'عربستان سعودی', SY: 'سوریه', OM: 'عمان', OMN: 'عمان', KW: 'کویت', KWT: 'کویت', BH: 'بحرین', BHR: 'بحرین', } export function SimcardServiceView({ service }: { service: ServiceMeta }) { const [selectedCountry, setSelectedCountry] = useState('ALL') const [searchTerm, setSearchTerm] = useState('') const [simcards, setSimcards] = useState([]) const [ordersCount, setOrdersCount] = useState(0) const [isLoading, setIsLoading] = useState(true) // فرم ایجاد و ویرایش const [isFormOpen, setIsFormOpen] = useState(false) const [editingItem, setEditingItem] = useState(null) // بارگذاری داده‌ها از دیتابیس (یک‌بار در ابتدا برای دریافت همه بسته‌ها) const loadData = async () => { setIsLoading(true) try { const [cardsData, ordersTotal] = await Promise.all([ fetchSimCards(), fetchSimCardOrdersCount(), ]) setSimcards(cardsData) setOrdersCount(ordersTotal) } catch (err) { console.error('Error loading simcards:', err) toast.error('خطا در دریافت لیست سیم‌کارت‌ها از سرور', 'خطا') } finally { setIsLoading(false) } } useEffect(() => { loadData() }, []) // ذخیره (ایجاد یا ویرایش) const handleSave = async (data: CreateSimCardInput, id?: number) => { if (id) { await updateSimCard(id, data) toast.success(`بسته سیم‌کارت «${data.title}» با موفقیت ویرایش شد.`, 'ویرایش موفق') } else { await createSimCard(data) toast.success( `بسته سیم‌کارت «${data.title}» با موفقیت ثبت شد و در اپلیکیشن قرار گرفت.`, 'ثبت موفق' ) } setIsFormOpen(false) loadData() } // حذف سیم‌کارت از دیتابیس const handleDelete = async (id: number) => { try { await deleteSimCard(id) toast.success('بسته سیم‌کارت با موفقیت از دیتابیس حذف شد.', 'حذف موفق') setIsFormOpen(false) loadData() } catch (err: any) { toast.error(err?.message || 'خطایی در حذف سیم‌کارت رخ داد.', 'خطا') throw err } } // فیلتر آنی کلاینت: بر اساس کشور انتخابی و عبارت جستجو (بدون لودینگ مجدد) const filtered = useMemo(() => { return simcards.filter((item) => { // فیلتر بر اساس کشور if (selectedCountry !== 'ALL' && item.country?.code !== selectedCountry) { return false } // فیلتر بر اساس عبارت جستجو if (searchTerm.trim()) { const term = searchTerm.toLowerCase().trim() const matchTitle = item.title?.toLowerCase().includes(term) const matchCountry = item.country?.name?.toLowerCase().includes(term) || (COUNTRY_NAMES_FA[item.country?.code] || '').includes(term) const matchDetails = item.simcard_detail?.some((d) => d.toLowerCase().includes(term) ) if (!matchTitle && !matchCountry && !matchDetails) { return false } } return true }) }, [simcards, selectedCountry, searchTerm]) // آمار محاسباتی زنده const averagePrice = useMemo(() => { if (!simcards.length) return '0' const total = simcards.reduce((sum, item) => sum + parseFloat(item.price || '0'), 0) return (total / simcards.length).toFixed(1) }, [simcards]) return (
{/* کارت‌های آمار واقعی منطبق با دیتابیس */}
بسته‌های فعال سیم‌کارت در اپلیکیشن
{isLoading ? : toFa(simcards.length)}
کشورهای تحت پوشش
{toFa(3)}{' '} (🇮🇷 ایران، 🇮🇶 عراق، 🇸🇦 عربستان)
میانگین قیمت بسته‌ها
{isLoading ? ( ) : ( `${toFa(averagePrice)}$` )}
سفارش‌های ثبت‌شده مشاهده
{isLoading ? ( ) : ( toFa(ordersCount) )}
{/* ابزارها، تب کشورها، جستجو و دکمه افزودن */}
{COUNTRY_OPTIONS.map((opt) => { const isSelected = selectedCountry === opt.code return ( ) })}
setSearchTerm(e.target.value)} placeholder="جستجوی بسته یا کشور..." className="h-9 ps-9 text-xs bg-surface-base rounded-xl border-border-soft" /> {searchTerm && ( )}
{/* جدول بسته‌های سیم‌کارت مطابق با دیتابیس */}
{isLoading ? ( Array.from({ length: 5 }).map((_, idx) => ( )) ) : filtered.length === 0 ? ( ) : ( filtered.map((item) => { const countryCode = item.country?.code || '' const flag = COUNTRY_FLAGS[countryCode] || item.country?.icon || '🌐' const countryNameFa = COUNTRY_NAMES_FA[countryCode] || item.country?.name || countryCode return ( { setEditingItem(item) setIsFormOpen(true) }} className="hover:bg-card/70 transition cursor-pointer group" > ) }) )}
شناسه کشور عنوان بسته اینترنت و سیم‌کارت قیمت رسمی وضعیت عملیات
هیچ بسته‌ای یافت نشد {searchTerm ? 'عبارت جستجو شده با هیچ‌یک از بسته‌های سیم‌کارت همخوانی ندارد.' : 'برای کشور انتخاب شده سیم‌کارتی در دیتابیس ثبت نشده است.'}
#{toFa(item.id)}
{flag} {countryNameFa} {countryCode}
{item.title}
{['fa', 'ar', 'en', 'ru', 'id'].map((lc) => ( {lc} ))} {item.simcard_detail && item.simcard_detail.length > 0 && ( • {toFa(item.simcard_detail.length)} ویژگی ثبت‌شده )}
{toFa(item.price)}$ {item.status === 2 ? 'ناموجود' : item.status === 3 ? 'غیرفعال' : 'فعال در اپلیکیشن'} e.stopPropagation()}>
{/* فرم ایجاد و ویرایش سیم‌کارت */}
) }