PageCreateButton.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. >
  37. <div className="btn-group flex-grow-1">
  38. <CreateButton
  39. className="z-2"
  40. onClick={createNewPageWithToastr}
  41. disabled={isNewPageCreating || isTodaysPageCreating || isTemplatePageCreating}
  42. />
  43. </div>
  44. { isHovered && (
  45. <Dropdown
  46. isOpen={dropdownOpen}
  47. toggle={toggle}
  48. direction="end"
  49. className="position-absolute"
  50. >
  51. <DropendToggle />
  52. <DropendMenu
  53. onClickCreateNewPage={createNewPageWithToastr}
  54. onClickCreateTodaysMemo={createTodaysMemoWithToastr}
  55. onClickCreateTemplate={isTemplatePageCreatable ? createTemplateWithToastr : undefined}
  56. todaysPath={todaysPath}
  57. />
  58. </Dropdown>
  59. )}
  60. </div>
  61. );
  62. });