user-group.tsx 4.9 KB

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