diff --git a/app/dashboard/servers/ServersPage.tsx b/app/dashboard/servers/ServersPage.tsx
new file mode 100644
index 0000000..287d538
--- /dev/null
+++ b/app/dashboard/servers/ServersPage.tsx
@@ -0,0 +1,45 @@
+"use client";
+import Sidebar from "@/components/Sidebar";
+import { Plus } from "lucide-react";
+import AddSite from "@/components/dialogues/AddSite";
+import Sites from "@/components/cards/Site";
+import Pagination from "@/components/Pagination";
+import SearchAndLayout from "@/components/SearchAndLayout";
+import Loading from "@/components/Loading";
+import useServers from "@/hooks/useServers";
+
+interface ServersPageProps {
+ username: string;
+ name: string;
+}
+
+export default function ServersPage({ username, name }: ServersPageProps) {
+ const {
+ servers,
+ loading,
+ currentPage,
+ itemPerPage,
+ total,
+ search,
+ setSearch,
+ handlePageChange,
+ setItemPerPage,
+ loadServers,
+ addServer
+ } = useServers();
+ return (
+
+
+
+
+
+ )
+}
diff --git a/app/dashboard/servers/page.tsx b/app/dashboard/servers/page.tsx
new file mode 100644
index 0000000..cf4575a
--- /dev/null
+++ b/app/dashboard/servers/page.tsx
@@ -0,0 +1,25 @@
+"use client";
+
+import ServersPage from "./ServersPage";
+import Loading from "@/components/Loading";
+
+import { useEffect } from "react";
+import useAuth from "@/hooks/useAuth";
+
+export default function Dashboard() {
+ const { loading, username, name, validate } = useAuth();
+
+ useEffect(() => {
+ const runValidation = async () => {
+ await validate();
+ };
+
+ runValidation();
+ }, [validate]);
+
+ if (loading) {
+ return ;
+ } else {
+ return ;
+ }
+}
\ No newline at end of file
diff --git a/hooks/useServers.ts b/hooks/useServers.ts
index 08884a8..f8746eb 100644
--- a/hooks/useServers.ts
+++ b/hooks/useServers.ts
@@ -1,5 +1,6 @@
import axios, { AxiosError } from "axios";
-
+import { useState, useEffect, useCallback } from "react";
+import Cookies from "js-cookie";
interface Server {
id: number;
networkId: number;
@@ -28,15 +29,34 @@ interface AddServer {
const useServers = () => {
- const getAllServers = (): Promise | string => {
- return axios.get('/api/servers/get_all')
- .then((response) => {
- return response.data.servers;
- })
- .catch(err => {
- throw err.response?.data?.error || 'Failed to fetch servers';
+ const [servers, setServers] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [currentPage, setCurrentPage] = useState(1);
+ const [itemPerPage, setItemPerPage] = useState(() => {
+ const savedValue = Cookies.get('servers-itemPerPage');
+ return savedValue ? parseInt(savedValue, 10) : 5;
+ });
+ const [total, setTotal] = useState(0);
+ const [search, setSearch] = useState("");
+
+ const loadServers = useCallback(() => {
+ setLoading(true);
+ axios.get('/api/servers/get_all', {
+ params: { currentPage, itemPerPage, search }
+ }).then((response) => {
+ setServers(response.data.servers);
+ setTotal(response.data.total);
+ setLoading(false);
});
- };
+ }, [currentPage, itemPerPage, search]);
+
+ useEffect(() => {
+ loadServers();
+ }, [loadServers]);
+
+ useEffect(() => {
+ Cookies.set('servers-itemPerPage', itemPerPage.toString());
+ }, [itemPerPage]);
const addServer = (server: AddServer): Promise | string => {
return axios.post('/api/servers/add', server)
@@ -47,10 +67,21 @@ const useServers = () => {
throw err.response?.data?.error || 'Failed to add server';
});
};
+
+ const handlePageChange = (page: number) => setCurrentPage(page);
return {
- getAllServers,
- addServer,
+ servers,
+ loading,
+ currentPage,
+ itemPerPage,
+ total,
+ search,
+ setSearch,
+ handlePageChange,
+ setItemPerPage,
+ loadServers,
+ addServer
};
};