PageCreateButton.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React, { type JSX, useState } from 'react';
  2. import { Dropdown } from 'reactstrap';
  3. import { useCreateTemplatePage } from '~/client/services/create-page';
  4. import { useToastrOnError } from '~/client/services/use-toastr-on-error';
  5. import { useCurrentPagePath } from '~/states/page';
  6. import { usePageCreateModalActions } from '~/states/ui/modal/page-create';
  7. import { CreateButton } from './CreateButton';
  8. import { DropendMenu } from './DropendMenu';
  9. import { DropendToggle } from './DropendToggle';
  10. import { useCreateNewPage, useCreateTodaysMemo } from './hooks';
  11. export const PageCreateButton = React.memo((): JSX.Element => {
  12. const [isHovered, setIsHovered] = useState(false);
  13. const [dropdownOpen, setDropdownOpen] = useState(false);
  14. const { open: openPageCreateModal } = usePageCreateModalActions();
  15. const currentPagePath = useCurrentPagePath();
  16. const { createNewPage, isCreating: isNewPageCreating } = useCreateNewPage();
  17. // TODO: https://redmine.weseek.co.jp/issues/138806
  18. const {
  19. createTodaysMemo,
  20. isCreating: isTodaysPageCreating,
  21. todaysPath,
  22. } = useCreateTodaysMemo();
  23. // TODO: https://redmine.weseek.co.jp/issues/138805
  24. const {
  25. createTemplate,
  26. isCreating: isTemplatePageCreating,
  27. isCreatable: isTemplatePageCreatable,
  28. } = useCreateTemplatePage();
  29. const createNewPageWithToastr = useToastrOnError(createNewPage);
  30. const createTodaysMemoWithToastr = useToastrOnError(createTodaysMemo);
  31. const createTemplateWithToastr = useToastrOnError(createTemplate);
  32. const onMouseEnterHandler = () => {
  33. setIsHovered(true);
  34. };
  35. const onMouseLeaveHandler = () => {
  36. setIsHovered(false);
  37. setDropdownOpen(false);
  38. };
  39. const toggle = () => setDropdownOpen(!dropdownOpen);
  40. return (
  41. <fieldset
  42. className="d-flex flex-row mt-2 border-0 p-0 m-0"
  43. onMouseEnter={onMouseEnterHandler}
  44. onMouseLeave={onMouseLeaveHandler}
  45. data-testid="grw-page-create-button"
  46. aria-label="Page create actions"
  47. >
  48. <div className="btn-group flex-grow-1">
  49. <CreateButton
  50. className="z-2"
  51. onClick={createNewPageWithToastr}
  52. disabled={
  53. isNewPageCreating || isTodaysPageCreating || isTemplatePageCreating
  54. }
  55. />
  56. </div>
  57. {isHovered && (
  58. <Dropdown
  59. isOpen={dropdownOpen}
  60. toggle={toggle}
  61. direction="end"
  62. className="position-absolute"
  63. >
  64. <DropendToggle />
  65. <DropendMenu
  66. onClickCreateNewPage={createNewPageWithToastr}
  67. onClickOpenPageCreateModal={() =>
  68. openPageCreateModal(currentPagePath)
  69. }
  70. onClickCreateTodaysMemo={createTodaysMemoWithToastr}
  71. onClickCreateTemplate={
  72. isTemplatePageCreatable ? createTemplateWithToastr : undefined
  73. }
  74. todaysPath={todaysPath}
  75. />
  76. </Dropdown>
  77. )}
  78. </fieldset>
  79. );
  80. });