hooks.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { useCallback } from 'react';
  2. import { useRouter } from 'next/router';
  3. import { createPage } from '~/client/services/page-operation';
  4. import { useIsNotFound } from '~/stores/page';
  5. import loggerFactory from '~/utils/logger';
  6. const logger = loggerFactory('growi:Navbar:GrowiContextualSubNavigation');
  7. /**
  8. * Invoked when creation and transition has finished
  9. */
  10. type OnCreated = () => void;
  11. /**
  12. * Invoked when either creation or transition has aborted
  13. */
  14. type OnAborted = () => void;
  15. /**
  16. * Invoked when an error is occured
  17. */
  18. type OnError = (err) => void;
  19. /**
  20. * Always invoked after processing is terminated
  21. */
  22. type OnTerminated = () => void;
  23. type CreatePageAndTransitOpts = {
  24. onCreationStart?: OnCreated,
  25. onCreated?: OnCreated,
  26. onAborted?: OnAborted,
  27. onError?: OnError,
  28. onTerminated?: OnTerminated,
  29. }
  30. type CreatePageAndTransit = (
  31. pagePath: string | undefined,
  32. // grant?: number,
  33. // grantUserGroupId?: string,
  34. opts?: CreatePageAndTransitOpts,
  35. ) => Promise<void>;
  36. export const useCreatePageAndTransit = (): CreatePageAndTransit => {
  37. const router = useRouter();
  38. const { data: isNotFound } = useIsNotFound();
  39. return useCallback(async(pagePath, opts = {}) => {
  40. const {
  41. onCreationStart, onCreated, onAborted, onError, onTerminated,
  42. } = opts;
  43. if (isNotFound == null || !isNotFound || pagePath == null) {
  44. onAborted?.();
  45. onTerminated?.();
  46. return;
  47. }
  48. try {
  49. onCreationStart?.();
  50. const params = {
  51. isSlackEnabled: false,
  52. slackChannels: '',
  53. grant: 4,
  54. // grant,
  55. // grantUserGroupId,
  56. };
  57. const response = await createPage(pagePath, '', params);
  58. // Should not mutateEditorMode as it might prevent transitioning during mutation
  59. router.push(`${response.page.id}#edit`);
  60. onCreated?.();
  61. }
  62. catch (err) {
  63. logger.warn(err);
  64. onError?.(err);
  65. }
  66. finally {
  67. onTerminated?.();
  68. }
  69. }, [isNotFound, router]);
  70. };