main
tsx 128 lines 3.8 KB
Raw
1 import { SsgoiTransition } from "@ssgoi/react";
2 import { Header } from "@/components/Header";
3 import { useAdmin } from "@/hooks/useAdmin";
4 import { useAuth } from "@/hooks/useAuth";
5 import { ServerListView } from "@/components/ServerListView";
6
7 export function Admin() {
8 const {
9 isAuthenticated,
10 isLoading: authLoading,
11 checkAuth,
12 } = useAuth();
13
14 const {
15 servers,
16 filteredServers,
17 availableTags,
18 searchQuery,
19 status,
20 sortBy,
21 selectedTags,
22 banFilter,
23 approvalMode,
24 landingPageEnabled,
25 udpSettings,
26 tcpPortSettings,
27 favorites,
28 loading,
29 error,
30 handleSearchChange,
31 handleStatusChange,
32 handleSortByChange,
33 handleTagToggle,
34 handleBanFilterChange,
35 handleToggleFavorite,
36 handleBanStatus,
37 handleBPSChange,
38 handleApprovalModeChange,
39 handleLandingPageEnabledChange,
40 handleUDPSettingsChange,
41 handleTCPPortSettingsChange,
42 handleApproveStatus,
43 handleDenyStatus,
44 handleIPBanStatus,
45 handleBulkApprove,
46 handleBulkDeny,
47 handleBulkBan,
48 } = useAdmin(isAuthenticated);
49
50 const handleAuthChange = async () => {
51 await checkAuth();
52 };
53
54 if (authLoading) {
55 return <div className="p-8 text-foreground">Checking authentication...</div>;
56 }
57
58 if (!isAuthenticated) {
59 return (
60 <SsgoiTransition id="admin">
61 <div className="relative flex min-h-screen w-full flex-col bg-background">
62 <div className="sticky top-0 z-10 w-full bg-background pb-4 pt-5">
63 <div className="flex w-full flex-col px-4 sm:px-6 lg:px-8">
64 <Header
65 title="PORTAL ADMIN"
66 isAdmin={true}
67 onAuthChange={handleAuthChange}
68 />
69 </div>
70 </div>
71 <main className="mx-auto flex w-full max-w-6xl flex-1 items-center justify-center px-6 py-16">
72 <div className="rounded-lg border border-border bg-card px-6 py-5 text-center text-sm text-muted-foreground shadow-sm">
73 Enter the admin token from the header to view admin controls.
74 </div>
75 </main>
76 </div>
77 </SsgoiTransition>
78 );
79 }
80
81 if (loading && servers.length === 0) {
82 return <div className="p-8 text-foreground">Loading...</div>;
83 }
84 if (error && servers.length === 0) {
85 return <div className="p-8 text-red-500">Error: {error}</div>;
86 }
87
88 return (
89 <SsgoiTransition id="admin">
90 <ServerListView
91 title="PORTAL ADMIN"
92 searchQuery={searchQuery}
93 status={status}
94 sortBy={sortBy}
95 selectedTags={selectedTags}
96 availableTags={availableTags}
97 filteredServers={filteredServers}
98 favorites={favorites}
99 onSearchChange={handleSearchChange}
100 onStatusChange={handleStatusChange}
101 onSortByChange={handleSortByChange}
102 onTagToggle={handleTagToggle}
103 onToggleFavorite={handleToggleFavorite}
104 // Admin-specific props
105 isAdmin={true}
106 banFilter={banFilter}
107 approvalMode={approvalMode}
108 landingPageEnabled={landingPageEnabled}
109 udpSettings={udpSettings}
110 tcpPortSettings={tcpPortSettings}
111 onBanFilterChange={handleBanFilterChange}
112 onBanStatusChange={handleBanStatus}
113 onBPSChange={handleBPSChange}
114 onApprovalModeChange={handleApprovalModeChange}
115 onLandingPageEnabledChange={handleLandingPageEnabledChange}
116 onUDPSettingsChange={handleUDPSettingsChange}
117 onTCPPortSettingsChange={handleTCPPortSettingsChange}
118 onApproveStatusChange={handleApproveStatus}
119 onDenyStatusChange={handleDenyStatus}
120 onIPBanStatusChange={handleIPBanStatus}
121 onBulkApprove={handleBulkApprove}
122 onBulkDeny={handleBulkDeny}
123 onBulkBan={handleBulkBan}
124 onAuthChange={handleAuthChange}
125 />
126 </SsgoiTransition>
127 );
128 }