"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 } from "lucide-react"; import { fetchClient } from "@/lib/api-client"; import { useToast } from "@/hooks/use-toast"; 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); return (

Telegram Users

Manage Telegram user accounts and view statistics

{/* Stats Cards */}
Total Users {loading ? (
) : ( <>
{users.length}

Registered users

)}
Users with Orders {loading ? (
) : ( <>
{usersWithOrders.length}

{users.length > 0 ? Math.round((usersWithOrders.length / users.length) * 100) : 0}% conversion rate

)}
Total Revenue {loading ? (
) : ( <>
{formatCurrency(totalSpent)}

{totalOrders} total orders

)}
Returning Customers {loading ? (
) : ( <>
{returningCustomers.length}

{usersWithOrders.length > 0 ? Math.round((returningCustomers.length / usersWithOrders.length) * 100) : 0}% of customers

)}
Blocked Users {loading ? (
) : ( <>
{blockedUsers.length}

{users.length > 0 ? Math.round((blockedUsers.length / users.length) * 100) : 0}% blocked rate

)}
{/* Search and Filters */}
User Management View and manage all Telegram user accounts
{ setSearchQuery(e.target.value); setPage(1); }} />
{loading ? (
) : users.length === 0 ? (
{searchQuery ? "No users found matching your search" : "No users found"}
) : ( User ID Username Orders Total Spent Status First Order Last Order Actions {users.map((user) => (
{user.telegramUserId}
{user.telegramUsername !== "Unknown" ? `@${user.telegramUsername}` : "Unknown"}
{user.totalOrders} {user.completedOrders > 0 && ( {user.completedOrders} completed )}
{formatCurrency(user.totalSpent)}
{user.isBlocked ? ( Blocked {user.blockedReason && (

{user.blockedReason}

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