@greatapps/common 1.1.525 → 1.1.527

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +10 -4
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs +3 -1
  4. package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs.map +1 -1
  5. package/dist/components/account/sections/ChangeEmailModal.mjs +3 -1
  6. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  7. package/dist/components/account/sections/ChangePhoneModal.mjs +3 -1
  8. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  9. package/dist/components/account/sections/MyProfileSection.mjs +2 -1
  10. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  11. package/dist/components/account/sections/TokenSection.mjs +72 -0
  12. package/dist/components/account/sections/TokenSection.mjs.map +1 -0
  13. package/dist/components/embeds/ClarityEmbed.mjs +55 -0
  14. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -0
  15. package/dist/components/embeds/EmbedWidgets.mjs +3 -1
  16. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  17. package/dist/components/layouts/AppMobileNavBar.mjs +3 -1
  18. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  19. package/dist/components/layouts/AppNavBar.mjs +4 -8
  20. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  21. package/dist/components/layouts/NavBar.mjs +10 -9
  22. package/dist/components/layouts/NavBar.mjs.map +1 -1
  23. package/dist/components/layouts/NotificationsPopover.mjs +5 -2
  24. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  25. package/dist/components/layouts/ProfilePopover.mjs +4 -2
  26. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  27. package/dist/components/layouts/SideBarNavigation.mjs +4 -1
  28. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  29. package/dist/components/modals/BuyCreditsModal.mjs +26 -9
  30. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  31. package/dist/components/modals/cards/AddCardModal.mjs +3 -1
  32. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  33. package/dist/components/navigation/CancelledSubscriptionBanner.mjs +1 -1
  34. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  35. package/dist/components/navigation/ProjectSelectorPopover.mjs +7 -6
  36. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  37. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +39 -19
  38. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  39. package/dist/components/pages/NotFoundPage.mjs +2 -2
  40. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  41. package/dist/components/ui/buttons/Button.mjs +7 -2
  42. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  43. package/dist/components/ui/data-display/CardItem.mjs +1 -1
  44. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  45. package/dist/components/ui/data-display/PaymentInfoCard.mjs +4 -2
  46. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  47. package/dist/components/ui/data-display/UserAvatar.mjs +6 -2
  48. package/dist/components/ui/data-display/UserAvatar.mjs.map +1 -1
  49. package/dist/components/ui/feedback/DefaultCircularProgress.mjs +4 -1
  50. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  51. package/dist/components/ui/feedback/Toast.mjs +7 -2
  52. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  53. package/dist/components/ui/form/FormField.mjs +1 -1
  54. package/dist/components/ui/form/FormField.mjs.map +1 -1
  55. package/dist/components/ui/form/Select.mjs +1 -1
  56. package/dist/components/ui/form/Select.mjs.map +1 -1
  57. package/dist/components/ui/overlay/Popover.mjs +1 -1
  58. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  59. package/dist/components/ui/overlay/Sheet.mjs +8 -6
  60. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  61. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +23 -35
  62. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  63. package/dist/components/widgets/ImageUpload/ImageUpload.mjs +2 -1
  64. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  65. package/dist/components/widgets/notifications/NotificationCard.mjs +4 -1
  66. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  67. package/dist/enums/AccountSectionType.mjs +1 -0
  68. package/dist/enums/AccountSectionType.mjs.map +1 -1
  69. package/dist/hooks/useAuthQueryKey.mjs +23 -0
  70. package/dist/hooks/useAuthQueryKey.mjs.map +1 -0
  71. package/dist/index.mjs +90 -8
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/infra/utils/array.mjs +34 -0
  74. package/dist/infra/utils/array.mjs.map +1 -0
  75. package/dist/modules/accounts/actions/get-account-token.action.mjs +10 -0
  76. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -0
  77. package/dist/modules/accounts/hooks/current-account.hook.mjs +5 -2
  78. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  79. package/dist/modules/accounts/hooks/use-account-token.hook.mjs +15 -0
  80. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -0
  81. package/dist/modules/accounts/hooks/useAccountManagement.mjs +19 -9
  82. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  83. package/dist/modules/accounts/hooks/useCurrencies.mjs +3 -1
  84. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  85. package/dist/modules/accounts/hooks/useTimezones.mjs +3 -1
  86. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  87. package/dist/modules/accounts/services/account-token.service.mjs +32 -0
  88. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -0
  89. package/dist/modules/auth/hooks/useUserQuery.mjs +15 -6
  90. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  91. package/dist/modules/cards/actions/delete-card.action.mjs +10 -0
  92. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -0
  93. package/dist/modules/cards/actions/find-card-by-id.action.mjs +10 -0
  94. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -0
  95. package/dist/modules/cards/actions/set-default-card.action.mjs +10 -0
  96. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -0
  97. package/dist/modules/cards/hooks/card-by-id.hook.mjs +22 -0
  98. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -0
  99. package/dist/modules/cards/hooks/cards.hook.mjs +11 -3
  100. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  101. package/dist/modules/cards/hooks/create-card.hook.mjs +13 -2
  102. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  103. package/dist/modules/cards/hooks/delete-card.hook.mjs +50 -0
  104. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -0
  105. package/dist/modules/cards/hooks/set-default-card.hook.mjs +51 -0
  106. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -0
  107. package/dist/modules/cards/services/cards.service.mjs +45 -4
  108. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  109. package/dist/modules/cards/types.mjs +11 -3
  110. package/dist/modules/cards/types.mjs.map +1 -1
  111. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs +3 -1
  112. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  113. package/dist/modules/plans/hooks/list-plans.hook.mjs +3 -1
  114. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  115. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs +4 -2
  116. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  117. package/dist/modules/plans/services/plans.service.mjs +4 -2
  118. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  119. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  120. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +20 -10
  121. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  122. package/dist/modules/projects/actions/create-project.action.mjs +10 -0
  123. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -0
  124. package/dist/modules/projects/actions/delete-project.action.mjs +10 -0
  125. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -0
  126. package/dist/modules/projects/actions/find-project.action.mjs +10 -0
  127. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -0
  128. package/dist/modules/projects/actions/list-projects.action.mjs +10 -0
  129. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -0
  130. package/dist/modules/projects/actions/update-project.action.mjs +10 -0
  131. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -0
  132. package/dist/modules/projects/hooks/add-project-user.hook.mjs +15 -12
  133. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  134. package/dist/modules/projects/hooks/create-project.hook.mjs +71 -0
  135. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -0
  136. package/dist/modules/projects/hooks/delete-project.hook.mjs +53 -0
  137. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -0
  138. package/dist/modules/projects/hooks/find-project.hook.mjs +19 -0
  139. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -0
  140. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs +3 -1
  141. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  142. package/dist/modules/projects/hooks/list-available-users.hook.mjs +3 -1
  143. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  144. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +39 -0
  145. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -0
  146. package/dist/modules/projects/hooks/list-project-users.hook.mjs +3 -1
  147. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  148. package/dist/modules/projects/hooks/list-projects.hook.mjs +22 -0
  149. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -0
  150. package/dist/modules/projects/hooks/remove-project-user.hook.mjs +15 -12
  151. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  152. package/dist/modules/projects/hooks/update-project.hook.mjs +70 -0
  153. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -0
  154. package/dist/modules/projects/services/projects.service.mjs +99 -0
  155. package/dist/modules/projects/services/projects.service.mjs.map +1 -0
  156. package/dist/modules/projects/types.mjs +19 -4
  157. package/dist/modules/projects/types.mjs.map +1 -1
  158. package/dist/modules/subscriptions/constants/query-keys.constants.mjs +2 -0
  159. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  160. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs +5 -2
  161. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  162. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs +3 -1
  163. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  164. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs +6 -3
  165. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  166. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs +29 -2
  167. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  168. package/dist/modules/subscriptions/utils/periodicity.mjs +7 -0
  169. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  170. package/dist/modules/users/action/list-messages.action.mjs +14 -2
  171. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  172. package/dist/modules/users/hooks/messages.hook.mjs +9 -4
  173. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  174. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  175. package/dist/providers/auth.provider.mjs +6 -4
  176. package/dist/providers/auth.provider.mjs.map +1 -1
  177. package/dist/providers/query.provider.mjs +2 -2
  178. package/dist/providers/query.provider.mjs.map +1 -1
  179. package/dist/providers/whitelabel.provider.mjs +5 -0
  180. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  181. package/dist/server.mjs +14 -0
  182. package/dist/server.mjs.map +1 -1
  183. package/package.json +1 -1
  184. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +16 -2
  185. package/dist/components/navigation/types.mjs +0 -1
  186. package/dist/components/navigation/types.mjs.map +0 -1
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { createProjectAction } from "../actions/create-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ import { insertSorted, buildCompareFn } from "../../../infra/utils/array";
8
+ function extractSort(query) {
9
+ const key = query.queryKey;
10
+ for (let i = key.length - 1; i >= 0; i--) {
11
+ const segment = key[i];
12
+ if (segment && typeof segment === "object" && "sort" in segment) {
13
+ return segment.sort;
14
+ }
15
+ }
16
+ return void 0;
17
+ }
18
+ function useCreateProject() {
19
+ const queryClient = useQueryClient();
20
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
21
+ return useMutation({
22
+ mutationFn: (data) => withAction(createProjectAction)(data),
23
+ onSuccess: (newProject) => {
24
+ const cache = queryClient.getQueryCache();
25
+ const queries = cache.findAll({ queryKey: projectsKey });
26
+ for (const query of queries) {
27
+ const sort = extractSort(query);
28
+ const isInfinite = query.queryKey.includes("infinite");
29
+ if (isInfinite) {
30
+ queryClient.setQueryData(
31
+ query.queryKey,
32
+ (old) => {
33
+ if (!old?.pages.length) return old;
34
+ const pageSize = old.pages[0].data.length || 20;
35
+ const allItems = old.pages.flatMap((page) => page.data);
36
+ const withNew = sort ? insertSorted(allItems, newProject, buildCompareFn(sort)) : [newProject, ...allItems];
37
+ const newTotal = (old.pages[0].total ?? 0) + 1;
38
+ return {
39
+ ...old,
40
+ pages: old.pages.map((page, i) => ({
41
+ ...page,
42
+ data: withNew.slice(i * pageSize, (i + 1) * pageSize),
43
+ total: newTotal
44
+ }))
45
+ };
46
+ }
47
+ );
48
+ } else {
49
+ queryClient.setQueryData(
50
+ query.queryKey,
51
+ (old) => {
52
+ if (!old) return old;
53
+ const pageSize = old.data.length || 20;
54
+ const withNew = sort ? insertSorted(old.data, newProject, buildCompareFn(sort)) : [newProject, ...old.data];
55
+ return {
56
+ ...old,
57
+ data: withNew.slice(0, pageSize),
58
+ total: old.total + 1
59
+ };
60
+ }
61
+ );
62
+ }
63
+ }
64
+ queryClient.invalidateQueries({ queryKey: projectsKey });
65
+ }
66
+ });
67
+ }
68
+ export {
69
+ useCreateProject
70
+ };
71
+ //# sourceMappingURL=create-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/create-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient, InfiniteData, Query } from '@tanstack/react-query';\nimport { createProjectAction } from '../actions/create-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\nimport { insertSorted, buildCompareFn } from '../../../infra/utils/array';\nimport type { CreateProjectRequest, Project, ProjectsPage } from '../types';\n\nfunction extractSort(query: Query): string | undefined {\n const key = query.queryKey;\n for (let i = key.length - 1; i >= 0; i--) {\n const segment = key[i];\n if (segment && typeof segment === 'object' && 'sort' in segment) {\n return (segment as Record<string, unknown>).sort as string | undefined;\n }\n }\n return undefined;\n}\n\nexport function useCreateProject() {\n const queryClient = useQueryClient();\n const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);\n\n return useMutation({\n mutationFn: (data: CreateProjectRequest) =>\n withAction(createProjectAction)(data),\n\n onSuccess: (newProject: Project) => {\n const cache = queryClient.getQueryCache();\n const queries = cache.findAll({ queryKey: projectsKey });\n\n for (const query of queries) {\n const sort = extractSort(query);\n const isInfinite = query.queryKey.includes('infinite');\n\n if (isInfinite) {\n queryClient.setQueryData<InfiniteData<ProjectsPage>>(\n query.queryKey,\n (old) => {\n if (!old?.pages.length) return old;\n\n const pageSize = old.pages[0].data.length || 20;\n const allItems = old.pages.flatMap((page) => page.data);\n\n const withNew = sort\n ? insertSorted(allItems, newProject, buildCompareFn<Project>(sort))\n : [newProject, ...allItems];\n\n const newTotal = (old.pages[0].total ?? 0) + 1;\n\n return {\n ...old,\n pages: old.pages.map((page, i) => ({\n ...page,\n data: withNew.slice(i * pageSize, (i + 1) * pageSize),\n total: newTotal,\n })),\n };\n },\n );\n } else {\n queryClient.setQueryData<ProjectsPage>(\n query.queryKey,\n (old) => {\n if (!old) return old;\n\n const pageSize = old.data.length || 20;\n\n const withNew = sort\n ? insertSorted(old.data, newProject, buildCompareFn<Project>(sort))\n : [newProject, ...old.data];\n\n return {\n ...old,\n data: withNew.slice(0, pageSize),\n total: old.total + 1,\n };\n },\n );\n }\n }\n\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAA2C;AACjE,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,cAAc,sBAAsB;AAG7C,SAAS,YAAY,OAAkC;AACrD,QAAM,MAAM,MAAM;AAClB,WAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAM,UAAU,IAAI,CAAC;AACrB,QAAI,WAAW,OAAO,YAAY,YAAY,UAAU,SAAS;AAC/D,aAAQ,QAAoC;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;AAE1D,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,SACX,WAAW,mBAAmB,EAAE,IAAI;AAAA,IAEtC,WAAW,CAAC,eAAwB;AAClC,YAAM,QAAQ,YAAY,cAAc;AACxC,YAAM,UAAU,MAAM,QAAQ,EAAE,UAAU,YAAY,CAAC;AAEvD,iBAAW,SAAS,SAAS;AAC3B,cAAM,OAAO,YAAY,KAAK;AAC9B,cAAM,aAAa,MAAM,SAAS,SAAS,UAAU;AAErD,YAAI,YAAY;AACd,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,CAAC,QAAQ;AACP,kBAAI,CAAC,KAAK,MAAM,OAAQ,QAAO;AAE/B,oBAAM,WAAW,IAAI,MAAM,CAAC,EAAE,KAAK,UAAU;AAC7C,oBAAM,WAAW,IAAI,MAAM,QAAQ,CAAC,SAAS,KAAK,IAAI;AAEtD,oBAAM,UAAU,OACZ,aAAa,UAAU,YAAY,eAAwB,IAAI,CAAC,IAChE,CAAC,YAAY,GAAG,QAAQ;AAE5B,oBAAM,YAAY,IAAI,MAAM,CAAC,EAAE,SAAS,KAAK;AAE7C,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,kBACjC,GAAG;AAAA,kBACH,MAAM,QAAQ,MAAM,IAAI,WAAW,IAAI,KAAK,QAAQ;AAAA,kBACpD,OAAO;AAAA,gBACT,EAAE;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,CAAC,QAAQ;AACP,kBAAI,CAAC,IAAK,QAAO;AAEjB,oBAAM,WAAW,IAAI,KAAK,UAAU;AAEpC,oBAAM,UAAU,OACZ,aAAa,IAAI,MAAM,YAAY,eAAwB,IAAI,CAAC,IAChE,CAAC,YAAY,GAAG,IAAI,IAAI;AAE5B,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,MAAM,QAAQ,MAAM,GAAG,QAAQ;AAAA,gBAC/B,OAAO,IAAI,QAAQ;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { deleteProjectAction } from "../actions/delete-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ function useDeleteProject() {
8
+ const queryClient = useQueryClient();
9
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
10
+ return useMutation({
11
+ mutationFn: ({ projectId, moveToProjectId }) => withAction(deleteProjectAction)(projectId, moveToProjectId),
12
+ onSuccess: (_, { projectId }) => {
13
+ const cache = queryClient.getQueryCache();
14
+ const queries = cache.findAll({ queryKey: projectsKey });
15
+ for (const query of queries) {
16
+ const isInfinite = query.queryKey.includes("infinite");
17
+ if (isInfinite) {
18
+ queryClient.setQueryData(
19
+ query.queryKey,
20
+ (old) => {
21
+ if (!old?.pages.length) return old;
22
+ return {
23
+ ...old,
24
+ pages: old.pages.map((page) => ({
25
+ ...page,
26
+ data: page.data.filter((p) => p.id !== projectId),
27
+ total: page.total - 1
28
+ }))
29
+ };
30
+ }
31
+ );
32
+ } else {
33
+ queryClient.setQueryData(
34
+ query.queryKey,
35
+ (old) => {
36
+ if (!old) return old;
37
+ return {
38
+ ...old,
39
+ data: old.data.filter((p) => p.id !== projectId),
40
+ total: old.total - 1
41
+ };
42
+ }
43
+ );
44
+ }
45
+ }
46
+ queryClient.invalidateQueries({ queryKey: projectsKey });
47
+ }
48
+ });
49
+ }
50
+ export {
51
+ useDeleteProject
52
+ };
53
+ //# sourceMappingURL=delete-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/delete-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient, InfiniteData } from '@tanstack/react-query';\nimport { deleteProjectAction } from '../actions/delete-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\nimport type { ProjectsPage } from '../types';\n\nexport function useDeleteProject() {\n const queryClient = useQueryClient();\n const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);\n\n return useMutation({\n mutationFn: ({ projectId, moveToProjectId }: { projectId: number; moveToProjectId: number }) =>\n withAction(deleteProjectAction)(projectId, moveToProjectId),\n\n onSuccess: (_, { projectId }) => {\n const cache = queryClient.getQueryCache();\n const queries = cache.findAll({ queryKey: projectsKey });\n\n for (const query of queries) {\n const isInfinite = query.queryKey.includes('infinite');\n\n if (isInfinite) {\n queryClient.setQueryData<InfiniteData<ProjectsPage>>(\n query.queryKey,\n (old) => {\n if (!old?.pages.length) return old;\n return {\n ...old,\n pages: old.pages.map((page) => ({\n ...page,\n data: page.data.filter((p) => p.id !== projectId),\n total: page.total - 1,\n })),\n };\n },\n );\n } else {\n queryClient.setQueryData<ProjectsPage>(\n query.queryKey,\n (old) => {\n if (!old) return old;\n return {\n ...old,\n data: old.data.filter((p) => p.id !== projectId),\n total: old.total - 1,\n };\n },\n );\n }\n }\n\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAoC;AAC1D,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAG3B,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;AAE1D,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,EAAE,WAAW,gBAAgB,MACxC,WAAW,mBAAmB,EAAE,WAAW,eAAe;AAAA,IAE5D,WAAW,CAAC,GAAG,EAAE,UAAU,MAAM;AAC/B,YAAM,QAAQ,YAAY,cAAc;AACxC,YAAM,UAAU,MAAM,QAAQ,EAAE,UAAU,YAAY,CAAC;AAEvD,iBAAW,SAAS,SAAS;AAC3B,cAAM,aAAa,MAAM,SAAS,SAAS,UAAU;AAErD,YAAI,YAAY;AACd,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,CAAC,QAAQ;AACP,kBAAI,CAAC,KAAK,MAAM,OAAQ,QAAO;AAC/B,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,OAAO,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,kBAC9B,GAAG;AAAA,kBACH,MAAM,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,kBAChD,OAAO,KAAK,QAAQ;AAAA,gBACtB,EAAE;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,CAAC,QAAQ;AACP,kBAAI,CAAC,IAAK,QAAO;AACjB,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,MAAM,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,gBAC/C,OAAO,IAAI,QAAQ;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { findProjectAction } from "../actions/find-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ function useProject(projectId) {
8
+ const queryKey = useAuthQueryKey([...PROJECTS_BASE_KEY, projectId]);
9
+ return useQuery({
10
+ queryKey,
11
+ queryFn: () => withAction(() => findProjectAction(projectId))(),
12
+ enabled: projectId != null && projectId > 0,
13
+ staleTime: 3e4
14
+ });
15
+ }
16
+ export {
17
+ useProject
18
+ };
19
+ //# sourceMappingURL=find-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/find-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { findProjectAction } from '../actions/find-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\n\nexport function useProject(projectId: number | null) {\n const queryKey = useAuthQueryKey([...PROJECTS_BASE_KEY, projectId]);\n\n return useQuery({\n queryKey,\n queryFn: () => withAction(() => findProjectAction(projectId!))(),\n enabled: projectId != null && projectId > 0,\n staleTime: 30_000,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,yBAAyB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAE3B,SAAS,WAAW,WAA0B;AACnD,QAAM,WAAW,gBAAgB,CAAC,GAAG,mBAAmB,SAAS,CAAC;AAElE,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,MAAM,WAAW,MAAM,kBAAkB,SAAU,CAAC,EAAE;AAAA,IAC/D,SAAS,aAAa,QAAQ,YAAY;AAAA,IAC1C,WAAW;AAAA,EACb,CAAC;AACH;","names":[]}
@@ -2,6 +2,7 @@
2
2
  import { useInfiniteQuery } from "@tanstack/react-query";
