PageCreateButton.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import React, { useCallback, useState } from 'react';
  2. import { useRouter } from 'next/router';
  3. import { createPage } from '~/client/services/page-operation';
  4. import { toastError } from '~/client/util/toastr';
  5. import { useSWRxCurrentPage } from '~/stores/page';
  6. import loggerFactory from '~/utils/logger';
  7. import styles from './PageCreateButton.module.scss';
  8. import { Hexagon } from './Hexagon';
  9. import { CreateButton } from './CreateButton';
  10. const moduleClass = styles['grw-page-create-button'];
  11. const logger = loggerFactory('growi:cli:PageCreateButton');
  12. export const PageCreateButton = React.memo((): JSX.Element => {
  13. const router = useRouter();
  14. const { data: currentPage, isLoading } = useSWRxCurrentPage();
  15. const [isHovered, setIsHovered] = useState(false);
  16. const [isCreating, setIsCreating] = useState(false);
  17. const onMouseEnterHandler = () => {
  18. setIsHovered(true);
  19. };
  20. const onMouseLeaveHandler = () => {
  21. setIsHovered(false);
  22. };
  23. const onCreateNewPageButtonHandler = useCallback(async() => {
  24. if (isLoading) return;
  25. try {
  26. setIsCreating(true);
  27. const parentPath = currentPage == null
  28. ? '/'
  29. : currentPage.path;
  30. const params = {
  31. isSlackEnabled: false,
  32. slackChannels: '',
  33. grant: currentPage?.grant || 1,
  34. pageTags: [],
  35. grantUserGroupId: currentPage?.grantedGroup?._id,
  36. shouldGeneratePath: true,
  37. };
  38. const response = await createPage(parentPath, '', params);
  39. router.push(`${response.page.id}#edit`);
  40. }
  41. catch (err) {
  42. logger.warn(err);
  43. toastError(err);
  44. }
  45. finally {
  46. setIsCreating(false);
  47. }
  48. }, [currentPage, isLoading, router]);
  49. const onCreateTodaysButtonHandler = useCallback(() => {
  50. // router.push(`${router.pathname}#edit`);
  51. }, [router]);
  52. const onTemplateForChildrenButtonHandler = useCallback(() => {
  53. // router.push(`${router.pathname}/_template#edit`);
  54. }, [router]);
  55. const onTemplateForDescendantsButtonHandler = useCallback(() => {
  56. // router.push(`${router.pathname}/__template#edit`);
  57. }, [router]);
  58. // TODO: i18n
  59. // https://redmine.weseek.co.jp/issues/132681
  60. return (
  61. <div
  62. className={`${moduleClass} d-flex flex-row`}
  63. onMouseEnter={onMouseEnterHandler}
  64. onMouseLeave={onMouseLeaveHandler}
  65. >
  66. <div className="btn-group flex-grow-1">
  67. <CreateButton
  68. onClick={onCreateNewPageButtonHandler}
  69. disabled={isCreating}
  70. />
  71. </div>
  72. {isHovered && (
  73. <div className="btn-group dropend">
  74. <button
  75. className="btn btn-secondary dropdown-toggle dropdown-toggle-split position-absolute"
  76. type="button"
  77. data-bs-toggle="dropdown"
  78. aria-expanded="false"
  79. />
  80. <ul className="dropdown-menu">
  81. <li>
  82. <button
  83. className="dropdown-item"
  84. onClick={onCreateNewPageButtonHandler}
  85. type="button"
  86. disabled={isCreating}
  87. >
  88. Create New Page
  89. </button>
  90. </li>
  91. <li><hr className="dropdown-divider" /></li>
  92. <li><span className="text-muted px-3">Create today&apos;s ...</span></li>
  93. {/* TODO: show correct create today's page path */}
  94. {/* https://redmine.weseek.co.jp/issues/132682 */}
  95. <li>
  96. <button
  97. className="dropdown-item"
  98. onClick={onCreateTodaysButtonHandler}
  99. type="button"
  100. >
  101. Create today&apos;s
  102. </button>
  103. </li>
  104. <li><hr className="dropdown-divider" /></li>
  105. <li><span className="text-muted px-3">Child page template</span></li>
  106. <li>
  107. <button
  108. className="dropdown-item"
  109. onClick={onTemplateForChildrenButtonHandler}
  110. type="button"
  111. >
  112. Template for children
  113. </button>
  114. </li>
  115. <li>
  116. <button
  117. className="dropdown-item"
  118. onClick={onTemplateForDescendantsButtonHandler}
  119. type="button"
  120. >
  121. Template for descendants
  122. </button>
  123. </li>
  124. </ul>
  125. </div>
  126. )}
  127. </div>
  128. );
  129. });
  130. PageCreateButton.displayName = 'PageCreateButton';