PageCreateButton.tsx 2.3 KB

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