Add dashboard navigation and request timeouts

Added 'Back to Dashboard' buttons to all admin dashboard pages for improved navigation. Introduced AbortSignal timeouts to API client and middleware requests to prevent hanging network calls. Also enabled messaging customers from the order details page if Telegram info is available.
This commit is contained in:
NotII
2025-10-30 18:35:09 +00:00
parent fcba1a853d
commit f0d18a9e67
9 changed files with 70 additions and 19 deletions

View File

@@ -5,6 +5,7 @@ import { Button } from "@/components/ui/button";
import { Alert, AlertDescription } from "@/components/ui/alert";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { AlertTriangle, CheckCircle, XCircle, Clock, Bell, Shield } from "lucide-react";
import Link from "next/link";
export default function AdminAlertsPage() {
// Mock data for system alerts
@@ -93,9 +94,14 @@ export default function AdminAlertsPage() {
return (
<div className="space-y-6">
<div>
<h1 className="text-2xl font-semibold tracking-tight">System Alerts</h1>
<p className="text-sm text-muted-foreground mt-1">Monitor system alerts and security notifications</p>
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-semibold tracking-tight">System Alerts</h1>
<p className="text-sm text-muted-foreground mt-1">Monitor system alerts and security notifications</p>
</div>
<Button asChild variant="outline" size="sm">
<Link href="/dashboard">Back to Dashboard</Link>
</Button>
</div>
{/* Alert Summary */}

View File

@@ -12,6 +12,7 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@/components/ui/alert-dialog";
import { UserX, Shield, Search, Ban, Unlock } from "lucide-react";
import { useState } from "react";
import Link from "next/link";
export default function AdminBanPage() {
const [banData, setBanData] = useState({
@@ -62,9 +63,14 @@ export default function AdminBanPage() {
return (
<div className="space-y-6">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Ban Users</h1>
<p className="text-sm text-muted-foreground mt-1">Manage user bans and suspensions</p>
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Ban Users</h1>
<p className="text-sm text-muted-foreground mt-1">Manage user bans and suspensions</p>
</div>
<Button asChild variant="outline" size="sm">
<Link href="/dashboard">Back to Dashboard</Link>
</Button>
</div>
{/* Stats Cards */}

View File

@@ -10,6 +10,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@
import { Badge } from "@/components/ui/badge";
import { UserPlus, Mail, Copy, Check } from "lucide-react";
import { useState } from "react";
import Link from "next/link";
export default function AdminInvitePage() {
const [inviteData, setInviteData] = useState({
@@ -35,9 +36,14 @@ export default function AdminInvitePage() {
return (
<div className="space-y-6">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Invite Vendor</h1>
<p className="text-sm text-muted-foreground mt-1">Send invitations to new vendors to join the platform</p>
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Invite Vendor</h1>
<p className="text-sm text-muted-foreground mt-1">Send invitations to new vendors to join the platform</p>
</div>
<Button asChild variant="outline" size="sm">
<Link href="/dashboard">Back to Dashboard</Link>
</Button>
</div>
<div className="grid gap-6 lg:grid-cols-2">

View File

@@ -7,13 +7,20 @@ import RecentOrdersCard from "@/components/admin/RecentOrdersCard";
import SystemStatusCard from "@/components/admin/SystemStatusCard";
import InvitationsListCard from "@/components/admin/InvitationsListCard";
import VendorsCard from "@/components/admin/VendorsCard";
import { Button } from "@/components/ui/button";
import Link from "next/link";
export default function AdminPage() {
return (
<div className="space-y-6">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Admin</h1>
<p className="text-sm text-muted-foreground mt-1">Restricted area. Only admin1 can access.</p>
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Admin</h1>
<p className="text-sm text-muted-foreground mt-1">Restricted area. Only admin1 can access.</p>
</div>
<Button asChild variant="outline" size="sm">
<Link href="/dashboard">Back to Dashboard</Link>
</Button>
</div>
<div className="grid gap-4 lg:gap-6 sm:grid-cols-2 lg:grid-cols-3 items-stretch">

View File

@@ -8,13 +8,19 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@
import { Textarea } from "@/components/ui/textarea";
import { Separator } from "@/components/ui/separator";
import { Settings, Shield, Bell, Database, Globe, Key, Save } from "lucide-react";
import Link from "next/link";
export default function AdminSettingsPage() {
return (
<div className="space-y-6">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Admin Settings</h1>
<p className="text-sm text-muted-foreground mt-1">Configure system settings and preferences</p>
<div className="flex items-center justify-between">
<div>
<h1 className="text-2xl font-semibold tracking-tight">Admin Settings</h1>
<p className="text-sm text-muted-foreground mt-1">Configure system settings and preferences</p>
</div>
<Button asChild variant="outline" size="sm">
<Link href="/dashboard">Back to Dashboard</Link>
</Button>
</div>
<div className="grid gap-6 lg:grid-cols-2">