@umituz/react-native-settings 4.20.55 → 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.
Files changed (47) hide show
  1. package/README.md +145 -3
  2. package/package.json +1 -2
  3. package/src/application/README.md +322 -0
  4. package/src/domains/about/README.md +452 -0
  5. package/src/domains/about/presentation/hooks/README.md +350 -0
  6. package/src/domains/appearance/README.md +596 -0
  7. package/src/domains/appearance/hooks/README.md +366 -0
  8. package/src/domains/appearance/infrastructure/services/README.md +455 -0
  9. package/src/domains/cloud-sync/README.md +451 -0
  10. package/src/domains/cloud-sync/presentation/components/README.md +493 -0
  11. package/src/domains/dev/README.md +477 -0
  12. package/src/domains/disclaimer/README.md +421 -0
  13. package/src/domains/disclaimer/presentation/components/README.md +394 -0
  14. package/src/domains/faqs/README.md +586 -0
  15. package/src/domains/feedback/README.md +565 -0
  16. package/src/domains/feedback/presentation/hooks/README.md +428 -0
  17. package/src/domains/legal/README.md +549 -0
  18. package/src/domains/rating/README.md +452 -0
  19. package/src/domains/rating/presentation/components/README.md +475 -0
  20. package/src/domains/video-tutorials/README.md +482 -0
  21. package/src/domains/video-tutorials/presentation/components/README.md +433 -0
  22. package/src/infrastructure/README.md +509 -0
  23. package/src/infrastructure/repositories/README.md +475 -0
  24. package/src/infrastructure/services/README.md +510 -0
  25. package/src/presentation/components/README.md +482 -0
  26. package/src/presentation/components/SettingsErrorBoundary/README.md +461 -0
  27. package/src/presentation/components/SettingsFooter/README.md +446 -0
  28. package/src/presentation/components/SettingsItemCard/README.md +457 -0
  29. package/src/presentation/components/SettingsSection/README.md +421 -0
  30. package/src/presentation/hooks/README.md +413 -0
  31. package/src/presentation/hooks/mutations/README.md +430 -0
  32. package/src/presentation/hooks/queries/README.md +441 -0
  33. package/src/presentation/navigation/README.md +532 -0
  34. package/src/presentation/navigation/components/README.md +330 -0
  35. package/src/presentation/navigation/hooks/README.md +399 -0
  36. package/src/presentation/navigation/utils/README.md +442 -0
  37. package/src/presentation/screens/README.md +525 -0
  38. package/src/presentation/screens/components/SettingsContent/README.md +404 -0
  39. package/src/presentation/screens/components/SettingsHeader/README.md +322 -0
  40. package/src/presentation/screens/components/sections/CustomSettingsList/README.md +388 -0
  41. package/src/presentation/screens/components/sections/FeatureSettingsSection/README.md +232 -0
  42. package/src/presentation/screens/components/sections/IdentitySettingsSection/README.md +325 -0
  43. package/src/presentation/screens/components/sections/ProfileSectionLoader/README.md +480 -0
  44. package/src/presentation/screens/components/sections/SupportSettingsSection/README.md +391 -0
  45. package/src/presentation/screens/hooks/README.md +383 -0
  46. package/src/presentation/screens/types/README.md +439 -0
  47. 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