index.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import BN from 'bn.js';
  2. import React from 'react';
  3. import { Route, Switch } from 'react-router';
  4. import { AppProps, I18nProps } from '@polkadot/react-components/types';
  5. import { ApiProps } from '@polkadot/react-api/types';
  6. import { withCalls, withMulti } from '@polkadot/react-api/with';
  7. import Tabs, { TabItem } from '@polkadot/react-components/Tabs';
  8. import './index.css';
  9. import { queryMembershipToProp } from './utils';
  10. import translate from './translate';
  11. import Dashboard from './Dashboard';
  12. import List from './List';
  13. import DetailsByHandle from './DetailsByHandle';
  14. import EditForm from './EditForm';
  15. import { withMyAccount, MyAccountProps } from '@polkadot/joy-utils/MyAccount';
  16. import { FIRST_MEMBER_ID } from './constants';
  17. import { RouteComponentProps } from 'react-router-dom';
  18. // define out internal types
  19. type Props = AppProps & ApiProps & I18nProps & MyAccountProps & {
  20. membersCreated?: BN;
  21. };
  22. class App extends React.PureComponent<Props> {
  23. private buildTabs (): TabItem[] {
  24. const { t, membersCreated: memberCount, iAmMember } = this.props;
  25. return [
  26. {
  27. name: 'list',
  28. text: t('All members') + ` (${memberCount})`,
  29. forcedExact: false
  30. },
  31. {
  32. name: 'edit',
  33. text: iAmMember ? 'My profile' : t('Register')
  34. },
  35. {
  36. name: 'dashboard',
  37. text: t('Dashboard')
  38. }
  39. ];
  40. }
  41. private renderList (routeProps: RouteComponentProps) {
  42. const { membersCreated, ...otherProps } = this.props;
  43. return membersCreated
  44. ? <List firstMemberId={FIRST_MEMBER_ID} membersCreated={membersCreated} {...otherProps} {...routeProps}/>
  45. : <em>Loading...</em>;
  46. }
  47. render () {
  48. const { basePath } = this.props;
  49. const tabs = this.buildTabs();
  50. return (
  51. <main className='members--App'>
  52. <header>
  53. <Tabs basePath={basePath} items={tabs} />
  54. </header>
  55. <Switch>
  56. <Route path={`${basePath}/edit`} component={EditForm} />
  57. <Route path={`${basePath}/dashboard`} component={Dashboard} />
  58. <Route path={`${basePath}/list/:page([0-9]+)?`} render={ props => this.renderList(props) } />
  59. <Route exact={true} path={`${basePath}/:handle`} component={DetailsByHandle} />
  60. <Route render={ props => this.renderList(props) } />
  61. </Switch>
  62. </main>
  63. );
  64. }
  65. }
  66. export default withMulti(
  67. App,
  68. translate,
  69. withMyAccount,
  70. withCalls<Props>(
  71. queryMembershipToProp('membersCreated')
  72. )
  73. );