PageCreateButton.tsx 3.1 KB

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