@greatapps/common 1.1.495 → 1.1.497
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/modules/projects/hooks/create-project.hook.mjs +24 -4
- package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/delete-project.hook.mjs +30 -4
- package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
- package/dist/modules/projects/types.mjs +1 -1
- package/dist/modules/projects/types.mjs.map +1 -1
- package/package.json +1 -1
- package/src/modules/projects/hooks/create-project.hook.ts +30 -6
- package/src/modules/projects/hooks/delete-project.hook.ts +34 -5
- package/src/modules/projects/types.ts +1 -1
|
@@ -3,14 +3,34 @@ import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
|
3
3
|
import { createProjectAction } from "../actions/create-project.action";
|
|
4
4
|
import { withAction } from "../../../utils/withAction";
|
|
5
5
|
import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
|
|
6
|
-
import {
|
|
6
|
+
import { PROJECTS_QUERY_KEY } from "./list-projects.hook";
|
|
7
|
+
import { INFINITE_PROJECTS_QUERY_KEY } from "./list-infinite-projects.hook";
|
|
7
8
|
function useCreateProject() {
|
|
8
9
|
const queryClient = useQueryClient();
|
|
9
|
-
const
|
|
10
|
+
const infiniteKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY()]);
|
|
11
|
+
const listKey = useAuthQueryKey([...PROJECTS_QUERY_KEY()]);
|
|
10
12
|
return useMutation({
|
|
11
13
|
mutationFn: (data) => withAction(createProjectAction)(data),
|
|
12
|
-
onSuccess: () => {
|
|
13
|
-
queryClient.
|
|
14
|
+
onSuccess: (newProject) => {
|
|
15
|
+
queryClient.setQueriesData(
|
|
16
|
+
{ queryKey: infiniteKey, exact: false },
|
|
17
|
+
(old) => {
|
|
18
|
+
if (!old?.pages.length) return old;
|
|
19
|
+
return {
|
|
20
|
+
...old,
|
|
21
|
+
pages: old.pages.map(
|
|
22
|
+
(page, i) => i === 0 ? { ...page, data: [newProject, ...page.data], total: page.total + 1 } : page
|
|
23
|
+
)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
queryClient.setQueriesData(
|
|
28
|
+
{ queryKey: listKey, exact: false },
|
|
29
|
+
(old) => {
|
|
30
|
+
if (!old) return old;
|
|
31
|
+
return { ...old, data: [newProject, ...old.data], total: old.total + 1 };
|
|
32
|
+
}
|
|
33
|
+
);
|
|
14
34
|
}
|
|
15
35
|
});
|
|
16
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/hooks/create-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { createProjectAction } from '../actions/create-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/projects/hooks/create-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient, InfiniteData } from '@tanstack/react-query';\nimport { createProjectAction } from '../actions/create-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_QUERY_KEY } from './list-projects.hook';\nimport { INFINITE_PROJECTS_QUERY_KEY } from './list-infinite-projects.hook';\nimport type { CreateProjectRequest, Project, ProjectsPage } from '../types';\n\nexport function useCreateProject() {\n const queryClient = useQueryClient();\n const infiniteKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY()]);\n const listKey = useAuthQueryKey([...PROJECTS_QUERY_KEY()]);\n\n return useMutation({\n mutationFn: (data: CreateProjectRequest) =>\n withAction(createProjectAction)(data),\n\n onSuccess: (newProject: Project) => {\n queryClient.setQueriesData<InfiniteData<ProjectsPage>>(\n { queryKey: infiniteKey, 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\n ? { ...page, data: [newProject, ...page.data], total: page.total + 1 }\n : page\n ),\n };\n },\n );\n\n queryClient.setQueriesData<ProjectsPage>(\n { queryKey: listKey, exact: false },\n (old) => {\n if (!old) return old;\n return { ...old, data: [newProject, ...old.data], total: old.total + 1 };\n },\n );\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAoC;AAC1D,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,mCAAmC;AAGrC,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,4BAA4B,CAAC,CAAC;AACtE,QAAM,UAAU,gBAAgB,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAEzD,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,SACX,WAAW,mBAAmB,EAAE,IAAI;AAAA,IAEtC,WAAW,CAAC,eAAwB;AAClC,kBAAY;AAAA,QACV,EAAE,UAAU,aAAa,OAAO,MAAM;AAAA,QACtC,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,IACF,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,GAAG,KAAK,IAAI,GAAG,OAAO,KAAK,QAAQ,EAAE,IACnE;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,QACV,EAAE,UAAU,SAAS,OAAO,MAAM;AAAA,QAClC,CAAC,QAAQ;AACP,cAAI,CAAC,IAAK,QAAO;AACjB,iBAAO,EAAE,GAAG,KAAK,MAAM,CAAC,YAAY,GAAG,IAAI,IAAI,GAAG,OAAO,IAAI,QAAQ,EAAE;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -3,14 +3,40 @@ import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
|
3
3
|
import { deleteProjectAction } from "../actions/delete-project.action";
|
|
4
4
|
import { withAction } from "../../../utils/withAction";
|
|
5
5
|
import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
|
|
6
|
-
import {
|
|
6
|
+
import { PROJECTS_QUERY_KEY } from "./list-projects.hook";
|
|
7
|
+
import { INFINITE_PROJECTS_QUERY_KEY } from "./list-infinite-projects.hook";
|
|
7
8
|
function useDeleteProject() {
|
|
8
9
|
const queryClient = useQueryClient();
|
|
9
|
-
const
|
|
10
|
+
const infiniteKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY()]);
|
|
11
|
+
const listKey = useAuthQueryKey([...PROJECTS_QUERY_KEY()]);
|
|
10
12
|
return useMutation({
|
|
11
13
|
mutationFn: ({ projectId, moveToProjectId }) => withAction(deleteProjectAction)(projectId, moveToProjectId),
|
|
12
|
-
onSuccess: () => {
|
|
13
|
-
queryClient.
|
|
14
|
+
onSuccess: (_, { projectId }) => {
|
|
15
|
+
queryClient.setQueriesData(
|
|
16
|
+
{ queryKey: infiniteKey, exact: false },
|
|
17
|
+
(old) => {
|
|
18
|
+
if (!old?.pages.length) return old;
|
|
19
|
+
return {
|
|
20
|
+
...old,
|
|
21
|
+
pages: old.pages.map((page) => ({
|
|
22
|
+
...page,
|
|
23
|
+
data: page.data.filter((p) => p.id !== projectId),
|
|
24
|
+
total: page.total - 1
|
|
25
|
+
}))
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
queryClient.setQueriesData(
|
|
30
|
+
{ queryKey: listKey, exact: false },
|
|
31
|
+
(old) => {
|
|
32
|
+
if (!old) return old;
|
|
33
|
+
return {
|
|
34
|
+
...old,
|
|
35
|
+
data: old.data.filter((p) => p.id !== projectId),
|
|
36
|
+
total: old.total - 1
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
);
|
|
14
40
|
}
|
|
15
41
|
});
|
|
16
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/hooks/delete-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { deleteProjectAction } from '../actions/delete-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport {
|
|
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_QUERY_KEY } from './list-projects.hook';\nimport { INFINITE_PROJECTS_QUERY_KEY } from './list-infinite-projects.hook';\nimport type { ProjectsPage } from '../types';\n\nexport function useDeleteProject() {\n const queryClient = useQueryClient();\n const infiniteKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY()]);\n const listKey = useAuthQueryKey([...PROJECTS_QUERY_KEY()]);\n\n return useMutation({\n mutationFn: ({ projectId, moveToProjectId }: { projectId: number; moveToProjectId: number }) =>\n withAction(deleteProjectAction)(projectId, moveToProjectId),\n\n onSuccess: (_, { projectId }) => {\n queryClient.setQueriesData<InfiniteData<ProjectsPage>>(\n { queryKey: infiniteKey, exact: false },\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\n queryClient.setQueriesData<ProjectsPage>(\n { queryKey: listKey, exact: false },\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"],"mappings":";AAEA,SAAS,aAAa,sBAAoC;AAC1D,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,mCAAmC;AAGrC,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,4BAA4B,CAAC,CAAC;AACtE,QAAM,UAAU,gBAAgB,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAEzD,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,kBAAY;AAAA,QACV,EAAE,UAAU,aAAa,OAAO,MAAM;AAAA,QACtC,CAAC,QAAQ;AACP,cAAI,CAAC,KAAK,MAAM,OAAQ,QAAO;AAC/B,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,IAAI,MAAM,IAAI,CAAC,UAAU;AAAA,cAC9B,GAAG;AAAA,cACH,MAAM,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,cAChD,OAAO,KAAK,QAAQ;AAAA,YACtB,EAAE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,QACV,EAAE,UAAU,SAAS,OAAO,MAAM;AAAA,QAClC,CAAC,QAAQ;AACP,cAAI,CAAC,IAAK,QAAO;AACjB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,MAAM,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,YAC/C,OAAO,IAAI,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -7,7 +7,7 @@ const ProjectSchema = z.object({
|
|
|
7
7
|
photo: z.string().nullable().optional(),
|
|
8
8
|
id_api: z.union([z.number(), z.string()]).nullable().optional(),
|
|
9
9
|
id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),
|
|
10
|
-
total_users: z.
|
|
10
|
+
total_users: z.coerce.number().optional().default(0),
|
|
11
11
|
deleted: z.union([z.boolean(), z.number()]).transform((v) => Boolean(v)).default(false),
|
|
12
12
|
datetime_add: z.string().nullable().optional(),
|
|
13
13
|
datetime_alt: z.string().nullable().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/modules/projects/types.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\n// ============================================================================\r\n// Project\r\n// ============================================================================\r\n\r\nexport const ProjectSchema = z.object({\r\n id: z.union([z.number(), z.string()]).transform(Number),\r\n id_wl: z.union([z.number(), z.string()]).transform(Number),\r\n id_account: z.union([z.number(), z.string()]).transform(Number),\r\n title: z.string(),\r\n photo: z.string().nullable().optional(),\r\n id_api: z.union([z.number(), z.string()]).nullable().optional(),\r\n id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),\r\n total_users: z.
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/projects/types.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\n// ============================================================================\r\n// Project\r\n// ============================================================================\r\n\r\nexport const ProjectSchema = z.object({\r\n id: z.union([z.number(), z.string()]).transform(Number),\r\n id_wl: z.union([z.number(), z.string()]).transform(Number),\r\n id_account: z.union([z.number(), z.string()]).transform(Number),\r\n title: z.string(),\r\n photo: z.string().nullable().optional(),\r\n id_api: z.union([z.number(), z.string()]).nullable().optional(),\r\n id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),\r\n total_users: z.coerce.number().optional().default(0),\r\n deleted: z\r\n .union([z.boolean(), z.number()])\r\n .transform((v) => Boolean(v))\r\n .default(false),\r\n datetime_add: z.string().nullable().optional(),\r\n datetime_alt: z.string().nullable().optional(),\r\n datetime_del: z.string().nullable().optional(),\r\n});\r\n\r\nexport type Project = z.infer<typeof ProjectSchema>;\r\n\r\nexport interface ProjectsPage {\r\n data: Project[];\r\n total: number;\r\n page: number;\r\n}\r\n\r\nexport interface CreateProjectRequest {\r\n title: string;\r\n photo?: string;\r\n id_api?: number;\r\n users?: number[];\r\n}\r\n\r\nexport interface UpdateProjectRequest {\r\n title: string;\r\n photo?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Project Users\r\n// ============================================================================\r\n\r\nexport const ProjectUserSchema = z.object({\r\n id_user: z.union([z.number(), z.string()]).transform(Number),\r\n id_account: z.union([z.number(), z.string()]).transform(Number),\r\n id_project: z.union([z.number(), z.string()]).transform(Number),\r\n name: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profile: z.string().nullable().optional().default(\"viewer\"),\r\n photo: z.string().nullable().optional(),\r\n});\r\n\r\nexport type ProjectUser = z.infer<typeof ProjectUserSchema>;\r\n\r\nexport const AccountUserSchema = z.object({\r\n id: z.union([z.number(), z.string()]).transform(Number),\r\n name: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profile: z.string().nullable().optional().default(\"viewer\"),\r\n photo: z.string().nullable().optional(),\r\n in_project: z.boolean().optional(),\r\n});\r\n\r\nexport type AccountUser = z.infer<typeof AccountUserSchema>;\r\n\r\nexport interface AddRemoveProjectUsersParams {\r\n projectId: number;\r\n users: number[];\r\n}\r\n\r\nexport interface ListUsersParams {\r\n search?: string;\r\n page?: number;\r\n limit?: number;\r\n inProject?: number;\r\n}\r\n\r\nexport interface UsersPage<T> {\r\n data: T[];\r\n total: number;\r\n page: number;\r\n}\r\n"],"mappings":"AAAA,SAAS,SAAS;AAMX,MAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACtD,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACzD,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9D,qBAAqB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3E,aAAa,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACnD,SAAS,EACN,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAC/B,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC3B,QAAQ,KAAK;AAAA,EAChB,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC/C,CAAC;AA0BM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC3D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACxC,CAAC;AAIM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,21 +1,45 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { useMutation, useQueryClient, InfiniteData } from '@tanstack/react-query';
|
|
4
4
|
import { createProjectAction } from '../actions/create-project.action';
|
|
5
5
|
import { withAction } from '../../../utils/withAction';
|
|
6
6
|
import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
7
|
+
import { PROJECTS_QUERY_KEY } from './list-projects.hook';
|
|
8
|
+
import { INFINITE_PROJECTS_QUERY_KEY } from './list-infinite-projects.hook';
|
|
9
|
+
import type { CreateProjectRequest, Project, ProjectsPage } from '../types';
|
|
9
10
|
|
|
10
11
|
export function useCreateProject() {
|
|
11
12
|
const queryClient = useQueryClient();
|
|
12
|
-
const
|
|
13
|
+
const infiniteKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY()]);
|
|
14
|
+
const listKey = useAuthQueryKey([...PROJECTS_QUERY_KEY()]);
|
|
13
15
|
|
|
14
16
|
return useMutation({
|
|
15
17
|
mutationFn: (data: CreateProjectRequest) =>
|
|
16
18
|
withAction(createProjectAction)(data),
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
|
|
20
|
+
onSuccess: (newProject: Project) => {
|
|
21
|
+
queryClient.setQueriesData<InfiniteData<ProjectsPage>>(
|
|
22
|
+
{ queryKey: infiniteKey, exact: false },
|
|
23
|
+
(old) => {
|
|
24
|
+
if (!old?.pages.length) return old;
|
|
25
|
+
return {
|
|
26
|
+
...old,
|
|
27
|
+
pages: old.pages.map((page, i) =>
|
|
28
|
+
i === 0
|
|
29
|
+
? { ...page, data: [newProject, ...page.data], total: page.total + 1 }
|
|
30
|
+
: page
|
|
31
|
+
),
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
queryClient.setQueriesData<ProjectsPage>(
|
|
37
|
+
{ queryKey: listKey, exact: false },
|
|
38
|
+
(old) => {
|
|
39
|
+
if (!old) return old;
|
|
40
|
+
return { ...old, data: [newProject, ...old.data], total: old.total + 1 };
|
|
41
|
+
},
|
|
42
|
+
);
|
|
19
43
|
},
|
|
20
44
|
});
|
|
21
45
|
}
|
|
@@ -1,20 +1,49 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
3
|
+
import { useMutation, useQueryClient, InfiniteData } from '@tanstack/react-query';
|
|
4
4
|
import { deleteProjectAction } from '../actions/delete-project.action';
|
|
5
5
|
import { withAction } from '../../../utils/withAction';
|
|
6
6
|
import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
|
|
7
|
-
import {
|
|
7
|
+
import { PROJECTS_QUERY_KEY } from './list-projects.hook';
|
|
8
|
+
import { INFINITE_PROJECTS_QUERY_KEY } from './list-infinite-projects.hook';
|
|
9
|
+
import type { ProjectsPage } from '../types';
|
|
8
10
|
|
|
9
11
|
export function useDeleteProject() {
|
|
10
12
|
const queryClient = useQueryClient();
|
|
11
|
-
const
|
|
13
|
+
const infiniteKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY()]);
|
|
14
|
+
const listKey = useAuthQueryKey([...PROJECTS_QUERY_KEY()]);
|
|
12
15
|
|
|
13
16
|
return useMutation({
|
|
14
17
|
mutationFn: ({ projectId, moveToProjectId }: { projectId: number; moveToProjectId: number }) =>
|
|
15
18
|
withAction(deleteProjectAction)(projectId, moveToProjectId),
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
|
|
20
|
+
onSuccess: (_, { projectId }) => {
|
|
21
|
+
queryClient.setQueriesData<InfiniteData<ProjectsPage>>(
|
|
22
|
+
{ queryKey: infiniteKey, exact: false },
|
|
23
|
+
(old) => {
|
|
24
|
+
if (!old?.pages.length) return old;
|
|
25
|
+
return {
|
|
26
|
+
...old,
|
|
27
|
+
pages: old.pages.map((page) => ({
|
|
28
|
+
...page,
|
|
29
|
+
data: page.data.filter((p) => p.id !== projectId),
|
|
30
|
+
total: page.total - 1,
|
|
31
|
+
})),
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
queryClient.setQueriesData<ProjectsPage>(
|
|
37
|
+
{ queryKey: listKey, exact: false },
|
|
38
|
+
(old) => {
|
|
39
|
+
if (!old) return old;
|
|
40
|
+
return {
|
|
41
|
+
...old,
|
|
42
|
+
data: old.data.filter((p) => p.id !== projectId),
|
|
43
|
+
total: old.total - 1,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
);
|
|
18
47
|
},
|
|
19
48
|
});
|
|
20
49
|
}
|
|
@@ -12,7 +12,7 @@ export const ProjectSchema = z.object({
|
|
|
12
12
|
photo: z.string().nullable().optional(),
|
|
13
13
|
id_api: z.union([z.number(), z.string()]).nullable().optional(),
|
|
14
14
|
id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),
|
|
15
|
-
total_users: z.
|
|
15
|
+
total_users: z.coerce.number().optional().default(0),
|
|
16
16
|
deleted: z
|
|
17
17
|
.union([z.boolean(), z.number()])
|
|
18
18
|
.transform((v) => Boolean(v))
|