Adds loader
This commit is contained in:
34
src/components/Loader.tsx
Normal file
34
src/components/Loader.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ import { createFileRoute } from "@tanstack/react-router";
|
|||||||
import { pb } from "@/lib/pocketbase";
|
import { pb } from "@/lib/pocketbase";
|
||||||
import type { Campaign } from "@/lib/types";
|
import type { Campaign } from "@/lib/types";
|
||||||
import { Link } from "@tanstack/react-router";
|
import { Link } from "@tanstack/react-router";
|
||||||
|
import { Loader } from "@/components/Loader";
|
||||||
|
|
||||||
export const Route = createFileRoute("/_authenticated/campaigns/")({
|
export const Route = createFileRoute("/_authenticated/campaigns/")({
|
||||||
loader: async () => {
|
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[] };
|
return { campaigns: records.map((rec: any) => ({ id: rec.id, name: rec.name })) as Campaign[] };
|
||||||
},
|
},
|
||||||
component: RouteComponent,
|
component: RouteComponent,
|
||||||
|
pendingComponent: Loader,
|
||||||
});
|
});
|
||||||
|
|
||||||
function RouteComponent() {
|
function RouteComponent() {
|
||||||
|
|||||||
Reference in New Issue
Block a user