UserGroupPage.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import React, {
  2. FC, Fragment, useState, useCallback, useEffect,
  3. } from 'react';
  4. import UserGroupTable from './UserGroupTable';
  5. import UserGroupCreateForm from './UserGroupCreateForm';
  6. import UserGroupDeleteModal from './UserGroupDeleteModal';
  7. import { withUnstatedContainers } from '../../UnstatedUtils';
  8. import AppContainer from '~/client/services/AppContainer';
  9. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  10. import { IUserGroupHasObjectId, IUserGroupRelation } from '~/interfaces/user';
  11. import Xss from '~/services/xss';
  12. import { CustomWindow } from '~/interfaces/global';
  13. import { apiv3Get, apiv3Delete } from '~/client/util/apiv3-client';
  14. type Props = {
  15. appContainer: AppContainer,
  16. };
  17. const UserGroupPage: FC<Props> = (props: Props) => {
  18. const xss: Xss = (window as CustomWindow).xss;
  19. const { isAclEnabled } = props.appContainer.config;
  20. /*
  21. * State
  22. */
  23. const [userGroups, setUserGroups] = useState<IUserGroupHasObjectId[]>([]);
  24. const [userGroupRelations, setUserGroupRelations] = useState<IUserGroupRelation[]>([]);
  25. const [selectedUserGroup, setSelectedUserGroup] = useState<IUserGroupHasObjectId | undefined>(undefined); // not null but undefined (to use defaultProps in UserGroupDeleteModal)
  26. const [isDeleteModalShown, setDeleteModalShown] = useState<boolean>(false);
  27. /*
  28. * Functions
  29. */
  30. const syncUserGroupAndRelations = useCallback(async() => {
  31. try {
  32. const userGroupsRes = await apiv3Get('/user-groups', { pagination: false });
  33. const userGroupRelationsRes = await apiv3Get('/user-group-relations');
  34. setUserGroups(userGroupsRes.data.userGroups);
  35. setUserGroupRelations(userGroupRelationsRes.data.userGroupRelations);
  36. }
  37. catch (err) {
  38. toastError(err);
  39. }
  40. }, []);
  41. const showDeleteModal = useCallback(async(group: IUserGroupHasObjectId) => {
  42. try {
  43. await syncUserGroupAndRelations();
  44. setSelectedUserGroup(group);
  45. setDeleteModalShown(true);
  46. }
  47. catch (err) {
  48. toastError(err);
  49. }
  50. }, []);
  51. const hideDeleteModal = useCallback(() => {
  52. setSelectedUserGroup(undefined);
  53. setDeleteModalShown(false);
  54. }, []);
  55. const addUserGroup = useCallback((userGroup: IUserGroupHasObjectId, userGroupRelations: IUserGroupRelation[]) => {
  56. setUserGroups(prev => [...prev, userGroup]);
  57. setUserGroupRelations(prev => ([...prev, ...userGroupRelations]));
  58. }, []);
  59. const deleteUserGroupById = useCallback(async(deleteGroupId: string, actionName: string, transferToUserGroupId: string) => {
  60. try {
  61. const res = await apiv3Delete(`/user-groups/${deleteGroupId}`, {
  62. actionName,
  63. transferToUserGroupId,
  64. });
  65. setUserGroups(prev => prev.filter(userGroup => userGroup._id !== deleteGroupId));
  66. setUserGroupRelations(prev => prev.filter(relation => relation.relatedGroup !== deleteGroupId));
  67. setSelectedUserGroup(undefined);
  68. setDeleteModalShown(false);
  69. toastSuccess(`Deleted a group "${xss.process(res.data.userGroup.name)}"`);
  70. }
  71. catch (err) {
  72. toastError(new Error('Unable to delete the group'));
  73. }
  74. }, []);
  75. /*
  76. * componentDidMount
  77. */
  78. useEffect(() => {
  79. syncUserGroupAndRelations();
  80. }, []);
  81. return (
  82. <Fragment>
  83. <UserGroupCreateForm
  84. isAclEnabled={isAclEnabled}
  85. onCreate={addUserGroup}
  86. />
  87. <UserGroupTable
  88. userGroups={userGroups}
  89. isAclEnabled={isAclEnabled}
  90. onDelete={showDeleteModal}
  91. userGroupRelations={userGroupRelations}
  92. />
  93. <UserGroupDeleteModal
  94. appContainer={props.appContainer}
  95. userGroups={userGroups}
  96. deleteUserGroup={selectedUserGroup}
  97. onDelete={deleteUserGroupById}
  98. isShow={isDeleteModalShown}
  99. onShow={showDeleteModal}
  100. onHide={hideDeleteModal}
  101. />
  102. </Fragment>
  103. );
  104. };
  105. /**
  106. * Wrapper component for using unstated
  107. */
  108. const UserGroupPageWrapper = withUnstatedContainers(UserGroupPage, [AppContainer]);
  109. export default UserGroupPageWrapper;