Loading on Sites & Site load

This commit is contained in:
headlesdev 2025-05-19 15:05:35 +02:00
parent 62d8c1c1b2
commit 59a32e0407
4 changed files with 57 additions and 31 deletions

View File

@ -6,6 +6,7 @@ import Sites from "@/components/cards/Sites";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
import useSites from "@/hooks/useSites"; import useSites from "@/hooks/useSites";
import SearchAndLayout from "@/components/SearchAndLayout"; import SearchAndLayout from "@/components/SearchAndLayout";
import Loading from "@/components/Loading";
interface SitesPageProps { interface SitesPageProps {
username: string; username: string;
@ -22,7 +23,8 @@ export default function SitesPage({ username, name }: SitesPageProps) {
setSearch, setSearch,
handlePageChange, handlePageChange,
setItemPerPage, setItemPerPage,
loadSites loadSites,
loading
} = useSites(); } = useSites();
return ( return (
<Sidebar <Sidebar
@ -56,37 +58,46 @@ export default function SitesPage({ username, name }: SitesPageProps) {
setItemPerPage={setItemPerPage} setItemPerPage={setItemPerPage}
/> />
{sites.length > 0 ? (
<div className={ {loading ? (
itemPerPage === 5 <div className="flex justify-center items-center h-48 mt-4">
? "flex flex-col gap-4 pt-4" <Loading />
: "grid grid-cols-1 md:grid-cols-2 gap-4 pt-4"
}>
{sites.map((site: any) => (
<Sites
key={site.id}
id={site.id}
name={site.name}
description={site.description}
networks={site.networks}
/>
))}
</div> </div>
) : ( ) : (
<div className="flex justify-center items-center h-48 bg-base-200 rounded-lg mt-4"> <>
<div className="text-center"> {sites.length > 0 ? (
<h3 className="text-lg font-bold">No Sites Found</h3> <div className={
<p className="text-sm opacity-70">No sites match your current search criteria</p> itemPerPage === 5
</div> ? "flex flex-col gap-4 pt-4"
</div> : "grid grid-cols-1 md:grid-cols-2 gap-4 pt-4"
)} }>
{sites.map((site: any) => (
<Sites
key={site.id}
id={site.id}
name={site.name}
description={site.description}
networks={site.networks}
/>
))}
</div>
) : (
<div className="flex justify-center items-center h-48 bg-base-200 rounded-lg mt-4">
<div className="text-center">
<h3 className="text-lg font-bold">No Sites Found</h3>
<p className="text-sm opacity-70">No sites match your current search criteria</p>
</div>
</div>
)}
<Pagination <Pagination
currentPage={currentPage} currentPage={currentPage}
totalItems={total} totalItems={total}
itemsPerPage={itemPerPage} itemsPerPage={itemPerPage}
onPageChange={handlePageChange} onPageChange={handlePageChange}
/> />
</>
)}
</main> </main>
</Sidebar> </Sidebar>
) )

View File

@ -2,6 +2,7 @@
import Sidebar from "@/components/Sidebar" import Sidebar from "@/components/Sidebar"
import useSite from "@/hooks/useSite" import useSite from "@/hooks/useSite"
import { useEffect, useState } from "react" import { useEffect, useState } from "react"
import Loading from "@/components/Loading"
import { EditModeToggle } from "@/components/EditModeToggle" import { EditModeToggle } from "@/components/EditModeToggle"
import AddNetwork from "@/components/dialogues/AddNetwork" import AddNetwork from "@/components/dialogues/AddNetwork"
import { Plus, Pencil, Trash, Info, Building2, Network as NetworkIcon, Globe, Cpu } from "lucide-react" import { Plus, Pencil, Trash, Info, Building2, Network as NetworkIcon, Globe, Cpu } from "lucide-react"
@ -17,7 +18,7 @@ interface SitesPageProps {
} }
export default function SitesPage({ username, name, siteId }: SitesPageProps) { export default function SitesPage({ username, name, siteId }: SitesPageProps) {
const { site, loadSite, setSiteId } = useSite() const { site, loadSite, setSiteId, loading } = useSite()
const [isEditMode, setIsEditMode] = useState(false) const [isEditMode, setIsEditMode] = useState(false)
useEffect(() => { useEffect(() => {
@ -29,6 +30,11 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
return ( return (
<Sidebar username={username} fullName={name} breadcrumbPath={["/", "Dashboard", "Resources", "Sites", site.name]}> <Sidebar username={username} fullName={name} breadcrumbPath={["/", "Dashboard", "Resources", "Sites", site.name]}>
<main className="w-full"> <main className="w-full">
{loading ? (
<div className="flex justify-center items-center h-64 w-full">
<Loading />
</div>
) : (
<div className="flex flex-col gap-4 w-full"> <div className="flex flex-col gap-4 w-full">
<div className="card bg-base-100 shadow-xl rounded-xl overflow-hidden border border-base-200 w-full"> <div className="card bg-base-100 shadow-xl rounded-xl overflow-hidden border border-base-200 w-full">
<div className="card-body p-6"> <div className="card-body p-6">
@ -153,6 +159,7 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
<EditSite site={site} onSiteEdited={loadSite} /> <EditSite site={site} onSiteEdited={loadSite} />
<DeleteSite siteId={site.id} /> <DeleteSite siteId={site.id} />
</div> </div>
)}
</main> </main>
</Sidebar> </Sidebar>
) )

View File

@ -10,13 +10,16 @@ const useSite = () => {
networks: [] networks: []
}); });
const [siteId, setSiteId] = useState(""); const [siteId, setSiteId] = useState("");
const [loading, setLoading] = useState(false);
const loadSite = useCallback(() => { const loadSite = useCallback(() => {
if (!siteId) return; if (!siteId) return;
setLoading(true);
axios.get('/api/sites/get', { axios.get('/api/sites/get', {
params: { siteId } params: { siteId }
}).then((response) => { }).then((response) => {
setSite(response.data.site); setSite(response.data.site);
setLoading(false);
}); });
}, [siteId]); }, [siteId]);
@ -58,6 +61,7 @@ const useSite = () => {
setSiteId, setSiteId,
editSite, editSite,
deleteSite, deleteSite,
loading
}; };
}; };

View File

@ -11,13 +11,16 @@ const useSites = () => {
const [itemPerPage, setItemPerPage] = useState(defaultLayout); const [itemPerPage, setItemPerPage] = useState(defaultLayout);
const [total, setTotal] = useState(0); const [total, setTotal] = useState(0);
const [search, setSearch] = useState(""); const [search, setSearch] = useState("");
const [loading, setLoading] = useState(false);
const loadSites = useCallback(() => { const loadSites = useCallback(() => {
setLoading(true);
axios.get('/api/sites/get_all', { axios.get('/api/sites/get_all', {
params: { currentPage, itemPerPage, search } params: { currentPage, itemPerPage, search }
}).then((response) => { }).then((response) => {
setSites(response.data.sites); setSites(response.data.sites);
setTotal(response.data.total); setTotal(response.data.total);
setLoading(false);
}); });
}, [currentPage, itemPerPage, search]); }, [currentPage, itemPerPage, search]);
@ -41,7 +44,8 @@ const useSites = () => {
setSearch, setSearch,
handlePageChange, handlePageChange,
setItemPerPage, setItemPerPage,
loadSites loadSites,
loading
}; };
}; };