diff --git a/netmanager-app/app/(authenticated)/clients/columns.tsx b/netmanager-app/app/(authenticated)/clients/columns.tsx index ac2a1a57c2..398a793ae3 100644 --- a/netmanager-app/app/(authenticated)/clients/columns.tsx +++ b/netmanager-app/app/(authenticated)/clients/columns.tsx @@ -42,8 +42,19 @@ export const columns = ({ onActivate, onDeactivate }: ColumnProps): ColumnDef { - const expires = new Date(row.getValue("access_token.expires")) - return expires.toLocaleDateString() + const accessToken = row.original.access_token + if (!accessToken || !accessToken.expires) return "N/A" + const expires = new Date(accessToken.expires) + if (isNaN(expires.getTime())) return "Invalid Date" + + const now = new Date() + const diffTime = expires.getTime() - now.getTime() + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + + if (diffDays < 0) return "Expired" + if (diffDays === 0) return "Expires today" + if (diffDays === 1) return "Expires tomorrow" + return `Expires in ${diffDays} days` }, }, { diff --git a/netmanager-app/app/(authenticated)/clients/page.tsx b/netmanager-app/app/(authenticated)/clients/page.tsx index adcce2d85f..ae10c6142a 100644 --- a/netmanager-app/app/(authenticated)/clients/page.tsx +++ b/netmanager-app/app/(authenticated)/clients/page.tsx @@ -9,6 +9,21 @@ import { getClientsApi, activateUserClientApi } from "@/core/apis/analytics" import { useToast } from "@/components/ui/use-toast" import type { Client } from "@/app/types/clients" +const formatDate = (dateString: string | undefined): string => { + if (!dateString) return "N/A" + const date = new Date(dateString) + if (isNaN(date.getTime())) return "Invalid Date" + + const now = new Date() + const diffTime = date.getTime() - now.getTime() + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + + if (diffDays < 0) return "Expired" + if (diffDays === 0) return "Expires today" + if (diffDays === 1) return "Expires tomorrow" + return `Expires in ${diffDays} days` +} + const ClientManagement = () => { const [clients, setClients] = useState([]) const [loading, setLoading] = useState(false) @@ -71,6 +86,22 @@ const ClientManagement = () => { setDeactivateDialogOpen(true) } + const nearestExpiringToken = clients + .filter((client) => client.access_token && client.access_token.expires) + .filter((client) => { + const expiryDate = new Date(client.access_token.expires) + return expiryDate > new Date() + }) + .sort((a, b) => { + const dateA = new Date(a.access_token.expires).getTime() + const dateB = new Date(b.access_token.expires).getTime() + return dateA - dateB + })[0] + + const nearestExpiryDate = nearestExpiringToken + ? formatDate(nearestExpiringToken.access_token.expires) + : "No upcoming expiries" + return (
@@ -78,7 +109,7 @@ const ClientManagement = () => {
-
+

Activated Clients

{activatedClients}

@@ -87,6 +118,13 @@ const ClientManagement = () => {

Deactivated Clients

{deactivatedClients}

+
+

Nearest Token Expiry

+

+ {nearestExpiringToken ? formatDate(nearestExpiringToken.access_token.expires) : "No upcoming expiries"} +

+

{nearestExpiringToken?.name || "N/A"}

+