@mustafaaksoy41/react-native-offline-queue 0.1.3 → 0.1.5
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 +202 -85
- package/lib/commonjs/components/OfflineProvider.js +18 -12
- package/lib/commonjs/components/OfflineProvider.js.map +1 -1
- package/lib/commonjs/core/OfflineManager.js +21 -0
- package/lib/commonjs/core/OfflineManager.js.map +1 -1
- package/lib/commonjs/hooks/useOfflineMutation.js +29 -6
- package/lib/commonjs/hooks/useOfflineMutation.js.map +1 -1
- package/lib/module/components/OfflineProvider.js +20 -12
- package/lib/module/components/OfflineProvider.js.map +1 -1
- package/lib/module/core/OfflineManager.js +21 -0
- package/lib/module/core/OfflineManager.js.map +1 -1
- package/lib/module/hooks/useOfflineMutation.js +30 -7
- package/lib/module/hooks/useOfflineMutation.js.map +1 -1
- package/lib/typescript/components/OfflineProvider.d.ts +2 -4
- package/lib/typescript/components/OfflineProvider.d.ts.map +1 -1
- package/lib/typescript/core/OfflineManager.d.ts +6 -0
- package/lib/typescript/core/OfflineManager.d.ts.map +1 -1
- package/lib/typescript/hooks/useOfflineMutation.d.ts +14 -3
- package/lib/typescript/hooks/useOfflineMutation.d.ts.map +1 -1
- package/package.json +10 -2
- package/src/components/OfflineProvider.tsx +16 -14
- package/src/core/OfflineManager.ts +25 -0
- package/src/hooks/useOfflineMutation.ts +50 -8
package/README.md
CHANGED
|
@@ -29,6 +29,11 @@ Queue operations when offline, sync automatically or manually when connectivity
|
|
|
29
29
|
<!-- Core Dependency -->
|
|
30
30
|
[](https://github.com/react-native-netinfo/react-native-netinfo)
|
|
31
31
|
|
|
32
|
+
<!-- CI & Testing -->
|
|
33
|
+
[](https://github.com/messivite/react-native-offline-queue/actions/workflows/tests.yml)
|
|
34
|
+
[](https://jestjs.io/)
|
|
35
|
+
[](#testing)
|
|
36
|
+
|
|
32
37
|
<br />
|
|
33
38
|
|
|
34
39
|
<p align="center">
|
|
@@ -46,10 +51,37 @@ Queue operations when offline, sync automatically or manually when connectivity
|
|
|
46
51
|
- **Flexible sync modes** — `auto` (silent sync) or `manual` (prompt the user)
|
|
47
52
|
- **Pluggable storage** — MMKV, AsyncStorage, or bring your own adapter
|
|
48
53
|
- **Live sync progress** — track each item as it syncs (pending → syncing → success/failed)
|
|
49
|
-
- **Zero unnecessary renders** — built on `useSyncExternalStore
|
|
54
|
+
- **Zero unnecessary re-renders** — all hooks built on `useSyncExternalStore`, no Context-based cascading
|
|
55
|
+
- **Mutation state tracking** — `isLoading`, `isQueued`, `isSuccess`, `isError` per mutation
|
|
56
|
+
- **React Query compatible** — use `mutateAsync` inside handlers
|
|
50
57
|
- **Customizable restore UI** — Alert, Toast, BottomSheet, or silent — you decide
|
|
51
58
|
- **Background task compatible** — use `OfflineManager.flushQueue()` from any context
|
|
52
59
|
|
|
60
|
+
## Network Status
|
|
61
|
+
|
|
62
|
+
The most basic thing: know if the user is online or offline. Use this anywhere in your app — only the component that reads `isOnline` re-renders when it changes.
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { useNetworkStatus } from '@mustafaaksoy41/react-native-offline-queue';
|
|
66
|
+
|
|
67
|
+
function ConnectionBanner() {
|
|
68
|
+
const { isOnline } = useNetworkStatus();
|
|
69
|
+
|
|
70
|
+
if (isOnline === null) return null; // still detecting
|
|
71
|
+
if (isOnline) return null; // online, nothing to show
|
|
72
|
+
|
|
73
|
+
return (
|
|
74
|
+
<View style={{ backgroundColor: '#ff4444', padding: 8 }}>
|
|
75
|
+
<Text style={{ color: 'white', textAlign: 'center' }}>
|
|
76
|
+
📴 You are offline. Changes will sync when you’re back online.
|
|
77
|
+
</Text>
|
|
78
|
+
</View>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
> **No re-renders:** `useNetworkStatus` is built on `useSyncExternalStore`. It reads from a singleton store, not React Context. Components that don't call this hook are completely unaffected by connectivity changes.
|
|
84
|
+
|
|
53
85
|
## Installation
|
|
54
86
|
|
|
55
87
|
```bash
|
|
@@ -307,39 +339,34 @@ Each `handler` is self-contained: when the user goes offline, actions are queued
|
|
|
307
339
|
|
|
308
340
|
### Using with React Query (TanStack Query)
|
|
309
341
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
**Pattern 1 — Shared API layer (recommended)**
|
|
342
|
+
Use your **existing `useMutation` hook** — the handler calls `mutateAsync`. No duplicate fetch, no extra API layer. Your mutation does everything (POST, cache invalidation, etc.).
|
|
313
343
|
|
|
314
|
-
|
|
344
|
+
**Pattern — Handler uses `mutateAsync` from `useMutation`**
|
|
315
345
|
|
|
316
346
|
```tsx
|
|
317
|
-
|
|
318
|
-
export async function createPost(payload: { title: string; body: string }) {
|
|
319
|
-
const res = await fetch('https://api.myapp.com/posts', {
|
|
320
|
-
method: 'POST',
|
|
321
|
-
headers: { 'Content-Type': 'application/json' },
|
|
322
|
-
body: JSON.stringify(payload),
|
|
323
|
-
});
|
|
324
|
-
if (!res.ok) throw new Error(await res.text());
|
|
325
|
-
return res.json();
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// CreatePostForm.tsx
|
|
329
|
-
import { useQueryClient } from '@tanstack/react-query';
|
|
347
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
330
348
|
import { useOfflineMutation } from '@mustafaaksoy41/react-native-offline-queue';
|
|
331
|
-
import { createPost } from './api/posts';
|
|
332
349
|
|
|
333
350
|
function CreatePostForm() {
|
|
334
351
|
const queryClient = useQueryClient();
|
|
335
352
|
|
|
353
|
+
// Your existing React Query mutation — mutationFn, onSuccess, retry, etc.
|
|
354
|
+
const { mutateAsync } = useMutation({
|
|
355
|
+
mutationFn: (payload: { title: string; body: string }) =>
|
|
356
|
+
fetch('https://api.myapp.com/posts', {
|
|
357
|
+
method: 'POST',
|
|
358
|
+
headers: { 'Content-Type': 'application/json' },
|
|
359
|
+
body: JSON.stringify(payload),
|
|
360
|
+
}).then((r) => r.json()),
|
|
361
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// Handler = your mutation. Online: runs immediately. Offline: queued, runs when back online.
|
|
336
365
|
const { mutateOffline } = useOfflineMutation('CREATE_POST', {
|
|
337
366
|
handler: async (payload) => {
|
|
338
|
-
await
|
|
339
|
-
queryClient.invalidateQueries({ queryKey: ['posts'] });
|
|
367
|
+
await mutateAsync(payload);
|
|
340
368
|
},
|
|
341
369
|
onOptimisticSuccess: (payload) => {
|
|
342
|
-
// Add to local list immediately (optimistic update)
|
|
343
370
|
queryClient.setQueryData(['posts'], (old: any) =>
|
|
344
371
|
old ? [...old, { ...payload, id: 'temp', pending: true }] : [payload]
|
|
345
372
|
);
|
|
@@ -355,62 +382,40 @@ function CreatePostForm() {
|
|
|
355
382
|
}
|
|
356
383
|
```
|
|
357
384
|
|
|
358
|
-
**
|
|
385
|
+
**With custom hooks / API layer**
|
|
359
386
|
|
|
360
|
-
|
|
387
|
+
If your mutations live in custom hooks:
|
|
361
388
|
|
|
362
389
|
```tsx
|
|
363
|
-
//
|
|
364
|
-
|
|
365
|
-
import { OfflineProvider } from '@mustafaaksoy41/react-native-offline-queue';
|
|
366
|
-
import { createPost, likePost } from './api';
|
|
367
|
-
|
|
368
|
-
function AppWithProviders() {
|
|
390
|
+
// hooks/useCreatePost.ts
|
|
391
|
+
export function useCreatePost() {
|
|
369
392
|
const queryClient = useQueryClient();
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
storageType: 'mmkv',
|
|
375
|
-
syncMode: 'auto',
|
|
376
|
-
onSyncAction: async (action) => {
|
|
377
|
-
switch (action.actionName) {
|
|
378
|
-
case 'CREATE_POST':
|
|
379
|
-
await createPost(action.payload);
|
|
380
|
-
queryClient.invalidateQueries({ queryKey: ['posts'] });
|
|
381
|
-
break;
|
|
382
|
-
case 'LIKE_POST':
|
|
383
|
-
await likePost(action.payload);
|
|
384
|
-
queryClient.invalidateQueries({ queryKey: ['posts'] });
|
|
385
|
-
break;
|
|
386
|
-
}
|
|
387
|
-
},
|
|
388
|
-
}}
|
|
389
|
-
>
|
|
390
|
-
<YourApp />
|
|
391
|
-
</OfflineProvider>
|
|
392
|
-
);
|
|
393
|
+
return useMutation({
|
|
394
|
+
mutationFn: api.createPost, // your axios/fetch wrapper
|
|
395
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
|
|
396
|
+
});
|
|
393
397
|
}
|
|
394
398
|
|
|
395
|
-
//
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
399
|
+
// CreatePostForm.tsx
|
|
400
|
+
function CreatePostForm() {
|
|
401
|
+
const { mutateAsync } = useCreatePost();
|
|
402
|
+
|
|
403
|
+
const { mutateOffline } = useOfflineMutation('CREATE_POST', {
|
|
404
|
+
handler: async (payload) => await mutateAsync(payload),
|
|
405
|
+
onOptimisticSuccess: (payload) => { /* ... */ },
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
return <Button onPress={() => mutateOffline({ title, body })} />;
|
|
402
409
|
}
|
|
403
410
|
```
|
|
404
411
|
|
|
405
412
|
**Summary**
|
|
406
413
|
|
|
407
|
-
|
|
|
408
|
-
|
|
409
|
-
|
|
|
410
|
-
| Cache invalidation | `queryClient.invalidateQueries()` inside `handler` or `onSyncAction` |
|
|
411
|
-
| Optimistic updates | `onOptimisticSuccess` + `queryClient.setQueryData()` |
|
|
414
|
+
| Handler does | Your mutation does |
|
|
415
|
+
|--------------|--------------------|
|
|
416
|
+
| Calls `mutateAsync(payload)` | POST/GET, retry, cache invalidation, error handling |
|
|
412
417
|
|
|
413
|
-
|
|
418
|
+
No duplicate logic. Same mutation for online and offline sync.
|
|
414
419
|
|
|
415
420
|
## Configuration
|
|
416
421
|
|
|
@@ -502,31 +507,94 @@ Omit `onOnlineRestore` entirely. Nothing happens — you handle sync manually th
|
|
|
502
507
|
|
|
503
508
|
### `useOfflineMutation(actionName, options?)`
|
|
504
509
|
|
|
505
|
-
Queue-aware mutation hook. Calls the handler directly when online, queues when offline.
|
|
510
|
+
Queue-aware mutation hook with built-in state tracking. Calls the handler directly when online, queues when offline.
|
|
506
511
|
|
|
507
|
-
|
|
508
|
-
const { mutateOffline } = useOfflineMutation('CREATE_POST', {
|
|
509
|
-
handler: async (payload) => {
|
|
510
|
-
// Your API call — runs directly when online, or during sync when offline
|
|
511
|
-
await api.createPost(payload);
|
|
512
|
-
},
|
|
513
|
-
onOptimisticSuccess: (payload) => {
|
|
514
|
-
// Runs immediately — update your local state here
|
|
515
|
-
},
|
|
516
|
-
onError: (error, payload) => {
|
|
517
|
-
// Runs if the direct API call fails while online
|
|
518
|
-
},
|
|
519
|
-
});
|
|
512
|
+
**Returns:**
|
|
520
513
|
|
|
521
|
-
|
|
514
|
+
```tsx
|
|
515
|
+
const {
|
|
516
|
+
mutateOffline, // (payload) => Promise<void>
|
|
517
|
+
status, // 'idle' | 'loading' | 'success' | 'error' | 'queued'
|
|
518
|
+
isIdle, // true before any mutation
|
|
519
|
+
isLoading, // true while the handler is running (online only)
|
|
520
|
+
isSuccess, // true after a successful direct call
|
|
521
|
+
isError, // true if the direct call threw (action still queued as fallback)
|
|
522
|
+
isQueued, // true when the action was added to the offline queue
|
|
523
|
+
error, // Error | null
|
|
524
|
+
reset, // () => void — reset status back to idle
|
|
525
|
+
} = useOfflineMutation('ACTION_NAME', options);
|
|
522
526
|
```
|
|
523
527
|
|
|
524
528
|
| Option | Type | Description |
|
|
525
529
|
|--------|------|-------------|
|
|
526
|
-
| `handler` | `(payload) => Promise<void>` | API call for this
|
|
527
|
-
| `onOptimisticSuccess` | `(payload) => void` | Fires immediately
|
|
530
|
+
| `handler` | `(payload) => Promise<void>` | API call for this action. Registered automatically, used during sync. |
|
|
531
|
+
| `onOptimisticSuccess` | `(payload) => void` | Fires immediately — update your local state here |
|
|
532
|
+
| `onSuccess` | `(payload) => void` | Fires only after a successful direct call (online) |
|
|
528
533
|
| `onError` | `(error, payload) => void` | Fires if the direct call fails while online |
|
|
529
534
|
|
|
535
|
+
**With `fetch`:**
|
|
536
|
+
|
|
537
|
+
```tsx
|
|
538
|
+
function LikeButton({ postId }) {
|
|
539
|
+
const { mutateOffline, isLoading, isQueued } = useOfflineMutation('LIKE_POST', {
|
|
540
|
+
handler: async (payload) => {
|
|
541
|
+
await fetch('/api/likes', {
|
|
542
|
+
method: 'POST',
|
|
543
|
+
body: JSON.stringify(payload),
|
|
544
|
+
});
|
|
545
|
+
},
|
|
546
|
+
onOptimisticSuccess: () => setLiked(true),
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
return (
|
|
550
|
+
<Button
|
|
551
|
+
title={isLoading ? '⏳' : isQueued ? '📡 Queued' : '❤️ Like'}
|
|
552
|
+
onPress={() => mutateOffline({ postId })}
|
|
553
|
+
disabled={isLoading}
|
|
554
|
+
/>
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
**With React Query:**
|
|
560
|
+
|
|
561
|
+
```tsx
|
|
562
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
563
|
+
|
|
564
|
+
function LikeButton({ postId }) {
|
|
565
|
+
const queryClient = useQueryClient();
|
|
566
|
+
|
|
567
|
+
const { mutateAsync } = useMutation({
|
|
568
|
+
mutationFn: (payload) => api.likePost(payload),
|
|
569
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
const { mutateOffline, isQueued } = useOfflineMutation('LIKE_POST', {
|
|
573
|
+
handler: async (payload) => await mutateAsync(payload),
|
|
574
|
+
onOptimisticSuccess: () => {
|
|
575
|
+
queryClient.setQueryData(['posts', postId], (old) => ({
|
|
576
|
+
...old, liked: true,
|
|
577
|
+
}));
|
|
578
|
+
},
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
return (
|
|
582
|
+
<Button
|
|
583
|
+
title={isQueued ? '📡 Queued' : '❤️ Like'}
|
|
584
|
+
onPress={() => mutateOffline({ postId })}
|
|
585
|
+
/>
|
|
586
|
+
);
|
|
587
|
+
}
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
**State flow:**
|
|
591
|
+
|
|
592
|
+
| Scenario | `status` flow |
|
|
593
|
+
|----------|---------------|
|
|
594
|
+
| Online + success | `idle` → `loading` → `success` |
|
|
595
|
+
| Online + API fails | `idle` → `loading` → `queued` (fallback) |
|
|
596
|
+
| Offline | `idle` → `queued` |
|
|
597
|
+
|
|
530
598
|
### `useOfflineQueue()`
|
|
531
599
|
|
|
532
600
|
Access the live queue state. Uses `useSyncExternalStore` under the hood — only re-renders when the queue actually changes.
|
|
@@ -545,12 +613,28 @@ const { queue, pendingCount, isSyncing, syncNow, clearQueue } = useOfflineQueue(
|
|
|
545
613
|
|
|
546
614
|
### `useNetworkStatus()`
|
|
547
615
|
|
|
548
|
-
|
|
616
|
+
Reactive connectivity status. Built on `useSyncExternalStore` — only re-renders when the value actually changes. No Context, no cascading re-renders.
|
|
549
617
|
|
|
550
618
|
```tsx
|
|
551
|
-
|
|
619
|
+
import { useNetworkStatus } from '@mustafaaksoy41/react-native-offline-queue';
|
|
620
|
+
|
|
621
|
+
function MyComponent() {
|
|
622
|
+
const { isOnline } = useNetworkStatus();
|
|
623
|
+
|
|
624
|
+
return (
|
|
625
|
+
<View>
|
|
626
|
+
<Text>Status: {isOnline === null ? 'Detecting...' : isOnline ? '✅ Online' : '📴 Offline'}</Text>
|
|
627
|
+
</View>
|
|
628
|
+
);
|
|
629
|
+
}
|
|
552
630
|
```
|
|
553
631
|
|
|
632
|
+
| Property | Type | Description |
|
|
633
|
+
|----------|------|-------------|
|
|
634
|
+
| `isOnline` | `boolean \| null` | `true` = online, `false` = offline, `null` = not yet detected |
|
|
635
|
+
|
|
636
|
+
> **Re-render guarantee:** If your component doesn't call `useNetworkStatus()`, it will **never** re-render due to connectivity changes. This is by design — we use a subscriber pattern instead of React Context.
|
|
637
|
+
|
|
554
638
|
### `useSyncProgress()`
|
|
555
639
|
|
|
556
640
|
Live progress tracking during a sync session. Useful for building progress UIs inside sheets or modals.
|
|
@@ -812,6 +896,39 @@ When the device comes back online, the manager either flushes the queue automati
|
|
|
812
896
|
|
|
813
897
|
Storage is abstracted behind a simple `getItem` / `setItem` / `removeItem` interface, so swapping between MMKV, AsyncStorage, Realm, or your own backend is just a config change.
|
|
814
898
|
|
|
899
|
+
## Testing
|
|
900
|
+
|
|
901
|
+
This package is tested with [Jest](https://jestjs.io/). All core logic is covered with unit tests.
|
|
902
|
+
|
|
903
|
+
```bash
|
|
904
|
+
# Run all tests
|
|
905
|
+
npm test
|
|
906
|
+
|
|
907
|
+
# Run in watch mode
|
|
908
|
+
npm run test:watch
|
|
909
|
+
|
|
910
|
+
# Run with coverage report
|
|
911
|
+
npm test -- --coverage
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
### Test Coverage
|
|
915
|
+
|
|
916
|
+
| Module | Tests | What's Covered |
|
|
917
|
+
|--------|-------|----------------|
|
|
918
|
+
| **Queue CRUD** | 8 | push, remove, clear, getQueue, unique ID generation |
|
|
919
|
+
| **Subscriptions** | 2 | listener notify on change, cleanup after unsubscribe |
|
|
920
|
+
| **Network Status** | 5 | initial null, setOnline, no-op on same value, snapshot |
|
|
921
|
+
| **Handler Registry** | 4 | register, unregister, overwrite, unknown handler |
|
|
922
|
+
| **flushQueue** | 8 | per-action > global handler, retry count, failed items persist, concurrent guard |
|
|
923
|
+
| **Sync Progress** | 3 | initial state, active tracking, per-item success/fail status |
|
|
924
|
+
| **Online Restore** | 4 | auto flush, manual callback, empty queue, discardQueue |
|
|
925
|
+
| **Configuration** | 3 | syncMode, onSyncAction, isInitialized |
|
|
926
|
+
| **Total** | **38** | |
|
|
927
|
+
|
|
928
|
+
### CI
|
|
929
|
+
|
|
930
|
+
Tests run automatically on every push and pull request via [GitHub Actions](https://github.com/messivite/react-native-offline-queue/actions). The CI pipeline tests against Node.js 18 and 20.
|
|
931
|
+
|
|
815
932
|
## License
|
|
816
933
|
|
|
817
934
|
MIT
|
|
@@ -3,23 +3,28 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.OfflineProvider = void 0;
|
|
7
|
+
exports.useNetworkStatus = useNetworkStatus;
|
|
7
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
9
|
var _netinfo = _interopRequireDefault(require("@react-native-community/netinfo"));
|
|
9
10
|
var _OfflineManager = require("../core/OfflineManager");
|
|
10
11
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
13
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
// ─── useNetworkStatus (useSyncExternalStore — zero unnecessary re-renders) ───
|
|
15
|
+
function useNetworkStatus() {
|
|
16
|
+
const isOnline = (0, _react.useSyncExternalStore)(_OfflineManager.OfflineManager.subscribeNetwork, _OfflineManager.OfflineManager.getNetworkSnapshot, _OfflineManager.OfflineManager.getNetworkSnapshot);
|
|
17
|
+
return {
|
|
18
|
+
isOnline
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ─── OfflineProvider ───
|
|
23
|
+
|
|
18
24
|
const OfflineProvider = ({
|
|
19
25
|
children,
|
|
20
26
|
config
|
|
21
27
|
}) => {
|
|
22
|
-
const [isOnline, setIsOnline] = (0, _react.useState)(null);
|
|
23
28
|
const wasOfflineRef = (0, _react.useRef)(false);
|
|
24
29
|
(0, _react.useEffect)(() => {
|
|
25
30
|
_OfflineManager.OfflineManager.configure(config);
|
|
@@ -28,7 +33,9 @@ const OfflineProvider = ({
|
|
|
28
33
|
const unsubscribe = _netinfo.default.addEventListener(state => {
|
|
29
34
|
const connected = !!state.isConnected;
|
|
30
35
|
if (__DEV__) console.log('[OfflineQueue] Network:', connected ? 'online' : 'offline', '| type:', state.type);
|
|
31
|
-
|
|
36
|
+
|
|
37
|
+
// Update the singleton — only notifies listeners if value actually changed
|
|
38
|
+
_OfflineManager.OfflineManager.setOnline(connected);
|
|
32
39
|
if (!connected) {
|
|
33
40
|
wasOfflineRef.current = true;
|
|
34
41
|
}
|
|
@@ -40,10 +47,9 @@ const OfflineProvider = ({
|
|
|
40
47
|
});
|
|
41
48
|
return () => unsubscribe();
|
|
42
49
|
}, []);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
},
|
|
50
|
+
|
|
51
|
+
// No context provider needed — useNetworkStatus reads from OfflineManager directly
|
|
52
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
47
53
|
children: children
|
|
48
54
|
});
|
|
49
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_netinfo","_interopRequireDefault","_OfflineManager","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_netinfo","_interopRequireDefault","_OfflineManager","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","useNetworkStatus","isOnline","useSyncExternalStore","OfflineManager","subscribeNetwork","getNetworkSnapshot","OfflineProvider","children","config","wasOfflineRef","useRef","useEffect","configure","unsubscribe","NetInfo","addEventListener","state","connected","isConnected","__DEV__","console","log","type","setOnline","current","handleOnlineRestore","jsx","Fragment","exports"],"sourceRoot":"../../../src","sources":["components/OfflineProvider.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -27,12 +27,33 @@ class OfflineManagerClass {
|
|
|
27
27
|
// Progress listeners (for useSyncProgress)
|
|
28
28
|
progressListeners = new Set();
|
|
29
29
|
|
|
30
|
+
// Network status listeners (for useNetworkStatus / useSyncExternalStore)
|
|
31
|
+
networkListeners = new Set();
|
|
32
|
+
|
|
30
33
|
// Per-action handler registry
|
|
31
34
|
actionHandlers = new Map();
|
|
32
35
|
isInitialized = false;
|
|
33
36
|
syncMode = 'manual';
|
|
34
37
|
isSyncing = false;
|
|
35
38
|
|
|
39
|
+
// ─── Network Status State ───
|
|
40
|
+
_isOnline = null;
|
|
41
|
+
get isOnline() {
|
|
42
|
+
return this._isOnline;
|
|
43
|
+
}
|
|
44
|
+
setOnline(online) {
|
|
45
|
+
if (this._isOnline === online) return; // no change, no re-render
|
|
46
|
+
this._isOnline = online;
|
|
47
|
+
this.networkListeners.forEach(l => l());
|
|
48
|
+
}
|
|
49
|
+
subscribeNetwork = listener => {
|
|
50
|
+
this.networkListeners.add(listener);
|
|
51
|
+
return () => this.networkListeners.delete(listener);
|
|
52
|
+
};
|
|
53
|
+
getNetworkSnapshot = () => {
|
|
54
|
+
return this._isOnline;
|
|
55
|
+
};
|
|
56
|
+
|
|
36
57
|
// ─── Sync Progress State ───
|
|
37
58
|
_syncProgress = {
|
|
38
59
|
..._types.INITIAL_SYNC_PROGRESS
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_StorageAdapter","require","_types","_adapters","generateUUID","replace","c","r","Math","random","v","toString","OfflineManagerClass","queue","storage","MemoryStorageAdapter","storageKey","useRecordAdapter","queueListeners","Set","progressListeners","actionHandlers","Map","isInitialized","syncMode","isSyncing","_syncProgress","INITIAL_SYNC_PROGRESS","syncProgress","configure","config","storageType","getMMKVAdapter","getAsyncStorageAdapter","getRealmAdapter","realmOptions","isRecordAdapter","onSyncAction","onOnlineRestore","loadQueue","adapter","getAll","data","getItem","JSON","parse","notifyQueueListeners","e","console","warn","saveQueue","setItem","stringify","subscribeQueue","listener","add","delete","subscribe","forEach","l","subscribeProgress","updateProgress","partial","updateProgressItem","id","update","items","map","item","action","push","actionName","payload","createdAt","Date","now","retryCount","insert","remove","filter","a","clear","getQueue","registerHandler","handler","set","unregisterHandler","getHandler","get","flushQueue","length","hasAnyHandler","size","currentQueue","progressItems","status","isActive","totalCount","completedCount","failedCount","currentAction","Error","error","message","target","find","handleOnlineRestore","pendingCount","syncNow","discardQueue","OfflineManager","exports"],"sourceRoot":"../../../src","sources":["core/OfflineManager.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_StorageAdapter","require","_types","_adapters","generateUUID","replace","c","r","Math","random","v","toString","OfflineManagerClass","queue","storage","MemoryStorageAdapter","storageKey","useRecordAdapter","queueListeners","Set","progressListeners","networkListeners","actionHandlers","Map","isInitialized","syncMode","isSyncing","_isOnline","isOnline","setOnline","online","forEach","l","subscribeNetwork","listener","add","delete","getNetworkSnapshot","_syncProgress","INITIAL_SYNC_PROGRESS","syncProgress","configure","config","storageType","getMMKVAdapter","getAsyncStorageAdapter","getRealmAdapter","realmOptions","isRecordAdapter","onSyncAction","onOnlineRestore","loadQueue","adapter","getAll","data","getItem","JSON","parse","notifyQueueListeners","e","console","warn","saveQueue","setItem","stringify","subscribeQueue","subscribe","subscribeProgress","updateProgress","partial","updateProgressItem","id","update","items","map","item","action","push","actionName","payload","createdAt","Date","now","retryCount","insert","remove","filter","a","clear","getQueue","registerHandler","handler","set","unregisterHandler","getHandler","get","flushQueue","length","hasAnyHandler","size","currentQueue","progressItems","status","isActive","totalCount","completedCount","failedCount","currentAction","Error","error","message","target","find","handleOnlineRestore","pendingCount","syncNow","discardQueue","OfflineManager","exports"],"sourceRoot":"../../../src","sources":["core/OfflineManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,6 +13,8 @@ function useOfflineMutation(actionName, options) {
|
|
|
13
13
|
} = (0, _OfflineProvider.useNetworkStatus)();
|
|
14
14
|
const handlerRef = (0, _react.useRef)(options?.handler);
|
|
15
15
|
handlerRef.current = options?.handler;
|
|
16
|
+
const [status, setStatus] = (0, _react.useState)('idle');
|
|
17
|
+
const [error, setError] = (0, _react.useState)(null);
|
|
16
18
|
|
|
17
19
|
// Register per-action handler (persists even after unmount)
|
|
18
20
|
(0, _react.useEffect)(() => {
|
|
@@ -20,7 +22,11 @@ function useOfflineMutation(actionName, options) {
|
|
|
20
22
|
_OfflineManager.OfflineManager.registerHandler(actionName, payload => handlerRef.current(payload));
|
|
21
23
|
}
|
|
22
24
|
}, [actionName]);
|
|
23
|
-
const
|
|
25
|
+
const reset = (0, _react.useCallback)(() => {
|
|
26
|
+
setStatus('idle');
|
|
27
|
+
setError(null);
|
|
28
|
+
}, []);
|
|
29
|
+
const mutateOffline = (0, _react.useCallback)(async payload => {
|
|
24
30
|
// Resolve which handler to use: per-action handler > global onSyncAction
|
|
25
31
|
const handler = handlerRef.current || _OfflineManager.OfflineManager.getHandler(actionName);
|
|
26
32
|
const globalHandler = _OfflineManager.OfflineManager.onSyncAction;
|
|
@@ -28,6 +34,8 @@ function useOfflineMutation(actionName, options) {
|
|
|
28
34
|
if (isOnline && hasHandler) {
|
|
29
35
|
// ── ONLINE: Execute directly, skip the queue ──
|
|
30
36
|
if (__DEV__) console.log(`[OfflineQueue] mutate: ${actionName} (direct)`);
|
|
37
|
+
setStatus('loading');
|
|
38
|
+
setError(null);
|
|
31
39
|
try {
|
|
32
40
|
if (handler) {
|
|
33
41
|
await handler(payload);
|
|
@@ -40,22 +48,37 @@ function useOfflineMutation(actionName, options) {
|
|
|
40
48
|
retryCount: 0
|
|
41
49
|
});
|
|
42
50
|
}
|
|
51
|
+
setStatus('success');
|
|
43
52
|
options?.onOptimisticSuccess?.(payload);
|
|
44
|
-
|
|
45
|
-
|
|
53
|
+
options?.onSuccess?.(payload);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
console.warn(`[OfflineQueue] mutate: ${actionName} failed, falling back to queue`, err);
|
|
56
|
+
// API failed even though online → fallback to queue
|
|
46
57
|
await _OfflineManager.OfflineManager.push(actionName, payload);
|
|
58
|
+
setStatus('queued');
|
|
59
|
+
setError(err);
|
|
47
60
|
options?.onOptimisticSuccess?.(payload);
|
|
48
|
-
options?.onError?.(
|
|
61
|
+
options?.onError?.(err, payload);
|
|
49
62
|
}
|
|
50
63
|
} else {
|
|
51
64
|
// ── OFFLINE: Add to queue + optimistic update ──
|
|
52
65
|
if (__DEV__) console.log(`[OfflineQueue] mutate: ${actionName} (queued)`);
|
|
53
66
|
await _OfflineManager.OfflineManager.push(actionName, payload);
|
|
67
|
+
setStatus('queued');
|
|
68
|
+
setError(null);
|
|
54
69
|
options?.onOptimisticSuccess?.(payload);
|
|
55
70
|
}
|
|
56
|
-
};
|
|
71
|
+
}, [actionName, isOnline, options]);
|
|
57
72
|
return {
|
|
58
|
-
mutateOffline
|
|
73
|
+
mutateOffline,
|
|
74
|
+
status,
|
|
75
|
+
isIdle: status === 'idle',
|
|
76
|
+
isLoading: status === 'loading',
|
|
77
|
+
isSuccess: status === 'success',
|
|
78
|
+
isError: status === 'error',
|
|
79
|
+
isQueued: status === 'queued',
|
|
80
|
+
error,
|
|
81
|
+
reset
|
|
59
82
|
};
|
|
60
83
|
}
|
|
61
84
|
//# sourceMappingURL=useOfflineMutation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_OfflineManager","_OfflineProvider","useOfflineMutation","actionName","options","isOnline","useNetworkStatus","handlerRef","useRef","handler","current","useEffect","OfflineManager","registerHandler","payload","mutateOffline","getHandler","globalHandler","onSyncAction","hasHandler","__DEV__","console","log","id","createdAt","Date","now","retryCount","onOptimisticSuccess","
|
|
1
|
+
{"version":3,"names":["_react","require","_OfflineManager","_OfflineProvider","useOfflineMutation","actionName","options","isOnline","useNetworkStatus","handlerRef","useRef","handler","current","status","setStatus","useState","error","setError","useEffect","OfflineManager","registerHandler","payload","reset","useCallback","mutateOffline","getHandler","globalHandler","onSyncAction","hasHandler","__DEV__","console","log","id","createdAt","Date","now","retryCount","onOptimisticSuccess","onSuccess","err","warn","push","onError","isIdle","isLoading","isSuccess","isError","isQueued"],"sourceRoot":"../../../src","sources":["hooks/useOfflineMutation.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AAgBO,SAASG,kBAAkBA,CAChCC,UAAkB,EAClBC,OAKC,EACgC;EACjC,MAAM;IAAEC;EAAS,CAAC,GAAG,IAAAC,iCAAgB,EAAC,CAAC;EACvC,MAAMC,UAAU,GAAG,IAAAC,aAAM,EAACJ,OAAO,EAAEK,OAAO,CAAC;EAC3CF,UAAU,CAACG,OAAO,GAAGN,OAAO,EAAEK,OAAO;EAErC,MAAM,CAACE,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAC,eAAQ,EAAiB,MAAM,CAAC;EAC5D,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAF,eAAQ,EAAe,IAAI,CAAC;;EAEtD;EACA,IAAAG,gBAAS,EAAC,MAAM;IACd,IAAIT,UAAU,CAACG,OAAO,EAAE;MACtBO,8BAAc,CAACC,eAAe,CAACf,UAAU,EAAGgB,OAAY,IACtDZ,UAAU,CAACG,OAAO,CAAES,OAAO,CAC7B,CAAC;IACH;EACF,CAAC,EAAE,CAAChB,UAAU,CAAC,CAAC;EAEhB,MAAMiB,KAAK,GAAG,IAAAC,kBAAW,EAAC,MAAM;IAC9BT,SAAS,CAAC,MAAM,CAAC;IACjBG,QAAQ,CAAC,IAAI,CAAC;EAChB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMO,aAAa,GAAG,IAAAD,kBAAW,EAAC,MAAOF,OAAiB,IAAK;IAC7D;IACA,MAAMV,OAAO,GAAGF,UAAU,CAACG,OAAO,IAAIO,8BAAc,CAACM,UAAU,CAACpB,UAAU,CAAC;IAC3E,MAAMqB,aAAa,GAAGP,8BAAc,CAACQ,YAAY;IACjD,MAAMC,UAAU,GAAGjB,OAAO,IAAIe,aAAa;IAE3C,IAAInB,QAAQ,IAAIqB,UAAU,EAAE;MAC1B;MACA,IAAIC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0B1B,UAAU,WAAW,CAAC;MACzES,SAAS,CAAC,SAAS,CAAC;MACpBG,QAAQ,CAAC,IAAI,CAAC;MACd,IAAI;QACF,IAAIN,OAAO,EAAE;UACX,MAAMA,OAAO,CAACU,OAAO,CAAC;QACxB,CAAC,MAAM,IAAIK,aAAa,EAAE;UACxB,MAAMA,aAAa,CAAC;YAClBM,EAAE,EAAE,EAAE;YACN3B,UAAU;YACVgB,OAAO;YACPY,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;YACrBC,UAAU,EAAE;UACd,CAAC,CAAC;QACJ;QACAtB,SAAS,CAAC,SAAS,CAAC;QACpBR,OAAO,EAAE+B,mBAAmB,GAAGhB,OAAO,CAAC;QACvCf,OAAO,EAAEgC,SAAS,GAAGjB,OAAO,CAAC;MAC/B,CAAC,CAAC,OAAOkB,GAAQ,EAAE;QACjBT,OAAO,CAACU,IAAI,CAAC,0BAA0BnC,UAAU,gCAAgC,EAAEkC,GAAG,CAAC;QACvF;QACA,MAAMpB,8BAAc,CAACsB,IAAI,CAACpC,UAAU,EAAEgB,OAAO,CAAC;QAC9CP,SAAS,CAAC,QAAQ,CAAC;QACnBG,QAAQ,CAACsB,GAAG,CAAC;QACbjC,OAAO,EAAE+B,mBAAmB,GAAGhB,OAAO,CAAC;QACvCf,OAAO,EAAEoC,OAAO,GAAGH,GAAG,EAAElB,OAAO,CAAC;MAClC;IACF,CAAC,MAAM;MACL;MACA,IAAIQ,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0B1B,UAAU,WAAW,CAAC;MACzE,MAAMc,8BAAc,CAACsB,IAAI,CAACpC,UAAU,EAAEgB,OAAO,CAAC;MAC9CP,SAAS,CAAC,QAAQ,CAAC;MACnBG,QAAQ,CAAC,IAAI,CAAC;MACdX,OAAO,EAAE+B,mBAAmB,GAAGhB,OAAO,CAAC;IACzC;EACF,CAAC,EAAE,CAAChB,UAAU,EAAEE,QAAQ,EAAED,OAAO,CAAC,CAAC;EAEnC,OAAO;IACLkB,aAAa;IACbX,MAAM;IACN8B,MAAM,EAAE9B,MAAM,KAAK,MAAM;IACzB+B,SAAS,EAAE/B,MAAM,KAAK,SAAS;IAC/BgC,SAAS,EAAEhC,MAAM,KAAK,SAAS;IAC/BiC,OAAO,EAAEjC,MAAM,KAAK,OAAO;IAC3BkC,QAAQ,EAAElC,MAAM,KAAK,QAAQ;IAC7BG,KAAK;IACLM;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { useEffect, useRef } from 'react';
|
|
4
|
+
import { useSyncExternalStore } from 'react';
|
|
4
5
|
import NetInfo from '@react-native-community/netinfo';
|
|
5
6
|
import { OfflineManager } from '../core/OfflineManager';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
|
|
8
|
+
// ─── useNetworkStatus (useSyncExternalStore — zero unnecessary re-renders) ───
|
|
9
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
10
|
+
export function useNetworkStatus() {
|
|
11
|
+
const isOnline = useSyncExternalStore(OfflineManager.subscribeNetwork, OfflineManager.getNetworkSnapshot, OfflineManager.getNetworkSnapshot);
|
|
12
|
+
return {
|
|
13
|
+
isOnline
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ─── OfflineProvider ───
|
|
18
|
+
|
|
11
19
|
export const OfflineProvider = ({
|
|
12
20
|
children,
|
|
13
21
|
config
|
|
14
22
|
}) => {
|
|
15
|
-
const [isOnline, setIsOnline] = useState(null);
|
|
16
23
|
const wasOfflineRef = useRef(false);
|
|
17
24
|
useEffect(() => {
|
|
18
25
|
OfflineManager.configure(config);
|
|
@@ -21,7 +28,9 @@ export const OfflineProvider = ({
|
|
|
21
28
|
const unsubscribe = NetInfo.addEventListener(state => {
|
|
22
29
|
const connected = !!state.isConnected;
|
|
23
30
|
if (__DEV__) console.log('[OfflineQueue] Network:', connected ? 'online' : 'offline', '| type:', state.type);
|
|
24
|
-
|
|
31
|
+
|
|
32
|
+
// Update the singleton — only notifies listeners if value actually changed
|
|
33
|
+
OfflineManager.setOnline(connected);
|
|
25
34
|
if (!connected) {
|
|
26
35
|
wasOfflineRef.current = true;
|
|
27
36
|
}
|
|
@@ -33,10 +42,9 @@ export const OfflineProvider = ({
|
|
|
33
42
|
});
|
|
34
43
|
return () => unsubscribe();
|
|
35
44
|
}, []);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
},
|
|
45
|
+
|
|
46
|
+
// No context provider needed — useNetworkStatus reads from OfflineManager directly
|
|
47
|
+
return /*#__PURE__*/_jsx(_Fragment, {
|
|
40
48
|
children: children
|
|
41
49
|
});
|
|
42
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","
|
|
1
|
+
{"version":3,"names":["React","useEffect","useRef","useSyncExternalStore","NetInfo","OfflineManager","Fragment","_Fragment","jsx","_jsx","useNetworkStatus","isOnline","subscribeNetwork","getNetworkSnapshot","OfflineProvider","children","config","wasOfflineRef","configure","unsubscribe","addEventListener","state","connected","isConnected","__DEV__","console","log","type","setOnline","current","handleOnlineRestore"],"sourceRoot":"../../../src","sources":["components/OfflineProvider.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAChD,SAASC,oBAAoB,QAAQ,OAAO;AAC5C,OAAOC,OAAO,MAAM,iCAAiC;AACrD,SAASC,cAAc,QAAmC,wBAAwB;;AAElF;AAAA,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AACA,OAAO,SAASC,gBAAgBA,CAAA,EAAG;EAC/B,MAAMC,QAAQ,GAAGR,oBAAoB,CACjCE,cAAc,CAACO,gBAAgB,EAC/BP,cAAc,CAACQ,kBAAkB,EACjCR,cAAc,CAACQ,kBACnB,CAAC;EAED,OAAO;IAAEF;EAAS,CAAC;AACvB;;AAEA;;AAMA,OAAO,MAAMG,eAA+C,GAAGA,CAAC;EAAEC,QAAQ;EAAEC;AAAO,CAAC,KAAK;EACrF,MAAMC,aAAa,GAAGf,MAAM,CAAC,KAAK,CAAC;EAEnCD,SAAS,CAAC,MAAM;IACZI,cAAc,CAACa,SAAS,CAACF,MAAM,CAAC;EACpC,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEZf,SAAS,CAAC,MAAM;IACZ,MAAMkB,WAAW,GAAGf,OAAO,CAACgB,gBAAgB,CAAEC,KAAK,IAAK;MACpD,MAAMC,SAAS,GAAG,CAAC,CAACD,KAAK,CAACE,WAAW;MACrC,IAAIC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,yBAAyB,EAAEJ,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE,SAAS,EAAED,KAAK,CAACM,IAAI,CAAC;;MAE5G;MACAtB,cAAc,CAACuB,SAAS,CAACN,SAAS,CAAC;MAEnC,IAAI,CAACA,SAAS,EAAE;QACZL,aAAa,CAACY,OAAO,GAAG,IAAI;MAChC;MAEA,IAAIP,SAAS,IAAIL,aAAa,CAACY,OAAO,EAAE;QACpCZ,aAAa,CAACY,OAAO,GAAG,KAAK;QAC7B,IAAIL,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0DAA0D,CAAC;QACpFrB,cAAc,CAACyB,mBAAmB,CAAC,CAAC;MACxC;IACJ,CAAC,CAAC;IAEF,OAAO,MAAMX,WAAW,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,oBAAOV,IAAA,CAAAF,SAAA;IAAAQ,QAAA,EAAGA;EAAQ,CAAG,CAAC;AAC1B,CAAC","ignoreList":[]}
|
|
@@ -23,12 +23,33 @@ class OfflineManagerClass {
|
|
|
23
23
|
// Progress listeners (for useSyncProgress)
|
|
24
24
|
progressListeners = new Set();
|
|
25
25
|
|
|
26
|
+
// Network status listeners (for useNetworkStatus / useSyncExternalStore)
|
|
27
|
+
networkListeners = new Set();
|
|
28
|
+
|
|
26
29
|
// Per-action handler registry
|
|
27
30
|
actionHandlers = new Map();
|
|
28
31
|
isInitialized = false;
|
|
29
32
|
syncMode = 'manual';
|
|
30
33
|
isSyncing = false;
|
|
31
34
|
|
|
35
|
+
// ─── Network Status State ───
|
|
36
|
+
_isOnline = null;
|
|
37
|
+
get isOnline() {
|
|
38
|
+
return this._isOnline;
|
|
39
|
+
}
|
|
40
|
+
setOnline(online) {
|
|
41
|
+
if (this._isOnline === online) return; // no change, no re-render
|
|
42
|
+
this._isOnline = online;
|
|
43
|
+
this.networkListeners.forEach(l => l());
|
|
44
|
+
}
|
|
45
|
+
subscribeNetwork = listener => {
|
|
46
|
+
this.networkListeners.add(listener);
|
|
47
|
+
return () => this.networkListeners.delete(listener);
|
|
48
|
+
};
|
|
49
|
+
getNetworkSnapshot = () => {
|
|
50
|
+
return this._isOnline;
|
|
51
|
+
};
|
|
52
|
+
|
|
32
53
|
// ─── Sync Progress State ───
|
|
33
54
|
_syncProgress = {
|
|
34
55
|
...INITIAL_SYNC_PROGRESS
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MemoryStorageAdapter","isRecordAdapter","INITIAL_SYNC_PROGRESS","getMMKVAdapter","getAsyncStorageAdapter","getRealmAdapter","generateUUID","replace","c","r","Math","random","v","toString","OfflineManagerClass","queue","storage","storageKey","useRecordAdapter","queueListeners","Set","progressListeners","actionHandlers","Map","isInitialized","syncMode","isSyncing","_syncProgress","syncProgress","configure","config","storageType","realmOptions","onSyncAction","onOnlineRestore","loadQueue","adapter","getAll","data","getItem","JSON","parse","notifyQueueListeners","e","console","warn","saveQueue","setItem","stringify","subscribeQueue","listener","add","delete","subscribe","forEach","l","subscribeProgress","updateProgress","partial","updateProgressItem","id","update","items","map","item","action","push","actionName","payload","createdAt","Date","now","retryCount","insert","remove","filter","a","clear","getQueue","registerHandler","handler","set","unregisterHandler","getHandler","get","flushQueue","length","hasAnyHandler","size","currentQueue","progressItems","status","isActive","totalCount","completedCount","failedCount","currentAction","Error","error","message","target","find","handleOnlineRestore","pendingCount","syncNow","discardQueue","OfflineManager"],"sourceRoot":"../../../src","sources":["core/OfflineManager.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["MemoryStorageAdapter","isRecordAdapter","INITIAL_SYNC_PROGRESS","getMMKVAdapter","getAsyncStorageAdapter","getRealmAdapter","generateUUID","replace","c","r","Math","random","v","toString","OfflineManagerClass","queue","storage","storageKey","useRecordAdapter","queueListeners","Set","progressListeners","networkListeners","actionHandlers","Map","isInitialized","syncMode","isSyncing","_isOnline","isOnline","setOnline","online","forEach","l","subscribeNetwork","listener","add","delete","getNetworkSnapshot","_syncProgress","syncProgress","configure","config","storageType","realmOptions","onSyncAction","onOnlineRestore","loadQueue","adapter","getAll","data","getItem","JSON","parse","notifyQueueListeners","e","console","warn","saveQueue","setItem","stringify","subscribeQueue","subscribe","subscribeProgress","updateProgress","partial","updateProgressItem","id","update","items","map","item","action","push","actionName","payload","createdAt","Date","now","retryCount","insert","remove","filter","a","clear","getQueue","registerHandler","handler","set","unregisterHandler","getHandler","get","flushQueue","length","hasAnyHandler","size","currentQueue","progressItems","status","isActive","totalCount","completedCount","failedCount","currentAction","Error","error","message","target","find","handleOnlineRestore","pendingCount","syncNow","discardQueue","OfflineManager"],"sourceRoot":"../../../src","sources":["core/OfflineManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useEffect, useRef, useState, useCallback } from 'react';
|
|
4
4
|
import { OfflineManager } from '../core/OfflineManager';
|
|
5
5
|
import { useNetworkStatus } from '../components/OfflineProvider';
|
|
6
6
|
export function useOfflineMutation(actionName, options) {
|
|
@@ -9,6 +9,8 @@ export function useOfflineMutation(actionName, options) {
|
|
|
9
9
|
} = useNetworkStatus();
|
|
10
10
|
const handlerRef = useRef(options?.handler);
|
|
11
11
|
handlerRef.current = options?.handler;
|
|
12
|
+
const [status, setStatus] = useState('idle');
|
|
13
|
+
const [error, setError] = useState(null);
|
|
12
14
|
|
|
13
15
|
// Register per-action handler (persists even after unmount)
|
|
14
16
|
useEffect(() => {
|
|
@@ -16,7 +18,11 @@ export function useOfflineMutation(actionName, options) {
|
|
|
16
18
|
OfflineManager.registerHandler(actionName, payload => handlerRef.current(payload));
|
|
17
19
|
}
|
|
18
20
|
}, [actionName]);
|
|
19
|
-
const
|
|
21
|
+
const reset = useCallback(() => {
|
|
22
|
+
setStatus('idle');
|
|
23
|
+
setError(null);
|
|
24
|
+
}, []);
|
|
25
|
+
const mutateOffline = useCallback(async payload => {
|
|
20
26
|
// Resolve which handler to use: per-action handler > global onSyncAction
|
|
21
27
|
const handler = handlerRef.current || OfflineManager.getHandler(actionName);
|
|
22
28
|
const globalHandler = OfflineManager.onSyncAction;
|
|
@@ -24,6 +30,8 @@ export function useOfflineMutation(actionName, options) {
|
|
|
24
30
|
if (isOnline && hasHandler) {
|
|
25
31
|
// ── ONLINE: Execute directly, skip the queue ──
|
|
26
32
|
if (__DEV__) console.log(`[OfflineQueue] mutate: ${actionName} (direct)`);
|
|
33
|
+
setStatus('loading');
|
|
34
|
+
setError(null);
|
|
27
35
|
try {
|
|
28
36
|
if (handler) {
|
|
29
37
|
await handler(payload);
|
|
@@ -36,22 +44,37 @@ export function useOfflineMutation(actionName, options) {
|
|
|
36
44
|
retryCount: 0
|
|
37
45
|
});
|
|
38
46
|
}
|
|
47
|
+
setStatus('success');
|
|
39
48
|
options?.onOptimisticSuccess?.(payload);
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
options?.onSuccess?.(payload);
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.warn(`[OfflineQueue] mutate: ${actionName} failed, falling back to queue`, err);
|
|
52
|
+
// API failed even though online → fallback to queue
|
|
42
53
|
await OfflineManager.push(actionName, payload);
|
|
54
|
+
setStatus('queued');
|
|
55
|
+
setError(err);
|
|
43
56
|
options?.onOptimisticSuccess?.(payload);
|
|
44
|
-
options?.onError?.(
|
|
57
|
+
options?.onError?.(err, payload);
|
|
45
58
|
}
|
|
46
59
|
} else {
|
|
47
60
|
// ── OFFLINE: Add to queue + optimistic update ──
|
|
48
61
|
if (__DEV__) console.log(`[OfflineQueue] mutate: ${actionName} (queued)`);
|
|
49
62
|
await OfflineManager.push(actionName, payload);
|
|
63
|
+
setStatus('queued');
|
|
64
|
+
setError(null);
|
|
50
65
|
options?.onOptimisticSuccess?.(payload);
|
|
51
66
|
}
|
|
52
|
-
};
|
|
67
|
+
}, [actionName, isOnline, options]);
|
|
53
68
|
return {
|
|
54
|
-
mutateOffline
|
|
69
|
+
mutateOffline,
|
|
70
|
+
status,
|
|
71
|
+
isIdle: status === 'idle',
|
|
72
|
+
isLoading: status === 'loading',
|
|
73
|
+
isSuccess: status === 'success',
|
|
74
|
+
isError: status === 'error',
|
|
75
|
+
isQueued: status === 'queued',
|
|
76
|
+
error,
|
|
77
|
+
reset
|
|
55
78
|
};
|
|
56
79
|
}
|
|
57
80
|
//# sourceMappingURL=useOfflineMutation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","OfflineManager","useNetworkStatus","useOfflineMutation","actionName","options","isOnline","handlerRef","handler","current","registerHandler","payload","mutateOffline","getHandler","globalHandler","onSyncAction","hasHandler","__DEV__","console","log","id","createdAt","Date","now","retryCount","onOptimisticSuccess","
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","useState","useCallback","OfflineManager","useNetworkStatus","useOfflineMutation","actionName","options","isOnline","handlerRef","handler","current","status","setStatus","error","setError","registerHandler","payload","reset","mutateOffline","getHandler","globalHandler","onSyncAction","hasHandler","__DEV__","console","log","id","createdAt","Date","now","retryCount","onOptimisticSuccess","onSuccess","err","warn","push","onError","isIdle","isLoading","isSuccess","isError","isQueued"],"sourceRoot":"../../../src","sources":["hooks/useOfflineMutation.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type OfflineManagerConfig } from '../core/OfflineManager';
|
|
3
|
-
|
|
3
|
+
export declare function useNetworkStatus(): {
|
|
4
4
|
isOnline: boolean | null;
|
|
5
|
-
}
|
|
6
|
-
export declare const useNetworkStatus: () => OfflineContextValue;
|
|
5
|
+
};
|
|
7
6
|
export interface OfflineProviderProps {
|
|
8
7
|
children: React.ReactNode;
|
|
9
8
|
config: OfflineManagerConfig;
|
|
10
9
|
}
|
|
11
10
|
export declare const OfflineProvider: React.FC<OfflineProviderProps>;
|
|
12
|
-
export {};
|
|
13
11
|
//# sourceMappingURL=OfflineProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OfflineProvider.d.ts","sourceRoot":"","sources":["../../../src/components/OfflineProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"OfflineProvider.d.ts","sourceRoot":"","sources":["../../../src/components/OfflineProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAGjD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnF,wBAAgB,gBAAgB;;EAQ/B;AAGD,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,oBAAoB,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA+B1D,CAAC"}
|
|
@@ -21,12 +21,18 @@ declare class OfflineManagerClass {
|
|
|
21
21
|
private useRecordAdapter;
|
|
22
22
|
private queueListeners;
|
|
23
23
|
private progressListeners;
|
|
24
|
+
private networkListeners;
|
|
24
25
|
private actionHandlers;
|
|
25
26
|
isInitialized: boolean;
|
|
26
27
|
syncMode: 'auto' | 'manual';
|
|
27
28
|
onSyncAction?: (action: OfflineAction) => Promise<void>;
|
|
28
29
|
onOnlineRestore?: OfflineManagerConfig['onOnlineRestore'];
|
|
29
30
|
isSyncing: boolean;
|
|
31
|
+
private _isOnline;
|
|
32
|
+
get isOnline(): boolean | null;
|
|
33
|
+
setOnline(online: boolean): void;
|
|
34
|
+
subscribeNetwork: (listener: () => void) => (() => void);
|
|
35
|
+
getNetworkSnapshot: () => boolean | null;
|
|
30
36
|
private _syncProgress;
|
|
31
37
|
get syncProgress(): SyncProgress;
|
|
32
38
|
configure(config: OfflineManagerConfig): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OfflineManager.d.ts","sourceRoot":"","sources":["../../../src/core/OfflineManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAC;AAG7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAWvD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,cAAc,GAAG,oBAAoB,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAG7B,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAGnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAGxD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KACnC,KAAK,IAAI,CAAC;CACZ;AAED,cAAM,mBAAmB;IACvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAqE;IACpF,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,gBAAgB,CAAkB;IAG1C,OAAO,CAAC,cAAc,CAA8B;IAGpD,OAAO,CAAC,iBAAiB,CAA8B;IAGvD,OAAO,CAAC,cAAc,CAA2D;IAE1E,aAAa,UAAS;IACtB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAY;IACvC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,SAAS,UAAS;IAGzB,OAAO,CAAC,aAAa,CAA8C;IAEnE,IAAW,YAAY,IAAI,YAAY,CAEtC;IAGY,SAAS,CAAC,MAAM,EAAE,oBAAoB;YAsCrC,SAAS;YAkBT,SAAS;IAahB,cAAc,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG1D;IAGK,SAAS,aANmB,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAMrB;IAEvC,OAAO,CAAC,oBAAoB;IAKrB,iBAAiB,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG7D;IAEF,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IAWb,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoBlE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,QAAQ,IAAI,aAAa,EAAE;IAK3B,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;IAI5E,iBAAiB,CAAC,UAAU,EAAE,MAAM;IAIpC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS;IAKvE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0FjC,mBAAmB;CAc3B;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"OfflineManager.d.ts","sourceRoot":"","sources":["../../../src/core/OfflineManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
|
+
export type MutationStatus = 'idle' | 'loading' | 'success' | 'error' | 'queued';
|
|
2
|
+
export interface OfflineMutationResult<TPayload> {
|
|
3
|
+
mutateOffline: (payload: TPayload) => Promise<void>;
|
|
4
|
+
status: MutationStatus;
|
|
5
|
+
isIdle: boolean;
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
isSuccess: boolean;
|
|
8
|
+
isError: boolean;
|
|
9
|
+
isQueued: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
reset: () => void;
|
|
12
|
+
}
|
|
1
13
|
export declare function useOfflineMutation<TPayload>(actionName: string, options?: {
|
|
2
14
|
handler?: (payload: TPayload) => Promise<void>;
|
|
3
15
|
onOptimisticSuccess?: (payload: TPayload) => void;
|
|
4
16
|
onError?: (error: Error, payload: TPayload) => void;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
17
|
+
onSuccess?: (payload: TPayload) => void;
|
|
18
|
+
}): OfflineMutationResult<TPayload>;
|
|
8
19
|
//# sourceMappingURL=useOfflineMutation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOfflineMutation.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOfflineMutation.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,CAAC,QAAQ,EACzC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"useOfflineMutation.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOfflineMutation.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjF,MAAM,WAAW,qBAAqB,CAAC,QAAQ;IAC7C,aAAa,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EACzC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CACzC,GACA,qBAAqB,CAAC,QAAQ,CAAC,CA8EjC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mustafaaksoy41/react-native-offline-queue",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "A flexible, high-performance offline queue and synchronizer for React Native. Works great with React Query (TanStack Query).",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -16,7 +16,12 @@
|
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "bob build",
|
|
19
|
-
"
|
|
19
|
+
"test": "jest",
|
|
20
|
+
"test:watch": "jest --watch",
|
|
21
|
+
"docs:dev": "vitepress dev docs",
|
|
22
|
+
"docs:build": "vitepress build docs",
|
|
23
|
+
"docs:preview": "vitepress preview docs",
|
|
24
|
+
"postinstall": "echo '\\n📦 react-native-offline-queue installed!\\n⚠️ Required peer: npm install @react-native-community/netinfo\\n💡 Optional peers: react-native-mmkv | @react-native-async-storage/async-storage | realm\\n'"
|
|
20
25
|
},
|
|
21
26
|
"keywords": [
|
|
22
27
|
"react-native",
|
|
@@ -58,10 +63,13 @@
|
|
|
58
63
|
},
|
|
59
64
|
"devDependencies": {
|
|
60
65
|
"@react-native-community/netinfo": "^11.0.0",
|
|
66
|
+
"@types/jest": "^30.0.0",
|
|
61
67
|
"@types/react": "^18.2.6",
|
|
68
|
+
"jest": "^30.2.0",
|
|
62
69
|
"react": "18.2.0",
|
|
63
70
|
"react-native": "0.73.4",
|
|
64
71
|
"react-native-builder-bob": "^0.30.0",
|
|
72
|
+
"ts-jest": "^29.4.6",
|
|
65
73
|
"typescript": "^5.0.2",
|
|
66
74
|
"vitepress": "^1.6.4",
|
|
67
75
|
"vue": "^3.5.29"
|
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
import { useSyncExternalStore } from 'react';
|
|
2
3
|
import NetInfo from '@react-native-community/netinfo';
|
|
3
4
|
import { OfflineManager, type OfflineManagerConfig } from '../core/OfflineManager';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
// ─── useNetworkStatus (useSyncExternalStore — zero unnecessary re-renders) ───
|
|
7
|
+
export function useNetworkStatus() {
|
|
8
|
+
const isOnline = useSyncExternalStore(
|
|
9
|
+
OfflineManager.subscribeNetwork,
|
|
10
|
+
OfflineManager.getNetworkSnapshot,
|
|
11
|
+
OfflineManager.getNetworkSnapshot
|
|
12
|
+
);
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
return { isOnline };
|
|
15
|
+
}
|
|
12
16
|
|
|
17
|
+
// ─── OfflineProvider ───
|
|
13
18
|
export interface OfflineProviderProps {
|
|
14
19
|
children: React.ReactNode;
|
|
15
20
|
config: OfflineManagerConfig;
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
export const OfflineProvider: React.FC<OfflineProviderProps> = ({ children, config }) => {
|
|
19
|
-
const [isOnline, setIsOnline] = useState<boolean | null>(null);
|
|
20
24
|
const wasOfflineRef = useRef(false);
|
|
21
25
|
|
|
22
26
|
useEffect(() => {
|
|
@@ -28,7 +32,8 @@ export const OfflineProvider: React.FC<OfflineProviderProps> = ({ children, conf
|
|
|
28
32
|
const connected = !!state.isConnected;
|
|
29
33
|
if (__DEV__) console.log('[OfflineQueue] Network:', connected ? 'online' : 'offline', '| type:', state.type);
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
// Update the singleton — only notifies listeners if value actually changed
|
|
36
|
+
OfflineManager.setOnline(connected);
|
|
32
37
|
|
|
33
38
|
if (!connected) {
|
|
34
39
|
wasOfflineRef.current = true;
|
|
@@ -44,9 +49,6 @@ export const OfflineProvider: React.FC<OfflineProviderProps> = ({ children, conf
|
|
|
44
49
|
return () => unsubscribe();
|
|
45
50
|
}, []);
|
|
46
51
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{children}
|
|
50
|
-
</OfflineContext.Provider>
|
|
51
|
-
);
|
|
52
|
+
// No context provider needed — useNetworkStatus reads from OfflineManager directly
|
|
53
|
+
return <>{children}</>;
|
|
52
54
|
};
|
|
@@ -46,6 +46,9 @@ class OfflineManagerClass {
|
|
|
46
46
|
// Progress listeners (for useSyncProgress)
|
|
47
47
|
private progressListeners: Set<() => void> = new Set();
|
|
48
48
|
|
|
49
|
+
// Network status listeners (for useNetworkStatus / useSyncExternalStore)
|
|
50
|
+
private networkListeners: Set<() => void> = new Set();
|
|
51
|
+
|
|
49
52
|
// Per-action handler registry
|
|
50
53
|
private actionHandlers: Map<string, (payload: any) => Promise<void>> = new Map();
|
|
51
54
|
|
|
@@ -55,6 +58,28 @@ class OfflineManagerClass {
|
|
|
55
58
|
public onOnlineRestore?: OfflineManagerConfig['onOnlineRestore'];
|
|
56
59
|
public isSyncing = false;
|
|
57
60
|
|
|
61
|
+
// ─── Network Status State ───
|
|
62
|
+
private _isOnline: boolean | null = null;
|
|
63
|
+
|
|
64
|
+
public get isOnline(): boolean | null {
|
|
65
|
+
return this._isOnline;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public setOnline(online: boolean) {
|
|
69
|
+
if (this._isOnline === online) return; // no change, no re-render
|
|
70
|
+
this._isOnline = online;
|
|
71
|
+
this.networkListeners.forEach((l) => l());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public subscribeNetwork = (listener: () => void): (() => void) => {
|
|
75
|
+
this.networkListeners.add(listener);
|
|
76
|
+
return () => this.networkListeners.delete(listener);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
public getNetworkSnapshot = (): boolean | null => {
|
|
80
|
+
return this._isOnline;
|
|
81
|
+
};
|
|
82
|
+
|
|
58
83
|
// ─── Sync Progress State ───
|
|
59
84
|
private _syncProgress: SyncProgress = { ...INITIAL_SYNC_PROGRESS };
|
|
60
85
|
|
|
@@ -1,19 +1,37 @@
|
|
|
1
|
-
import { useEffect, useRef } from 'react';
|
|
1
|
+
import { useEffect, useRef, useState, useCallback } from 'react';
|
|
2
2
|
import { OfflineManager } from '../core/OfflineManager';
|
|
3
3
|
import { useNetworkStatus } from '../components/OfflineProvider';
|
|
4
4
|
|
|
5
|
+
export type MutationStatus = 'idle' | 'loading' | 'success' | 'error' | 'queued';
|
|
6
|
+
|
|
7
|
+
export interface OfflineMutationResult<TPayload> {
|
|
8
|
+
mutateOffline: (payload: TPayload) => Promise<void>;
|
|
9
|
+
status: MutationStatus;
|
|
10
|
+
isIdle: boolean;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
isSuccess: boolean;
|
|
13
|
+
isError: boolean;
|
|
14
|
+
isQueued: boolean;
|
|
15
|
+
error: Error | null;
|
|
16
|
+
reset: () => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
5
19
|
export function useOfflineMutation<TPayload>(
|
|
6
20
|
actionName: string,
|
|
7
21
|
options?: {
|
|
8
22
|
handler?: (payload: TPayload) => Promise<void>;
|
|
9
23
|
onOptimisticSuccess?: (payload: TPayload) => void;
|
|
10
24
|
onError?: (error: Error, payload: TPayload) => void;
|
|
25
|
+
onSuccess?: (payload: TPayload) => void;
|
|
11
26
|
}
|
|
12
|
-
) {
|
|
27
|
+
): OfflineMutationResult<TPayload> {
|
|
13
28
|
const { isOnline } = useNetworkStatus();
|
|
14
29
|
const handlerRef = useRef(options?.handler);
|
|
15
30
|
handlerRef.current = options?.handler;
|
|
16
31
|
|
|
32
|
+
const [status, setStatus] = useState<MutationStatus>('idle');
|
|
33
|
+
const [error, setError] = useState<Error | null>(null);
|
|
34
|
+
|
|
17
35
|
// Register per-action handler (persists even after unmount)
|
|
18
36
|
useEffect(() => {
|
|
19
37
|
if (handlerRef.current) {
|
|
@@ -23,7 +41,12 @@ export function useOfflineMutation<TPayload>(
|
|
|
23
41
|
}
|
|
24
42
|
}, [actionName]);
|
|
25
43
|
|
|
26
|
-
const
|
|
44
|
+
const reset = useCallback(() => {
|
|
45
|
+
setStatus('idle');
|
|
46
|
+
setError(null);
|
|
47
|
+
}, []);
|
|
48
|
+
|
|
49
|
+
const mutateOffline = useCallback(async (payload: TPayload) => {
|
|
27
50
|
// Resolve which handler to use: per-action handler > global onSyncAction
|
|
28
51
|
const handler = handlerRef.current || OfflineManager.getHandler(actionName);
|
|
29
52
|
const globalHandler = OfflineManager.onSyncAction;
|
|
@@ -32,6 +55,8 @@ export function useOfflineMutation<TPayload>(
|
|
|
32
55
|
if (isOnline && hasHandler) {
|
|
33
56
|
// ── ONLINE: Execute directly, skip the queue ──
|
|
34
57
|
if (__DEV__) console.log(`[OfflineQueue] mutate: ${actionName} (direct)`);
|
|
58
|
+
setStatus('loading');
|
|
59
|
+
setError(null);
|
|
35
60
|
try {
|
|
36
61
|
if (handler) {
|
|
37
62
|
await handler(payload);
|
|
@@ -44,20 +69,37 @@ export function useOfflineMutation<TPayload>(
|
|
|
44
69
|
retryCount: 0,
|
|
45
70
|
});
|
|
46
71
|
}
|
|
72
|
+
setStatus('success');
|
|
47
73
|
options?.onOptimisticSuccess?.(payload);
|
|
48
|
-
|
|
49
|
-
|
|
74
|
+
options?.onSuccess?.(payload);
|
|
75
|
+
} catch (err: any) {
|
|
76
|
+
console.warn(`[OfflineQueue] mutate: ${actionName} failed, falling back to queue`, err);
|
|
77
|
+
// API failed even though online → fallback to queue
|
|
50
78
|
await OfflineManager.push(actionName, payload);
|
|
79
|
+
setStatus('queued');
|
|
80
|
+
setError(err);
|
|
51
81
|
options?.onOptimisticSuccess?.(payload);
|
|
52
|
-
options?.onError?.(
|
|
82
|
+
options?.onError?.(err, payload);
|
|
53
83
|
}
|
|
54
84
|
} else {
|
|
55
85
|
// ── OFFLINE: Add to queue + optimistic update ──
|
|
56
86
|
if (__DEV__) console.log(`[OfflineQueue] mutate: ${actionName} (queued)`);
|
|
57
87
|
await OfflineManager.push(actionName, payload);
|
|
88
|
+
setStatus('queued');
|
|
89
|
+
setError(null);
|
|
58
90
|
options?.onOptimisticSuccess?.(payload);
|
|
59
91
|
}
|
|
60
|
-
};
|
|
92
|
+
}, [actionName, isOnline, options]);
|
|
61
93
|
|
|
62
|
-
return {
|
|
94
|
+
return {
|
|
95
|
+
mutateOffline,
|
|
96
|
+
status,
|
|
97
|
+
isIdle: status === 'idle',
|
|
98
|
+
isLoading: status === 'loading',
|
|
99
|
+
isSuccess: status === 'success',
|
|
100
|
+
isError: status === 'error',
|
|
101
|
+
isQueued: status === 'queued',
|
|
102
|
+
error,
|
|
103
|
+
reset,
|
|
104
|
+
};
|
|
63
105
|
}
|