"use client"; import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { UserPlus, Search, Download } from "lucide-react"; import { api, Subscriber, PaginatedResponse } from "@/lib/api"; const statusVariant = (s: string) => s === "active" ? "success" : s === "suspended" ? "warning" : s === "terminated" ? "destructive" : "secondary"; export default function SubscribersPage() { const [subscribers, setSubscribers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); useEffect(() => { const loadSubscribers = async () => { try { setLoading(true); const response = await api.subscribers.list(currentPage, 20); setSubscribers(response.data); setTotalPages(Math.ceil(response.total / response.page_size)); } catch (err) { setError(err instanceof Error ? err.message : "Failed to load subscribers"); } finally { setLoading(false); } }; loadSubscribers(); }, [currentPage]); const filteredSubscribers = subscribers.filter(sub => sub.first_name.toLowerCase().includes(searchTerm.toLowerCase()) || sub.last_name.toLowerCase().includes(searchTerm.toLowerCase()) || sub.msisdn.includes(searchTerm) || sub.email.toLowerCase().includes(searchTerm.toLowerCase()) ); if (loading) { return (
); } if (error) { return (

Error loading subscribers

{error}

); } return (

Subscribers

Manage subscriber accounts and profiles.

All Subscribers
setSearchTerm(e.target.value)} className="h-9 rounded-lg border border-input bg-background pl-9 pr-3 text-sm outline-none focus:ring-2 focus:ring-ring/50 w-64" />
{filteredSubscribers.map((sub) => ( ))}
Name MSISDN IMSI Plan Balance Status Actions

{sub.first_name} {sub.last_name}

{sub.email}

{sub.msisdn} {sub.imsi} Plan {sub.plan_id} ${sub.balance.toFixed(2)} {sub.status}
); }