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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 { open: openHandsontableModal } = useHandsontableModal();
  23. const saveOrUpdate = useSaveOrUpdate();
  24. const saveByHandsontableModal = useCallback(async(table: MarkdownTable, bol: number, eol: number) => {
  25. if (currentPage == null || shareLinkId != null) {
  26. return;
  27. }
  28. const currentMarkdown = currentPage.revision.body;
  29. const newMarkdown = mtu.replaceMarkdownTableInMarkdown(table, currentMarkdown, bol, eol);
  30. const optionsToSave: OptionsToSave = {
  31. isSlackEnabled: false,
  32. slackChannels: '',
  33. grant: currentPage.grant,
  34. grantUserGroupId: currentPage.grantedGroup?._id,
  35. grantUserGroupName: currentPage.grantedGroup?.name,
  36. };
  37. try {
  38. const currentRevisionId = currentPage.revision._id;
  39. await saveOrUpdate(
  40. newMarkdown,
  41. { pageId: currentPage._id, path: currentPage.path, revisionId: currentRevisionId },
  42. optionsToSave,
  43. );
  44. opts?.onSaveSuccess?.();
  45. }
  46. catch (error) {
  47. logger.error('failed to save', error);
  48. opts?.onSaveError?.(error);
  49. }
  50. }, [currentPage, opts, saveOrUpdate, shareLinkId]);
  51. // set handler to open HandsonTableModal
  52. useEffect(() => {
  53. if (currentPage == null || shareLinkId != null) {
  54. return;
  55. }
  56. const handler = (bol: number, eol: number) => {
  57. const markdown = currentPage.revision.body;
  58. const currentMarkdownTable = mtu.getMarkdownTableFromLine(markdown, bol, eol);
  59. openHandsontableModal(currentMarkdownTable, undefined, false, table => saveByHandsontableModal(table, bol, eol));
  60. };
  61. globalEmitter.on('launchHandsonTableModal', handler);
  62. return function cleanup() {
  63. globalEmitter.removeListener('launchHandsonTableModal', handler);
  64. };
  65. }, [currentPage, openHandsontableModal, saveByHandsontableModal, shareLinkId]);
  66. };