PageCreateButton.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React, { 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 { CreateButton } from './CreateButton';
  6. import { DropendMenu } from './DropendMenu';
  7. import { DropendToggle } from './DropendToggle';
  8. import { useCreateNewPage, useCreateTodaysMemo } from './hooks';
  9. export const PageCreateButton = React.memo((): JSX.Element => {
  10. const [isHovered, setIsHovered] = useState(false);
  11. const [dropdownOpen, setDropdownOpen] = useState(false);
  12. const { createNewPage, isCreating: isNewPageCreating } = useCreateNewPage();
  13. // TODO: https://redmine.weseek.co.jp/issues/138806
  14. const { createTodaysMemo, isCreating: isTodaysPageCreating, todaysPath } = useCreateTodaysMemo();
  15. // TODO: https://redmine.weseek.co.jp/issues/138805
  16. const {
  17. createTemplate,
  18. isCreating: isTemplatePageCreating, isCreatable: isTemplatePageCreatable,
  19. } = useCreateTemplatePage();
  20. const createNewPageWithToastr = useToastrOnError(createNewPage);
  21. const createTodaysMemoWithToastr = useToastrOnError(createTodaysMemo);
  22. const createTemplateWithToastr = useToastrOnError(createTemplate);
  23. const onMouseEnterHandler = () => {
  24. setIsHovered(true);
  25. };
  26. const onMouseLeaveHandler = () => {
  27. setIsHovered(false);
  28. setDropdownOpen(false);
  29. };
  30. const toggle = () => setDropdownOpen(!dropdownOpen);
  31. return (
  32. <div
  33. className="d-flex flex-row mt-2"
  34. onMouseEnter={onMouseEnterHandler}
  35. onMouseLeave={onMouseLeaveHandler}
  36. data-testid="grw-page-create-button"
  37. >
  38. <div className="btn-group flex-grow-1">
  39. <CreateButton
  40. className="z-2"
  41. onClick={createNewPageWithToastr}
  42. disabled={isNewPageCreating || isTodaysPageCreating || isTemplatePageCreating}
  43. />
  44. </div>
  45. { isHovered && (
  46. <Dropdown
  47. isOpen={dropdownOpen}
  48. toggle={toggle}
  49. direction="end"
  50. className="position-absolute"
  51. >
  52. <DropendToggle />
  53. <DropendMenu
  54. onClickCreateNewPage={createNewPageWithToastr}
  55. onClickCreateTodaysMemo={createTodaysMemoWithToastr}
  56. onClickCreateTemplate={isTemplatePageCreatable ? createTemplateWithToastr : undefined}
  57. todaysPath={todaysPath}
  58. />
  59. </Dropdown>
  60. )}
  61. </div>
  62. );
  63. });