import { FC, ReactNode } from 'react' import { Location } from 'history' import { Redirect, Route, RouteProps } from 'react-router-dom' import { Role, Permission, hasPermission, isInRole } from '../../utils/permissions' import { getUserToken } from '../../utils/storage' export type PrivateRouteProps = RouteProps & { roles: Role[] | Role permission?: Permission children?: ReactNode redirect?: (location?: Location) => ReactNode } export const defaultRedirect = (location?: Location) => ( ) export const PrivateRoute: FC = ({ permission, roles, component, children, redirect = defaultRedirect, ...other }) => { const available = getUserToken() && (hasPermission(permission) && isInRole(roles)) return ( available ? children : redirect(location)} /> ) } export default PrivateRoute