@umituz/react-native-design-system 4.25.113 → 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.
|
|
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 lazy loaded",
|
|
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,
|
package/src/tanstack/index.ts
CHANGED
|
@@ -41,82 +41,6 @@ export interface PersisterFactoryOptions {
|
|
|
41
41
|
throttleTime?: number;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
/**
|
|
45
|
-
* Create an AsyncStorage persister for TanStack Query
|
|
46
|
-
* Lazy loads the persistence packages to reduce initial bundle size
|
|
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 async function createPersister(options: PersisterFactoryOptions = {}) {
|
|
58
|
-
// Lazy load TanStack persistence packages
|
|
59
|
-
const [{ createAsyncStoragePersister }, { default: { PersistQueryClient }] = await Promise.all([
|
|
60
|
-
import('@tanstack/query-async-storage-persister'),
|
|
61
|
-
import('@tanstack/react-query-persist-client'),
|
|
62
|
-
]);
|
|
63
|
-
|
|
64
|
-
type Persister = ReturnType<typeof createAsyncStoragePersister>;
|
|
65
|
-
|
|
66
|
-
const {
|
|
67
|
-
keyPrefix = 'tanstack-query',
|
|
68
|
-
maxAge = DEFAULT_GC_TIME.LONG,
|
|
69
|
-
busterVersion = '1',
|
|
70
|
-
throttleTime = 1000,
|
|
71
|
-
} = options;
|
|
72
|
-
|
|
73
|
-
return createAsyncStoragePersister({
|
|
74
|
-
storage: storageService,
|
|
75
|
-
key: `${keyPrefix}-cache`,
|
|
76
|
-
throttleTime,
|
|
77
|
-
serialize: (data: unknown) => {
|
|
78
|
-
// Add metadata for cache validation
|
|
79
|
-
const persistData = {
|
|
80
|
-
version: busterVersion,
|
|
81
|
-
timestamp: Date.now(),
|
|
82
|
-
data,
|
|
83
|
-
};
|
|
84
|
-
return JSON.stringify(persistData);
|
|
85
|
-
},
|
|
86
|
-
deserialize: (cachedString: string) => {
|
|
87
|
-
try {
|
|
88
|
-
const parsed = JSON.parse(cachedString);
|
|
89
|
-
|
|
90
|
-
// Validate cache version
|
|
91
|
-
if (parsed.version !== busterVersion) {
|
|
92
|
-
if (__DEV__) {
|
|
93
|
-
console.warn(
|
|
94
|
-
`[TanStack Query] Cache version mismatch. Expected: ${busterVersion}, Got: ${parsed.version}`,
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Validate cache age
|
|
101
|
-
const age = Date.now() - parsed.timestamp;
|
|
102
|
-
if (age > maxAge) {
|
|
103
|
-
if (__DEV__) {
|
|
104
|
-
console.warn(`[TanStack Query] Cache age exceeded maxAge: ${maxAge}ms`);
|
|
105
|
-
}
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return parsed.data;
|
|
110
|
-
} catch (error) {
|
|
111
|
-
if (__DEV__) {
|
|
112
|
-
console.error('[TanStack Query] Error deserializing cache:', error);
|
|
113
|
-
}
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
}) as Persister;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
44
|
/**
|
|
121
45
|
* Clear all persisted cache data
|
|
122
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
|
|
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
|
|
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
|
-
<
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
}
|