use-on-template-button-clicked.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { useCallback, useState } from 'react';
  2. import { isCreatablePage } from '@growi/core/dist/utils/page-path-utils';
  3. import { useRouter } from 'next/router';
  4. import { createPage, exist } from '~/client/services/page-operation';
  5. import type { LabelType } from '~/interfaces/template';
  6. export const useOnTemplateButtonClicked = (
  7. currentPagePath?: string,
  8. isLoading?: boolean,
  9. ): {
  10. onClickHandler: (label: LabelType) => Promise<void>,
  11. isPageCreating: boolean
  12. } => {
  13. const router = useRouter();
  14. const [isPageCreating, setIsPageCreating] = useState(false);
  15. const onClickHandler = useCallback(async(label: LabelType) => {
  16. if (isLoading) return;
  17. try {
  18. setIsPageCreating(true);
  19. const targetPath = currentPagePath == null || currentPagePath === '/'
  20. ? `/${label}`
  21. : `${currentPagePath}/${label}`;
  22. const path = isCreatablePage(targetPath) ? targetPath : `/${label}`;
  23. const res = await exist(JSON.stringify([path]));
  24. if (!res.pages[path]) {
  25. const params = {
  26. isSlackEnabled: false,
  27. slackChannels: '',
  28. grant: 4,
  29. // grant: currentPage?.grant || 1,
  30. // grantUserGroupId: currentPage?.grantedGroup?._id,
  31. };
  32. await createPage(path, '', params);
  33. }
  34. router.push(`${path}#edit`);
  35. }
  36. catch (err) {
  37. throw err;
  38. }
  39. finally {
  40. setIsPageCreating(false);
  41. }
  42. }, [currentPagePath, isLoading, router]);
  43. return { onClickHandler, isPageCreating };
  44. };