App.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { useState, useEffect } from 'react'
  2. import reactLogo from './assets/react.svg'
  3. import viteLogo from '/vite.svg'
  4. import './App.css'
  5. import {createBrowserHistory} from 'history';
  6. import {Router} from 'react-router-dom'
  7. import {NamedRoute, NamedLink, HashRoute, createPrivateRoute} from './lib';
  8. const history = createBrowserHistory()
  9. const SwapiPeople = ({data:{name, eye_color}}) =>
  10. <div>
  11. <h3 style={{color: eye_color}}>{name}</h3>
  12. <HashRoute path="/foo" component={() => <h1>FOO</h1>} />
  13. <HashRoute path="/bar" component={() => <h1>BAR</h1>} />
  14. <a href="#/foo">go to foo</a>
  15. <a href="#/bar">go to bar</a>
  16. </div>
  17. const SwapiPlanet = ({data:{name, diameter}}) =>
  18. <div>
  19. <h3>{name}</h3>
  20. <h4>{diameter}</h4>
  21. </div>
  22. const queries = {
  23. people({id}){
  24. return fetch('https://swapi.dev/api/people/' + id).then(res => res.json())
  25. },
  26. planet({id}){
  27. if (id == 2)
  28. return {
  29. "name": "Alderaan",
  30. "diameter": "12500"
  31. }
  32. return fetch('https://swapi.dev/api/planets/' + id).then(res => res.json())
  33. }
  34. }
  35. const Pending = () => <h1>Loading</h1>
  36. const Error = ({error}) => <h1>Error: {error.message}</h1>
  37. const UserNamedRoute = createPrivateRoute(() => ['user'], history => history.goBack())(NamedRoute)
  38. const Dashboard = () => <h1>dashboard</h1>
  39. function App() {
  40. return (
  41. <Router history={history}>
  42. <div>
  43. <NamedRoute name="people"
  44. query={queries.people}
  45. path="/people/:id"
  46. pendingQueryComponent={Pending}
  47. errorQueryComponent={Error}
  48. component={SwapiPeople}/>
  49. <NamedRoute routeName="planet"
  50. query={queries.planet}
  51. pendingQueryComponent={Pending}
  52. errorQueryComponent={Error}
  53. path="/planet/:id"
  54. component={SwapiPlanet}/>
  55. <UserNamedRoute routeName="dashboard" path="/dashboard" component={Dashboard} roles={['admin']} />
  56. </div>
  57. <p className="read-the-docs">
  58. <NamedLink routeName="people" params={{id: 1}}>Luke</NamedLink>
  59. <NamedLink routeName="people" params={{id: 2}}>C3PO</NamedLink>
  60. </p>
  61. <p className="read-the-docs">
  62. <NamedLink routeName="planet" params={{id: 1}}>Tatooin</NamedLink>
  63. <NamedLink routeName="planet" params={{id: 2}}>Alderaan</NamedLink>
  64. </p>
  65. </Router>
  66. )
  67. }
  68. export default App