3
3
  import { listAllAccountUsersAction } from "../actions/list-all-account-users.action";
4
4
  import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
6
  const PAGE_SIZE = 20;
6
7
  const LIST_ALL_ACCOUNT_USERS_BASE_KEY = () => ["account-users", "all"];
7
8
  const LIST_ALL_ACCOUNT_USERS_QUERY_KEY = (search = "", projectId) => [
@@ -10,8 +11,9 @@ const LIST_ALL_ACCOUNT_USERS_QUERY_KEY = (search = "", projectId) => [
10
11
  projectId
11
12
  ];
12
13
  function useListAllAccountUsers(search = "", projectId) {
14
+ const queryKey = useAuthQueryKey([...LIST_ALL_ACCOUNT_USERS_QUERY_KEY(search, projectId)]);
13
15
  return useInfiniteQuery({
14
- queryKey: LIST_ALL_ACCOUNT_USERS_QUERY_KEY(search, projectId),
16
+ queryKey,
15
17
  queryFn: ({ pageParam }) => withAction(
16
18
  () => listAllAccountUsersAction({
17
19
  search: search || void 0,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/projects/hooks/list-all-account-users.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { listAllAccountUsersAction } from '../actions/list-all-account-users.action';\nimport { withAction } from '../../../utils/withAction';\n\nconst PAGE_SIZE = 20;\n\nexport const LIST_ALL_ACCOUNT_USERS_BASE_KEY = () => ['account-users', 'all'];\nexport const LIST_ALL_ACCOUNT_USERS_QUERY_KEY = (search: string = '', projectId?: number) => [\n ...LIST_ALL_ACCOUNT_USERS_BASE_KEY(),\n search,\n projectId,\n];\n\nexport function useListAllAccountUsers(search: string = '', projectId?: number) {\n return useInfiniteQuery({\n queryKey: LIST_ALL_ACCOUNT_USERS_QUERY_KEY(search, projectId),\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listAllAccountUsersAction({\n search: search || undefined,\n page: pageParam as number,\n limit: PAGE_SIZE,\n inProject: projectId,\n })\n )(),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,iCAAiC;AAC1C,SAAS,kBAAkB;AAE3B,MAAM,YAAY;AAEX,MAAM,kCAAkC,MAAM,CAAC,iBAAiB,KAAK;AACrE,MAAM,mCAAmC,CAAC,SAAiB,IAAI,cAAuB;AAAA,EAC3F,GAAG,gCAAgC;AAAA,EACnC;AAAA,EACA;AACF;AAEO,SAAS,uBAAuB,SAAiB,IAAI,WAAoB;AAC9E,SAAO,iBAAiB;AAAA,IACtB,UAAU,iCAAiC,QAAQ,SAAS;AAAA,IAC5D,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,0BAA0B;AAAA,QACxB,QAAQ,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,WAAW;AAAA,MACb,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-all-account-users.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { listAllAccountUsersAction } from '../actions/list-all-account-users.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nconst PAGE_SIZE = 20;\n\nexport const LIST_ALL_ACCOUNT_USERS_BASE_KEY = () =>\n ['account-users', 'all'] as const;\n\nexport const LIST_ALL_ACCOUNT_USERS_QUERY_KEY = (search: string = '', projectId?: number) => [\n ...LIST_ALL_ACCOUNT_USERS_BASE_KEY(),\n search,\n projectId,\n] as const;\n\nexport function useListAllAccountUsers(search: string = '', projectId?: number) {\n const queryKey = useAuthQueryKey([...LIST_ALL_ACCOUNT_USERS_QUERY_KEY(search, projectId)]);\n\n return useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listAllAccountUsersAction({\n search: search || undefined,\n page: pageParam as number,\n limit: PAGE_SIZE,\n inProject: projectId,\n })\n )(),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,iCAAiC;AAC1C,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEhC,MAAM,YAAY;AAEX,MAAM,kCAAkC,MAC7C,CAAC,iBAAiB,KAAK;AAElB,MAAM,mCAAmC,CAAC,SAAiB,IAAI,cAAuB;AAAA,EAC3F,GAAG,gCAAgC;AAAA,EACnC;AAAA,EACA;AACF;AAEO,SAAS,uBAAuB,SAAiB,IAAI,WAAoB;AAC9E,QAAM,WAAW,gBAAgB,CAAC,GAAG,iCAAiC,QAAQ,SAAS,CAAC,CAAC;AAEzF,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,0BAA0B;AAAA,QACxB,QAAQ,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,WAAW;AAAA,MACb,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AACH;","names":[]}
@@ -2,6 +2,7 @@
2
2
  import { useInfiniteQuery } from "@tanstack/react-query";
3
3
  import { listAvailableUsersAction } from "../actions/list-available-users.action";
4
4
  import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
6
  const PAGE_SIZE = 20;
6
7
  const LIST_AVAILABLE_USERS_BASE_KEY = (projectId) => ["project-users", projectId, "out"];
7
8
  const LIST_AVAILABLE_USERS_QUERY_KEY = (projectId, search = "") => [
@@ -9,8 +10,9 @@ const LIST_AVAILABLE_USERS_QUERY_KEY = (projectId, search = "") => [
9
10
  search
10
11
  ];
11
12
  function useListAvailableUsers(projectId, search = "") {
13
+ const queryKey = useAuthQueryKey([...LIST_AVAILABLE_USERS_QUERY_KEY(projectId, search)]);
12
14
  return useInfiniteQuery({
13
- queryKey: LIST_AVAILABLE_USERS_QUERY_KEY(projectId, search),
15
+ queryKey,
14
16
  queryFn: ({ pageParam }) => withAction(
15
17
  () => listAvailableUsersAction(projectId, {
16
18
  search: search || void 0,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/projects/hooks/list-available-users.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { listAvailableUsersAction } from '../actions/list-available-users.action';\nimport { withAction } from '../../../utils/withAction';\n\nconst PAGE_SIZE = 20;\n\nexport const LIST_AVAILABLE_USERS_BASE_KEY = (projectId: number) => ['project-users', projectId, 'out'];\nexport const LIST_AVAILABLE_USERS_QUERY_KEY = (projectId: number, search: string = '') => [\n ...LIST_AVAILABLE_USERS_BASE_KEY(projectId),\n search,\n];\n\nexport function useListAvailableUsers(projectId: number, search: string = '') {\n return useInfiniteQuery({\n queryKey: LIST_AVAILABLE_USERS_QUERY_KEY(projectId, search),\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listAvailableUsersAction(projectId, {\n search: search || undefined,\n page: pageParam as number,\n limit: PAGE_SIZE,\n })\n )(),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n enabled: !!projectId,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,kBAAkB;AAE3B,MAAM,YAAY;AAEX,MAAM,gCAAgC,CAAC,cAAsB,CAAC,iBAAiB,WAAW,KAAK;AAC/F,MAAM,iCAAiC,CAAC,WAAmB,SAAiB,OAAO;AAAA,EACxF,GAAG,8BAA8B,SAAS;AAAA,EAC1C;AACF;AAEO,SAAS,sBAAsB,WAAmB,SAAiB,IAAI;AAC5E,SAAO,iBAAiB;AAAA,IACtB,UAAU,+BAA+B,WAAW,MAAM;AAAA,IAC1D,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,yBAAyB,WAAW;AAAA,QAClC,QAAQ,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-available-users.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { listAvailableUsersAction } from '../actions/list-available-users.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nconst PAGE_SIZE = 20;\n\nexport const LIST_AVAILABLE_USERS_BASE_KEY = (projectId: number) =>\n ['project-users', projectId, 'out'] as const;\n\nexport const LIST_AVAILABLE_USERS_QUERY_KEY = (projectId: number, search: string = '') => [\n ...LIST_AVAILABLE_USERS_BASE_KEY(projectId),\n search,\n] as const;\n\nexport function useListAvailableUsers(projectId: number, search: string = '') {\n const queryKey = useAuthQueryKey([...LIST_AVAILABLE_USERS_QUERY_KEY(projectId, search)]);\n\n return useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listAvailableUsersAction(projectId, {\n search: search || undefined,\n page: pageParam as number,\n limit: PAGE_SIZE,\n })\n )(),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n enabled: !!projectId,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEhC,MAAM,YAAY;AAEX,MAAM,gCAAgC,CAAC,cAC5C,CAAC,iBAAiB,WAAW,KAAK;AAE7B,MAAM,iCAAiC,CAAC,WAAmB,SAAiB,OAAO;AAAA,EACxF,GAAG,8BAA8B,SAAS;AAAA,EAC1C;AACF;AAEO,SAAS,sBAAsB,WAAmB,SAAiB,IAAI;AAC5E,QAAM,WAAW,gBAAgB,CAAC,GAAG,+BAA+B,WAAW,MAAM,CAAC,CAAC;AAEvF,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,yBAAyB,WAAW;AAAA,QAClC,QAAQ,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;","names":[]}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { useInfiniteQuery } from "@tanstack/react-query";
3
+ import { listProjectsAction } from "../actions/list-projects.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ const PAGE_SIZE = 20;
8
+ const INFINITE_PROJECTS_QUERY_KEY = (params) => [...PROJECTS_BASE_KEY, "infinite", params];
9
+ function useInfiniteProjects({
10
+ limit = PAGE_SIZE,
11
+ ...params
12
+ }) {
13
+ const queryKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY(params)]);
14
+ return useInfiniteQuery({
15
+ queryKey,
16
+ queryFn: ({ pageParam }) => withAction(
17
+ () => listProjectsAction({
18
+ ...params,
19
+ page: pageParam,
20
+ limit
21
+ })
22
+ )(),
23
+ initialPageParam: 1,
24
+ getNextPageParam: (lastPage, allPages) => {
25
+ const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);
26
+ return loaded < lastPage.total ? allPages.length + 1 : void 0;
27
+ },
28
+ placeholderData: (prev) => prev,
29
+ staleTime: 3e4,
30
+ refetchOnMount: true,
31
+ refetchOnWindowFocus: true,
32
+ refetchOnReconnect: true
33
+ });
34
+ }
35
+ export {
36
+ INFINITE_PROJECTS_QUERY_KEY,
37
+ useInfiniteProjects
38
+ };
39
+ //# sourceMappingURL=list-infinite-projects.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-infinite-projects.hook.ts"],"sourcesContent":["\"use client\";\n\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { listProjectsAction } from \"../actions/list-projects.action\";\nimport type { ListProjectsActionParams } from \"../actions/list-projects.action\";\nimport { withAction } from \"../../../utils/withAction\";\nimport { useAuthQueryKey } from \"../../../hooks/useAuthQueryKey\";\nimport { PROJECTS_BASE_KEY } from \"./list-projects.hook\";\n\nconst PAGE_SIZE = 20;\n\nexport const INFINITE_PROJECTS_QUERY_KEY = (\n params?: Omit<ListProjectsActionParams, \"page\">,\n) => [...PROJECTS_BASE_KEY, \"infinite\", params] as const;\n\nexport function useInfiniteProjects({\n limit = PAGE_SIZE,\n ...params\n}: Omit<ListProjectsActionParams, \"page\">) {\n const queryKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY(params)]);\n\n return useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listProjectsAction({\n ...params,\n page: pageParam as number,\n limit,\n }),\n )(),\n initialPageParam: 1,\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n placeholderData: (prev) => prev,\n staleTime: 30_000,\n refetchOnMount: true,\n refetchOnWindowFocus: true,\n refetchOnReconnect: true,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AAEnC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAElC,MAAM,YAAY;AAEX,MAAM,8BAA8B,CACzC,WACG,CAAC,GAAG,mBAAmB,YAAY,MAAM;AAEvC,SAAS,oBAAoB;AAAA,EAClC,QAAQ;AAAA,EACR,GAAG;AACL,GAA2C;AACzC,QAAM,WAAW,gBAAgB,CAAC,GAAG,4BAA4B,MAAM,CAAC,CAAC;AAEzE,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,mBAAmB;AAAA,QACjB,GAAG;AAAA,QACH,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,iBAAiB,CAAC,SAAS;AAAA,IAC3B,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,EACtB,CAAC;AACH;","names":[]}
@@ -2,6 +2,7 @@
2
2
  import { useInfiniteQuery } from "@tanstack/react-query";
3
3
  import { listProjectUsersAction } from "../actions/list-project-users.action";
4
4
  import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
6
  const PAGE_SIZE = 20;
6
7
  const LIST_PROJECT_USERS_BASE_KEY = (projectId) => ["project-users", projectId, "in"];
7
8
  const LIST_PROJECT_USERS_QUERY_KEY = (projectId, search = "") => [
@@ -9,8 +10,9 @@ const LIST_PROJECT_USERS_QUERY_KEY = (projectId, search = "") => [
9
10
  search
10
11
  ];
11
12
  function useListProjectUsers(projectId, search = "") {
13
+ const queryKey = useAuthQueryKey([...LIST_PROJECT_USERS_QUERY_KEY(projectId, search)]);
12
14
  return useInfiniteQuery({
13
- queryKey: LIST_PROJECT_USERS_QUERY_KEY(projectId, search),
15
+ queryKey,
14
16
  queryFn: ({ pageParam }) => withAction(
15
17
  () => listProjectUsersAction(projectId, {
16
18
  search: search || void 0,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/projects/hooks/list-project-users.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { listProjectUsersAction } from '../actions/list-project-users.action';\nimport { withAction } from '../../../utils/withAction';\n\nconst PAGE_SIZE = 20;\n\nexport const LIST_PROJECT_USERS_BASE_KEY = (projectId: number) => ['project-users', projectId, 'in'];\nexport const LIST_PROJECT_USERS_QUERY_KEY = (projectId: number, search: string = '') => [\n ...LIST_PROJECT_USERS_BASE_KEY(projectId),\n search,\n];\n\nexport function useListProjectUsers(projectId: number, search: string = '') {\n return useInfiniteQuery({\n queryKey: LIST_PROJECT_USERS_QUERY_KEY(projectId, search),\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listProjectUsersAction(projectId, {\n search: search || undefined,\n page: pageParam as number,\n limit: PAGE_SIZE,\n })\n )(),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n enabled: !!projectId,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAE3B,MAAM,YAAY;AAEX,MAAM,8BAA8B,CAAC,cAAsB,CAAC,iBAAiB,WAAW,IAAI;AAC5F,MAAM,+BAA+B,CAAC,WAAmB,SAAiB,OAAO;AAAA,EACtF,GAAG,4BAA4B,SAAS;AAAA,EACxC;AACF;AAEO,SAAS,oBAAoB,WAAmB,SAAiB,IAAI;AAC1E,SAAO,iBAAiB;AAAA,IACtB,UAAU,6BAA6B,WAAW,MAAM;AAAA,IACxD,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,uBAAuB,WAAW;AAAA,QAChC,QAAQ,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-project-users.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { listProjectUsersAction } from '../actions/list-project-users.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nconst PAGE_SIZE = 20;\n\nexport const LIST_PROJECT_USERS_BASE_KEY = (projectId: number) =>\n ['project-users', projectId, 'in'] as const;\n\nexport const LIST_PROJECT_USERS_QUERY_KEY = (projectId: number, search: string = '') => [\n ...LIST_PROJECT_USERS_BASE_KEY(projectId),\n search,\n] as const;\n\nexport function useListProjectUsers(projectId: number, search: string = '') {\n const queryKey = useAuthQueryKey([...LIST_PROJECT_USERS_QUERY_KEY(projectId, search)]);\n\n return useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listProjectUsersAction(projectId, {\n search: search || undefined,\n page: pageParam as number,\n limit: PAGE_SIZE,\n })\n )(),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n enabled: !!projectId,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEhC,MAAM,YAAY;AAEX,MAAM,8BAA8B,CAAC,cAC1C,CAAC,iBAAiB,WAAW,IAAI;AAE5B,MAAM,+BAA+B,CAAC,WAAmB,SAAiB,OAAO;AAAA,EACtF,GAAG,4BAA4B,SAAS;AAAA,EACxC;AACF;AAEO,SAAS,oBAAoB,WAAmB,SAAiB,IAAI;AAC1E,QAAM,WAAW,gBAAgB,CAAC,GAAG,6BAA6B,WAAW,MAAM,CAAC,CAAC;AAErF,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,uBAAuB,WAAW;AAAA,QAChC,QAAQ,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,IAClB,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;","names":[]}
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { useQuery, keepPreviousData } from "@tanstack/react-query";
3
+ import { listProjectsAction } from "../actions/list-projects.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ const PROJECTS_BASE_KEY = ["projects"];
7
+ const PROJECTS_QUERY_KEY = (params) => [...PROJECTS_BASE_KEY, params];
8
+ function useProjects(params) {
9
+ const queryKey = useAuthQueryKey([...PROJECTS_QUERY_KEY(params)]);
10
+ return useQuery({
11
+ queryKey,
12
+ queryFn: withAction(() => listProjectsAction(params)),
13
+ staleTime: 3e4,
14
+ placeholderData: keepPreviousData
15
+ });
16
+ }
17
+ export {
18
+ PROJECTS_BASE_KEY,
19
+ PROJECTS_QUERY_KEY,
20
+ useProjects
21
+ };
22
+ //# sourceMappingURL=list-projects.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-projects.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query';\nimport { listProjectsAction } from '../actions/list-projects.action';\nimport type { ListProjectsActionParams } from '../actions/list-projects.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const PROJECTS_BASE_KEY = ['projects'] as const;\n\nexport const PROJECTS_QUERY_KEY = (params?: ListProjectsActionParams) =>\n [...PROJECTS_BASE_KEY, params] as const;\n\nexport function useProjects(params?: ListProjectsActionParams) {\n const queryKey = useAuthQueryKey([...PROJECTS_QUERY_KEY(params)]);\n\n return useQuery({\n queryKey,\n queryFn: withAction(() => listProjectsAction(params)),\n staleTime: 30_000,\n placeholderData: keepPreviousData,\n });\n}\n"],"mappings":";AAEA,SAAS,UAAU,wBAAwB;AAC3C,SAAS,0BAA0B;AAEnC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEzB,MAAM,oBAAoB,CAAC,UAAU;AAErC,MAAM,qBAAqB,CAAC,WACjC,CAAC,GAAG,mBAAmB,MAAM;AAExB,SAAS,YAAY,QAAmC;AAC7D,QAAM,WAAW,gBAAgB,CAAC,GAAG,mBAAmB,MAAM,CAAC,CAAC;AAEhE,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,WAAW,MAAM,mBAAmB,MAAM,CAAC;AAAA,IACpD,WAAW;AAAA,IACX,iBAAiB;AAAA,EACnB,CAAC;AACH;","names":[]}
@@ -3,21 +3,24 @@ import { useQueryClient, useMutation } from "@tanstack/react-query";
3
3
  import { removeProjectUserAction } from "../actions/remove-project-user.action";
4
4
  import { LIST_PROJECT_USERS_BASE_KEY } from "./list-project-users.hook";
5
5
  import { LIST_ALL_ACCOUNT_USERS_BASE_KEY } from "./list-all-account-users.hook";
6
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
7
  function useRemoveProjectUser(projectId) {
7
8
  const queryClient = useQueryClient();
9
+ const allAccountUsersKey = useAuthQueryKey([...LIST_ALL_ACCOUNT_USERS_BASE_KEY()]);
10
+ const projectUsersKey = useAuthQueryKey([...LIST_PROJECT_USERS_BASE_KEY(projectId)]);
8
11
  return useMutation({
9
- mutationFn: (userId) => removeProjectUserAction({ projectId, users: [userId] }),
10
- onMutate: async (userId) => {
11
- await queryClient.cancelQueries({ queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY() });
12
- await queryClient.cancelQueries({ queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId) });
12
+ mutationFn: (targetUserId) => removeProjectUserAction({ projectId, users: [targetUserId] }),
13
+ onMutate: async (targetUserId) => {
14
+ await queryClient.cancelQueries({ queryKey: allAccountUsersKey });
15
+ await queryClient.cancelQueries({ queryKey: projectUsersKey });
13
16
  const prevAccountUsers = queryClient.getQueriesData({
14
- queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY()
17
+ queryKey: allAccountUsersKey
15
18
  });
16
19
  const prevProjectUsers = queryClient.getQueriesData({
17
- queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId)
20
+ queryKey: projectUsersKey
18
21
  });
19
22
  queryClient.setQueriesData(
20
- { queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY(), exact: false },
23
+ { queryKey: allAccountUsersKey, exact: false },
21
24
  (old) => {
22
25
  if (!old) return old;
23
26
  return {
@@ -25,14 +28,14 @@ function useRemoveProjectUser(projectId) {
25
28
  pages: old.pages.map((page) => ({
26
29
  ...page,
27
30
  data: page.data.map(
28
- (u) => u.id === userId ? { ...u, in_project: false } : u
31
+ (u) => u.id === targetUserId ? { ...u, in_project: false } : u
29
32
  )
30
33
  }))
31
34
  };
32
35
  }
33
36
  );
34
37
  queryClient.setQueriesData(
35
- { queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId), exact: false },
38
+ { queryKey: projectUsersKey, exact: false },
36
39
  (old) => {
37
40
  if (!old?.pages.length) return old;
38
41
  return {
@@ -45,13 +48,13 @@ function useRemoveProjectUser(projectId) {
45
48
  );
46
49
  return { prevAccountUsers, prevProjectUsers };
47
50
  },
48
- onError: (_err, _userId, ctx) => {
51
+ onError: (_err, _targetUserId, ctx) => {
49
52
  ctx?.prevAccountUsers.forEach(([key, data]) => queryClient.setQueryData(key, data));
50
53
  ctx?.prevProjectUsers.forEach(([key, data]) => queryClient.setQueryData(key, data));
51
54
  },
52
55
  onSettled: () => {
53
- queryClient.invalidateQueries({ queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId) });
54
- queryClient.invalidateQueries({ queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY() });
56
+ queryClient.invalidateQueries({ queryKey: projectUsersKey });
57
+ queryClient.invalidateQueries({ queryKey: allAccountUsersKey });
55
58
  }
56
59
  });
57
60
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/projects/hooks/remove-project-user.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQueryClient, useMutation, InfiniteData } from '@tanstack/react-query';\nimport { removeProjectUserAction } from '../actions/remove-project-user.action';\nimport { LIST_PROJECT_USERS_BASE_KEY } from './list-project-users.hook';\nimport { LIST_ALL_ACCOUNT_USERS_BASE_KEY } from './list-all-account-users.hook';\nimport type { UsersPage, AccountUser, ProjectUser } from '../types';\n\nexport function useRemoveProjectUser(projectId: number) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (userId: number) =>\n removeProjectUserAction({ projectId, users: [userId] }),\n\n onMutate: async (userId) => {\n await queryClient.cancelQueries({ queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY() });\n await queryClient.cancelQueries({ queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId) });\n\n const prevAccountUsers = queryClient.getQueriesData<InfiniteData<UsersPage<AccountUser>>>({\n queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY(),\n });\n const prevProjectUsers = queryClient.getQueriesData<InfiniteData<UsersPage<ProjectUser>>>({\n queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId),\n });\n\n queryClient.setQueriesData<InfiniteData<UsersPage<AccountUser>>>(\n { queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY(), exact: false },\n (old) => {\n if (!old) return old;\n return {\n ...old,\n pages: old.pages.map((page) => ({\n ...page,\n data: page.data.map((u) =>\n u.id === userId ? { ...u, in_project: false } : u\n ),\n })),\n };\n }\n );\n\n queryClient.setQueriesData<InfiniteData<UsersPage<ProjectUser>>>(\n { queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId), exact: false },\n (old) => {\n if (!old?.pages.length) return old;\n return {\n ...old,\n pages: old.pages.map((page, i) =>\n i === 0 ? { ...page, total: page.total - 1 } : page\n ),\n };\n }\n );\n\n return { prevAccountUsers, prevProjectUsers };\n },\n\n onError: (_err, _userId, ctx) => {\n ctx?.prevAccountUsers.forEach(([key, data]) => queryClient.setQueryData(key, data));\n ctx?.prevProjectUsers.forEach(([key, data]) => queryClient.setQueryData(key, data));\n },\n\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: LIST_PROJECT_USERS_BASE_KEY(projectId) });\n queryClient.invalidateQueries({ queryKey: LIST_ALL_ACCOUNT_USERS_BASE_KEY() });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB,mBAAiC;AAC1D,SAAS,+BAA+B;AACxC,SAAS,mCAAmC;AAC5C,SAAS,uCAAuC;AAGzC,SAAS,qBAAqB,WAAmB;AACtD,QAAM,cAAc,eAAe;AAEnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,WACX,wBAAwB,EAAE,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,IAExD,UAAU,OAAO,WAAW;AAC1B,YAAM,YAAY,cAAc,EAAE,UAAU,gCAAgC,EAAE,CAAC;AAC/E,YAAM,YAAY,cAAc,EAAE,UAAU,4BAA4B,SAAS,EAAE,CAAC;AAEpF,YAAM,mBAAmB,YAAY,eAAqD;AAAA,QACxF,UAAU,gCAAgC;AAAA,MAC5C,CAAC;AACD,YAAM,mBAAmB,YAAY,eAAqD;AAAA,QACxF,UAAU,4BAA4B,SAAS;AAAA,MACjD,CAAC;AAED,kBAAY;AAAA,QACV,EAAE,UAAU,gCAAgC,GAAG,OAAO,MAAM;AAAA,QAC5D,CAAC,QAAQ;AACP,cAAI,CAAC,IAAK,QAAO;AACjB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,cAC9B,GAAG;AAAA,cACH,MAAM,KAAK,KAAK;AAAA,gBAAI,CAAC,MACnB,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,YAAY,MAAM,IAAI;AAAA,cAClD;AAAA,YACF,EAAE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,QACV,EAAE,UAAU,4BAA4B,SAAS,GAAG,OAAO,MAAM;AAAA,QACjE,CAAC,QAAQ;AACP,cAAI,CAAC,KAAK,MAAM,OAAQ,QAAO;AAC/B,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,IAAI,MAAM;AAAA,cAAI,CAAC,MAAM,MAC1B,MAAM,IAAI,EAAE,GAAG,MAAM,OAAO,KAAK,QAAQ,EAAE,IAAI;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,kBAAkB,iBAAiB;AAAA,IAC9C;AAAA,IAEA,SAAS,CAAC,MAAM,SAAS,QAAQ;AAC/B,WAAK,iBAAiB,QAAQ,CAAC,CAAC,KAAK,IAAI,MAAM,YAAY,aAAa,KAAK,IAAI,CAAC;AAClF,WAAK,iBAAiB,QAAQ,CAAC,CAAC,KAAK,IAAI,MAAM,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,IACpF;AAAA,IAEA,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,4BAA4B,SAAS,EAAE,CAAC;AAClF,kBAAY,kBAAkB,EAAE,UAAU,gCAAgC,EAAE,CAAC;AAAA,IAC/E;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/remove-project-user.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQueryClient, useMutation, InfiniteData } from '@tanstack/react-query';\nimport { removeProjectUserAction } from '../actions/remove-project-user.action';\nimport { LIST_PROJECT_USERS_BASE_KEY } from './list-project-users.hook';\nimport { LIST_ALL_ACCOUNT_USERS_BASE_KEY } from './list-all-account-users.hook';\nimport type { UsersPage, AccountUser, ProjectUser } from '../types';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport function useRemoveProjectUser(projectId: number) {\n const queryClient = useQueryClient();\n const allAccountUsersKey = useAuthQueryKey([...LIST_ALL_ACCOUNT_USERS_BASE_KEY()]);\n const projectUsersKey = useAuthQueryKey([...LIST_PROJECT_USERS_BASE_KEY(projectId)]);\n\n return useMutation({\n mutationFn: (targetUserId: number) =>\n removeProjectUserAction({ projectId, users: [targetUserId] }),\n\n onMutate: async (targetUserId) => {\n await queryClient.cancelQueries({ queryKey: allAccountUsersKey });\n await queryClient.cancelQueries({ queryKey: projectUsersKey });\n\n const prevAccountUsers = queryClient.getQueriesData<InfiniteData<UsersPage<AccountUser>>>({\n queryKey: allAccountUsersKey,\n });\n const prevProjectUsers = queryClient.getQueriesData<InfiniteData<UsersPage<ProjectUser>>>({\n queryKey: projectUsersKey,\n });\n\n queryClient.setQueriesData<InfiniteData<UsersPage<AccountUser>>>(\n { queryKey: allAccountUsersKey, exact: false },\n (old) => {\n if (!old) return old;\n return {\n ...old,\n pages: old.pages.map((page) => ({\n ...page,\n data: page.data.map((u) =>\n u.id === targetUserId ? { ...u, in_project: false } : u\n ),\n })),\n };\n }\n );\n\n queryClient.setQueriesData<InfiniteData<UsersPage<ProjectUser>>>(\n { queryKey: projectUsersKey, exact: false },\n (old) => {\n if (!old?.pages.length) return old;\n return {\n ...old,\n pages: old.pages.map((page, i) =>\n i === 0 ? { ...page, total: page.total - 1 } : page\n ),\n };\n }\n );\n\n return { prevAccountUsers, prevProjectUsers };\n },\n\n onError: (_err, _targetUserId, ctx) => {\n ctx?.prevAccountUsers.forEach(([key, data]) => queryClient.setQueryData(key, data));\n ctx?.prevProjectUsers.forEach(([key, data]) => queryClient.setQueryData(key, data));\n },\n\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: projectUsersKey });\n queryClient.invalidateQueries({ queryKey: allAccountUsersKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB,mBAAiC;AAC1D,SAAS,+BAA+B;AACxC,SAAS,mCAAmC;AAC5C,SAAS,uCAAuC;AAEhD,SAAS,uBAAuB;AAEzB,SAAS,qBAAqB,WAAmB;AACtD,QAAM,cAAc,eAAe;AACnC,QAAM,qBAAqB,gBAAgB,CAAC,GAAG,gCAAgC,CAAC,CAAC;AACjF,QAAM,kBAAkB,gBAAgB,CAAC,GAAG,4BAA4B,SAAS,CAAC,CAAC;AAEnF,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,iBACX,wBAAwB,EAAE,WAAW,OAAO,CAAC,YAAY,EAAE,CAAC;AAAA,IAE9D,UAAU,OAAO,iBAAiB;AAChC,YAAM,YAAY,cAAc,EAAE,UAAU,mBAAmB,CAAC;AAChE,YAAM,YAAY,cAAc,EAAE,UAAU,gBAAgB,CAAC;AAE7D,YAAM,mBAAmB,YAAY,eAAqD;AAAA,QACxF,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,mBAAmB,YAAY,eAAqD;AAAA,QACxF,UAAU;AAAA,MACZ,CAAC;AAED,kBAAY;AAAA,QACV,EAAE,UAAU,oBAAoB,OAAO,MAAM;AAAA,QAC7C,CAAC,QAAQ;AACP,cAAI,CAAC,IAAK,QAAO;AACjB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,cAC9B,GAAG;AAAA,cACH,MAAM,KAAK,KAAK;AAAA,gBAAI,CAAC,MACnB,EAAE,OAAO,eAAe,EAAE,GAAG,GAAG,YAAY,MAAM,IAAI;AAAA,cACxD;AAAA,YACF,EAAE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,QACV,EAAE,UAAU,iBAAiB,OAAO,MAAM;AAAA,QAC1C,CAAC,QAAQ;AACP,cAAI,CAAC,KAAK,MAAM,OAAQ,QAAO;AAC/B,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,IAAI,MAAM;AAAA,cAAI,CAAC,MAAM,MAC1B,MAAM,IAAI,EAAE,GAAG,MAAM,OAAO,KAAK,QAAQ,EAAE,IAAI;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,kBAAkB,iBAAiB;AAAA,IAC9C;AAAA,IAEA,SAAS,CAAC,MAAM,eAAe,QAAQ;AACrC,WAAK,iBAAiB,QAAQ,CAAC,CAAC,KAAK,IAAI,MAAM,YAAY,aAAa,KAAK,IAAI,CAAC;AAClF,WAAK,iBAAiB,QAAQ,CAAC,CAAC,KAAK,IAAI,MAAM,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,IACpF;AAAA,IAEA,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,gBAAgB,CAAC;AAC3D,kBAAY,kBAAkB,EAAE,UAAU,mBAAmB,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { updateProjectAction } from "../actions/update-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ import { insertSorted, buildCompareFn } from "../../../infra/utils/array";
8
+ function extractSort(query) {
9
+ const key = query.queryKey;
10
+ for (let i = key.length - 1; i >= 0; i--) {
11
+ const segment = key[i];
12
+ if (segment && typeof segment === "object" && "sort" in segment) {
13
+ return segment.sort;
14
+ }
15
+ }
16
+ return void 0;
17
+ }
18
+ function useUpdateProject() {
19
+ const queryClient = useQueryClient();
20
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
21
+ return useMutation({
22
+ mutationFn: ({ projectId, data }) => withAction(updateProjectAction)(projectId, data),
23
+ onSuccess: (updatedProject, { projectId }) => {
24
+ const cache = queryClient.getQueryCache();
25
+ const queries = cache.findAll({ queryKey: projectsKey });
26
+ for (const query of queries) {
27
+ const sort = extractSort(query);
28
+ const isInfinite = query.queryKey.includes("infinite");
29
+ if (isInfinite) {
30
+ queryClient.setQueryData(
31
+ query.queryKey,
32
+ (old) => {
33
+ if (!old?.pages.length) return old;
34
+ const pageSize = old.pages[0].data.length || 20;
35
+ const allItems = old.pages.flatMap((page) => page.data);
36
+ const without = allItems.filter((p) => p.id !== projectId);
37
+ const withUpdated = sort ? insertSorted(without, updatedProject, buildCompareFn(sort)) : [updatedProject, ...without];
38
+ return {
39
+ ...old,
40
+ pages: old.pages.map((page, i) => ({
41
+ ...page,
42
+ data: withUpdated.slice(i * pageSize, (i + 1) * pageSize)
43
+ }))
44
+ };
45
+ }
46
+ );
47
+ } else {
48
+ queryClient.setQueryData(
49
+ query.queryKey,
50
+ (old) => {
51
+ if (!old) return old;
52
+ const pageSize = old.data.length || 20;
53
+ const without = old.data.filter((p) => p.id !== projectId);
54
+ const withUpdated = sort ? insertSorted(without, updatedProject, buildCompareFn(sort)) : [updatedProject, ...without];
55
+ return {
56
+ ...old,
57
+ data: withUpdated.slice(0, pageSize)
58
+ };
59
+ }
60
+ );
61
+ }
62
+ }
63
+ queryClient.invalidateQueries({ queryKey: projectsKey });
64
+ }
65
+ });
66
+ }
67
+ export {
68
+ useUpdateProject
69
+ };
70
+ //# sourceMappingURL=update-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/update-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient, InfiniteData, Query } from '@tanstack/react-query';\nimport { updateProjectAction } from '../actions/update-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\nimport { insertSorted, buildCompareFn } from '../../../infra/utils/array';\nimport type { Project, ProjectsPage, UpdateProjectRequest } from '../types';\n\nfunction extractSort(query: Query): string | undefined {\n const key = query.queryKey;\n for (let i = key.length - 1; i >= 0; i--) {\n const segment = key[i];\n if (segment && typeof segment === 'object' && 'sort' in segment) {\n return (segment as Record<string, unknown>).sort as string | undefined;\n }\n }\n return undefined;\n}\n\nexport function useUpdateProject() {\n const queryClient = useQueryClient();\n const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);\n\n return useMutation({\n mutationFn: ({ projectId, data }: { projectId: number; data: UpdateProjectRequest }) =>\n withAction(updateProjectAction)(projectId, data),\n\n onSuccess: (updatedProject: Project, { projectId }) => {\n const cache = queryClient.getQueryCache();\n const queries = cache.findAll({ queryKey: projectsKey });\n\n for (const query of queries) {\n const sort = extractSort(query);\n const isInfinite = query.queryKey.includes('infinite');\n\n if (isInfinite) {\n queryClient.setQueryData<InfiniteData<ProjectsPage>>(\n query.queryKey,\n (old) => {\n if (!old?.pages.length) return old;\n\n const pageSize = old.pages[0].data.length || 20;\n const allItems = old.pages.flatMap((page) => page.data);\n const without = allItems.filter((p) => p.id !== projectId);\n\n const withUpdated = sort\n ? insertSorted(without, updatedProject, buildCompareFn<Project>(sort))\n : [updatedProject, ...without];\n\n return {\n ...old,\n pages: old.pages.map((page, i) => ({\n ...page,\n data: withUpdated.slice(i * pageSize, (i + 1) * pageSize),\n })),\n };\n },\n );\n } else {\n queryClient.setQueryData<ProjectsPage>(\n query.queryKey,\n (old) => {\n if (!old) return old;\n\n const pageSize = old.data.length || 20;\n const without = old.data.filter((p) => p.id !== projectId);\n\n const withUpdated = sort\n ? insertSorted(without, updatedProject, buildCompareFn<Project>(sort))\n : [updatedProject, ...without];\n\n return {\n ...old,\n data: withUpdated.slice(0, pageSize),\n };\n },\n );\n }\n }\n\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAA2C;AACjE,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,cAAc,sBAAsB;AAG7C,SAAS,YAAY,OAAkC;AACrD,QAAM,MAAM,MAAM;AAClB,WAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAM,UAAU,IAAI,CAAC;AACrB,QAAI,WAAW,OAAO,YAAY,YAAY,UAAU,SAAS;AAC/D,aAAQ,QAAoC;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;AAE1D,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,EAAE,WAAW,KAAK,MAC7B,WAAW,mBAAmB,EAAE,WAAW,IAAI;AAAA,IAEjD,WAAW,CAAC,gBAAyB,EAAE,UAAU,MAAM;AACrD,YAAM,QAAQ,YAAY,cAAc;AACxC,YAAM,UAAU,MAAM,QAAQ,EAAE,UAAU,YAAY,CAAC;AAEvD,iBAAW,SAAS,SAAS;AAC3B,cAAM,OAAO,YAAY,KAAK;AAC9B,cAAM,aAAa,MAAM,SAAS,SAAS,UAAU;AAErD,YAAI,YAAY;AACd,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,CAAC,QAAQ;AACP,kBAAI,CAAC,KAAK,MAAM,OAAQ,QAAO;AAE/B,oBAAM,WAAW,IAAI,MAAM,CAAC,EAAE,KAAK,UAAU;AAC7C,oBAAM,WAAW,IAAI,MAAM,QAAQ,CAAC,SAAS,KAAK,IAAI;AACtD,oBAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAEzD,oBAAM,cAAc,OAChB,aAAa,SAAS,gBAAgB,eAAwB,IAAI,CAAC,IACnE,CAAC,gBAAgB,GAAG,OAAO;AAE/B,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,kBACjC,GAAG;AAAA,kBACH,MAAM,YAAY,MAAM,IAAI,WAAW,IAAI,KAAK,QAAQ;AAAA,gBAC1D,EAAE;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,CAAC,QAAQ;AACP,kBAAI,CAAC,IAAK,QAAO;AAEjB,oBAAM,WAAW,IAAI,KAAK,UAAU;AACpC,oBAAM,UAAU,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAEzD,oBAAM,cAAc,OAChB,aAAa,SAAS,gBAAgB,eAAwB,IAAI,CAAC,IACnE,CAAC,gBAAgB,GAAG,OAAO;AAE/B,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,MAAM,YAAY,MAAM,GAAG,QAAQ;AAAA,cACrC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,99 @@
1
+ import "server-only";
2
+ import { api } from "../../../infra/api/client";
3
+ import { ApiError } from "../../../infra/api/types";
4
+ import { buildQueryParams } from "../../../infra/utils/params";
5
+ import { getUserContext } from "../../auth/utils/get-user-context";
6
+ import { assertManagementSubscription } from "../../auth/utils/assert-management-subscription";
7
+ import {
8
+ ProjectSchema
9
+ } from "../types";
10
+ class ProjectsService {
11
+ async list(params = {}) {
12
+ const { id_account, id_user } = await getUserContext();
13
+ const query = buildQueryParams(params);
14
+ const url = `/account/${id_account}/user/${id_user}/projects${query ? `?${query}` : ""}`;
15
+ const response = await api.apps.get(url);
16
+ if (response.status === 0) {
17
+ throw new ApiError(
18
+ response.message || "Erro ao listar projetos",
19
+ "LIST_PROJECTS_FAILED",
20
+ 400
21
+ );
22
+ }
23
+ return {
24
+ data: (response.data || []).map((item) => ProjectSchema.parse(item)),
25
+ total: response.total || 0,
26
+ page: params.page ?? 1
27
+ };
28
+ }
29
+ async findById(projectId) {
30
+ const { id_account, id_user } = await getUserContext();
31
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
32
+ const response = await api.apps.get(url);
33
+ if (response.status === 0) {
34
+ throw new ApiError(
35
+ response.message || "Erro ao buscar projeto",
36
+ "FIND_PROJECT_FAILED",
37
+ 400
38
+ );
39
+ }
40
+ if (!response.data || response.data.length === 0) {
41
+ throw new ApiError("Projeto n\xE3o encontrado", "PROJECT_NOT_FOUND", 404);
42
+ }
43
+ return ProjectSchema.parse(response.data[0]);
44
+ }
45
+ async create(data) {
46
+ await assertManagementSubscription();
47
+ const { id_account, id_user } = await getUserContext();
48
+ const url = `/account/${id_account}/user/${id_user}/projects`;
49
+ const response = await api.apps.post(url, data);
50
+ if (response.status === 0) {
51
+ throw new ApiError(
52
+ response.message || "Erro ao criar projeto",
53
+ "CREATE_PROJECT_FAILED",
54
+ 400
55
+ );
56
+ }
57
+ if (!response.data || response.data.length === 0) {
58
+ throw new ApiError("Resposta inv\xE1lida ao criar projeto", "INVALID_RESPONSE", 500);
59
+ }
60
+ return ProjectSchema.parse(response.data[0]);
61
+ }
62
+ async update(projectId, data) {
63
+ await assertManagementSubscription();
64
+ const { id_account, id_user } = await getUserContext();
65
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
66
+ const response = await api.apps.put(url, data);
67
+ if (response.status === 0) {
68
+ throw new ApiError(
69
+ response.message || "Erro ao atualizar projeto",
70
+ "UPDATE_PROJECT_FAILED",
71
+ 400
72
+ );
73
+ }
74
+ if (!response.data || response.data.length === 0) {
75
+ throw new ApiError("Resposta inv\xE1lida ao atualizar projeto", "INVALID_RESPONSE", 500);
76
+ }
77
+ return ProjectSchema.parse(response.data[0]);
78
+ }
79
+ async delete(projectId, moveToProjectId) {
80
+ await assertManagementSubscription();
81
+ const { id_account, id_user } = await getUserContext();
82
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
83
+ const response = await api.apps.delete(url, {
84
+ body: JSON.stringify({ id_project_to_move: moveToProjectId })
85
+ });
86
+ if (response.status === 0) {
87
+ throw new ApiError(
88
+ response.message || "Erro ao deletar projeto",
89
+ "DELETE_PROJECT_FAILED",
90
+ 400
91
+ );
92
+ }
93
+ }
94
+ }
95
+ const projectsService = new ProjectsService();
96
+ export {
97
+ projectsService
98
+ };
99
+ //# sourceMappingURL=projects.service.mjs.map