Adds loader

This commit is contained in:
2025-05-28 14:36:44 -07:00
parent ec2e0b380f
commit 5604b6ffdc
2 changed files with 36 additions and 0 deletions

34
src/components/Loader.tsx Normal file
View File

@@ -0,0 +1,34 @@
import type { ReactNode } from "react";
/**
* Loader component for displaying a loading spinner or message during async route loads.
* Accepts optional children to customize the loading message.
*/
export function Loader({ children }: { children?: ReactNode }) {
return (
<div className="flex items-center justify-center py-12 text-slate-300">
<svg
className="animate-spin h-6 w-6 mr-3 text-violet-400"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
aria-hidden="true"
>
<circle
className="opacity-25"
cx="12"
cy="12"
r="10"
stroke="currentColor"
strokeWidth="4"
></circle>
<path
className="opacity-75"
fill="currentColor"
d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z"
></path>
</svg>
{children || <span>Loading</span>}
</div>
);
}

View File

@@ -2,6 +2,7 @@ import { createFileRoute } from "@tanstack/react-router";
import { pb } from "@/lib/pocketbase";
import type { Campaign } from "@/lib/types";
import { Link } from "@tanstack/react-router";
import { Loader } from "@/components/Loader";
export const Route = createFileRoute("/_authenticated/campaigns/")({
loader: async () => {
@@ -9,6 +10,7 @@ export const Route = createFileRoute("/_authenticated/campaigns/")({
return { campaigns: records.map((rec: any) => ({ id: rec.id, name: rec.name })) as Campaign[] };
},
component: RouteComponent,
pendingComponent: Loader,
});
function RouteComponent() {