index.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { ApiContext } from '@polkadot/react-api';
  3. import { AppProps, I18nProps } from '@polkadot/react-components/types';
  4. import { ApiProps } from '@polkadot/react-api/types';
  5. import { Route, Switch, RouteComponentProps } from 'react-router';
  6. import Tabs from '@polkadot/react-components/Tabs';
  7. import { withMulti } from '@polkadot/react-api/index';
  8. import QueueContext from '@polkadot/react-components/Status/Context';
  9. import { withMyAccount, MyAccountProps } from '@polkadot/joy-utils/react/hocs/accounts';
  10. import { Transport } from './transport.substrate';
  11. import { WorkingGroupsController, WorkingGroupsView } from './tabs/WorkingGroup.controller';
  12. import { OpportunityController, OpportunityView } from './tabs/Opportunity.controller';
  13. import { OpportunitiesController, OpportunitiesView } from './tabs/Opportunities.controller';
  14. import { ApplyController, ApplyView } from './flows/apply.controller';
  15. import { MyRolesController, MyRolesView } from './tabs/MyRoles.controller';
  16. import { AdminController, AdminView } from './tabs/Admin.controller';
  17. import './index.sass';
  18. import translate from './translate';
  19. type Props = AppProps & ApiProps & I18nProps & MyAccountProps
  20. type DefaultRouteProps = RouteComponentProps<Record<string, string | undefined>>;
  21. export const App: React.FC<Props> = (props: Props) => {
  22. const { t } = props;
  23. const tabs: Array<any> = [
  24. {
  25. isRoot: true,
  26. name: 'working-groups',
  27. text: t('Working groups')
  28. },
  29. {
  30. name: 'opportunities',
  31. text: t('Opportunities'),
  32. hasParams: true
  33. }
  34. ];
  35. const { api } = useContext(ApiContext);
  36. const { queueExtrinsic } = useContext(QueueContext);
  37. const [transport] = useState(() => new Transport(api, queueExtrinsic));
  38. const [wgCtrl] = useState(() => new WorkingGroupsController(transport));
  39. const [oppCtrl] = useState(() => new OpportunityController(transport));
  40. const [oppsCtrl] = useState(() => new OpportunitiesController(transport));
  41. const [applyCtrl] = useState(() => new ApplyController(transport));
  42. const [myRolesCtrl] = useState(() => new MyRolesController(transport));
  43. const [adminCtrl] = useState(() => new AdminController(transport, api, queueExtrinsic));
  44. useEffect(() => {
  45. return () => {
  46. transport.unsubscribe();
  47. };
  48. }, []);
  49. useEffect(() => {
  50. oppCtrl.setMemberId(props.myMemberId);
  51. oppsCtrl.setMemberId(props.myMemberId);
  52. myRolesCtrl.setMyAddress(props.myAddress);
  53. }, [props.myMemberId, props.myAddress]);
  54. const { basePath } = props;
  55. if (props.myAddress) {
  56. tabs.push({
  57. name: 'my-roles',
  58. text: t('My roles and applications')
  59. });
  60. }
  61. return (
  62. <main className='roles--App'>
  63. <header>
  64. <Tabs
  65. basePath={basePath}
  66. items={tabs}
  67. />
  68. </header>
  69. <Switch>
  70. <Route
  71. path={`${basePath}/opportunities/:group/:id([0-9]+)/apply`}
  72. render={(props: DefaultRouteProps) => <ApplyView controller={applyCtrl} params={props.match.params}/>} />
  73. <Route
  74. path={`${basePath}/opportunities/:group/:id([0-9]+)`}
  75. render={(props: DefaultRouteProps) => <OpportunityView controller={oppCtrl} params={props.match.params}/>} />
  76. <Route
  77. path={`${basePath}/opportunities/:group/:lead(lead)?`}
  78. render={(props: DefaultRouteProps) => <OpportunitiesView controller={oppsCtrl} params={props.match.params}/>} />
  79. <Route
  80. path={`${basePath}/opportunities`}
  81. render={(props: DefaultRouteProps) => <OpportunitiesView controller={oppsCtrl} params={props.match.params}/>} />
  82. <Route
  83. path={`${basePath}/my-roles`}
  84. render={(props: DefaultRouteProps) => <MyRolesView controller={myRolesCtrl} params={props.match.params}/>} />
  85. <Route
  86. path={`${basePath}/admin`}
  87. render={(props: DefaultRouteProps) => <AdminView controller={adminCtrl} params={props.match.params}/>} />
  88. <Route
  89. render={(props: DefaultRouteProps) => <WorkingGroupsView controller={wgCtrl} params={props.match.params}/> } />
  90. </Switch>
  91. </main>
  92. );
  93. };
  94. export default withMulti(
  95. App,
  96. translate,
  97. withMyAccount
  98. );