abraha2d

Untitled

Nov 17th, 2023
1,177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { useEffect, useState } from "react";
  2. import { BrowserRouter as Router, Routes, Route, useParams } from "react-router-dom";
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9. type Crumb = {
  10.   href: string;
  11.   label: string;
  12. };
  13.  
  14. type CrumbsSetter = (crumbs: Crumb[]) => void;
  15.  
  16. const useCrumbs = (crumb: Crumb, setCrumbs: CrumbsSetter) => {
  17.   useEffect(() => {
  18.     setCrumbs([crumb]);
  19.     return () => setCrumbs([]);
  20.   }, [crumb]);
  21.  
  22.   const crumbSetter = (crumbs: Crumb[]) => {
  23.     setCrumbs([crumb, ...crumbs]);
  24.   };
  25.  
  26.   return crumbSetter;
  27. };
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34. const TheMainPage = () => {
  35.   const [crumbs, setCrumbs] = useState<Crumb[]>([]);
  36.  
  37.   const crumb = { href: "/", label: "Home" };
  38.   const crumbSetter = useCrumbs(crumb, setCrumbs);
  39.  
  40.   return (
  41.     <>
  42.       <Crumbs crumbs={crumbs} />
  43.       <Router>
  44.         <Routes>
  45.           <Route
  46.             path={"/children"}
  47.             element={<ChildList setCrumbs={crumbSetter} />}
  48.           />
  49.           <Route
  50.             path={"/children/:id"}
  51.             element={<ChildDetail setCrumbs={crumbSetter} />}
  52.           />
  53.         </Routes>
  54.       </Router>
  55.     </>
  56.   );
  57. };
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64. type ChildListProps = {
  65.   setCrumbs: CrumbsSetter;
  66. };
  67.  
  68. const ChildList = ({ setCrumbs }: ChildListProps) => {
  69.   const crumb = { href: "/children", label: "Children" };
  70.  
  71.   useCrumbs(crumb, setCrumbs);
  72.  
  73.   return <>Child List</>;
  74. };
  75.  
  76. type ChildDetailProps = {
  77.   setCrumbs: CrumbsSetter;
  78. };
  79.  
  80. const ChildDetail = ({ setCrumbs }: ChildDetailProps) => {
  81.   const { id } = useParams();
  82.   const crumb = { href: `/children/${id}`, label: `Child ${id}` };
  83.  
  84.   const crumbSetter = useCrumbs(crumb, setCrumbs);
  85.  
  86.   return (
  87.     <>
  88.       Child {id}
  89.       <Router>
  90.         <Routes>
  91.           <Route
  92.             path={"/grandchildren"}
  93.             element={<GrandChildList childId={id} setCrumbs={crumbSetter} />}
  94.           />
  95.           <Route
  96.             path={"/grandchildren/:id"}
  97.             element={<GrandChildDetail setCrumbs={crumbSetter} />}
  98.           />
  99.         </Routes>
  100.       </Router>
  101.     </>
  102.   );
  103. };
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110. type GrandChildListProps = {
  111.   childId: string;
  112.   setCrumbs: CrumbsSetter;
  113. };
  114.  
  115. const GrandChildList = ({ childId, setCrumbs }: GrandChildListProps) => {
  116.   const crumb = {
  117.     href: "/grandchildren",
  118.     label: `Grandchildren for ${childId}`,
  119.   };
  120.  
  121.   useCrumbs(crumb, setCrumbs);
  122.  
  123.   return <>Grandchild List for {childId}</>;
  124. };
  125.  
  126. type GrandChildDetailProps = {
  127.   setCrumbs: CrumbsSetter;
  128. };
  129.  
  130. const GrandChildDetail = ({ setCrumbs }: GrandChildDetailProps) => {
  131.   const { id } = useParams();
  132.   const crumb = { href: `/grandchildren/${id}`, label: `Grandchild ${id}` };
  133.  
  134.   const crumbSetter = useCrumbs(crumb, setCrumbs);
  135.  
  136.   return (
  137.     <>
  138.       Grandchild {id}
  139.       <Router>
  140.         <Routes>
  141.           <Route
  142.             path={"/greatgrandchildren"}
  143.             element={
  144.               <GreatGrandChildList grandChildId={id} setCrumbs={crumbSetter} />
  145.             }
  146.           />
  147.           <Route
  148.             path={"/greatgrandchildren/:id"}
  149.             element={<GreatGrandChildDetail setCrumbs={crumbSetter} />}
  150.           />
  151.         </Routes>
  152.       </Router>
  153.     </>
  154.   );
  155. };
  156.  
  157.  
  158.  
  159.  
  160.  
  161. type GreatGrandChildListProps = {
  162.   grandChildId: string;
  163.   setCrumbs: CrumbsSetter;
  164. };
  165.  
  166. const GreatGrandChildList = ({ grandChildId, setCrumbs }: GreatGrandChildListProps) => {
  167.   const crumb = {
  168.     href: "/greatgrandchildren",
  169.     label: `Greatgrandchildren for ${grandChildId}`,
  170.   };
  171.  
  172.   useCrumbs(crumb, setCrumbs);
  173.  
  174.   return <>Greatgrandchild List for {grandChildId}</>;
  175. };
  176.  
  177. type GreatGrandChildDetailProps = {
  178.   setCrumbs: CrumbsSetter;
  179. };
  180.  
  181. const GreatGrandChildDetail = ({ setCrumbs }: GreatGrandChildDetailProps) => {
  182.   const { id } = useParams();
  183.   const crumb = { href: `/greatgrandchildren/${id}`, label: `Greatgrandchild ${id}` };
  184.  
  185.   const crumbSetter = useCrumbs(crumb, setCrumbs);
  186.  
  187.   return (
  188.     <>
  189.       Greatgrandchild {id}
  190.       <Router>
  191.         <Routes>
  192.           <Route
  193.             path={"/greatgreatgrandchildren"}
  194.             element={
  195.               <GreatGreatGrandChildList greatGrandChildId={id} setCrumbs={crumbSetter} />
  196.             }
  197.           />
  198.           <Route
  199.             path={"/greatgreatgrandchildren/:id"}
  200.             element={<GreatGreatGrandChildDetail setCrumbs={crumbSetter} />}
  201.           />
  202.         </Routes>
  203.       </Router>
  204.     </>
  205.   );
  206. };
  207.  
Advertisement
Add Comment
Please, Sign In to add comment