@umituz/react-native-settings 4.20.56 → 4.20.57
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/README.md +145 -3
- package/package.json +1 -2
- package/src/application/README.md +322 -0
- package/src/domains/about/README.md +452 -0
- package/src/domains/about/presentation/hooks/README.md +350 -0
- package/src/domains/appearance/README.md +596 -0
- package/src/domains/appearance/hooks/README.md +366 -0
- package/src/domains/appearance/infrastructure/services/README.md +455 -0
- package/src/domains/cloud-sync/README.md +451 -0
- package/src/domains/cloud-sync/presentation/components/README.md +493 -0
- package/src/domains/dev/README.md +477 -0
- package/src/domains/disclaimer/README.md +421 -0
- package/src/domains/disclaimer/presentation/components/README.md +394 -0
- package/src/domains/faqs/README.md +586 -0
- package/src/domains/feedback/README.md +565 -0
- package/src/domains/feedback/presentation/hooks/README.md +428 -0
- package/src/domains/legal/README.md +549 -0
- package/src/domains/rating/README.md +452 -0
- package/src/domains/rating/presentation/components/README.md +475 -0
- package/src/domains/video-tutorials/README.md +482 -0
- package/src/domains/video-tutorials/presentation/components/README.md +433 -0
- package/src/infrastructure/README.md +509 -0
- package/src/infrastructure/repositories/README.md +475 -0
- package/src/infrastructure/services/README.md +510 -0
- package/src/presentation/components/README.md +482 -0
- package/src/presentation/components/SettingsErrorBoundary/README.md +461 -0
- package/src/presentation/components/SettingsFooter/README.md +446 -0
- package/src/presentation/components/SettingsItemCard/README.md +457 -0
- package/src/presentation/components/SettingsSection/README.md +421 -0
- package/src/presentation/hooks/README.md +413 -0
- package/src/presentation/hooks/mutations/README.md +430 -0
- package/src/presentation/hooks/queries/README.md +441 -0
- package/src/presentation/navigation/README.md +532 -0
- package/src/presentation/navigation/components/README.md +330 -0
- package/src/presentation/navigation/hooks/README.md +399 -0
- package/src/presentation/navigation/utils/README.md +442 -0
- package/src/presentation/screens/README.md +525 -0
- package/src/presentation/screens/components/SettingsContent/README.md +404 -0
- package/src/presentation/screens/components/SettingsHeader/README.md +322 -0
- package/src/presentation/screens/components/sections/CustomSettingsList/README.md +388 -0
- package/src/presentation/screens/components/sections/FeatureSettingsSection/README.md +232 -0
- package/src/presentation/screens/components/sections/IdentitySettingsSection/README.md +325 -0
- package/src/presentation/screens/components/sections/ProfileSectionLoader/README.md +480 -0
- package/src/presentation/screens/components/sections/SupportSettingsSection/README.md +391 -0
- package/src/presentation/screens/hooks/README.md +383 -0
- package/src/presentation/screens/types/README.md +439 -0
- package/src/presentation/screens/utils/README.md +288 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
# Settings Queries
|
|
2
|
+
|
|
3
|
+
Custom TanStack Query hooks for fetching user settings in the settings system.
|
|
4
|
+
|
|
5
|
+
## Queries
|
|
6
|
+
|
|
7
|
+
### useSettingsQuery
|
|
8
|
+
|
|
9
|
+
Query hook for fetching user settings.
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { useSettingsQuery } from '@umituz/react-native-settings';
|
|
13
|
+
|
|
14
|
+
function SettingsScreen() {
|
|
15
|
+
const { data, isLoading, isError, error } = useSettingsQuery('user123');
|
|
16
|
+
|
|
17
|
+
if (isLoading) return <LoadingSpinner />;
|
|
18
|
+
if (isError) return <ErrorMessage message={error.message} />;
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<View>
|
|
22
|
+
<Text>Theme: {data?.settings.theme}</Text>
|
|
23
|
+
<Text>Language: {data?.settings.language}</Text>
|
|
24
|
+
</View>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
#### Returns
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
interface UseSettingsQueryResult {
|
|
33
|
+
data: SettingsResult | undefined;
|
|
34
|
+
isLoading: boolean;
|
|
35
|
+
isError: boolean;
|
|
36
|
+
error: Error | null;
|
|
37
|
+
isFetching: boolean;
|
|
38
|
+
refetch: () => void;
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
#### Parameters
|
|
43
|
+
|
|
44
|
+
| Parameter | Type | Required | Description |
|
|
45
|
+
|-----------|------|----------|-------------|
|
|
46
|
+
| `userId` | `string` | Yes | Unique user identifier |
|
|
47
|
+
| `options` | `UseQueryOptions` | No | TanStack Query options |
|
|
48
|
+
|
|
49
|
+
#### Examples
|
|
50
|
+
|
|
51
|
+
**Basic Query:**
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
const { data, isLoading } = useSettingsQuery('user123');
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**With Query Options:**
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
const { data } = useSettingsQuery('user123', {
|
|
61
|
+
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
62
|
+
cacheTime: 10 * 60 * 1000, // 10 minutes
|
|
63
|
+
refetchOnWindowFocus: false,
|
|
64
|
+
refetchOnMount: false,
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**With Refetch:**
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
const { data, refetch } = useSettingsQuery('user123');
|
|
72
|
+
|
|
73
|
+
const handleRefresh = () => {
|
|
74
|
+
refetch();
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<PullToRefresh onRefresh={handleRefresh}>
|
|
79
|
+
<SettingsContent settings={data?.settings} />
|
|
80
|
+
</PullToRefresh>
|
|
81
|
+
);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**With Conditional Query:**
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
const { data } = useSettingsQuery(
|
|
88
|
+
userId,
|
|
89
|
+
{ enabled: !!userId } // Only run query if userId exists
|
|
90
|
+
);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### useSettingsSuspenseQuery
|
|
94
|
+
|
|
95
|
+
Suspense version of settings query for React Suspense boundaries.
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
import { useSettingsSuspenseQuery } from '@umituz/react-native-settings';
|
|
99
|
+
|
|
100
|
+
function SettingsScreen() {
|
|
101
|
+
const { data } = useSettingsSuspenseQuery('user123');
|
|
102
|
+
|
|
103
|
+
// Data is guaranteed to be available
|
|
104
|
+
return (
|
|
105
|
+
<View>
|
|
106
|
+
<Text>Theme: {data.settings.theme}</Text>
|
|
107
|
+
</View>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Wrap in Suspense boundary
|
|
112
|
+
function App() {
|
|
113
|
+
return (
|
|
114
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
115
|
+
<SettingsScreen />
|
|
116
|
+
</Suspense>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### Returns
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
interface UseSettingsSuspenseQueryResult {
|
|
125
|
+
data: SettingsResult; // Always defined
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Query Options
|
|
130
|
+
|
|
131
|
+
### staleTime
|
|
132
|
+
|
|
133
|
+
Time in milliseconds after which data is considered stale.
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
const { data } = useSettingsQuery('user123', {
|
|
137
|
+
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### cacheTime
|
|
142
|
+
|
|
143
|
+
Time in milliseconds that unused data remains in cache.
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
const { data } = useSettingsQuery('user123', {
|
|
147
|
+
cacheTime: 10 * 60 * 1000, // 10 minutes
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### refetchOnWindowFocus
|
|
152
|
+
|
|
153
|
+
Refetch query when window regains focus.
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
const { data } = useSettingsQuery('user123', {
|
|
157
|
+
refetchOnWindowFocus: true, // Default: true
|
|
158
|
+
});
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### refetchOnMount
|
|
162
|
+
|
|
163
|
+
Refetch query on component mount.
|
|
164
|
+
|
|
165
|
+
```tsx
|
|
166
|
+
const { data } = useSettingsQuery('user123', {
|
|
167
|
+
refetchOnMount: true, // Default: true
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### refetchOnReconnect
|
|
172
|
+
|
|
173
|
+
Refetch query when network reconnects.
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
const { data } = useSettingsQuery('user123', {
|
|
177
|
+
refetchOnReconnect: true, // Default: true
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### enabled
|
|
182
|
+
|
|
183
|
+
Conditionally enable/disable query.
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
const { data } = useSettingsQuery('user123', {
|
|
187
|
+
enabled: isLoggedIn, // Only run if logged in
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### onSuccess
|
|
192
|
+
|
|
193
|
+
Callback executed on successful query.
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
const { data } = useSettingsQuery('user123', {
|
|
197
|
+
onSuccess: (data) => {
|
|
198
|
+
console.log('Settings loaded:', data);
|
|
199
|
+
Analytics.track('settings_loaded', { theme: data.settings.theme });
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### onError
|
|
205
|
+
|
|
206
|
+
Callback executed on query error.
|
|
207
|
+
|
|
208
|
+
```tsx
|
|
209
|
+
const { data } = useSettingsQuery('user123', {
|
|
210
|
+
onError: (error) => {
|
|
211
|
+
console.error('Failed to load settings:', error);
|
|
212
|
+
Alert.alert('Error', 'Could not load settings');
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### onSettled
|
|
218
|
+
|
|
219
|
+
Callback executed after query succeeds or fails.
|
|
220
|
+
|
|
221
|
+
```tsx
|
|
222
|
+
const { data } = useSettingsQuery('user123', {
|
|
223
|
+
onSettled: (data, error) => {
|
|
224
|
+
if (error) {
|
|
225
|
+
Analytics.track('settings_load_failed');
|
|
226
|
+
} else {
|
|
227
|
+
Analytics.track('settings_load_success');
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Usage Examples
|
|
234
|
+
|
|
235
|
+
### Complete Loading States
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
function SettingsScreen() {
|
|
239
|
+
const { data, isLoading, isError, error } = useSettingsQuery('user123');
|
|
240
|
+
|
|
241
|
+
if (isLoading) {
|
|
242
|
+
return (
|
|
243
|
+
<View style={styles.centered}>
|
|
244
|
+
<ActivityIndicator size="large" />
|
|
245
|
+
<Text>Loading settings...</Text>
|
|
246
|
+
</View>
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (isError) {
|
|
251
|
+
return (
|
|
252
|
+
<View style={styles.centered}>
|
|
253
|
+
<Text style={styles.error}>Error: {error.message}</Text>
|
|
254
|
+
<Button title="Retry" onPress={() => refetch()} />
|
|
255
|
+
</View>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return (
|
|
260
|
+
<SettingsContent settings={data?.settings} />
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Pull to Refresh
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
function SettingsScreen() {
|
|
269
|
+
const { data, refetch, isFetching } = useSettingsQuery('user123');
|
|
270
|
+
|
|
271
|
+
return (
|
|
272
|
+
<ScrollView
|
|
273
|
+
refreshControl={
|
|
274
|
+
<RefreshControl
|
|
275
|
+
refreshing={isFetching}
|
|
276
|
+
onRefresh={() => refetch()}
|
|
277
|
+
/>
|
|
278
|
+
}
|
|
279
|
+
>
|
|
280
|
+
<SettingsContent settings={data?.settings} />
|
|
281
|
+
</ScrollView>
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Background Refetch
|
|
287
|
+
|
|
288
|
+
```tsx
|
|
289
|
+
function SettingsScreen() {
|
|
290
|
+
const { data } = useSettingsQuery('user123', {
|
|
291
|
+
refetchInterval: 60000, // Refetch every minute
|
|
292
|
+
refetchIntervalInBackground: true,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
return <SettingsContent settings={data?.settings} />;
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Conditional Query
|
|
300
|
+
|
|
301
|
+
```tsx
|
|
302
|
+
function SettingsScreen({ userId, enabled }) {
|
|
303
|
+
const { data } = useSettingsQuery(userId, {
|
|
304
|
+
enabled: enabled && !!userId,
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
if (!enabled) {
|
|
308
|
+
return <Text>Please log in to view settings</Text>;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return <SettingsContent settings={data?.settings} />;
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Query Invalidation
|
|
316
|
+
|
|
317
|
+
```tsx
|
|
318
|
+
function SettingsUpdater() {
|
|
319
|
+
const queryClient = useQueryClient();
|
|
320
|
+
const updateSettings = useUpdateSettingsMutation();
|
|
321
|
+
|
|
322
|
+
const handleUpdate = (newSettings) => {
|
|
323
|
+
updateSettings.mutate(
|
|
324
|
+
{ userId: 'user123', settings: newSettings },
|
|
325
|
+
{
|
|
326
|
+
onSuccess: () => {
|
|
327
|
+
// Invalidate and refetch
|
|
328
|
+
queryClient.invalidateQueries(['settings', 'user123']);
|
|
329
|
+
},
|
|
330
|
+
}
|
|
331
|
+
);
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
return <Button onPress={handleUpdate} title="Update" />;
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Optimistic Updates with Query
|
|
339
|
+
|
|
340
|
+
```tsx
|
|
341
|
+
function SettingsScreen() {
|
|
342
|
+
const queryClient = useQueryClient();
|
|
343
|
+
const { data } = useSettingsQuery('user123');
|
|
344
|
+
|
|
345
|
+
const handleThemeChange = (newTheme) => {
|
|
346
|
+
// Optimistically update
|
|
347
|
+
queryClient.setQueryData(['settings', 'user123'], (old: any) => ({
|
|
348
|
+
...old,
|
|
349
|
+
settings: {
|
|
350
|
+
...old.settings,
|
|
351
|
+
theme: newTheme,
|
|
352
|
+
},
|
|
353
|
+
}));
|
|
354
|
+
|
|
355
|
+
// Then update on server
|
|
356
|
+
updateSettings.mutate({
|
|
357
|
+
userId: 'user123',
|
|
358
|
+
settings: { theme: newTheme },
|
|
359
|
+
});
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
return (
|
|
363
|
+
<ThemeSelector
|
|
364
|
+
value={data?.settings.theme}
|
|
365
|
+
onChange={handleThemeChange}
|
|
366
|
+
/>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Query Keys
|
|
372
|
+
|
|
373
|
+
Query keys follow a consistent pattern for cache management:
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
// Single user settings
|
|
377
|
+
['settings', userId]
|
|
378
|
+
|
|
379
|
+
// All settings (admin)
|
|
380
|
+
['settings']
|
|
381
|
+
|
|
382
|
+
// Settings with filters
|
|
383
|
+
['settings', userId, { type: 'appearance' }]
|
|
384
|
+
|
|
385
|
+
// Infinite settings (pagination)
|
|
386
|
+
['settings', 'infinite']
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Manual Invalidation
|
|
390
|
+
|
|
391
|
+
```tsx
|
|
392
|
+
// Invalidate specific user
|
|
393
|
+
queryClient.invalidateQueries(['settings', 'user123']);
|
|
394
|
+
|
|
395
|
+
// Invalidate all settings
|
|
396
|
+
queryClient.invalidateQueries(['settings']);
|
|
397
|
+
|
|
398
|
+
// Remove from cache
|
|
399
|
+
queryClient.removeQueries(['settings', 'user123']);
|
|
400
|
+
|
|
401
|
+
// Reset cache
|
|
402
|
+
queryClient.resetQueries(['settings']);
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Prefetching
|
|
406
|
+
|
|
407
|
+
```tsx
|
|
408
|
+
// Prefetch settings for expected navigation
|
|
409
|
+
const prefetchSettings = async (userId: string) => {
|
|
410
|
+
await queryClient.prefetchQuery(['settings', userId], () =>
|
|
411
|
+
fetchSettings(userId)
|
|
412
|
+
);
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
// Usage
|
|
416
|
+
useEffect(() => {
|
|
417
|
+
if (likelyToNavigate) {
|
|
418
|
+
prefetchSettings('user123');
|
|
419
|
+
}
|
|
420
|
+
}, [likelyToNavigate]);
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Best Practices
|
|
424
|
+
|
|
425
|
+
1. **Error Handling**: Always handle loading and error states
|
|
426
|
+
2. **Cache Strategy**: Configure staleTime and cacheTime appropriately
|
|
427
|
+
3. **Refetch Control**: Disable automatic refetch when not needed
|
|
428
|
+
4. **Query Keys**: Use consistent query keys for cache management
|
|
429
|
+
5. **Prefetching**: Prefetch data for smooth navigation
|
|
430
|
+
6. **Optimistic Updates**: Combine with mutations for instant feedback
|
|
431
|
+
7. **Suspense**: Use suspense queries for cleaner code
|
|
432
|
+
|
|
433
|
+
## Related
|
|
434
|
+
|
|
435
|
+
- **Settings Mutations**: Mutation hooks for updating settings
|
|
436
|
+
- **useSettings**: Combined hook for settings management
|
|
437
|
+
- **TanStack Query**: Official Query documentation
|
|
438
|
+
|
|
439
|
+
## License
|
|
440
|
+
|
|
441
|
+
MIT
|