user-group.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import type {
  2. IPageHasId, IUserGroupHasId, IUserGroupRelationHasId,
  3. } from '@growi/core';
  4. import { type SWRResponseWithUtils, withUtils } from '@growi/core/dist/swr';
  5. import type { SWRResponse } from 'swr';
  6. import useSWRImmutable from 'swr/immutable';
  7. import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';
  8. import type {
  9. IUserGroupRelationHasIdPopulatedUser,
  10. UserGroupResult, UserGroupListResult, ChildUserGroupListResult, UserGroupRelationListResult, UserGroupRelationsResult,
  11. UserGroupPagesResult, SelectableParentUserGroupsResult, SelectableUserChildGroupsResult, AncestorUserGroupsResult,
  12. } from '~/interfaces/user-group-response';
  13. export const useSWRxUserGroup = (groupId: string | null): SWRResponse<IUserGroupHasId, Error> => {
  14. return useSWRImmutable(
  15. groupId != null ? `/user-groups/${groupId}` : null,
  16. endpoint => apiv3Get<UserGroupResult>(endpoint).then(result => result.data.userGroup),
  17. );
  18. };
  19. export const useSWRxUserGroupList = (initialData?: IUserGroupHasId[], isExternalGroup = false): SWRResponse<IUserGroupHasId[], Error> => {
  20. const url = isExternalGroup ? '/external-user-groups' : '/user-groups';
  21. return useSWRImmutable(
  22. url,
  23. endpoint => apiv3Get<UserGroupListResult>(endpoint, { pagination: false }).then(result => result.data.userGroups),
  24. {
  25. fallbackData: initialData,
  26. },
  27. );
  28. };
  29. type ChildUserGroupListUtils = {
  30. updateChild(childGroupData: IUserGroupHasId): Promise<void>, // update one child and refresh list
  31. }
  32. export const useSWRxChildUserGroupList = (
  33. parentIds?: string[], includeGrandChildren?: boolean,
  34. ): SWRResponseWithUtils<ChildUserGroupListUtils, ChildUserGroupListResult, Error> => {
  35. const shouldFetch = parentIds != null && parentIds.length > 0;
  36. const swrResponse = useSWRImmutable(
  37. shouldFetch ? ['/user-groups/children', parentIds, includeGrandChildren] : null,
  38. ([endpoint, parentIds, includeGrandChildren]) => apiv3Get<ChildUserGroupListResult>(
  39. endpoint, { parentIds, includeGrandChildren },
  40. ).then((result => result.data)),
  41. );
  42. const updateChild = async(childGroupData: IUserGroupHasId) => {
  43. await apiv3Put(`/user-groups/${childGroupData._id}`, {
  44. name: childGroupData.name,
  45. description: childGroupData.description,
  46. parentId: childGroupData.parent,
  47. });
  48. swrResponse.mutate();
  49. };
  50. return withUtils(swrResponse, { updateChild });
  51. };
  52. export const useSWRxUserGroupRelations = (groupId: string | null): SWRResponse<IUserGroupRelationHasIdPopulatedUser[], Error> => {
  53. return useSWRImmutable(
  54. groupId != null ? `/user-groups/${groupId}/user-group-relations` : null,
  55. endpoint => apiv3Get<UserGroupRelationsResult>(endpoint).then(result => result.data.userGroupRelations),
  56. );
  57. };
  58. export const useSWRxUserGroupRelationList = (
  59. groupIds: string[] | null, childGroupIds?: string[], initialData?: IUserGroupRelationHasId[],
  60. ): SWRResponse<IUserGroupRelationHasId[], Error> => {
  61. return useSWRImmutable(
  62. groupIds != null ? ['/user-group-relations', groupIds, childGroupIds] : null,
  63. ([endpoint, groupIds, childGroupIds]) => apiv3Get<UserGroupRelationListResult>(
  64. endpoint, { groupIds, childGroupIds },
  65. ).then(result => result.data.userGroupRelations),
  66. {
  67. fallbackData: initialData,
  68. },
  69. );
  70. };
  71. export const useSWRxUserGroupPages = (groupId: string | undefined, limit: number, offset: number): SWRResponse<IPageHasId[], Error> => {
  72. return useSWRImmutable(
  73. groupId != null ? [`/user-groups/${groupId}/pages`, limit, offset] : null,
  74. ([endpoint, limit, offset]) => apiv3Get<UserGroupPagesResult>(endpoint, { limit, offset }).then(result => result.data.pages),
  75. );
  76. };
  77. export const useSWRxSelectableParentUserGroups = (groupId: string | null): SWRResponse<IUserGroupHasId[], Error> => {
  78. return useSWRImmutable(
  79. groupId != null ? ['/user-groups/selectable-parent-groups', groupId] : null,
  80. ([endpoint, groupId]) => apiv3Get<SelectableParentUserGroupsResult>(endpoint, { groupId }).then(result => result.data.selectableParentGroups),
  81. );
  82. };
  83. export const useSWRxSelectableChildUserGroups = (groupId: string | null): SWRResponse<IUserGroupHasId[], Error> => {
  84. return useSWRImmutable(
  85. groupId != null ? ['/user-groups/selectable-child-groups', groupId] : null,
  86. ([endpoint, groupId]) => apiv3Get<SelectableUserChildGroupsResult>(endpoint, { groupId }).then(result => result.data.selectableChildGroups),
  87. );
  88. };
  89. export const useSWRxAncestorUserGroups = (groupId: string | null): SWRResponse<IUserGroupHasId[], Error> => {
  90. return useSWRImmutable(
  91. groupId != null ? ['/user-groups/ancestors', groupId] : null,
  92. ([endpoint, groupId]) => apiv3Get<AncestorUserGroupsResult>(endpoint, { groupId }).then(result => result.data.ancestorUserGroups),
  93. );
  94. };