2019-08-09 10:26:22 +00:00
|
|
|
import React from "react";
|
2019-06-19 14:40:52 +00:00
|
|
|
import { Route, RouteProps } from "react-router-dom";
|
|
|
|
|
2021-12-17 11:10:54 +00:00
|
|
|
import { useUser } from "..";
|
2019-06-19 14:40:52 +00:00
|
|
|
import NotFound from "../../NotFound";
|
|
|
|
import { PermissionEnum } from "../../types/globalTypes";
|
2021-09-24 12:01:54 +00:00
|
|
|
import { hasAllPermissions, hasAnyPermissions } from "../misc";
|
|
|
|
|
|
|
|
type MatchPermissionType = "all" | "any";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
interface SectionRouteProps extends RouteProps {
|
|
|
|
permissions?: PermissionEnum[];
|
2021-09-24 12:01:54 +00:00
|
|
|
matchPermission?: MatchPermissionType;
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
|
|
|
|
2021-09-24 12:01:54 +00:00
|
|
|
const matchAll = (match: MatchPermissionType) => match === "all";
|
|
|
|
|
2019-11-07 11:34:54 +00:00
|
|
|
export const SectionRoute: React.FC<SectionRouteProps> = ({
|
2019-06-19 14:40:52 +00:00
|
|
|
permissions,
|
2021-09-24 12:01:54 +00:00
|
|
|
matchPermission = "all",
|
2019-06-19 14:40:52 +00:00
|
|
|
...props
|
2019-10-21 11:44:13 +00:00
|
|
|
}) => {
|
|
|
|
const { user } = useUser();
|
|
|
|
|
2021-09-24 12:01:54 +00:00
|
|
|
const hasSectionPermissions = () => {
|
|
|
|
if (!permissions) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (matchAll(matchPermission)) {
|
|
|
|
return hasAllPermissions(permissions, user);
|
|
|
|
}
|
|
|
|
|
|
|
|
return hasAnyPermissions(permissions, user);
|
|
|
|
};
|
|
|
|
|
|
|
|
return hasSectionPermissions() ? <Route {...props} /> : <NotFound />;
|
2019-10-21 11:44:13 +00:00
|
|
|
};
|
2019-06-19 14:40:52 +00:00
|
|
|
SectionRoute.displayName = "Route";
|
|
|
|
export default SectionRoute;
|