'use client'; import { useState, useEffect } from 'react'; import { useAuth } from '@/contexts/AuthContext'; import { usersApi } from '@/lib/api/users'; import { packagesApi } from '@/lib/api/packages'; import UserSearch from '@/components/admin/users/UserSearch'; import UserInfo from '@/components/admin/users/UserInfo'; import UserProducts from '@/components/admin/users/UserProducts'; import UserEditForm from '@/components/admin/users/UserEditForm'; import PackageSelector from '@/components/admin/users/PackageSelector'; import PageHeader from '@/components/admin/PageHeader'; import StepIndicator from '@/components/admin/StepIndicator'; import ConfirmDialog from '@/components/admin/ConfirmDialog'; import { showToast } from '@/components/Toast'; import { User, Product, UpdateUserProfileData } from '@/types/user'; import { PackageName } from '@/types/package'; import { formatPrice, getProductTypeLabel } from '@/lib/utils'; import { PencilSquareIcon, TrashIcon } from '@heroicons/react/24/outline'; export default function UsersPage() { const { token } = useAuth(); const [user, setUser] = useState(null); const [products, setProducts] = useState([]); const [packages, setPackages] = useState([]); const [selectedPackage, setSelectedPackage] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [isEditing, setIsEditing] = useState(false); useEffect(() => { if (token) { loadPackages(); } }, [token]); useEffect(() => { if (token && selectedPackage) { loadProducts(selectedPackage); } }, [selectedPackage, token]); const loadPackages = async () => { try { const data = await packagesApi.getAllPackages(token!); setPackages(data); if (data.length > 0 && !selectedPackage) { setSelectedPackage(data[0].name!); } } catch (err) { console.error('Failed to load packages:', err); setError('خطا در دریافت لیست پکیج‌ها'); } }; const loadProducts = async (packageName: string) => { try { const data = await usersApi.getProductsByPackage(packageName, token!); setProducts(data); } catch (err) { console.error('Failed to load products:', err); setError('خطا در دریافت محصولات'); } }; const handleSearch = async (searchTerm: string) => { if (!selectedPackage) { setError('لطفا ابتدا یک پکیج انتخاب کنید'); return; } setIsLoading(true); setError(null); setUser(null); try { const userData = await usersApi.getUserStatus(searchTerm, selectedPackage, token!); setUser(userData); } catch (err) { setError(err instanceof Error ? err.message : 'خطا در دریافت اطلاعات کاربر'); } finally { setIsLoading(false); } }; const handleSubscribe = async (productId: number) => { if (!user) return; const identifier = user.email || user.mobile; if (!identifier) { setError('کاربر فاقد ایمیل یا شماره موبایل است'); return; } setIsLoading(true); setError(null); try { await usersApi.subscribeUser(identifier, productId, token!); showToast('success', 'اشتراک با موفقیت اضافه شد'); if (selectedPackage) { const userData = await usersApi.getUserStatus(identifier, selectedPackage, token!); setUser(userData); } } catch (err) { setError(err instanceof Error ? err.message : 'خطا در افزودن اشتراک'); } finally { setIsLoading(false); } }; const handleUnsubscribe = async (productId: number) => { if (!user) return; const identifier = user.email || user.mobile; if (!identifier) { setError('کاربر فاقد ایمیل یا شماره موبایل است'); return; } setIsLoading(true); setError(null); try { await usersApi.unsubscribeUser(identifier, productId, token!); showToast('success', 'اشتراک با موفقیت لغو شد'); if (selectedPackage) { const userData = await usersApi.getUserStatus(identifier, selectedPackage, token!); setUser(userData); } } catch (err) { setError(err instanceof Error ? err.message : 'خطا در لغو اشتراک'); } finally { setIsLoading(false); } }; const handleEditSubmit = async (data: UpdateUserProfileData) => { if (!user) return; const identifier = user.email || user.mobile; if (!identifier) { setError('کاربر فاقد ایمیل یا شماره موبایل است'); return; } setIsLoading(true); setError(null); try { await usersApi.updateUserProfile(identifier, data, token!); showToast('success', 'اطلاعات کاربر با موفقیت به‌روزرسانی شد'); setIsEditing(false); const newIdentifier = data.email || data.mobile || identifier; if (selectedPackage) { const userData = await usersApi.getUserStatus(newIdentifier, selectedPackage, token!); setUser(userData); } } catch (err) { setError(err instanceof Error ? err.message : 'خطا در به‌روزرسانی اطلاعات کاربر'); } finally { setIsLoading(false); } }; const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false); const handleDeleteUser = () => { if (!user) return; const identifier = user.email || user.mobile; if (!identifier) { setError('کاربر فاقد ایمیل یا شماره موبایل است'); return; } setIsDeleteConfirmOpen(true); }; const confirmDeleteUser = async () => { if (!user) return; const identifier = user.email || user.mobile; if (!identifier) return; setIsLoading(true); setError(null); try { await usersApi.deleteUser(identifier, token!); showToast('success', 'کاربر با موفقیت حذف شد'); setUser(null); setIsDeleteConfirmOpen(false); } catch (err) { setError(err instanceof Error ? err.message : 'خطا در حذف کاربر'); } finally { setIsLoading(false); } }; const handlePackageChange = (packageName: string) => { setSelectedPackage(packageName); setUser(null); setError(null); }; const availableProducts = products; // Compute step indicator state const steps = [ { label: 'انتخاب پکیج', isCompleted: !!selectedPackage, isCurrent: !selectedPackage }, { label: 'جستجوی کاربر', isCompleted: !!user, isCurrent: !!selectedPackage && !user }, { label: 'پروفایل کاربر', isCompleted: false, isCurrent: !!user }, ]; return (
{/* Step Indicator */}
{token && ( )} {selectedPackage && ( )} {error && (

{error}

)} {!selectedPackage && packages.length === 0 && (

هیچ پکیجی یافت نشد. ابتدا یک پکیج ایجاد کنید.

)} {selectedPackage && products.length > 0 && !user && (

محصولات موجود در پکیج {selectedPackage}

{products.map((product) => (

{product.title || 'محصول'}

قیمت: {formatPrice(product.price)} تومان

نوع: {getProductTypeLabel(product.type)}

))}

برای افزودن اشتراک به کاربر، ابتدا یک کاربر جستجو کنید

)} {user && ( <>
)} {user && selectedPackage && ( )} {user && isEditing && ( setIsEditing(false)} isLoading={isLoading} /> )} setIsDeleteConfirmOpen(false)} />
); }