App.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { AuthProvider, useAuth } from "./contexts/AuthContext";
  2. import { Spinner } from "@contentful/f36-components";
  3. import { MenuProvider } from "./contexts/MenuContext";
  4. import { RouterProvider } from "react-router-dom";
  5. import { createAppRouter } from "./router";
  6. import { isPublicRoute } from "./router/publicRoutes.tsx";
  7. import { useMemo } from "react";
  8. function AppRouter() {
  9. const { menus, loading } = useAuth();
  10. const router = useMemo(() => {
  11. const currentPath = window.location.pathname;
  12. // 如果在公开路由页面,创建包含公开路由的路由器
  13. if (isPublicRoute(currentPath)) {
  14. return createAppRouter([]);
  15. }
  16. // 对于受保护的路由,需要等待菜单数据加载
  17. if (menus.length === 0) {
  18. return null;
  19. }
  20. return createAppRouter(menus);
  21. }, [menus]);
  22. if (loading) {
  23. return (
  24. <div
  25. style={{
  26. display: "flex",
  27. justifyContent: "center",
  28. alignItems: "center",
  29. height: "100vh",
  30. }}
  31. >
  32. <Spinner variant="primary" size="large"/>
  33. </div>
  34. );
  35. }
  36. if (!router) {
  37. return (
  38. <div
  39. style={{
  40. display: "flex",
  41. justifyContent: "center",
  42. alignItems: "center",
  43. height: "100vh",
  44. }}
  45. >
  46. 无可用菜单
  47. </div>
  48. );
  49. }
  50. return <RouterProvider router={router} />;
  51. }
  52. export default function App() {
  53. return (
  54. <AuthProvider>
  55. <MenuProvider>
  56. <AppRouter />
  57. </MenuProvider>
  58. </AuthProvider>
  59. );
  60. }