TableWithEditButton.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import React, { useCallback } from 'react';
  2. import EventEmitter from 'events';
  3. import { Element } from 'react-markdown/lib/rehype-filter';
  4. import {
  5. useIsGuestUser, useIsReadOnlyUser, useIsSharedUser, useShareLinkId,
  6. } from '~/stores/context';
  7. import styles from './TableWithEditButton.module.scss';
  8. declare global {
  9. // eslint-disable-next-line vars-on-top, no-var
  10. var globalEmitter: EventEmitter;
  11. }
  12. type TableWithEditButtonProps = {
  13. children: React.ReactNode,
  14. node: Element,
  15. className?: string
  16. }
  17. export const TableWithEditButton = React.memo((props: TableWithEditButtonProps): JSX.Element => {
  18. const { children, node, className } = props;
  19. const { data: isGuestUser } = useIsGuestUser();
  20. const { data: isReadOnlyUser } = useIsReadOnlyUser();
  21. const { data: isSharedUser } = useIsSharedUser();
  22. const { data: shareLinkId } = useShareLinkId();
  23. const bol = node.position?.start.line;
  24. const eol = node.position?.end.line;
  25. const editButtonClickHandler = useCallback(() => {
  26. globalEmitter.emit('launchHandsonTableModal', bol, eol);
  27. }, [bol, eol]);
  28. const showEditButton = !isGuestUser && !isReadOnlyUser && !isSharedUser && shareLinkId == null;
  29. return (
  30. <div className={`editable-with-handsontable ${styles['editable-with-handsontable']}`}>
  31. { showEditButton && (
  32. <button className="handsontable-modal-trigger" onClick={editButtonClickHandler}>
  33. <i className="icon-note"></i>
  34. </button>
  35. )}
  36. <table className={className}>
  37. {children}
  38. </table>
  39. </div>
  40. );
  41. });
  42. TableWithEditButton.displayName = 'TableWithEditButton';