Suspense

<Suspense> display a fallback function until its children have been finished loading.

// Adds a promise-based delay to emulate backend latency
export function sleep(ms: number): Promise<void> {
    return new Promise((resolve) => setTimeout(resolve, ms));
}
import { Suspense, lazy } from "react";
import { BrowserRouter, Routes, Route, Navigate } from "react-router";
import { sleep } from "./lib/sleep";
// lazy loading
const ChatLayout = lazy(async () => {
    await sleep(1500);
    return import("./chat/layout/ChatLayout")
});
import ChatPage from "./chat/pages/ChatPage";

export const AppRouter = () => {
    return (
        <BrowserRouter>
                <Route path="/chat" element={
                    {/* Suspense component */}
                    <Suspense
                        fallback={
                            <div className="flex h-screen w-full items-center justify-center">
                                <div className="h-10 w-10 animate-spin rounded-full border-4 border-gray-300 border-t-gray-900" />
                            </div>
                        }
                    >
                        <ChatLayout />
                    </Suspense>
                }>
                    <Route index element={<ChatPage />} />
                </Route>
                <Route path="/" element={<Navigate to="/chat" />} />
            </Routes>
        </BrowserRouter>
    )
}
Powered by Forestry.md