@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 CHANGED
@@ -29,6 +29,11 @@ Queue operations when offline, sync automatically or manually when connectivity
29
29
  <!-- Core Dependency -->
30
30
  [![NetInfo](https://img.shields.io/badge/NetInfo-0088CC?style=for-the-badge&logo=wifi&logoColor=white)](https://github.com/react-native-netinfo/react-native-netinfo)
31
31
 
32
+ <!-- CI & Testing -->
33
+ [![Tests](https://github.com/messivite/react-native-offline-queue/actions/workflows/tests.yml/badge.svg)](https://github.com/messivite/react-native-offline-queue/actions/workflows/tests.yml)
34
+ [![Jest](https://img.shields.io/badge/tested_with-Jest-99424f?style=for-the-badge&logo=jest&logoColor=white)](https://jestjs.io/)
35
+ [![Coverage](https://img.shields.io/badge/coverage-38_tests-brightgreen?style=for-the-badge&logo=codecov&logoColor=white)](#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
- If you already use React Query, this package works alongside it. The key: **share the same API function** for both React Query mutations and the offline queue handler.
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
- Define your API calls in one place. Use them in the offline queue `handler` and optionally in React Query's `useMutation`:
344
+ **Pattern Handler uses `mutateAsync` from `useMutation`**
315
345
 
316
346
  ```tsx
317
- // api/posts.ts
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 createPost(payload);
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
- **Pattern 2 Centralized `onSyncAction` with React Query**
385
+ **With custom hooks / API layer**
359
386
 
360
- Handle all actions in one place and use `queryClient` for cache updates:
387
+ If your mutations live in custom hooks:
361
388
 
362
389
  ```tsx
363
- // App.tsx
364
- import { useQueryClient } from '@tanstack/react-query';
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
- return (
372
- <OfflineProvider
373
- config={{
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
- // Wrap with QueryClientProvider
396
- export default function App() {
397
- return (
398
- <QueryClientProvider client={queryClient}>
399
- <AppWithProviders />
400
- </QueryClientProvider>
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
- | What | Use |
408
- |------|-----|
409
- | API call (fetch/axios) | Same function in both `mutationFn` and `handler` |
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
- React Query handles **queries** (reading data). This package handles **mutations when offline** (queue + sync). They work together.
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
- ```tsx
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
- mutateOffline({ title: 'Hello', body: 'World' });
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 specific action. Registered automatically. |
527
- | `onOptimisticSuccess` | `(payload) => void` | Fires immediately for instant UI updates |
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
- Simple connectivity status.
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
- const { isOnline } = useNetworkStatus();
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.useNetworkStatus = exports.OfflineProvider = void 0;
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
- const OfflineContext = /*#__PURE__*/(0, _react.createContext)({
14
- isOnline: true
15
- });
16
- const useNetworkStatus = () => (0, _react.useContext)(OfflineContext);
17
- exports.useNetworkStatus = useNetworkStatus;
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
- setIsOnline(connected);
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
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(OfflineContext.Provider, {
44
- value: {
45
- isOnline
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","OfflineContext","createContext","isOnline","useNetworkStatus","useContext","exports","OfflineProvider","children","config","setIsOnline","useState","wasOfflineRef","useRef","useEffect","OfflineManager","configure","unsubscribe","NetInfo","addEventListener","state","connected","isConnected","__DEV__","console","log","type","current","handleOnlineRestore","jsx","Provider","value"],"sourceRoot":"../../../src","sources":["components/OfflineProvider.tsx"],"mappings":"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","ignoreList":[]}
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":";;;;;;AACA,IAAAA,eAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAGA;AACA,SAASG,YAAYA,CAAA,EAAG;EACtB,OAAO,sCAAsC,CAACC,OAAO,CAAC,OAAO,EAAE,UAAUC,CAAC,EAAE;IAC1E,MAAMC,CAAC,GAAIC,IAAI,CAACC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAI,CAAC;MAChCC,CAAC,GAAGJ,CAAC,KAAK,GAAG,GAAGC,CAAC,GAAIA,CAAC,GAAG,GAAG,GAAI,GAAG;IACrC,OAAOG,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC;EACvB,CAAC,CAAC;AACJ;AAsBA,MAAMC,mBAAmB,CAAC;EAChBC,KAAK,GAAoB,EAAE;EAC3BC,OAAO,GAA0C,IAAIC,oCAAoB,CAAC,CAAC;EAC3EC,UAAU,GAAW,kCAAkC;EACvDC,gBAAgB,GAAY,KAAK;;EAEzC;EACQC,cAAc,GAAoB,IAAIC,GAAG,CAAC,CAAC;;EAEnD;EACQC,iBAAiB,GAAoB,IAAID,GAAG,CAAC,CAAC;;EAEtD;EACQE,gBAAgB,GAAoB,IAAIF,GAAG,CAAC,CAAC;;EAErD;EACQG,cAAc,GAAiD,IAAIC,GAAG,CAAC,CAAC;EAEzEC,aAAa,GAAG,KAAK;EACrBC,QAAQ,GAAsB,QAAQ;EAGtCC,SAAS,GAAG,KAAK;;EAExB;EACQC,SAAS,GAAmB,IAAI;EAExC,IAAWC,QAAQA,CAAA,EAAmB;IACpC,OAAO,IAAI,CAACD,SAAS;EACvB;EAEOE,SAASA,CAACC,MAAe,EAAE;IAChC,IAAI,IAAI,CAACH,SAAS,KAAKG,MAAM,EAAE,OAAO,CAAC;IACvC,IAAI,CAACH,SAAS,GAAGG,MAAM;IACvB,IAAI,CAACT,gBAAgB,CAACU,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAAC,CAAC,CAAC;EAC3C;EAEOC,gBAAgB,GAAIC,QAAoB,IAAmB;IAChE,IAAI,CAACb,gBAAgB,CAACc,GAAG,CAACD,QAAQ,CAAC;IACnC,OAAO,MAAM,IAAI,CAACb,gBAAgB,CAACe,MAAM,CAACF,QAAQ,CAAC;EACrD,CAAC;EAEMG,kBAAkB,GAAGA,CAAA,KAAsB;IAChD,OAAO,IAAI,CAACV,SAAS;EACvB,CAAC;;EAED;EACQW,aAAa,GAAiB;IAAE,GAAGC;EAAsB,CAAC;EAElE,IAAWC,YAAYA,CAAA,EAAiB;IACtC,OAAO,IAAI,CAACF,aAAa;EAC3B;;EAEA;EACA,MAAaG,SAASA,CAACC,MAA4B,EAAE;IACnD,IAAIA,MAAM,CAACC,WAAW,EAAE;MACtB,IAAID,MAAM,CAACC,WAAW,KAAK,MAAM,EAAE;QACjC,IAAI,CAAC7B,OAAO,GAAG,IAAA8B,wBAAc,EAAC,CAAC;QAC/B,IAAI,CAAC3B,gBAAgB,GAAG,KAAK;MAC/B,CAAC,MAAM,IAAIyB,MAAM,CAACC,WAAW,KAAK,eAAe,EAAE;QACjD,IAAI,CAAC7B,OAAO,GAAG,IAAA+B,gCAAsB,EAAC,CAAC;QACvC,IAAI,CAAC5B,gBAAgB,GAAG,KAAK;MAC/B,CAAC,MAAM,IAAIyB,MAAM,CAACC,WAAW,KAAK,OAAO,EAAE;QACzC,IAAI,CAAC7B,OAAO,GAAG,IAAAgC,yBAAe,EAACJ,MAAM,CAACK,YAAY,CAAC;QACnD,IAAI,CAAC9B,gBAAgB,GAAG,IAAI;MAC9B,CAAC,MAAM;QACL,IAAI,CAACH,OAAO,GAAG,IAAIC,oCAAoB,CAAC,CAAC;QACzC,IAAI,CAACE,gBAAgB,GAAG,KAAK;MAC/B;IACF,CAAC,MAAM,IAAIyB,MAAM,CAAC5B,OAAO,EAAE;MACzB,IAAI,CAACA,OAAO,GAAG4B,MAAM,CAAC5B,OAAO;MAC7B,IAAI,CAACG,gBAAgB,GAAG,IAAA+B,+BAAe,EAACN,MAAM,CAAC5B,OAAO,CAAC;IACzD;IAEA,IAAI4B,MAAM,CAAC1B,UAAU,EAAE;MACrB,IAAI,CAACA,UAAU,GAAG0B,MAAM,CAAC1B,UAAU;IACrC;IACA,IAAI0B,MAAM,CAACjB,QAAQ,EAAE;MACnB,IAAI,CAACA,QAAQ,GAAGiB,MAAM,CAACjB,QAAQ;IACjC;IACA,IAAIiB,MAAM,CAACO,YAAY,EAAE;MACvB,IAAI,CAACA,YAAY,GAAGP,MAAM,CAACO,YAAY;IACzC;IACA,IAAIP,MAAM,CAACQ,eAAe,EAAE;MAC1B,IAAI,CAACA,eAAe,GAAGR,MAAM,CAACQ,eAAe;IAC/C;IAEA,MAAM,IAAI,CAACC,SAAS,CAAC,CAAC;IACtB,IAAI,CAAC3B,aAAa,GAAG,IAAI;EAC3B;;EAEA;EACA,MAAc2B,SAASA,CAAA,EAAG;IACxB,IAAI;MACF,IAAI,IAAI,CAAClC,gBAAgB,EAAE;QACzB,MAAMmC,OAAO,GAAG,IAAI,CAACtC,OAA+B;QACpD,IAAI,CAACD,KAAK,GAAG,MAAMuC,OAAO,CAACC,MAAM,CAAC,CAAC;MACrC,CAAC,MAAM;QACL,MAAMD,OAAO,GAAG,IAAI,CAACtC,OAAyB;QAC9C,MAAMwC,IAAI,GAAG,MAAMF,OAAO,CAACG,OAAO,CAAC,IAAI,CAACvC,UAAU,CAAC;QACnD,IAAIsC,IAAI,EAAE;UACR,IAAI,CAACzC,KAAK,GAAG2C,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC,IAAI,EAAE;QACrC;MACF;MACA,IAAI,CAACI,oBAAoB,CAAC,CAAC;IAC7B,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVC,OAAO,CAACC,IAAI,CAAC,oDAAoD,EAAEF,CAAC,CAAC;IACvE;EACF;EAEA,MAAcG,SAASA,CAAA,EAAG;IACxB,IAAI;MACF,IAAI,CAAC,IAAI,CAAC7C,gBAAgB,EAAE;QAC1B,MAAMmC,OAAO,GAAG,IAAI,CAACtC,OAAyB;QAC9C,MAAMsC,OAAO,CAACW,OAAO,CAAC,IAAI,CAAC/C,UAAU,EAAEwC,IAAI,CAACQ,SAAS,CAAC,IAAI,CAACnD,KAAK,CAAC,CAAC;MACpE;MACA;IACF,CAAC,CAAC,OAAO8C,CAAC,EAAE;MACVC,OAAO,CAACC,IAAI,CAAC,kDAAkD,EAAEF,CAAC,CAAC;IACrE;EACF;;EAEA;EACOM,cAAc,GAAI/B,QAAoB,IAAmB;IAC9D,IAAI,CAAChB,cAAc,CAACiB,GAAG,CAACD,QAAQ,CAAC;IACjC,OAAO,MAAM,IAAI,CAAChB,cAAc,CAACkB,MAAM,CAACF,QAAQ,CAAC;EACnD,CAAC;;EAED;EACOgC,SAAS,GAAG,IAAI,CAACD,cAAc;EAE9BP,oBAAoBA,CAAA,EAAG;IAC7B,IAAI,CAACxC,cAAc,CAACa,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAAC,CAAC,CAAC;EACzC;;EAEA;EACOmC,iBAAiB,GAAIjC,QAAoB,IAAmB;IACjE,IAAI,CAACd,iBAAiB,CAACe,GAAG,CAACD,QAAQ,CAAC;IACpC,OAAO,MAAM,IAAI,CAACd,iBAAiB,CAACgB,MAAM,CAACF,QAAQ,CAAC;EACtD,CAAC;EAEOkC,cAAcA,CAACC,OAA8B,EAAE;IACrD,IAAI,CAAC/B,aAAa,GAAG;MAAE,GAAG,IAAI,CAACA,aAAa;MAAE,GAAG+B;IAAQ,CAAC;IAC1D,IAAI,CAACjD,iBAAiB,CAACW,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAAC,CAAC,CAAC;EAC5C;EAEQsC,kBAAkBA,CAACC,EAAU,EAAEC,MAAiC,EAAE;IACxE,IAAI,CAAClC,aAAa,GAAG;MACnB,GAAG,IAAI,CAACA,aAAa;MACrBmC,KAAK,EAAE,IAAI,CAACnC,aAAa,CAACmC,KAAK,CAACC,GAAG,CAAEC,IAAI,IACvCA,IAAI,CAACC,MAAM,CAACL,EAAE,KAAKA,EAAE,GAAG;QAAE,GAAGI,IAAI;QAAE,GAAGH;MAAO,CAAC,GAAGG,IACnD;IACF,CAAC;IACD,IAAI,CAACvD,iBAAiB,CAACW,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAAC,CAAC,CAAC;EAC5C;;EAEA;EACA,MAAa6C,IAAIA,CAAIC,UAAkB,EAAEC,OAAU,EAA6B;IAC9E,MAAMH,MAAwB,GAAG;MAC/BL,EAAE,EAAEnE,YAAY,CAAC,CAAC;MAClB0E,UAAU;MACVC,OAAO;MACPC,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;MACrBC,UAAU,EAAE;IACd,CAAC;IACD,IAAI,CAACtE,KAAK,GAAG,CAAC,GAAG,IAAI,CAACA,KAAK,EAAE+D,MAAM,CAAC;IAEpC,IAAI,IAAI,CAAC3D,gBAAgB,EAAE;MACzB,MAAO,IAAI,CAACH,OAAO,CAA0BsE,MAAM,CAACR,MAAuB,CAAC;IAC9E,CAAC,MAAM;MACL,MAAM,IAAI,CAACd,SAAS,CAAC,CAAC;IACxB;IAEA,IAAI,CAACJ,oBAAoB,CAAC,CAAC;IAC3B,OAAOkB,MAAM;EACf;EAEA,MAAaS,MAAMA,CAACd,EAAU,EAAiB;IAC7C,IAAI,CAAC1D,KAAK,GAAG,IAAI,CAACA,KAAK,CAACyE,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAAChB,EAAE,KAAKA,EAAE,CAAC;IAElD,IAAI,IAAI,CAACtD,gBAAgB,EAAE;MACzB,MAAO,IAAI,CAACH,OAAO,CAA0BuE,MAAM,CAACd,EAAE,CAAC;IACzD,CAAC,MAAM;MACL,MAAM,IAAI,CAACT,SAAS,CAAC,CAAC;IACxB;IAEA,IAAI,CAACJ,oBAAoB,CAAC,CAAC;EAC7B;EAEA,MAAa8B,KAAKA,CAAA,EAAkB;IAClC,IAAI,CAAC3E,KAAK,GAAG,EAAE;IAEf,IAAI,IAAI,CAACI,gBAAgB,EAAE;MACzB,MAAO,IAAI,CAACH,OAAO,CAA0B0E,KAAK,CAAC,CAAC;IACtD,CAAC,MAAM;MACL,MAAM,IAAI,CAAC1B,SAAS,CAAC,CAAC;IACxB;IAEA,IAAI,CAACJ,oBAAoB,CAAC,CAAC;IAC3B,IAAI,CAACU,cAAc,CAAC;MAAE,GAAG7B;IAAsB,CAAC,CAAC;EACnD;EAEOkD,QAAQA,CAAA,EAAoB;IACjC,OAAO,IAAI,CAAC5E,KAAK;EACnB;;EAEA;EACO6E,eAAeA,CAACZ,UAAkB,EAAEa,OAAwC,EAAE;IACnF,IAAI,CAACrE,cAAc,CAACsE,GAAG,CAACd,UAAU,EAAEa,OAAO,CAAC;EAC9C;EAEOE,iBAAiBA,CAACf,UAAkB,EAAE;IAC3C,IAAI,CAACxD,cAAc,CAACc,MAAM,CAAC0C,UAAU,CAAC;EACxC;EAEOgB,UAAUA,CAAChB,UAAkB,EAAiD;IACnF,OAAO,IAAI,CAACxD,cAAc,CAACyE,GAAG,CAACjB,UAAU,CAAC;EAC5C;;EAEA;EACA,MAAakB,UAAUA,CAAA,EAAkB;IACvC,IAAI,IAAI,CAACnF,KAAK,CAACoF,MAAM,KAAK,CAAC,IAAI,IAAI,CAACvE,SAAS,EAAE;MAC7C;IACF;IAEA,MAAMwE,aAAa,GAAG,IAAI,CAACjD,YAAY,IAAI,IAAI,CAAC3B,cAAc,CAAC6E,IAAI,GAAG,CAAC;IACvE,IAAI,CAACD,aAAa,EAAE;MAClBtC,OAAO,CAACC,IAAI,CAAC,yEAAyE,CAAC;MACvF;IACF;IAEA,IAAI,CAACnC,SAAS,GAAG,IAAI;IACrB,IAAI,CAACgC,oBAAoB,CAAC,CAAC;IAE3B,MAAM0C,YAAY,GAAG,CAAC,GAAG,IAAI,CAACvF,KAAK,CAAC;;IAEpC;IACA,MAAMwF,aAAiC,GAAGD,YAAY,CAAC1B,GAAG,CAAEE,MAAM,KAAM;MACtEA,MAAM;MACN0B,MAAM,EAAE;IACV,CAAC,CAAC,CAAC;IAEH,IAAI,CAAClC,cAAc,CAAC;MAClBmC,QAAQ,EAAE,IAAI;MACdC,UAAU,EAAEJ,YAAY,CAACH,MAAM;MAC/BQ,cAAc,EAAE,CAAC;MACjBC,WAAW,EAAE,CAAC;MACdC,aAAa,EAAE,IAAI;MACnBlC,KAAK,EAAE4B;IACT,CAAC,CAAC;IAEF,IAAII,cAAc,GAAG,CAAC;IACtB,IAAIC,WAAW,GAAG,CAAC;IAEnB,KAAK,MAAM9B,MAAM,IAAIwB,YAAY,EAAE;MACjC;MACA,IAAI,CAAChC,cAAc,CAAC;QAAEuC,aAAa,EAAE/B;MAAO,CAAC,CAAC;MAC9C,IAAI,CAACN,kBAAkB,CAACM,MAAM,CAACL,EAAE,EAAE;QAAE+B,MAAM,EAAE;MAAU,CAAC,CAAC;MAEzD,IAAI;QACF;QACA,MAAMX,OAAO,GAAG,IAAI,CAACrE,cAAc,CAACyE,GAAG,CAACnB,MAAM,CAACE,UAAU,CAAC;QAC1D,IAAIa,OAAO,EAAE;UACX,MAAMA,OAAO,CAACf,MAAM,CAACG,OAAO,CAAC;QAC/B,CAAC,MAAM,IAAI,IAAI,CAAC9B,YAAY,EAAE;UAC5B,MAAM,IAAI,CAACA,YAAY,CAAC2B,MAAM,CAAC;QACjC,CAAC,MAAM;UACL,MAAM,IAAIgC,KAAK,CAAC,qCAAqChC,MAAM,CAACE,UAAU,EAAE,CAAC;QAC3E;;QAEA;QACA,MAAM,IAAI,CAACO,MAAM,CAACT,MAAM,CAACL,EAAE,CAAC;QAC5BkC,cAAc,EAAE;QAChB,IAAI,CAACnC,kBAAkB,CAACM,MAAM,CAACL,EAAE,EAAE;UAAE+B,MAAM,EAAE;QAAU,CAAC,CAAC;QACzD,IAAI,CAAClC,cAAc,CAAC;UAAEqC;QAAe,CAAC,CAAC;MACzC,CAAC,CAAC,OAAOI,KAAU,EAAE;QACnBjD,OAAO,CAACC,IAAI,CAAC,2BAA2Be,MAAM,CAACE,UAAU,kBAAkB,EAAE+B,KAAK,CAAC;;QAEnF;QACAH,WAAW,EAAE;QACb,IAAI,CAACpC,kBAAkB,CAACM,MAAM,CAACL,EAAE,EAAE;UACjC+B,MAAM,EAAE,QAAQ;UAChBO,KAAK,EAAEA,KAAK,EAAEC,OAAO,IAAI;QAC3B,CAAC,CAAC;QACF,IAAI,CAAC1C,cAAc,CAAC;UAAEsC;QAAY,CAAC,CAAC;;QAEpC;QACA,MAAMK,MAAM,GAAG,IAAI,CAAClG,KAAK,CAACmG,IAAI,CAAEzB,CAAC,IAAKA,CAAC,CAAChB,EAAE,KAAKK,MAAM,CAACL,EAAE,CAAC;QACzD,IAAIwC,MAAM,EAAE;UACVA,MAAM,CAAC5B,UAAU,IAAI,CAAC;QACxB;QAEA,IAAI,IAAI,CAAClE,gBAAgB,EAAE;UACzB,MAAO,IAAI,CAACH,OAAO,CAA0B0D,MAAM,CAACI,MAAM,CAACL,EAAE,EAAE;YAC7DY,UAAU,EAAG4B,MAAM,EAAE5B,UAAU,IAAI;UACrC,CAAC,CAAC;QACJ,CAAC,MAAM;UACL,MAAM,IAAI,CAACrB,SAAS,CAAC,CAAC;QACxB;QAEA,IAAI,CAACJ,oBAAoB,CAAC,CAAC;MAC7B;IACF;IAEA,IAAI,CAAChC,SAAS,GAAG,KAAK;IACtB,IAAI,CAAC0C,cAAc,CAAC;MAAEmC,QAAQ,EAAE,KAAK;MAAEI,aAAa,EAAE;IAAK,CAAC,CAAC;IAC7D,IAAI,CAACjD,oBAAoB,CAAC,CAAC;EAC7B;;EAEA;EACOuD,mBAAmBA,CAAA,EAAG;IAC3B,IAAI,IAAI,CAACpG,KAAK,CAACoF,MAAM,KAAK,CAAC,EAAE;IAE7B,IAAI,IAAI,CAACxE,QAAQ,KAAK,MAAM,EAAE;MAC5B,IAAI,CAACuE,UAAU,CAAC,CAAC;IACnB,CAAC,MAAM,IAAI,IAAI,CAACvE,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAACyB,eAAe,EAAE;MAC7D,IAAI,CAACA,eAAe,CAAC;QACnBgE,YAAY,EAAE,IAAI,CAACrG,KAAK,CAACoF,MAAM;QAC/BkB,OAAO,EAAEA,CAAA,KAAM,IAAI,CAACnB,UAAU,CAAC,CAAC;QAChCoB,YAAY,EAAEA,CAAA,KAAM,IAAI,CAAC5B,KAAK,CAAC;MACjC,CAAC,CAAC;IACJ;IACA;EACF;AACF;AAEO,MAAM6B,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG,IAAIzG,mBAAmB,CAAC,CAAC","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 mutateOffline = async payload => {
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
- } catch (error) {
45
- console.warn(`[OfflineQueue] mutate: ${actionName} failed, falling back to queue`, error);
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?.(error, payload);
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","error","warn","push","onError"],"sourceRoot":"../../../src","sources":["hooks/useOfflineMutation.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AAEO,SAASG,kBAAkBA,CAChCC,UAAkB,EAClBC,OAIC,EACD;EACA,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;EACA,IAAAE,gBAAS,EAAC,MAAM;IACd,IAAIJ,UAAU,CAACG,OAAO,EAAE;MACtBE,8BAAc,CAACC,eAAe,CAACV,UAAU,EAAGW,OAAY,IACtDP,UAAU,CAACG,OAAO,CAAEI,OAAO,CAC7B,CAAC;IACH;EACF,CAAC,EAAE,CAACX,UAAU,CAAC,CAAC;EAEhB,MAAMY,aAAa,GAAG,MAAOD,OAAiB,IAAK;IACjD;IACA,MAAML,OAAO,GAAGF,UAAU,CAACG,OAAO,IAAIE,8BAAc,CAACI,UAAU,CAACb,UAAU,CAAC;IAC3E,MAAMc,aAAa,GAAGL,8BAAc,CAACM,YAAY;IACjD,MAAMC,UAAU,GAAGV,OAAO,IAAIQ,aAAa;IAE3C,IAAIZ,QAAQ,IAAIc,UAAU,EAAE;MAC1B;MACA,IAAIC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0BnB,UAAU,WAAW,CAAC;MACzE,IAAI;QACF,IAAIM,OAAO,EAAE;UACX,MAAMA,OAAO,CAACK,OAAO,CAAC;QACxB,CAAC,MAAM,IAAIG,aAAa,EAAE;UACxB,MAAMA,aAAa,CAAC;YAClBM,EAAE,EAAE,EAAE;YACNpB,UAAU;YACVW,OAAO;YACPU,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;YACrBC,UAAU,EAAE;UACd,CAAC,CAAC;QACJ;QACAvB,OAAO,EAAEwB,mBAAmB,GAAGd,OAAO,CAAC;MACzC,CAAC,CAAC,OAAOe,KAAU,EAAE;QACnBR,OAAO,CAACS,IAAI,CAAC,0BAA0B3B,UAAU,gCAAgC,EAAE0B,KAAK,CAAC;QACzF,MAAMjB,8BAAc,CAACmB,IAAI,CAAC5B,UAAU,EAAEW,OAAO,CAAC;QAC9CV,OAAO,EAAEwB,mBAAmB,GAAGd,OAAO,CAAC;QACvCV,OAAO,EAAE4B,OAAO,GAAGH,KAAK,EAAEf,OAAO,CAAC;MACpC;IACF,CAAC,MAAM;MACL;MACA,IAAIM,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0BnB,UAAU,WAAW,CAAC;MACzE,MAAMS,8BAAc,CAACmB,IAAI,CAAC5B,UAAU,EAAEW,OAAO,CAAC;MAC9CV,OAAO,EAAEwB,mBAAmB,GAAGd,OAAO,CAAC;IACzC;EACF,CAAC;EAED,OAAO;IAAEC;EAAc,CAAC;AAC1B","ignoreList":[]}
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":"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","ignoreList":[]}
@@ -1,18 +1,25 @@
1
1
  "use strict";
2
2
 
3
- import React, { createContext, useContext, useEffect, useRef, useState } from '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
- import { jsx as _jsx } from "react/jsx-runtime";
7
- const OfflineContext = /*#__PURE__*/createContext({
8
- isOnline: true
9
- });
10
- export const useNetworkStatus = () => useContext(OfflineContext);
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
- setIsOnline(connected);
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
- return /*#__PURE__*/_jsx(OfflineContext.Provider, {
37
- value: {
38
- isOnline
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","createContext","useContext","useEffect","useRef","useState","NetInfo","OfflineManager","jsx","_jsx","OfflineContext","isOnline","useNetworkStatus","OfflineProvider","children","config","setIsOnline","wasOfflineRef","configure","unsubscribe","addEventListener","state","connected","isConnected","__DEV__","console","log","type","current","handleOnlineRestore","Provider","value"],"sourceRoot":"../../../src","sources":["components/OfflineProvider.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,aAAa,EAAEC,UAAU,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACrF,OAAOC,OAAO,MAAM,iCAAiC;AACrD,SAASC,cAAc,QAAmC,wBAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAMnF,MAAMC,cAAc,gBAAGT,aAAa,CAAsB;EAAEU,QAAQ,EAAE;AAAK,CAAC,CAAC;AAE7E,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAAMV,UAAU,CAACQ,cAAc,CAAC;AAOhE,OAAO,MAAMG,eAA+C,GAAGA,CAAC;EAAEC,QAAQ;EAAEC;AAAO,CAAC,KAAK;EACrF,MAAM,CAACJ,QAAQ,EAAEK,WAAW,CAAC,GAAGX,QAAQ,CAAiB,IAAI,CAAC;EAC9D,MAAMY,aAAa,GAAGb,MAAM,CAAC,KAAK,CAAC;EAEnCD,SAAS,CAAC,MAAM;IACZI,cAAc,CAACW,SAAS,CAACH,MAAM,CAAC;EACpC,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEZZ,SAAS,CAAC,MAAM;IACZ,MAAMgB,WAAW,GAAGb,OAAO,CAACc,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;MAE5GX,WAAW,CAACM,SAAS,CAAC;MAEtB,IAAI,CAACA,SAAS,EAAE;QACZL,aAAa,CAACW,OAAO,GAAG,IAAI;MAChC;MAEA,IAAIN,SAAS,IAAIL,aAAa,CAACW,OAAO,EAAE;QACpCX,aAAa,CAACW,OAAO,GAAG,KAAK;QAC7B,IAAIJ,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0DAA0D,CAAC;QACpFnB,cAAc,CAACsB,mBAAmB,CAAC,CAAC;MACxC;IACJ,CAAC,CAAC;IAEF,OAAO,MAAMV,WAAW,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,oBACIV,IAAA,CAACC,cAAc,CAACoB,QAAQ;IAACC,KAAK,EAAE;MAAEpB;IAAS,CAAE;IAAAG,QAAA,EACxCA;EAAQ,CACY,CAAC;AAElC,CAAC","ignoreList":[]}
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 mutateOffline = async payload => {
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
- } catch (error) {
41
- console.warn(`[OfflineQueue] mutate: ${actionName} failed, falling back to queue`, error);
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?.(error, payload);
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","error","warn","push","onError"],"sourceRoot":"../../../src","sources":["hooks/useOfflineMutation.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,gBAAgB,QAAQ,+BAA+B;AAEhE,OAAO,SAASC,kBAAkBA,CAChCC,UAAkB,EAClBC,OAIC,EACD;EACA,MAAM;IAAEC;EAAS,CAAC,GAAGJ,gBAAgB,CAAC,CAAC;EACvC,MAAMK,UAAU,GAAGP,MAAM,CAACK,OAAO,EAAEG,OAAO,CAAC;EAC3CD,UAAU,CAACE,OAAO,GAAGJ,OAAO,EAAEG,OAAO;;EAErC;EACAT,SAAS,CAAC,MAAM;IACd,IAAIQ,UAAU,CAACE,OAAO,EAAE;MACtBR,cAAc,CAACS,eAAe,CAACN,UAAU,EAAGO,OAAY,IACtDJ,UAAU,CAACE,OAAO,CAAEE,OAAO,CAC7B,CAAC;IACH;EACF,CAAC,EAAE,CAACP,UAAU,CAAC,CAAC;EAEhB,MAAMQ,aAAa,GAAG,MAAOD,OAAiB,IAAK;IACjD;IACA,MAAMH,OAAO,GAAGD,UAAU,CAACE,OAAO,IAAIR,cAAc,CAACY,UAAU,CAACT,UAAU,CAAC;IAC3E,MAAMU,aAAa,GAAGb,cAAc,CAACc,YAAY;IACjD,MAAMC,UAAU,GAAGR,OAAO,IAAIM,aAAa;IAE3C,IAAIR,QAAQ,IAAIU,UAAU,EAAE;MAC1B;MACA,IAAIC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0Bf,UAAU,WAAW,CAAC;MACzE,IAAI;QACF,IAAII,OAAO,EAAE;UACX,MAAMA,OAAO,CAACG,OAAO,CAAC;QACxB,CAAC,MAAM,IAAIG,aAAa,EAAE;UACxB,MAAMA,aAAa,CAAC;YAClBM,EAAE,EAAE,EAAE;YACNhB,UAAU;YACVO,OAAO;YACPU,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;YACrBC,UAAU,EAAE;UACd,CAAC,CAAC;QACJ;QACAnB,OAAO,EAAEoB,mBAAmB,GAAGd,OAAO,CAAC;MACzC,CAAC,CAAC,OAAOe,KAAU,EAAE;QACnBR,OAAO,CAACS,IAAI,CAAC,0BAA0BvB,UAAU,gCAAgC,EAAEsB,KAAK,CAAC;QACzF,MAAMzB,cAAc,CAAC2B,IAAI,CAACxB,UAAU,EAAEO,OAAO,CAAC;QAC9CN,OAAO,EAAEoB,mBAAmB,GAAGd,OAAO,CAAC;QACvCN,OAAO,EAAEwB,OAAO,GAAGH,KAAK,EAAEf,OAAO,CAAC;MACpC;IACF,CAAC,MAAM;MACL;MACA,IAAIM,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0Bf,UAAU,WAAW,CAAC;MACzE,MAAMH,cAAc,CAAC2B,IAAI,CAACxB,UAAU,EAAEO,OAAO,CAAC;MAC9CN,OAAO,EAAEoB,mBAAmB,GAAGd,OAAO,CAAC;IACzC;EACF,CAAC;EAED,OAAO;IAAEC;EAAc,CAAC;AAC1B","ignoreList":[]}
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":";;AAAA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,QAAQ,OAAO;AAChE,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,gBAAgB,QAAQ,+BAA+B;AAgBhE,OAAO,SAASC,kBAAkBA,CAChCC,UAAkB,EAClBC,OAKC,EACgC;EACjC,MAAM;IAAEC;EAAS,CAAC,GAAGJ,gBAAgB,CAAC,CAAC;EACvC,MAAMK,UAAU,GAAGT,MAAM,CAACO,OAAO,EAAEG,OAAO,CAAC;EAC3CD,UAAU,CAACE,OAAO,GAAGJ,OAAO,EAAEG,OAAO;EAErC,MAAM,CAACE,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAAiB,MAAM,CAAC;EAC5D,MAAM,CAACa,KAAK,EAAEC,QAAQ,CAAC,GAAGd,QAAQ,CAAe,IAAI,CAAC;;EAEtD;EACAF,SAAS,CAAC,MAAM;IACd,IAAIU,UAAU,CAACE,OAAO,EAAE;MACtBR,cAAc,CAACa,eAAe,CAACV,UAAU,EAAGW,OAAY,IACtDR,UAAU,CAACE,OAAO,CAAEM,OAAO,CAC7B,CAAC;IACH;EACF,CAAC,EAAE,CAACX,UAAU,CAAC,CAAC;EAEhB,MAAMY,KAAK,GAAGhB,WAAW,CAAC,MAAM;IAC9BW,SAAS,CAAC,MAAM,CAAC;IACjBE,QAAQ,CAAC,IAAI,CAAC;EAChB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMI,aAAa,GAAGjB,WAAW,CAAC,MAAOe,OAAiB,IAAK;IAC7D;IACA,MAAMP,OAAO,GAAGD,UAAU,CAACE,OAAO,IAAIR,cAAc,CAACiB,UAAU,CAACd,UAAU,CAAC;IAC3E,MAAMe,aAAa,GAAGlB,cAAc,CAACmB,YAAY;IACjD,MAAMC,UAAU,GAAGb,OAAO,IAAIW,aAAa;IAE3C,IAAIb,QAAQ,IAAIe,UAAU,EAAE;MAC1B;MACA,IAAIC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0BpB,UAAU,WAAW,CAAC;MACzEO,SAAS,CAAC,SAAS,CAAC;MACpBE,QAAQ,CAAC,IAAI,CAAC;MACd,IAAI;QACF,IAAIL,OAAO,EAAE;UACX,MAAMA,OAAO,CAACO,OAAO,CAAC;QACxB,CAAC,MAAM,IAAII,aAAa,EAAE;UACxB,MAAMA,aAAa,CAAC;YAClBM,EAAE,EAAE,EAAE;YACNrB,UAAU;YACVW,OAAO;YACPW,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC;YACrBC,UAAU,EAAE;UACd,CAAC,CAAC;QACJ;QACAlB,SAAS,CAAC,SAAS,CAAC;QACpBN,OAAO,EAAEyB,mBAAmB,GAAGf,OAAO,CAAC;QACvCV,OAAO,EAAE0B,SAAS,GAAGhB,OAAO,CAAC;MAC/B,CAAC,CAAC,OAAOiB,GAAQ,EAAE;QACjBT,OAAO,CAACU,IAAI,CAAC,0BAA0B7B,UAAU,gCAAgC,EAAE4B,GAAG,CAAC;QACvF;QACA,MAAM/B,cAAc,CAACiC,IAAI,CAAC9B,UAAU,EAAEW,OAAO,CAAC;QAC9CJ,SAAS,CAAC,QAAQ,CAAC;QACnBE,QAAQ,CAACmB,GAAG,CAAC;QACb3B,OAAO,EAAEyB,mBAAmB,GAAGf,OAAO,CAAC;QACvCV,OAAO,EAAE8B,OAAO,GAAGH,GAAG,EAAEjB,OAAO,CAAC;MAClC;IACF,CAAC,MAAM;MACL;MACA,IAAIO,OAAO,EAAEC,OAAO,CAACC,GAAG,CAAC,0BAA0BpB,UAAU,WAAW,CAAC;MACzE,MAAMH,cAAc,CAACiC,IAAI,CAAC9B,UAAU,EAAEW,OAAO,CAAC;MAC9CJ,SAAS,CAAC,QAAQ,CAAC;MACnBE,QAAQ,CAAC,IAAI,CAAC;MACdR,OAAO,EAAEyB,mBAAmB,GAAGf,OAAO,CAAC;IACzC;EACF,CAAC,EAAE,CAACX,UAAU,EAAEE,QAAQ,EAAED,OAAO,CAAC,CAAC;EAEnC,OAAO;IACLY,aAAa;IACbP,MAAM;IACN0B,MAAM,EAAE1B,MAAM,KAAK,MAAM;IACzB2B,SAAS,EAAE3B,MAAM,KAAK,SAAS;IAC/B4B,SAAS,EAAE5B,MAAM,KAAK,SAAS;IAC/B6B,OAAO,EAAE7B,MAAM,KAAK,OAAO;IAC3B8B,QAAQ,EAAE9B,MAAM,KAAK,QAAQ;IAC7BE,KAAK;IACLI;EACF,CAAC;AACH","ignoreList":[]}
@@ -1,13 +1,11 @@
1
1
  import React from 'react';
2
2
  import { type OfflineManagerConfig } from '../core/OfflineManager';
3
- interface OfflineContextValue {
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,KAAiE,MAAM,OAAO,CAAC;AAEtF,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnF,UAAU,mBAAmB;IACzB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAID,eAAO,MAAM,gBAAgB,2BAAmC,CAAC;AAEjE,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,CAkC1D,CAAC"}
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
- mutateOffline: (payload: TPayload) => Promise<void>;
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;CACrD;6BAeqC,QAAQ;EAqC/C"}
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",
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
- "postinstall": "echo '\\n📦 @mustafaaksoy41/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'"
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, { createContext, useContext, useEffect, useRef, useState } from '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
- interface OfflineContextValue {
6
- isOnline: boolean | null;
7
- }
8
-
9
- const OfflineContext = createContext<OfflineContextValue>({ isOnline: true });
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
- export const useNetworkStatus = () => useContext(OfflineContext);
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
- setIsOnline(connected);
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
- return (
48
- <OfflineContext.Provider value={{ isOnline }}>
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 mutateOffline = async (payload: TPayload) => {
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
- } catch (error: any) {
49
- console.warn(`[OfflineQueue] mutate: ${actionName} failed, falling back to queue`, error);
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?.(error, payload);
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 { mutateOffline };
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
  }