@greatapps/common 1.1.85 → 1.1.86

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.
@@ -2,40 +2,112 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import {
4
4
  QueryCache,
5
- QueryClient,
6
- QueryClientProvider
5
+ QueryClient
7
6
  } from "@tanstack/react-query";
8
- import { useState } from "react";
7
+ import { useEffect, useState } from "react";
9
8
  import dynamic from "next/dynamic";
10
9
  import { toast } from "sonner";
10
+ import {
11
+ PersistQueryClientProvider
12
+ } from "@tanstack/react-query-persist-client";
13
+ import { broadcastQueryClient } from "@tanstack/query-broadcast-client-experimental";
14
+ import { set, get, del } from "idb-keyval";
11
15
  const ReactQueryDevtools = process.env.NODE_ENV === "development" ? dynamic(
12
16
  () => import("@tanstack/react-query-devtools").then((mod) => ({
13
17
  default: mod.ReactQueryDevtools
14
18
  })),
15
19
  { ssr: false }
16
20
  ) : () => null;
17
- function QueryProvider({ children }) {
21
+ const persister = {
22
+ persistClient: async (client) => {
23
+ try {
24
+ await set("rq-cache", client);
25
+ } catch {
26
+ console.warn("Falha ao persistir cache");
27
+ }
28
+ },
29
+ restoreClient: async () => {
30
+ try {
31
+ return await get("rq-cache");
32
+ } catch {
33
+ await del("rq-cache").catch(() => {
34
+ });
35
+ return void 0;
36
+ }
37
+ },
38
+ removeClient: async () => {
39
+ try {
40
+ await del("rq-cache");
41
+ } catch {
42
+ console.warn("Falha ao remover cache");
43
+ }
44
+ }
45
+ };
46
+ function QueryProvider({
47
+ children,
48
+ persisterVersion = "v1"
49
+ }) {
18
50
  const [queryClient] = useState(
19
51
  () => new QueryClient({
20
52
  defaultOptions: {
21
53
  queries: {
22
- staleTime: 60 * 1e3,
23
- refetchOnWindowFocus: false
54
+ staleTime: 5 * 60 * 1e3,
55
+ gcTime: 4 * 60 * 60 * 1e3,
56
+ refetchOnWindowFocus: false,
57
+ refetchOnReconnect: true,
58
+ retry: 2,
59
+ retryDelay: (attempt) => Math.min(1e3 * 2 ** attempt, 3e4)
60
+ },
61
+ mutations: {
62
+ retry: 1,
63
+ onError: (error) => {
64
+ toast.error(
65
+ error instanceof Error ? error.message : "Erro inesperado na opera\xE7\xE3o."
66
+ );
67
+ }
24
68
  }
25
69
  },
26
70
  queryCache: new QueryCache({
27
71
  onError: (error) => {
28
- toast.error(error.message);
72
+ toast.error(
73
+ error instanceof Error ? error.message : "Ocorreu um erro inesperado. Por favor, tente novamente."
74
+ );
29
75
  }
30
76
  })
31
77
  })
32
78
  );
33
- return /* @__PURE__ */ jsxs(QueryClientProvider, { client: queryClient, children: [
34
- children,
35
- /* @__PURE__ */ jsx(ReactQueryDevtools, { initialIsOpen: false })
36
- ] });
79
+ useEffect(() => {
80
+ broadcastQueryClient({
81
+ queryClient,
82
+ broadcastChannel: "react-query"
83
+ });
84
+ }, [queryClient]);
85
+ return /* @__PURE__ */ jsxs(
86
+ PersistQueryClientProvider,
87
+ {
88
+ client: queryClient,
89
+ persistOptions: {
90
+ persister,
91
+ maxAge: 2 * 60 * 60 * 1e3,
92
+ buster: persisterVersion,
93
+ dehydrateOptions: {
94
+ shouldDehydrateQuery: (query) => {
95
+ if (query.state.status === "error") return false;
96
+ if (query.meta?.persist === false) return false;
97
+ if ((query.state.dataUpdateCount ?? 0) > 10) return false;
98
+ return true;
99
+ }
100
+ }
101
+ },
102
+ children: [
103
+ children,
104
+ /* @__PURE__ */ jsx(ReactQueryDevtools, { initialIsOpen: false })
105
+ ]
106
+ }
107
+ );
37
108
  }
38
109
  export {
39
- QueryProvider
110
+ QueryProvider,
111
+ persister
40
112
  };
41
113
  //# sourceMappingURL=query.provider.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/query.provider.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {\r\n QueryCache,\r\n QueryClient,\r\n QueryClientProvider,\r\n} from \"@tanstack/react-query\";\r\nimport { ReactNode, useState } from \"react\";\r\nimport dynamic from \"next/dynamic\";\r\nimport { toast } from \"sonner\";\r\n\r\n// React Query Devtools só em desenvolvimento - remove do bundle de produção\r\nconst ReactQueryDevtools =\r\n process.env.NODE_ENV === \"development\"\r\n ? dynamic(\r\n () =>\r\n import(\"@tanstack/react-query-devtools\").then((mod) => ({\r\n default: mod.ReactQueryDevtools,\r\n })),\r\n { ssr: false },\r\n )\r\n : () => null;\r\n\r\ninterface QueryProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport function QueryProvider({ children }: QueryProviderProps) {\r\n const [queryClient] = useState(\r\n () =>\r\n new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n staleTime: 60 * 1000,\r\n refetchOnWindowFocus: false,\r\n },\r\n },\r\n queryCache: new QueryCache({\r\n onError: (error) => {\r\n toast.error(error.message);\r\n },\r\n }),\r\n }),\r\n );\r\n\r\n return (\r\n <QueryClientProvider client={queryClient}>\r\n {children}\r\n <ReactQueryDevtools initialIsOpen={false} />\r\n </QueryClientProvider>\r\n );\r\n}\r\n"],"mappings":";AA8CI,SAEE,KAFF;AA5CJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAoB,gBAAgB;AACpC,OAAO,aAAa;AACpB,SAAS,aAAa;AAGtB,MAAM,qBACJ,QAAQ,IAAI,aAAa,gBACrB;AAAA,EACE,MACE,OAAO,gCAAgC,EAAE,KAAK,CAAC,SAAS;AAAA,IACtD,SAAS,IAAI;AAAA,EACf,EAAE;AAAA,EACJ,EAAE,KAAK,MAAM;AACf,IACA,MAAM;AAML,SAAS,cAAc,EAAE,SAAS,GAAuB;AAC9D,QAAM,CAAC,WAAW,IAAI;AAAA,IACpB,MACE,IAAI,YAAY;AAAA,MACd,gBAAgB;AAAA,QACd,SAAS;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,YAAY,IAAI,WAAW;AAAA,QACzB,SAAS,CAAC,UAAU;AAClB,gBAAM,MAAM,MAAM,OAAO;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AAEA,SACE,qBAAC,uBAAoB,QAAQ,aAC1B;AAAA;AAAA,IACD,oBAAC,sBAAmB,eAAe,OAAO;AAAA,KAC5C;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/providers/query.provider.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {\r\n QueryCache,\r\n QueryClient,\r\n QueryClientProvider,\r\n} from \"@tanstack/react-query\";\r\nimport { ReactNode, useEffect, useState } from \"react\";\r\nimport dynamic from \"next/dynamic\";\r\nimport { toast } from \"sonner\";\r\nimport {\r\n PersistedClient,\r\n PersistQueryClientProvider,\r\n} from \"@tanstack/react-query-persist-client\";\r\nimport { broadcastQueryClient } from \"@tanstack/query-broadcast-client-experimental\";\r\nimport { set, get, del } from \"idb-keyval\";\r\n\r\n// React Query Devtools só em desenvolvimento - remove do bundle de produção\r\nconst ReactQueryDevtools =\r\n process.env.NODE_ENV === \"development\"\r\n ? dynamic(\r\n () =>\r\n import(\"@tanstack/react-query-devtools\").then((mod) => ({\r\n default: mod.ReactQueryDevtools,\r\n })),\r\n { ssr: false },\r\n )\r\n : () => null;\r\n\r\nexport const persister = {\r\n persistClient: async (client: PersistedClient) => {\r\n try {\r\n await set(\"rq-cache\", client);\r\n } catch {\r\n console.warn(\"Falha ao persistir cache\");\r\n }\r\n },\r\n restoreClient: async (): Promise<PersistedClient | undefined> => {\r\n try {\r\n return await get(\"rq-cache\");\r\n } catch {\r\n await del(\"rq-cache\").catch(() => {});\r\n return undefined;\r\n }\r\n },\r\n removeClient: async () => {\r\n try {\r\n await del(\"rq-cache\");\r\n } catch {\r\n console.warn(\"Falha ao remover cache\");\r\n }\r\n },\r\n};\r\n\r\ninterface QueryProviderProps {\r\n children: ReactNode;\r\n persisterVersion?: string;\r\n}\r\n\r\nexport function QueryProvider({\r\n children,\r\n persisterVersion = \"v1\",\r\n}: QueryProviderProps) {\r\n const [queryClient] = useState(\r\n () =>\r\n new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n staleTime: 5 * 60 * 1000,\r\n gcTime: 4 * 60 * 60 * 1000,\r\n refetchOnWindowFocus: false,\r\n refetchOnReconnect: true,\r\n retry: 2,\r\n retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 30000),\r\n },\r\n mutations: {\r\n retry: 1,\r\n onError: (error) => {\r\n toast.error(\r\n error instanceof Error\r\n ? error.message\r\n : \"Erro inesperado na operação.\",\r\n );\r\n },\r\n },\r\n },\r\n queryCache: new QueryCache({\r\n onError: (error) => {\r\n toast.error(\r\n error instanceof Error\r\n ? error.message\r\n : \"Ocorreu um erro inesperado. Por favor, tente novamente.\",\r\n );\r\n },\r\n }),\r\n }),\r\n );\r\n\r\n useEffect(() => {\r\n broadcastQueryClient({\r\n queryClient,\r\n broadcastChannel: \"react-query\",\r\n });\r\n }, [queryClient]);\r\n\r\n return (\r\n <PersistQueryClientProvider\r\n client={queryClient}\r\n persistOptions={{\r\n persister,\r\n maxAge: 2 * 60 * 60 * 1000,\r\n buster: persisterVersion,\r\n dehydrateOptions: {\r\n shouldDehydrateQuery: (query) => {\r\n if (query.state.status === \"error\") return false;\r\n if (query.meta?.persist === false) return false;\r\n if ((query.state.dataUpdateCount ?? 0) > 10) return false;\r\n return true;\r\n },\r\n },\r\n }}\r\n >\r\n {children}\r\n <ReactQueryDevtools initialIsOpen={false} />\r\n </PersistQueryClientProvider>\r\n );\r\n}\r\n"],"mappings":";AA0GI,SAiBE,KAjBF;AAxGJ;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAoB,WAAW,gBAAgB;AAC/C,OAAO,aAAa;AACpB,SAAS,aAAa;AACtB;AAAA,EAEE;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC,SAAS,KAAK,KAAK,WAAW;AAG9B,MAAM,qBACJ,QAAQ,IAAI,aAAa,gBACrB;AAAA,EACE,MACE,OAAO,gCAAgC,EAAE,KAAK,CAAC,SAAS;AAAA,IACtD,SAAS,IAAI;AAAA,EACf,EAAE;AAAA,EACJ,EAAE,KAAK,MAAM;AACf,IACA,MAAM;AAEL,MAAM,YAAY;AAAA,EACvB,eAAe,OAAO,WAA4B;AAChD,QAAI;AACF,YAAM,IAAI,YAAY,MAAM;AAAA,IAC9B,QAAQ;AACN,cAAQ,KAAK,0BAA0B;AAAA,IACzC;AAAA,EACF;AAAA,EACA,eAAe,YAAkD;AAC/D,QAAI;AACF,aAAO,MAAM,IAAI,UAAU;AAAA,IAC7B,QAAQ;AACN,YAAM,IAAI,UAAU,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,cAAc,YAAY;AACxB,QAAI;AACF,YAAM,IAAI,UAAU;AAAA,IACtB,QAAQ;AACN,cAAQ,KAAK,wBAAwB;AAAA,IACvC;AAAA,EACF;AACF;AAOO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,mBAAmB;AACrB,GAAuB;AACrB,QAAM,CAAC,WAAW,IAAI;AAAA,IACpB,MACE,IAAI,YAAY;AAAA,MACd,gBAAgB;AAAA,QACd,SAAS;AAAA,UACP,WAAW,IAAI,KAAK;AAAA,UACpB,QAAQ,IAAI,KAAK,KAAK;AAAA,UACtB,sBAAsB;AAAA,UACtB,oBAAoB;AAAA,UACpB,OAAO;AAAA,UACP,YAAY,CAAC,YAAY,KAAK,IAAI,MAAO,KAAK,SAAS,GAAK;AAAA,QAC9D;AAAA,QACA,WAAW;AAAA,UACT,OAAO;AAAA,UACP,SAAS,CAAC,UAAU;AAClB,kBAAM;AAAA,cACJ,iBAAiB,QACb,MAAM,UACN;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY,IAAI,WAAW;AAAA,QACzB,SAAS,CAAC,UAAU;AAClB,gBAAM;AAAA,YACJ,iBAAiB,QACb,MAAM,UACN;AAAA,UACN;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AAEA,YAAU,MAAM;AACd,yBAAqB;AAAA,MACnB;AAAA,MACA,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,CAAC;AAEhB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,gBAAgB;AAAA,QACd;AAAA,QACA,QAAQ,IAAI,KAAK,KAAK;AAAA,QACtB,QAAQ;AAAA,QACR,kBAAkB;AAAA,UAChB,sBAAsB,CAAC,UAAU;AAC/B,gBAAI,MAAM,MAAM,WAAW,QAAS,QAAO;AAC3C,gBAAI,MAAM,MAAM,YAAY,MAAO,QAAO;AAC1C,iBAAK,MAAM,MAAM,mBAAmB,KAAK,GAAI,QAAO;AACpD,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,QACD,oBAAC,sBAAmB,eAAe,OAAO;AAAA;AAAA;AAAA,EAC5C;AAEJ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greatapps/common",
3
- "version": "1.1.85",
3
+ "version": "1.1.86",
4
4
  "description": "Shared library for GreatApps frontend applications",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -39,11 +39,14 @@
39
39
  "@radix-ui/react-switch": "^1.2.6",
40
40
  "@radix-ui/react-tabs": "^1.1.13",
41
41
  "@radix-ui/react-tooltip": "^1.2.8",
42
+ "@tanstack/query-broadcast-client-experimental": "^5.90.20",
43
+ "@tanstack/react-query-persist-client": "^5.90.24",
42
44
  "axios": "^1.13.5",
43
45
  "class-variance-authority": "^0.7.1",
44
46
  "clsx": "^2.1.1",
45
47
  "cmdk": "^1.1.1",
46
48
  "date-fns": "^4.1.0",
49
+ "idb-keyval": "^6.2.2",
47
50
  "input-otp": "^1.4.2",
48
51
  "lucide-react": "^0.575.0",
49
52
  "react-day-picker": "^9.14.0",
@@ -60,7 +63,7 @@
60
63
  "@types/react": "^19.2.14",
61
64
  "@types/react-dom": "^19.2.3",
62
65
  "glob": "^13.0.6",
63
- "next": "15.5.9",
66
+ "next": "^15.5.12",
64
67
  "react": "19.1.4",
65
68
  "react-dom": "19.1.4",
66
69
  "react-hook-form": "^7.71.2",
@@ -5,9 +5,15 @@ import {
5
5
  QueryClient,
6
6
  QueryClientProvider,
7
7
  } from "@tanstack/react-query";
8
- import { ReactNode, useState } from "react";
8
+ import { ReactNode, useEffect, useState } from "react";
9
9
  import dynamic from "next/dynamic";
10
10
  import { toast } from "sonner";
11
+ import {
12
+ PersistedClient,
13
+ PersistQueryClientProvider,
14
+ } from "@tanstack/react-query-persist-client";
15
+ import { broadcastQueryClient } from "@tanstack/query-broadcast-client-experimental";
16
+ import { set, get, del } from "idb-keyval";
11
17
 
12
18
  // React Query Devtools só em desenvolvimento - remove do bundle de produção
13
19
  const ReactQueryDevtools =
@@ -21,32 +27,101 @@ const ReactQueryDevtools =
21
27
  )
