handsontable-modal-launcher-for-view.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { useCallback, useEffect } from 'react';
  2. import EventEmitter from 'events';
  3. import MarkdownTable from '~/client/models/MarkdownTable';
  4. import { useSaveOrUpdate } from '~/client/services/page-operation';
  5. import mtu from '~/components/PageEditor/MarkdownTableUtil';
  6. import type { OptionsToSave } from '~/interfaces/page-operation';
  7. import { useShareLinkId } from '~/stores/context';
  8. import { useHandsontableModal } from '~/stores/modal';
  9. import { useSWRxCurrentPage, useSWRxTagsInfo } from '~/stores/page';
  10. import loggerFactory from '~/utils/logger';
  11. const logger = loggerFactory('growi:cli:side-effects:useHandsontableModalLauncherForView');
  12. declare global {
  13. // eslint-disable-next-line vars-on-top, no-var
  14. var globalEmitter: EventEmitter;
  15. }
  16. export const useHandsontableModalLauncherForView = (opts?: {
  17. onSaveSuccess?: () => void,
  18. onSaveError?: (error: any) => void,
  19. }): void => {
  20. const { data: shareLinkId } = useShareLinkId();
  21. const { data: currentPage } = useSWRxCurrentPage();
  22. const { data: tagsInfo } = useSWRxTagsInfo(currentPage?._id);
  23. const { open: openHandsontableModal } = useHandsontableModal();
  24. const saveOrUpdate = useSaveOrUpdate();
  25. const saveByHandsontableModal = useCallback(async(table: MarkdownTable, bol: number, eol: number) => {
  26. if (currentPage == null || tagsInfo == null || shareLinkId != null) {
  27. return;
  28. }
  29. const currentMarkdown = currentPage.revision.body;
  30. const newMarkdown = mtu.replaceMarkdownTableInMarkdown(table, currentMarkdown, bol, eol);
  31. const optionsToSave: OptionsToSave = {
  32. isSlackEnabled: false,
  33. slackChannels: '',
  34. grant: currentPage.grant,
  35. grantUserGroupId: currentPage.grantedGroup?._id,
  36. grantUserGroupName: currentPage.grantedGroup?.name,
  37. pageTags: tagsInfo.tags,
  38. };
  39. try {
  40. const currentRevisionId = currentPage.revision._id;
  41. await saveOrUpdate(
  42. newMarkdown,
  43. { pageId: currentPage._id, path: currentPage.path, revisionId: currentRevisionId },
  44. optionsToSave,
  45. );
  46. opts?.onSaveSuccess?.();
  47. }
  48. catch (error) {
  49. logger.error('failed to save', error);
  50. opts?.onSaveError?.(error);
  51. }
  52. }, [currentPage, opts, saveOrUpdate, shareLinkId, tagsInfo]);
  53. // set handler to open HandsonTableModal
  54. useEffect(() => {
  55. if (currentPage == null || shareLinkId != null) {
  56. return;
  57. }
  58. const handler = (bol: number, eol: number) => {
  59. const markdown = currentPage.revision.body;
  60. const currentMarkdownTable = mtu.getMarkdownTableFromLine(markdown, bol, eol);
  61. openHandsontableModal(currentMarkdownTable, undefined, false, table => saveByHandsontableModal(table, bol, eol));
  62. };
  63. globalEmitter.on('launchHandsonTableModal', handler);
  64. return function cleanup() {
  65. globalEmitter.removeListener('launchHandsonTableModal', handler);
  66. };
  67. }, [currentPage, openHandsontableModal, saveByHandsontableModal, shareLinkId]);
  68. };