'use client'; import { useState, useEffect, useCallback, useRef } from 'react'; import { useAuth } from '@/contexts/AuthContext'; import { packagesApi } from '@/lib/api/packages'; import { productsApi } from '@/lib/api/products'; import ProductList from '@/components/admin/products/ProductList'; import ProductForm from '@/components/admin/products/ProductForm'; import PageHeader from '@/components/admin/PageHeader'; import ConfirmDialog from '@/components/admin/ConfirmDialog'; import { showToast } from '@/components/Toast'; import { PackageName } from '@/types/package'; import { Product, CreateProductData, UpdateProductData } from '@/types/product'; import { PlusIcon } from '@heroicons/react/24/outline'; export default function ProductsPage() { const { token } = useAuth(); const [packages, setPackages] = useState([]); const [selectedPackage, setSelectedPackage] = useState(null); const [products, setProducts] = useState([]); const [selectedProduct, setSelectedProduct] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isLoadingPackages, setIsLoadingPackages] = useState(false); const [isFormVisible, setIsFormVisible] = useState(false); const [error, setError] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const initialLoadRef = useRef(false); const prevPackageRef = useRef(null); useEffect(() => { if (token && !initialLoadRef.current) { initialLoadRef.current = true; loadPackages(); } }, [token]); const loadPackages = async () => { setIsLoadingPackages(true); setError(null); try { const data = await packagesApi.getAllPackages(token!); setPackages(data); if (data.length > 0 && !selectedPackage) { setSelectedPackage(data[0]); } } catch (err) { setError('خطا در دریافت لیست پکیج‌ها'); } finally { setIsLoadingPackages(false); } }; const loadProducts = useCallback(async (packageName: string, force = false) => { if (!force && prevPackageRef.current === packageName) { return; } setIsLoading(true); setError(null); prevPackageRef.current = packageName; try { const data = await productsApi.getProducts(packageName, token!); setProducts(data); } catch (err) { setError(err instanceof Error ? err.message : 'خطا در دریافت محصولات'); } finally { setIsLoading(false); } }, [token]); useEffect(() => { if (selectedPackage?.name && token) { loadProducts(selectedPackage.name); } else { setProducts([]); } }, [selectedPackage?.name, token, loadProducts]); const handlePackageChange = (e: React.ChangeEvent) => { const pkg = packages.find(p => p.name === e.target.value); setSelectedPackage(pkg || null); setIsFormVisible(false); setSelectedProduct(null); setError(null); }; const handleCreate = () => { setSelectedProduct(null); setIsFormVisible(true); }; const handleEdit = (product: Product) => { setSelectedProduct(product); setIsFormVisible(true); }; const handleDelete = (product: Product) => { setDeleteTarget(product); }; const confirmDelete = async () => { if (!selectedPackage || !deleteTarget) return; const product = deleteTarget; setIsLoading(true); setError(null); try { await productsApi.deleteProduct(selectedPackage.name!, product.id, token!); showToast('success', 'محصول با موفقیت حذف شد'); if (selectedPackage.name) { prevPackageRef.current = null; await loadProducts(selectedPackage.name, true); } } catch (err) { setError(err instanceof Error ? err.message : 'خطا در حذف محصول'); } finally { setIsLoading(false); setDeleteTarget(null); } }; const handleSubmit = async (data: CreateProductData | UpdateProductData) => { if (!selectedPackage) return; setIsLoading(true); setError(null); try { if (selectedProduct) { await productsApi.updateProduct(selectedPackage.name!, selectedProduct.id, data, token!); showToast('success', 'محصول با موفقیت به‌روزرسانی شد'); } else { await productsApi.createProduct(selectedPackage.name!, data as CreateProductData, token!); showToast('success', 'محصول با موفقیت ایجاد شد'); } if (selectedPackage.name) { prevPackageRef.current = null; await loadProducts(selectedPackage.name, true); } setIsFormVisible(false); setSelectedProduct(null); } catch (err) { setError(err instanceof Error ? err.message : 'خطا در ذخیره محصول'); } finally { setIsLoading(false); } }; const handleCancel = () => { setIsFormVisible(false); setSelectedProduct(null); setError(null); }; return (
{/* Package Selector */}
{error && (

{error}

)} {selectedPackage && ( <> {!isFormVisible && (
)} {isFormVisible ? ( ) : ( )} )} setDeleteTarget(null)} />
); }