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 }; };