index.tsx 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // @ts-nocheck
  2. // This file is generated by Umi automatically
  3. // DO NOT CHANGE IT MANUALLY!
  4. import React, { PropsWithChildren } from 'react';
  5. import { AccessContext } from './context';
  6. import type { IRoute } from 'umi';
  7. export const useAccess = () => {
  8. return React.useContext(AccessContext);
  9. };
  10. export interface AccessProps {
  11. accessible: boolean;
  12. fallback?: React.ReactNode;
  13. }
  14. export const Access: React.FC<PropsWithChildren<AccessProps>> = (props) => {
  15. if (process.env.NODE_ENV === 'development' && typeof props.accessible !== 'boolean') {
  16. throw new Error('[access] the `accessible` property on <Access /> should be a boolean');
  17. }
  18. return <>{ props.accessible ? props.children : props.fallback }</>;
  19. };
  20. export const useAccessMarkedRoutes = (routes: IRoute[]) => {
  21. const access = useAccess();
  22. const markdedRoutes: IRoute[] = React.useMemo(() => {
  23. const process = (route, parentAccessCode) => {
  24. const accessCode = route.access || parentAccessCode;
  25. // set default status
  26. route.unaccessible = false;
  27. // check access code
  28. if (typeof accessCode === 'string') {
  29. const detector = access[accessCode];
  30. if (typeof detector === 'function') {
  31. route.unaccessible = !detector(route);
  32. } else if (typeof detector === 'boolean') {
  33. route.unaccessible = !detector;
  34. } else if (typeof detector === 'undefined') {
  35. route.unaccessible = true;
  36. }
  37. }
  38. // check children access code
  39. if (route.children?.length) {
  40. const isNoAccessibleChild = !route.children.reduce((hasAccessibleChild, child) => {
  41. process(child, accessCode);
  42. return hasAccessibleChild || !child.unaccessible;
  43. }, false);
  44. // make sure parent route is unaccessible if all children are unaccessible
  45. if (isNoAccessibleChild) {
  46. route.unaccessible = true;
  47. }
  48. }
  49. return route;
  50. }
  51. return routes.map(route => process(route));
  52. }, [routes.length, access]);
  53. return markdedRoutes;
  54. }