index.tsx 3.7 KB

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