@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.
@@ -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 { PROJECTS_BASE_KEY } from "./list-projects.hook";
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 projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
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.invalidateQueries({ queryKey: projectsKey });
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 { PROJECTS_BASE_KEY } from './list-projects.hook';\nimport type { CreateProjectRequest } from '../types';\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 onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAsB;AAC5C,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,SACX,WAAW,mBAAmB,EAAE,IAAI;AAAA,IACtC,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
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 { PROJECTS_BASE_KEY } from "./list-projects.hook";
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 projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
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.invalidateQueries({ queryKey: projectsKey });
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 { PROJECTS_BASE_KEY } from './list-projects.hook';\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 onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAE3B,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,IAC5D,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
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.string().optional(),
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.string().optional(),\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,EAAE,SAAS;AAAA,EACjC,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":[]}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@greatapps/common",
3
- "version": "1.1.495",
3
+ "version": "1.1.497",
4
4
  "description": "Shared library for GreatApps frontend applications",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -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 { PROJECTS_BASE_KEY } from './list-projects.hook';
8
- import type { CreateProjectRequest } from '../types';
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 projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
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
- onSuccess: () => {
18
- queryClient.invalidateQueries({ queryKey: projectsKey });
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 { PROJECTS_BASE_KEY } from './list-projects.hook';
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 projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
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
- onSuccess: () => {
17
- queryClient.invalidateQueries({ queryKey: projectsKey });
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.string().optional(),
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))