Easy to use permission management based on react-router v6
react-router-auth-plus
Introduce
Make you easy to use permission management based on react-router v6.
Install
npm install react-router-auth-plus
OR
yarn add react-router-auth-plus
Usage
if user auth is ["auth1"], home router auth configure ["auth1", "auth2"], will be judged as having permission.
How to use(two ways)
// in array
// auth: string | string[]
const routers = [{ path: "/home", element: <Home />, auth: ["admin"] }];
// in jsx
// auth: string | string[]
<AuthRoute path="/home" element={<Home />} auth={["admin"]} />;
Configure the routes
// App.tsx
import Login from "./pages/Login";
import Home from "./pages/Home";
import NotFound from "./pages/NotFound";
import Layout from "./layout/Layout";
import Setting from "./pages/Setting";
import Application from "./pages/Application";
import Loading from "./components/Loading";
import {
  AuthRoute,
  AuthRouterObject,
  createAuthRoutesFromChildren,
  useAuthRouters,
} from "react-router-auth-plus";
import useSWR from "swr";
import { Navigate, Routes } from "react-router-dom";
const routers: AuthRouterObject[] = [
  { path: "/", element: <Login /> },
  { path: "/login", element: <Login /> },
  {
    element: <Layout />,
    children: [
      { path: "/home", element: <Home />, auth: ["admin"] },
      { path: "/setting", element: <Setting /> },
      {
        path: "/application",
        element: <Application />,
        auth: ["application"],
      },
    ],
  },
  { path: "*", element: <NotFound /> },
];
const fetcher = async (url: string): Promise<string[]> =>
  await new Promise((resolve) => {
    setTimeout(() => {
      resolve(["admin"]);
    }, 2000);
  });
function App() {
  // use swr, react-query or others
  const { data: auth } = useSWR("/api/user", fetcher, {
    revalidateOnFocus: false,
  });
  return useAuthRouters({
    auth: auth || [],
    routers,
    noAuthElement: (router) => <Navigate to="/login" replace />,
    render: (element) => (auth ? element : <Loading />),
  });
  // or you can use jsx to configure
  return useAuthRouters({
    auth: auth || [],
    noAuthElement: (router) => <Navigate to="/login" replace />,
    render: (element) => (auth ? element : <Loading />),
    routers: createAuthRoutesFromChildren(
      <Routes>
        <AuthRoute path="/" element={<Login />} />
        <AuthRoute path="/login" element={<Login />} />
        <AuthRoute element={<Layout />}>
          <AuthRoute path="/home" element={<Home />} auth={["admin"]} />
          <AuthRoute path="/setting" element={<Setting />} />
          <AuthRoute
            path="/application"
            element={<Application />}
            auth={["application"]}
          />
        </AuthRoute>
        <AuthRoute path="*" element={<NotFound />} />
      </Routes>
    ),
  });
}
API
useAuthRouters
| Property | Description | Type | Required | 
|---|---|---|---|
| auth | permissions of the current user | string | string[] | true | 
| noAuthElement | the element that is displayed when has no permissions | (router: AuthRouterObject) => ReactNode | false | 
| render | custom render page | (element: ReactElement | null) => ReactElement | null | false | 
| routers | all routers | AuthRouterObject[] | true | 
createAuthRoutesFromChildren (children: ReactNode) => AuthRouterObject[]
create routers from ReactNode