22
28
  : () => null;
23
29
 
30
+ export const persister = {
31
+ persistClient: async (client: PersistedClient) => {
32
+ try {
33
+ await set("rq-cache", client);
34
+ } catch {
35
+ console.warn("Falha ao persistir cache");
36
+ }
37
+ },
38
+ restoreClient: async (): Promise<PersistedClient | undefined> => {
39
+ try {
40
+ return await get("rq-cache");
41
+ } catch {
42
+ await del("rq-cache").catch(() => {});
43
+ return undefined;
44
+ }
45
+ },
46
+ removeClient: async () => {
47
+ try {
48
+ await del("rq-cache");
49
+ } catch {
50
+ console.warn("Falha ao remover cache");
51
+ }
52
+ },
53
+ };
54
+
24
55
  interface QueryProviderProps {
25
56
  children: ReactNode;
57
+ persisterVersion?: string;
26
58
  }
27
59
 
28
- export function QueryProvider({ children }: QueryProviderProps) {
60
+ export function QueryProvider({
61
+ children,
62
+ persisterVersion = "v1",
63
+ }: QueryProviderProps) {
29
64
  const [queryClient] = useState(
30
65
  () =>
31
66
  new QueryClient({
32
67
  defaultOptions: {
33
68
  queries: {
34
- staleTime: 60 * 1000,
69
+ staleTime: 5 * 60 * 1000,
70
+ gcTime: 4 * 60 * 60 * 1000,
35
71
  refetchOnWindowFocus: false,
72
+ refetchOnReconnect: true,
73
+ retry: 2,
74
+ retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 30000),
75
+ },
76
+ mutations: {
77
+ retry: 1,
78
+ onError: (error) => {
79
+ toast.error(
80
+ error instanceof Error
81
+ ? error.message
82
+ : "Erro inesperado na operação.",
83
+ );
84
+ },
36
85
  },
37
86
  },
38
87
  queryCache: new QueryCache({
39
88
  onError: (error) => {
40
- toast.error(error.message);
89
+ toast.error(
90
+ error instanceof Error
91
+ ? error.message
92
+ : "Ocorreu um erro inesperado. Por favor, tente novamente.",
93
+ );
41
94
  },
42
95
  }),
43
96
  }),
44
97
  );
45
98
 
99
+ useEffect(() => {
100
+ broadcastQueryClient({
101
+ queryClient,
102
+ broadcastChannel: "react-query",
103
+ });
104
+ }, [queryClient]);
105
+
46
106
  return (
47
- <QueryClientProvider client={queryClient}>
107
+ <PersistQueryClientProvider
108
+ client={queryClient}
109
+ persistOptions={{
110
+ persister,
111
+ maxAge: 2 * 60 * 60 * 1000,
112
+ buster: persisterVersion,
113
+ dehydrateOptions: {
114
+ shouldDehydrateQuery: (query) => {
115
+ if (query.state.status === "error") return false;
116
+ if (query.meta?.persist === false) return false;
117
+ if ((query.state.dataUpdateCount ?? 0) > 10) return false;
118
+ return true;
119
+ },
120
+ },
121
+ }}
122
+ >
48
123
  {children}
49
124
  <ReactQueryDevtools initialIsOpen={false} />
50
- </QueryClientProvider>
125
+ </PersistQueryClientProvider>
51
126
  );
52
127
  }