"use client"; import React, { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Search, Ban, UserCheck, Package, DollarSign, Loader2, Repeat, Users, ShoppingBag, CreditCard, UserX } from "lucide-react"; import { fetchClient } from "@/lib/api-client"; import { useToast } from "@/hooks/use-toast"; import { motion, AnimatePresence } from "framer-motion"; interface TelegramUser { telegramUserId: string; telegramUsername: string; totalOrders: number; totalSpent: number; paidOrders: number; completedOrders: number; firstOrderDate: string | null; lastOrderDate: string | null; isBlocked: boolean; blockedReason: string | null; createdAt?: string; } interface PaginationResponse { success: boolean; users: TelegramUser[]; pagination: { page: number; limit: number; total: number; totalPages: number; hasNextPage: boolean; hasPrevPage: boolean; }; } function formatCurrency(amount: number): string { return new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'GBP', }).format(amount); } export default function AdminUsersPage() { const { toast } = useToast(); const [loading, setLoading] = useState(true); const [users, setUsers] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [page, setPage] = useState(1); const [pagination, setPagination] = useState(null); useEffect(() => { fetchUsers(); }, [page, searchQuery]); const fetchUsers = async () => { try { setLoading(true); const params = new URLSearchParams({ page: page.toString(), limit: '25' }); if (searchQuery.trim()) { params.append('search', searchQuery.trim()); } const data = await fetchClient(`/admin/users?${params.toString()}`); setUsers(data.users); setPagination(data.pagination); } catch (error: any) { console.error("Failed to fetch users:", error); toast({ title: "Error", description: error.message || "Failed to load users", variant: "destructive", }); } finally { setLoading(false); } }; const usersWithOrders = users.filter(u => u.totalOrders > 0); const returningCustomers = users.filter(u => u.totalOrders > 1); const blockedUsers = users.filter(u => u.isBlocked); const totalSpent = users.reduce((sum, u) => sum + u.totalSpent, 0); const totalOrders = users.reduce((sum, u) => sum + u.totalOrders, 0); const stats = [ { title: "Total Users", value: users.length, description: "Registered users", icon: Users, }, { title: "Users with Orders", value: usersWithOrders.length, description: `${users.length > 0 ? Math.round((usersWithOrders.length / users.length) * 100) : 0}% conversion rate`, icon: ShoppingBag, }, { title: "Total Revenue", value: formatCurrency(totalSpent), description: `${totalOrders} total orders`, icon: DollarSign, }, { title: "Returning", value: returningCustomers.length, description: `${usersWithOrders.length > 0 ? Math.round((returningCustomers.length / usersWithOrders.length) * 100) : 0}% of customers`, icon: Repeat, }, { title: "Blocked", value: blockedUsers.length, description: `${users.length > 0 ? Math.round((blockedUsers.length / users.length) * 100) : 0}% blocked rate`, icon: UserX, }, ]; return (

Telegram Users

Manage Telegram user accounts and view statistics

{/* Stats Cards */}
{stats.map((stat, i) => ( {stat.title} {loading ? (
) : (
{stat.value}

{stat.description}

)}
))}
{/* Search and Filters */}
User Management View and manage all Telegram user accounts
{ setSearchQuery(e.target.value); setPage(1); }} />
User ID Username Orders Total Spent Status First Order Last Order Actions {loading ? (

Loading users...

) : users.length === 0 ? ( {searchQuery ? "No users found matching your search" : "No users found"} ) : ( users.map((user, index) => (
{user.telegramUserId}
{user.telegramUsername !== "Unknown" ? ( <> @ {user.telegramUsername} ) : ( Unknown )}
{user.totalOrders} {user.completedOrders > 0 && ( {user.completedOrders} done )}
{formatCurrency(user.totalSpent)} {user.isBlocked ? ( Blocked {user.blockedReason && (

{user.blockedReason}

)}
) : user.totalOrders > 0 ? ( Active ) : ( No Orders )}
{user.firstOrderDate ? new Date(user.firstOrderDate).toLocaleDateString() : '-'} {user.lastOrderDate ? new Date(user.lastOrderDate).toLocaleDateString() : '-'}
{!user.isBlocked ? ( ) : ( )}
)) )}
{pagination && pagination.totalPages > 1 && (
Showing page {pagination.page} of {pagination.totalPages}
)}
); }