diff --git a/app/dashboard/sites/SitesPage.tsx b/app/dashboard/sites/SitesPage.tsx index be250e5..bb3af64 100644 --- a/app/dashboard/sites/SitesPage.tsx +++ b/app/dashboard/sites/SitesPage.tsx @@ -3,10 +3,9 @@ import Sidebar from "@/components/Sidebar"; import { Plus } from "lucide-react"; import AddSite from "@/components/dialogues/AddSite"; import Sites from "@/components/cards/Sites"; -import axios from "axios"; -import { useEffect, useState, useCallback } from "react"; import Pagination from "@/components/Pagination"; -import Cookies from "js-cookie"; +import useSites from "@/hooks/useSites"; +import SearchAndLayout from "@/components/SearchAndLayout"; interface SitesPageProps { username: string; @@ -14,40 +13,18 @@ interface SitesPageProps { } export default function SitesPage({ username, name }: SitesPageProps) { - const [sites, setSites] = useState([]); - const [currentPage, setCurrentPage] = useState(1); - const [itemPerPage, setItemPerPage] = useState(5); - const [total, setTotal] = useState(0); - const [search, setSearch] = useState(""); + const { + sites, + currentPage, + itemPerPage, + total, + search, + setSearch, + handlePageChange, + setItemPerPage, + loadSites + } = useSites(); - const handlePageChange = (page: number) => { - setCurrentPage(page); - }; - - const loadSites = useCallback(() => { - axios.get('/api/sites/get_all', { - params: { - currentPage, - itemPerPage, - search, - }, - }).then((response) => { - setSites(response.data.sites); - setTotal(response.data.total); - }); - }, [currentPage, itemPerPage, search]); - - useEffect(() => { - loadSites(); - }, [loadSites]); - - useEffect(() => { - const itemPerPage = Cookies.get('sites-itemPerPage'); - if (itemPerPage) { - setItemPerPage(Number(itemPerPage)); - } - }, []); - return (

Sites

-

Manage your sites. Sites are real-world locations where you can monitor your assets & add networks.

+

+ Manage your sites. Sites are real-world locations where you can + monitor your assets & add networks. +

- + + -
- setSearch(e.target.value)} /> - -
- -
+
{sites.map((site: any) => ( - + ))}
diff --git a/components/SearchAndLayout.tsx b/components/SearchAndLayout.tsx new file mode 100644 index 0000000..183d07f --- /dev/null +++ b/components/SearchAndLayout.tsx @@ -0,0 +1,38 @@ +import { ChangeEvent } from "react"; + +interface SearchAndLayoutProps { + search: string; + setSearch: (value: string) => void; + itemPerPage: number; + setItemPerPage: (value: number) => void; +} + +const SearchAndLayout = ({ + search, + setSearch, + itemPerPage, + setItemPerPage +}: SearchAndLayoutProps) => ( +
+ ) => setSearch(e.target.value)} + /> + +
+); + +export default SearchAndLayout; \ No newline at end of file diff --git a/hooks/useSites.ts b/hooks/useSites.ts new file mode 100644 index 0000000..e724cf8 --- /dev/null +++ b/hooks/useSites.ts @@ -0,0 +1,49 @@ +import { useState, useEffect, useCallback } from "react"; +import axios from "axios"; +import Cookies from "js-cookie"; + +const useSites = () => { + const [sites, setSites] = useState([]); + const [currentPage, setCurrentPage] = useState(1); + const [itemPerPage, setItemPerPage] = useState(5); + const [total, setTotal] = useState(0); + const [search, setSearch] = useState(""); + + const loadSites = useCallback(() => { + axios.get('/api/sites/get_all', { + params: { currentPage, itemPerPage, search } + }).then((response) => { + setSites(response.data.sites); + setTotal(response.data.total); + }); + }, [currentPage, itemPerPage, search]); + + useEffect(() => { + loadSites(); + }, [loadSites]); + + useEffect(() => { + const savedItemPerPage = Cookies.get('sites-itemPerPage'); + if (savedItemPerPage) setItemPerPage(Number(savedItemPerPage)); + }, []); + + useEffect(() => { + Cookies.set('sites-itemPerPage', itemPerPage.toString()); + }, [itemPerPage]); + + const handlePageChange = (page: number) => setCurrentPage(page); + + return { + sites, + currentPage, + itemPerPage, + total, + search, + setSearch, + handlePageChange, + setItemPerPage, + loadSites + }; +}; + +export default useSites; \ No newline at end of file