NewPageCreateButton.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React, {
  2. useCallback, FC,
  3. } from 'react';
  4. import { pagePathUtils } from '@growi/core/dist/utils';
  5. import { NotAvailableForGuest } from '~/components/NotAvailableForGuest';
  6. import { NotAvailableForReadOnlyUser } from '~/components/NotAvailableForReadOnlyUser';
  7. import { IPageForItem } from '~/interfaces/page';
  8. import { usePageTreeDescCountMap } from '~/stores/ui';
  9. import { ItemNode } from './ItemNode';
  10. type StateHandlersType = {
  11. isOpen: boolean,
  12. setIsOpen: React.Dispatch<React.SetStateAction<boolean>>,
  13. isCreating: boolean,
  14. setCreating: React.Dispatch<React.SetStateAction<boolean>>,
  15. };
  16. export type NewPageCreateButtonProps = {
  17. page: IPageForItem,
  18. currentChildren: ItemNode[],
  19. stateHandlers: StateHandlersType,
  20. isNewPageInputShown?: boolean,
  21. setNewPageInputShown: React.Dispatch<React.SetStateAction<boolean>>,
  22. };
  23. export const NewPageCreateButton: FC<NewPageCreateButtonProps> = (props) => {
  24. const {
  25. page, currentChildren, stateHandlers, setNewPageInputShown,
  26. } = props;
  27. const { setIsOpen } = stateHandlers;
  28. // descendantCount
  29. const { getDescCount } = usePageTreeDescCountMap();
  30. const descendantCount = getDescCount(page._id) || page.descendantCount || 0;
  31. const isChildrenLoaded = currentChildren?.length > 0;
  32. const hasDescendants = descendantCount > 0 || isChildrenLoaded;
  33. const onClickPlusButton = useCallback(() => {
  34. setNewPageInputShown(true);
  35. if (hasDescendants) {
  36. setIsOpen(true);
  37. }
  38. }, [hasDescendants, setIsOpen]);
  39. return (
  40. <>
  41. {!pagePathUtils.isUsersTopPage(page.path ?? '') && (
  42. <NotAvailableForGuest>
  43. <NotAvailableForReadOnlyUser>
  44. <button
  45. id="page-create-button-in-page-tree"
  46. type="button"
  47. className="border-0 rounded btn btn-page-item-control p-0 grw-visible-on-hover"
  48. onClick={onClickPlusButton}
  49. >
  50. <i className="icon-plus d-block p-0" />
  51. </button>
  52. </NotAvailableForReadOnlyUser>
  53. </NotAvailableForGuest>
  54. )}
  55. </>
  56. );
  57. };