Events.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright 2017-2020 @polkadot/app-explorer 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 { KeyedEvent } from '@polkadot/react-query/types';
  5. import React, { useMemo } from 'react';
  6. import { Link } from 'react-router-dom';
  7. import styled from 'styled-components';
  8. import { Table } from '@polkadot/react-components';
  9. import { formatNumber } from '@polkadot/util';
  10. import Event from './Event';
  11. import { useTranslation } from './translate';
  12. interface Props {
  13. className?: string;
  14. emptyLabel?: React.ReactNode;
  15. events?: KeyedEvent[];
  16. eventClassName?: string;
  17. label?: React.ReactNode;
  18. }
  19. function Events ({ className = '', emptyLabel, eventClassName, events, label }: Props): React.ReactElement<Props> {
  20. const { t } = useTranslation();
  21. const header = useMemo(() => [
  22. [label || t<string>('recent events'), 'start']
  23. ], [label, t]);
  24. return (
  25. <Table
  26. className={className}
  27. empty={emptyLabel || t<string>('No events available')}
  28. header={header}
  29. >
  30. {events && events.map(({ blockHash, blockNumber, indexes, key, record }): React.ReactNode => (
  31. <tr
  32. className={eventClassName}
  33. key={key}
  34. >
  35. <td className='overflow'>
  36. <Event value={record} />
  37. {blockNumber && (
  38. <div className='event-link'>
  39. {indexes.length !== 1 && <span>({formatNumber(indexes.length)}x)&nbsp;</span>}
  40. <Link to={`/explorer/query/${blockHash || ''}`}>{formatNumber(blockNumber)}-{indexes[0]}</Link>
  41. </div>
  42. )}
  43. </td>
  44. </tr>
  45. ))}
  46. </Table>
  47. );
  48. }
  49. export default React.memo(styled(Events)`
  50. td.overflow {
  51. position: relative;
  52. .event-link {
  53. position: absolute;
  54. right: 0.75rem;
  55. top: 0.5rem;
  56. }
  57. }
  58. `);