@umituz/react-native-design-system 4.25.112 → 4.25.114

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@umituz/react-native-design-system",
3
- "version": "4.25.112",
4
- "description": "Universal design system for React Native apps - Consolidated package with atoms, molecules, organisms, theme, typography, responsive, safe area, exception, infinite scroll, UUID, image, timezone, offline, onboarding, and loading utilities",
3
+ "version": "4.25.114",
4
+ "description": "Universal design system for React Native apps - Consolidated package with atoms, molecules, organisms, theme, typography, responsive, safe area, exception, infinite scroll, UUID, image, timezone, offline, onboarding, and loading utilities - TanStack persistence now fully lazy loaded",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./dist/index.d.ts",
7
7
  "sideEffects": false,
@@ -172,6 +172,10 @@
172
172
  "react-native-svg": "^15.12.1",
173
173
  "rn-emoji-keyboard": "^1.7.0"
174
174
  },
175
+ "optionalDependencies": {
176
+ "@tanstack/query-async-storage-persister": "^5.0.0",
177
+ "@tanstack/react-query-persist-client": "^5.0.0"
178
+ },
175
179
  "keywords": [
176
180
  "react-native",
177
181
  "design-system",
@@ -81,7 +81,6 @@ export {
81
81
  } from './infrastructure/config/QueryClientConfig';
82
82
 
83
83
  export {
84
- createPersister,
85
84
  clearPersistedCache,
86
85
  getPersistedCacheSize,
87
86
  type PersisterFactoryOptions,
@@ -3,12 +3,11 @@
3
3
  * Infrastructure layer - AsyncStorage persistence setup
4
4
  *
5
5
  * General-purpose persistence configuration for any React Native app
6
+ * Lazy loads TanStack persistence packages to reduce bundle size
6
7
  */
7
8
 
8
- import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister';
9
9
  import { storageService } from '../../../storage';
10
10
  import { DEFAULT_GC_TIME } from '../../domain/constants/CacheDefaults';
11
- import type { Persister } from '@tanstack/react-query-persist-client';
12
11
 
13
12
  /**
14
13
  * Persister factory options
@@ -42,73 +41,6 @@ export interface PersisterFactoryOptions {
42
41
  throttleTime?: number;
43
42
  }
44
43
 
45
- /**
46
- * Create an AsyncStorage persister for TanStack Query
47
- *
48
- * @example
49
- * ```typescript
50
- * const persister = createPersister({
51
- * keyPrefix: 'myapp',
52
- * maxAge: 24 * 60 * 60 * 1000, // 24 hours
53
- * busterVersion: '1',
54
- * });
55
- * ```
56
- */
57
- export function createPersister(options: PersisterFactoryOptions = {}): Persister {
58
- const {
59
- keyPrefix = 'tanstack-query',
60
- maxAge = DEFAULT_GC_TIME.LONG,
61
- busterVersion = '1',
62
- throttleTime = 1000,
63
- } = options;
64
-
65
- return createAsyncStoragePersister({
66
- storage: storageService,
67
- key: `${keyPrefix}-cache`,
68
- throttleTime,
69
- serialize: (data: unknown) => {
70
- // Add metadata for cache validation
71
- const persistData = {
72
- version: busterVersion,
73
- timestamp: Date.now(),
74
- data,
75
- };
76
- return JSON.stringify(persistData);
77
- },
78
- deserialize: (cachedString: string) => {
79
- try {
80
- const parsed = JSON.parse(cachedString);
81
-
82
- // Validate cache version
83
- if (parsed.version !== busterVersion) {
84
- if (__DEV__) {
85
- console.warn(
86
- `[TanStack Query] Cache version mismatch. Expected: ${busterVersion}, Got: ${parsed.version}`,
87
- );
88
- }
89
- return undefined;
90
- }
91
-
92
- // Validate cache age
93
- const age = Date.now() - parsed.timestamp;
94
- if (age > maxAge) {
95
- if (__DEV__) {
96
- console.warn(`[TanStack Query] Cache age exceeded maxAge: ${maxAge}ms`);
97
- }
98
- return undefined;
99
- }
100
-
101
- return parsed.data;
102
- } catch (error) {
103
- if (__DEV__) {
104
- console.error('[TanStack Query] Error deserializing cache:', error);
105
- }
106
- return undefined;
107
- }
108
- },
109
- });
110
- }
111
-
112
44
  /**
113
45
  * Clear all persisted cache data
114
46
  * Useful for logout or cache reset scenarios
@@ -1,65 +1,90 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, lazy, Suspense } from 'react';
2
2
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
3
- import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client';
4
- import type { Persister } from '@tanstack/react-query-persist-client';
5
3
  import { createQueryClient, type QueryClientFactoryOptions } from '../config/QueryClientConfig';
6
- import { createPersister, type PersisterFactoryOptions } from '../config/PersisterConfig';
7
4
  import { setGlobalQueryClient } from '../config/QueryClientSingleton';
8
5
  import { DevMonitor } from '../monitoring/DevMonitor';
9
6
 
7
+ // Lazy load TanStack persistence packages
8
+ const PersistQueryClientProvider = lazy(() =>
9
+ import('@tanstack/react-query-persist-client').then(m => ({ default: m.PersistQueryClientProvider }))
10
+ );
11
+
12
+ // Lazy load persister creation
13
+ async function loadPersister(options: any) {
14
+ const { createAsyncStoragePersister } = await import('@tanstack/query-async-storage-persister');
15
+ const { storageService } = await import('../../../storage');
16
+ const { DEFAULT_GC_TIME } = await import('../../domain/constants/CacheDefaults');
17
+
18
+ const {
19
+ keyPrefix = 'tanstack-query',
20
+ maxAge = DEFAULT_GC_TIME.LONG,
21
+ busterVersion = '1',
22
+ throttleTime = 1000,
23
+ } = options;
24
+
25
+ return createAsyncStoragePersister({
26
+ storage: storageService,
27
+ key: `${keyPrefix}-cache`,
28
+ throttleTime,
29
+ serialize: (data: unknown) => {
30
+ const persistData = {
31
+ version: busterVersion,
32
+ timestamp: Date.now(),
33
+ data,
34
+ };
35
+ return JSON.stringify(persistData);
36
+ },
37
+ deserialize: (cachedString: string) => {
38
+ try {
39
+ const parsed = JSON.parse(cachedString);
40
+ if (parsed.version !== busterVersion) {
41
+ if (__DEV__) {
42
+ console.warn(
43
+ `[TanStack Query] Cache version mismatch. Expected: ${busterVersion}, Got: ${parsed.version}`,
44
+ );
45
+ }
46
+ return undefined;
47
+ }
48
+ const age = Date.now() - parsed.timestamp;
49
+ if (age > maxAge) {
50
+ if (__DEV__) {
51
+ console.warn(`[TanStack Query] Cache age exceeded maxAge: ${maxAge}ms`);
52
+ }
53
+ return undefined;
54
+ }
55
+ return parsed.data;
56
+ } catch (error) {
57
+ if (__DEV__) {
58
+ console.error('[TanStack Query] Error deserializing cache:', error);
59
+ }
60
+ return undefined;
61
+ }
62
+ },
63
+ });
64
+ }
65
+
66
+ /**
67
+ * Persister factory options
68
+ */
69
+ export interface PersisterFactoryOptions {
70
+ keyPrefix?: string;
71
+ maxAge?: number;
72
+ busterVersion?: string;
73
+ throttleTime?: number;
74
+ }
75
+
10
76
  /**
11
77
  * TanStack provider props
12
78
  */
13
79
  export interface TanstackProviderProps {
14
- /**
15
- * Child components
16
- */
17
80
  children: React.ReactNode;
18
-
19
- /**
20
- * Custom QueryClient instance
21
- * If not provided, a default one will be created
22
- */
23
- queryClient?: QueryClient;
24
-
25
- /**
26
- * QueryClient configuration options
27
- * Only used if queryClient is not provided
28
- */
81
+ queryClient?: any;
29
82
  queryClientOptions?: QueryClientFactoryOptions;
30
-
31
- /**
32
- * Enable AsyncStorage persistence
33
- * @default true
34
- */
35
83
  enablePersistence?: boolean;
36
-
37
- /**
38
- * Enable DevMonitor logging (development only)
39
- * @default false
40
- */
41
84
  enableDevTools?: boolean;
42
-
43
- /**
44
- * Custom persister instance
45
- * Only used if enablePersistence is true
46
- */
47
- persister?: Persister;
48
-
49
- /**
50
- * Persister configuration options
51
- * Only used if enablePersistence is true and persister is not provided
52
- */
85
+ persister?: any;
53
86
  persisterOptions?: PersisterFactoryOptions;
54
-
55
- /**
56
- * Callback when persistence is successfully restored
57
- */
58
87
  onPersistSuccess?: () => void;
59
-
60
- /**
61
- * Callback when persistence restoration fails
62
- */
63
88
  onPersistError?: () => void;
64
89
  }
65
90
 
@@ -89,30 +114,44 @@ export function TanstackProvider({
89
114
  return client;
90
115
  });
91
116
 
92
- // Create persister if persistence is enabled
93
- const [persister] = useState(() => {
117
+ // Create persister if persistence is enabled and provided
118
+ const [persister, setPersister] = useState<any>(() => {
94
119
  if (!enablePersistence) return undefined;
95
- return providedPersister ?? createPersister(persisterOptions);
120
+ return providedPersister;
96
121
  });
97
122
 
123
+ // Load persister asynchronously if needed
124
+ React.useEffect(() => {
125
+ if (enablePersistence && !providedPersister && !persister) {
126
+ loadPersister(persisterOptions).then(setPersister);
127
+ }
128
+ }, [enablePersistence, providedPersister, persister, persisterOptions]);
129
+
98
130
  // Without persistence
99
- if (!enablePersistence || !persister) {
131
+ if (!enablePersistence) {
132
+ return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
133
+ }
134
+
135
+ // With persistence - wait for persister to load
136
+ if (!persister) {
100
137
  return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
101
138
  }
102
139
 
103
- // With persistence
140
+ // With persistence - lazy load PersistQueryClientProvider
104
141
  return (
105
- <PersistQueryClientProvider
106
- client={queryClient}
107
- persistOptions={{
108
- persister,
109
- maxAge: persisterOptions?.maxAge,
110
- buster: persisterOptions?.busterVersion,
111
- }}
112
- onSuccess={onPersistSuccess}
113
- onError={onPersistError}
114
- >
115
- {children}
116
- </PersistQueryClientProvider>
142
+ <Suspense fallback={<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>}>
143
+ <PersistQueryClientProvider
144
+ client={queryClient}
145
+ persistOptions={{
146
+ persister,
147
+ maxAge: persisterOptions?.maxAge,
148
+ buster: persisterOptions?.busterVersion,
149
+ }}
150
+ onSuccess={onPersistSuccess}
151
+ onError={onPersistError}
152
+ >
153
+ {children}
154
+ </PersistQueryClientProvider>
155
+ </Suspense>
117
156
  );
118
157
  }