TableWithEditButton.tsx 2.1 KB

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