@greatapps/common 1.1.525 → 1.1.526
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.
- package/dist/components/account/ConfigurationsMyAccountModal.mjs +10 -4
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
- package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs +3 -1
- package/dist/components/account/hooks/useDisableTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/sections/ChangeEmailModal.mjs +3 -1
- package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs +3 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs +2 -1
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/TokenSection.mjs +72 -0
- package/dist/components/account/sections/TokenSection.mjs.map +1 -0
- package/dist/components/embeds/ClarityEmbed.mjs +55 -0
- package/dist/components/embeds/ClarityEmbed.mjs.map +1 -0
- package/dist/components/embeds/EmbedWidgets.mjs +3 -1
- package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
- package/dist/components/layouts/AppMobileNavBar.mjs +3 -1
- package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
- package/dist/components/layouts/AppNavBar.mjs +4 -8
- package/dist/components/layouts/AppNavBar.mjs.map +1 -1
- package/dist/components/layouts/NavBar.mjs +10 -9
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/NotificationsPopover.mjs +5 -2
- package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs +4 -2
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/SideBarNavigation.mjs +4 -1
- package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
- package/dist/components/modals/BuyCreditsModal.mjs +26 -9
- package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
- package/dist/components/modals/cards/AddCardModal.mjs +3 -1
- package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/ProjectSelectorPopover.mjs +7 -6
- package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs +39 -19
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- package/dist/components/pages/NotFoundPage.mjs +2 -2
- package/dist/components/pages/NotFoundPage.mjs.map +1 -1
- package/dist/components/ui/buttons/Button.mjs +7 -2
- package/dist/components/ui/buttons/Button.mjs.map +1 -1
- package/dist/components/ui/data-display/CardItem.mjs +1 -1
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentInfoCard.mjs +4 -2
- package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
- package/dist/components/ui/data-display/UserAvatar.mjs +6 -2
- package/dist/components/ui/data-display/UserAvatar.mjs.map +1 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs +4 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/Toast.mjs +7 -2
- package/dist/components/ui/feedback/Toast.mjs.map +1 -1
- package/dist/components/ui/form/FormField.mjs +1 -1
- package/dist/components/ui/form/FormField.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +1 -1
- package/dist/components/ui/form/Select.mjs.map +1 -1
- package/dist/components/ui/overlay/Popover.mjs +1 -1
- package/dist/components/ui/overlay/Popover.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs +8 -6
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +11 -37
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageUpload.mjs +2 -1
- package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
- package/dist/components/widgets/notifications/NotificationCard.mjs +4 -1
- package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
- package/dist/enums/AccountSectionType.mjs +1 -0
- package/dist/enums/AccountSectionType.mjs.map +1 -1
- package/dist/hooks/useAuthQueryKey.mjs +23 -0
- package/dist/hooks/useAuthQueryKey.mjs.map +1 -0
- package/dist/index.mjs +90 -8
- package/dist/index.mjs.map +1 -1
- package/dist/infra/utils/array.mjs +34 -0
- package/dist/infra/utils/array.mjs.map +1 -0
- package/dist/modules/accounts/actions/get-account-token.action.mjs +10 -0
- package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -0
- package/dist/modules/accounts/hooks/current-account.hook.mjs +5 -2
- package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/use-account-token.hook.mjs +15 -0
- package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -0
- package/dist/modules/accounts/hooks/useAccountManagement.mjs +19 -9
- package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useCurrencies.mjs +3 -1
- package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useTimezones.mjs +3 -1
- package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
- package/dist/modules/accounts/services/account-token.service.mjs +32 -0
- package/dist/modules/accounts/services/account-token.service.mjs.map +1 -0
- package/dist/modules/auth/hooks/useUserQuery.mjs +15 -6
- package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
- package/dist/modules/cards/actions/delete-card.action.mjs +10 -0
- package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -0
- package/dist/modules/cards/actions/find-card-by-id.action.mjs +10 -0
- package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -0
- package/dist/modules/cards/actions/set-default-card.action.mjs +10 -0
- package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -0
- package/dist/modules/cards/hooks/card-by-id.hook.mjs +22 -0
- package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -0
- package/dist/modules/cards/hooks/cards.hook.mjs +11 -3
- package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/create-card.hook.mjs +13 -2
- package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/delete-card.hook.mjs +50 -0
- package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -0
- package/dist/modules/cards/hooks/set-default-card.hook.mjs +51 -0
- package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -0
- package/dist/modules/cards/services/cards.service.mjs +45 -4
- package/dist/modules/cards/services/cards.service.mjs.map +1 -1
- package/dist/modules/cards/types.mjs +11 -3
- package/dist/modules/cards/types.mjs.map +1 -1
- package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs +3 -1
- package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
- package/dist/modules/plans/hooks/list-plans.hook.mjs +3 -1
- package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs +4 -2
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
- package/dist/modules/plans/services/plans.service.mjs +4 -2
- package/dist/modules/plans/services/plans.service.mjs.map +1 -1
- package/dist/modules/plans/types/plan.type.mjs.map +1 -1
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +20 -10
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
- package/dist/modules/projects/actions/create-project.action.mjs +10 -0
- package/dist/modules/projects/actions/create-project.action.mjs.map +1 -0
- package/dist/modules/projects/actions/delete-project.action.mjs +10 -0
- package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -0
- package/dist/modules/projects/actions/find-project.action.mjs +10 -0
- package/dist/modules/projects/actions/find-project.action.mjs.map +1 -0
- package/dist/modules/projects/actions/list-projects.action.mjs +10 -0
- package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -0
- package/dist/modules/projects/actions/update-project.action.mjs +10 -0
- package/dist/modules/projects/actions/update-project.action.mjs.map +1 -0
- package/dist/modules/projects/hooks/add-project-user.hook.mjs +15 -12
- package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/create-project.hook.mjs +71 -0
- package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/delete-project.hook.mjs +53 -0
- package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/find-project.hook.mjs +19 -0
- package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs +3 -1
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs +3 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +39 -0
- package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/list-project-users.hook.mjs +3 -1
- package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-projects.hook.mjs +22 -0
- package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/remove-project-user.hook.mjs +15 -12
- package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/update-project.hook.mjs +70 -0
- package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -0
- package/dist/modules/projects/services/projects.service.mjs +99 -0
- package/dist/modules/projects/services/projects.service.mjs.map +1 -0
- package/dist/modules/projects/types.mjs +19 -4
- package/dist/modules/projects/types.mjs.map +1 -1
- package/dist/modules/subscriptions/constants/query-keys.constants.mjs +2 -0
- package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs +5 -2
- package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs +3 -1
- package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs +6 -3
- package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/types/calculate-subscription.type.mjs +29 -2
- package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/periodicity.mjs +7 -0
- package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
- package/dist/modules/users/action/list-messages.action.mjs +14 -2
- package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
- package/dist/modules/users/hooks/messages.hook.mjs +9 -4
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/modules/users/services/messages.service.mjs.map +1 -1
- package/dist/providers/auth.provider.mjs +6 -4
- package/dist/providers/auth.provider.mjs.map +1 -1
- package/dist/providers/query.provider.mjs +2 -2
- package/dist/providers/query.provider.mjs.map +1 -1
- package/dist/providers/whitelabel.provider.mjs +5 -0
- package/dist/providers/whitelabel.provider.mjs.map +1 -1
- package/dist/server.mjs +14 -0
- package/dist/server.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/components/navigation/types.mjs +0 -1
- 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
|
|
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 = ()
|
|
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
|
|
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)
|
|
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
|
|
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)
|
|
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: (
|
|
10
|
-
onMutate: async (
|
|
11
|
-
await queryClient.cancelQueries({ queryKey:
|
|
12
|
-
await queryClient.cancelQueries({ queryKey:
|
|
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:
|
|
17
|
+
queryKey: allAccountUsersKey
|
|
15
18
|
});
|
|
16
19
|
const prevProjectUsers = queryClient.getQueriesData({
|
|
17
|
-
queryKey:
|
|
20
|
+
queryKey: projectUsersKey
|
|
18
21
|
});
|
|
19
22
|
queryClient.setQueriesData(
|
|
20
|
-
{ queryKey:
|
|
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 ===
|
|
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:
|
|
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,
|
|
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:
|
|
54
|
-
queryClient.invalidateQueries({ queryKey:
|
|
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: (
|
|
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
|