PageCreateButton.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, { useState, useCallback } from 'react';
  2. import { pagePathUtils } from '@growi/core/dist/utils';
  3. import { format } from 'date-fns';
  4. import { useOnTemplateButtonClicked } from '~/client/services/use-on-template-button-clicked';
  5. import { toastError } from '~/client/util/toastr';
  6. import { LabelType } from '~/interfaces/template';
  7. import { useCurrentUser } from '~/stores/context';
  8. import { useSWRxCurrentPage } from '~/stores/page';
  9. import { CreateButton } from './CreateButton';
  10. import { DropendMenu } from './DropendMenu';
  11. import { DropendToggle } from './DropendToggle';
  12. import { useOnNewButtonClicked, useOnTodaysButtonClicked } from './hooks';
  13. export const PageCreateButton = React.memo((): JSX.Element => {
  14. const { data: currentPage, isLoading } = useSWRxCurrentPage();
  15. const { data: currentUser } = useCurrentUser();
  16. const [isHovered, setIsHovered] = useState(false);
  17. const now = format(new Date(), 'yyyy/MM/dd');
  18. const userHomepagePath = pagePathUtils.userHomepagePath(currentUser);
  19. const todaysPath = `${userHomepagePath}/memo/${now}`;
  20. const { onClickHandler: onClickNewButton, isPageCreating: isNewPageCreating } = useOnNewButtonClicked(isLoading, currentPage);
  21. const { onClickHandler: onClickTodaysButton, isPageCreating: isTodaysPageCreating } = useOnTodaysButtonClicked(todaysPath, currentUser);
  22. const { onClickHandler: onClickTemplateButton, isPageCreating: isTemplatePageCreating } = useOnTemplateButtonClicked(currentPage?.path);
  23. const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
  24. try {
  25. await onClickTemplateButton(label);
  26. }
  27. catch (err) {
  28. toastError(err);
  29. }
  30. }, [onClickTemplateButton]);
  31. const onMouseEnterHandler = () => {
  32. setIsHovered(true);
  33. };
  34. const onMouseLeaveHandler = () => {
  35. setIsHovered(false);
  36. };
  37. return (
  38. <div
  39. className="d-flex flex-row"
  40. onMouseEnter={onMouseEnterHandler}
  41. onMouseLeave={onMouseLeaveHandler}
  42. >
  43. <div className="btn-group flex-grow-1">
  44. <CreateButton
  45. className="z-2"
  46. onClick={onClickNewButton}
  47. disabled={isNewPageCreating || isTodaysPageCreating || isTemplatePageCreating}
  48. />
  49. </div>
  50. { isHovered && (
  51. <div className="btn-group dropend position-absolute">
  52. <DropendToggle
  53. className="dropdown-toggle dropdown-toggle-split"
  54. data-bs-toggle="dropdown"
  55. aria-expanded="false"
  56. />
  57. <DropendMenu
  58. todaysPath={todaysPath}
  59. onClickCreateNewPageButtonHandler={onClickNewButton}
  60. onClickCreateTodaysButtonHandler={onClickTodaysButton}
  61. onClickTemplateButtonHandler={onClickTemplateButtonHandler}
  62. />
  63. </div>
  64. )}
  65. </div>
  66. );
  67. });