SavePageControls.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import React from 'react';
  2. import { pagePathUtils } from '@growi/core';
  3. import { useTranslation } from 'next-i18next';
  4. import {
  5. UncontrolledButtonDropdown, Button,
  6. DropdownToggle, DropdownMenu, DropdownItem,
  7. } from 'reactstrap';
  8. // import PageContainer from '~/client/services/PageContainer';
  9. import { CustomWindow } from '~/interfaces/global';
  10. import {
  11. useCurrentPagePath, useIsEditable, useCurrentPageId, useIsAclEnabled,
  12. } from '~/stores/context';
  13. import { useIsEnabledUnsavedWarning } from '~/stores/editor';
  14. import { useSelectedGrant } from '~/stores/ui';
  15. import loggerFactory from '~/utils/logger';
  16. import { IPageGrantData } from '~/interfaces/page';
  17. import GrantSelector from './SavePageControls/GrantSelector';
  18. // import { withUnstatedContainers } from './UnstatedUtils';
  19. const logger = loggerFactory('growi:SavePageControls');
  20. type Props = {
  21. // pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  22. }
  23. const { isTopPage } = pagePathUtils;
  24. export const SavePageControls = (props: Props): JSX.Element | null => {
  25. const { t } = useTranslation();
  26. const { data: currentPagePath } = useCurrentPagePath();
  27. const { data: isEditable } = useIsEditable();
  28. const { data: isAclEnabled } = useIsAclEnabled();
  29. const { data: grantData, mutate: mutateGrant } = useSelectedGrant();
  30. const { data: pageId } = useCurrentPageId();
  31. const { mutate: mutateIsEnabledUnsavedWarning } = useIsEnabledUnsavedWarning();
  32. if (isEditable == null || isAclEnabled == null) {
  33. return null;
  34. }
  35. if (!isEditable) {
  36. return null;
  37. }
  38. const grant = grantData?.grant || 1;
  39. const grantedGroup = grantData?.grantedGroup;
  40. const {
  41. // pageContainer,
  42. } = props;
  43. const updateGrantHandler = (grantData: IPageGrantData): void => {
  44. mutateGrant(grantData);
  45. };
  46. const save = async(): Promise<void> => {
  47. // disable unsaved warning
  48. mutateIsEnabledUnsavedWarning(false);
  49. try {
  50. // save
  51. (window as CustomWindow).globalEmitter.emit('saveAndReload');
  52. }
  53. catch (error) {
  54. logger.error('failed to save', error);
  55. // pageContainer.showErrorToastr(error);
  56. if (error.code === 'conflict') {
  57. // pageContainer.setState({
  58. // remoteRevisionId: error.data.revisionId,
  59. // remoteRevisionBody: error.data.revisionBody,
  60. // remoteRevisionUpdateAt: error.data.createdAt,
  61. // lastUpdateUser: error.data.user,
  62. // });
  63. }
  64. }
  65. };
  66. const saveAndOverwriteScopesOfDescendants = () => {
  67. // disable unsaved warning
  68. mutateIsEnabledUnsavedWarning(false);
  69. // save
  70. (window as CustomWindow).globalEmitter.emit('saveAndReload', { overwriteScopesOfDescendants: true });
  71. };
  72. const isRootPage = isTopPage(currentPagePath ?? '');
  73. const labelSubmitButton = pageId == null ? t('Create') : t('Update');
  74. const labelOverwriteScopes = t('page_edit.overwrite_scopes', { operation: labelSubmitButton });
  75. return (
  76. <div className="d-flex align-items-center form-inline flex-nowrap">
  77. {isAclEnabled
  78. && (
  79. <div className="mr-2">
  80. <GrantSelector
  81. grant={grant}
  82. disabled={isRootPage}
  83. grantGroupId={grantedGroup?.id}
  84. grantGroupName={grantedGroup?.name}
  85. onUpdateGrant={updateGrantHandler}
  86. />
  87. </div>
  88. )
  89. }
  90. <UncontrolledButtonDropdown direction="up">
  91. <Button id="caret" color="primary" className="btn-submit" onClick={save}>
  92. {labelSubmitButton}
  93. </Button>
  94. <DropdownToggle caret color="primary" />
  95. <DropdownMenu right>
  96. <DropdownItem onClick={saveAndOverwriteScopesOfDescendants}>
  97. {labelOverwriteScopes}
  98. </DropdownItem>
  99. </DropdownMenu>
  100. </UncontrolledButtonDropdown>
  101. </div>
  102. );
  103. };
  104. export default SavePageControls;