Overview.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright 2017-2019 @polkadot/app-address-book authors & contributors
  2. // This software may be modified and distributed under the terms
  3. // of the Apache-2.0 license. See the LICENSE file for details.
  4. import { I18nProps } from '@polkadot/react-components/types';
  5. import { SubjectInfo } from '@polkadot/ui-keyring/observable/types';
  6. import { ComponentProps } from './types';
  7. import React, { useState } from 'react';
  8. import { Link, useLocation } from 'react-router-dom';
  9. import { Button, CardGrid } from '@polkadot/react-components';
  10. import { Button as SUIButton, Icon } from 'semantic-ui-react';
  11. import addressObservable from '@polkadot/ui-keyring/observable/addresses';
  12. import { withMulti, withObservable } from '@polkadot/react-api';
  13. import CreateModal from './modals/Create';
  14. import Address from './Address';
  15. import translate from './translate';
  16. interface Props extends ComponentProps, I18nProps {
  17. addresses?: SubjectInfo[];
  18. }
  19. function Overview ({ addresses, onStatusChange, t }: Props): React.ReactElement<Props> {
  20. const { pathname } = useLocation();
  21. const [isCreateOpen, setIsCreateOpen] = useState(false);
  22. const emptyScreen = !isCreateOpen && (!addresses || Object.keys(addresses).length === 0);
  23. const _toggleCreate = (): void => setIsCreateOpen(!isCreateOpen);
  24. return (
  25. <CardGrid
  26. topButtons={
  27. <SUIButton as={Link} to={`${pathname}/memo`}>
  28. <Icon name="search" />
  29. View memo
  30. </SUIButton>
  31. }
  32. buttons={
  33. <Button
  34. icon='add'
  35. isPrimary
  36. label={t('Add contact')}
  37. onClick={_toggleCreate}
  38. />
  39. }
  40. isEmpty={emptyScreen}
  41. emptyText={t('No contacts found.')}
  42. >
  43. {isCreateOpen && (
  44. <CreateModal
  45. onClose={_toggleCreate}
  46. onStatusChange={onStatusChange}
  47. />
  48. )}
  49. {addresses && Object.keys(addresses).map((address): React.ReactNode => (
  50. <Address
  51. address={address}
  52. key={address}
  53. />
  54. ))}
  55. </CardGrid>
  56. );
  57. }
  58. export default withMulti(
  59. Overview,
  60. translate,
  61. withObservable(addressObservable.subject, { propName: 'addresses' })
  62. );