NewPageCreateButton.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. const test = pagePathUtils;
  40. console.dir(test);
  41. return (
  42. <>
  43. {!pagePathUtils.isUsersTopPage(page.path ?? '') && (
  44. <NotAvailableForGuest>
  45. <NotAvailableForReadOnlyUser>
  46. <button
  47. id="page-create-button-in-page-tree"
  48. type="button"
  49. className="border-0 rounded btn btn-page-item-control p-0 grw-visible-on-hover"
  50. onClick={onClickPlusButton}
  51. >
  52. <i className="icon-plus d-block p-0" />
  53. </button>
  54. </NotAvailableForReadOnlyUser>
  55. </NotAvailableForGuest>
  56. )}
  57. </>
  58. );
  59. };