@teincfood/core 0.9.24 → 0.9.26
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/dist/catalog/hooks.js +11 -2
- package/dist/db/migrations.js +25 -0
- package/dist/db/operations.d.ts +7 -0
- package/dist/db/operations.js +95 -17
- package/dist/domain/orders/order-flow.d.ts +41 -0
- package/dist/domain/orders/order-flow.js +66 -0
- package/dist/domain/orders/service.d.ts +2 -1
- package/dist/domain/orders/service.js +9 -3
- package/dist/hooks/delivery.hooks.d.ts +24 -24
- package/dist/hooks/rider.hooks.d.ts +48 -48
- package/dist/hooks/startup-readiness.hooks.js +20 -2
- package/dist/hooks/use-infinite-list.d.ts +24 -24
- package/dist/hooks/wallet.hooks.d.ts +24 -24
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/sync/device-lease.service.js +3 -1
- package/dist/sync/order-merge.js +7 -2
- package/dist/sync/order-snapshots.service.js +17 -1
- package/dist/sync/startup-readiness.js +29 -16
- package/dist/test-helpers/memory-driver.js +17 -10
- package/dist/types/api/business.api.d.ts +7 -0
- package/package.json +2 -2
|
@@ -47,10 +47,10 @@ export declare function useRiderDeliveriesQuery(enabled?: boolean, filters?: {
|
|
|
47
47
|
isRefetching: boolean;
|
|
48
48
|
isStale: boolean;
|
|
49
49
|
isEnabled: boolean;
|
|
50
|
-
refetch: (options?: import("@tanstack/query
|
|
51
|
-
fetchStatus: import("@tanstack/query
|
|
52
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
53
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
50
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
51
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
52
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
53
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
54
54
|
hasNextPage: boolean;
|
|
55
55
|
hasPreviousPage: boolean;
|
|
56
56
|
isFetchingNextPage: boolean;
|
|
@@ -81,10 +81,10 @@ export declare function useRiderDeliveriesQuery(enabled?: boolean, filters?: {
|
|
|
81
81
|
isRefetching: boolean;
|
|
82
82
|
isStale: boolean;
|
|
83
83
|
isEnabled: boolean;
|
|
84
|
-
refetch: (options?: import("@tanstack/query
|
|
85
|
-
fetchStatus: import("@tanstack/query
|
|
86
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
87
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
84
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
85
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
86
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
87
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
88
88
|
hasNextPage: boolean;
|
|
89
89
|
hasPreviousPage: boolean;
|
|
90
90
|
isFetchingNextPage: boolean;
|
|
@@ -116,10 +116,10 @@ export declare function useRiderDeliveriesQuery(enabled?: boolean, filters?: {
|
|
|
116
116
|
isRefetching: boolean;
|
|
117
117
|
isStale: boolean;
|
|
118
118
|
isEnabled: boolean;
|
|
119
|
-
refetch: (options?: import("@tanstack/query
|
|
120
|
-
fetchStatus: import("@tanstack/query
|
|
121
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
122
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
119
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
120
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
121
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
122
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
123
123
|
hasNextPage: boolean;
|
|
124
124
|
hasPreviousPage: boolean;
|
|
125
125
|
isFetchingNextPage: boolean;
|
|
@@ -149,10 +149,10 @@ export declare function useRiderDeliveriesQuery(enabled?: boolean, filters?: {
|
|
|
149
149
|
isRefetching: boolean;
|
|
150
150
|
isStale: boolean;
|
|
151
151
|
isEnabled: boolean;
|
|
152
|
-
refetch: (options?: import("@tanstack/query
|
|
153
|
-
fetchStatus: import("@tanstack/query
|
|
154
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
155
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
152
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
153
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
154
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
155
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
156
156
|
hasNextPage: boolean;
|
|
157
157
|
hasPreviousPage: boolean;
|
|
158
158
|
isFetchingNextPage: boolean;
|
|
@@ -183,10 +183,10 @@ export declare function useRiderDeliveriesQuery(enabled?: boolean, filters?: {
|
|
|
183
183
|
isRefetching: boolean;
|
|
184
184
|
isStale: boolean;
|
|
185
185
|
isEnabled: boolean;
|
|
186
|
-
refetch: (options?: import("@tanstack/query
|
|
187
|
-
fetchStatus: import("@tanstack/query
|
|
188
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
189
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
186
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
187
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
188
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
189
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
190
190
|
hasNextPage: boolean;
|
|
191
191
|
hasPreviousPage: boolean;
|
|
192
192
|
isFetchNextPageError: boolean;
|
|
@@ -217,10 +217,10 @@ export declare function useRiderDeliveriesQuery(enabled?: boolean, filters?: {
|
|
|
217
217
|
isRefetching: boolean;
|
|
218
218
|
isStale: boolean;
|
|
219
219
|
isEnabled: boolean;
|
|
220
|
-
refetch: (options?: import("@tanstack/query
|
|
221
|
-
fetchStatus: import("@tanstack/query
|
|
222
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
223
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
220
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
221
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
222
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
223
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<RiderDelivery>, unknown>, Error>>;
|
|
224
224
|
hasNextPage: boolean;
|
|
225
225
|
hasPreviousPage: boolean;
|
|
226
226
|
isFetchingNextPage: boolean;
|
|
@@ -261,10 +261,10 @@ export declare function useRiderWalletHistoryQuery(enabled?: boolean): {
|
|
|
261
261
|
isRefetching: boolean;
|
|
262
262
|
isStale: boolean;
|
|
263
263
|
isEnabled: boolean;
|
|
264
|
-
refetch: (options?: import("@tanstack/query
|
|
265
|
-
fetchStatus: import("@tanstack/query
|
|
266
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
267
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
264
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
265
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
266
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
267
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
268
268
|
hasNextPage: boolean;
|
|
269
269
|
hasPreviousPage: boolean;
|
|
270
270
|
isFetchingNextPage: boolean;
|
|
@@ -295,10 +295,10 @@ export declare function useRiderWalletHistoryQuery(enabled?: boolean): {
|
|
|
295
295
|
isRefetching: boolean;
|
|
296
296
|
isStale: boolean;
|
|
297
297
|
isEnabled: boolean;
|
|
298
|
-
refetch: (options?: import("@tanstack/query
|
|
299
|
-
fetchStatus: import("@tanstack/query
|
|
300
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
301
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
298
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
299
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
300
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
301
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
302
302
|
hasNextPage: boolean;
|
|
303
303
|
hasPreviousPage: boolean;
|
|
304
304
|
isFetchingNextPage: boolean;
|
|
@@ -330,10 +330,10 @@ export declare function useRiderWalletHistoryQuery(enabled?: boolean): {
|
|
|
330
330
|
isRefetching: boolean;
|
|
331
331
|
isStale: boolean;
|
|
332
332
|
isEnabled: boolean;
|
|
333
|
-
refetch: (options?: import("@tanstack/query
|
|
334
|
-
fetchStatus: import("@tanstack/query
|
|
335
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
336
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
333
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
334
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
335
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
336
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
337
337
|
hasNextPage: boolean;
|
|
338
338
|
hasPreviousPage: boolean;
|
|
339
339
|
isFetchingNextPage: boolean;
|
|
@@ -363,10 +363,10 @@ export declare function useRiderWalletHistoryQuery(enabled?: boolean): {
|
|
|
363
363
|
isRefetching: boolean;
|
|
364
364
|
isStale: boolean;
|
|
365
365
|
isEnabled: boolean;
|
|
366
|
-
refetch: (options?: import("@tanstack/query
|
|
367
|
-
fetchStatus: import("@tanstack/query
|
|
368
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
369
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
366
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
367
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
368
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
369
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
370
370
|
hasNextPage: boolean;
|
|
371
371
|
hasPreviousPage: boolean;
|
|
372
372
|
isFetchingNextPage: boolean;
|
|
@@ -397,10 +397,10 @@ export declare function useRiderWalletHistoryQuery(enabled?: boolean): {
|
|
|
397
397
|
isRefetching: boolean;
|
|
398
398
|
isStale: boolean;
|
|
399
399
|
isEnabled: boolean;
|
|
400
|
-
refetch: (options?: import("@tanstack/query
|
|
401
|
-
fetchStatus: import("@tanstack/query
|
|
402
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
403
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
400
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
401
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
402
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
403
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
404
404
|
hasNextPage: boolean;
|
|
405
405
|
hasPreviousPage: boolean;
|
|
406
406
|
isFetchNextPageError: boolean;
|
|
@@ -431,10 +431,10 @@ export declare function useRiderWalletHistoryQuery(enabled?: boolean): {
|
|
|
431
431
|
isRefetching: boolean;
|
|
432
432
|
isStale: boolean;
|
|
433
433
|
isEnabled: boolean;
|
|
434
|
-
refetch: (options?: import("@tanstack/query
|
|
435
|
-
fetchStatus: import("@tanstack/query
|
|
436
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
437
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
434
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
435
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
436
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
437
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<Record<string, unknown>>, unknown>, Error>>;
|
|
438
438
|
hasNextPage: boolean;
|
|
439
439
|
hasPreviousPage: boolean;
|
|
440
440
|
isFetchingNextPage: boolean;
|
|
@@ -25,20 +25,38 @@ export function useStartupReadiness(options = {}) {
|
|
|
25
25
|
const [readiness, setReadiness] = useState(null);
|
|
26
26
|
const [checking, setChecking] = useState(false);
|
|
27
27
|
const runRef = useRef(false);
|
|
28
|
+
// Identifies the latest readiness run so a slow catch-up for a previous
|
|
29
|
+
// business can never overwrite the verdict for the active one.
|
|
30
|
+
const tokenRef = useRef(0);
|
|
31
|
+
const businessRef = useRef(businessId);
|
|
32
|
+
// Switching business invalidates the previous verdict — its cached reference
|
|
33
|
+
// keys and lease belong to the old business.
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (businessRef.current === businessId)
|
|
36
|
+
return;
|
|
37
|
+
businessRef.current = businessId;
|
|
38
|
+
tokenRef.current += 1;
|
|
39
|
+
runRef.current = false;
|
|
40
|
+
setReadiness(null);
|
|
41
|
+
setChecking(false);
|
|
42
|
+
}, [businessId]);
|
|
28
43
|
const check = useCallback(async () => {
|
|
29
44
|
if (!businessId)
|
|
30
45
|
return;
|
|
31
46
|
if (runRef.current)
|
|
32
47
|
return;
|
|
33
48
|
runRef.current = true;
|
|
49
|
+
const token = ++tokenRef.current;
|
|
34
50
|
setChecking(true);
|
|
35
51
|
try {
|
|
36
52
|
const result = await ensureStartupReady(businessId, { timeoutMs });
|
|
37
|
-
|
|
53
|
+
if (tokenRef.current === token)
|
|
54
|
+
setReadiness(result);
|
|
38
55
|
}
|
|
39
56
|
finally {
|
|
40
57
|
runRef.current = false;
|
|
41
|
-
|
|
58
|
+
if (tokenRef.current === token)
|
|
59
|
+
setChecking(false);
|
|
42
60
|
}
|
|
43
61
|
}, [businessId, timeoutMs]);
|
|
44
62
|
// First check when a business is available.
|
|
@@ -50,10 +50,10 @@ export declare function useInfiniteList<T>(options: InfiniteListOptions<T>): {
|
|
|
50
50
|
isRefetching: boolean;
|
|
51
51
|
isStale: boolean;
|
|
52
52
|
isEnabled: boolean;
|
|
53
|
-
refetch: (options?: import("@tanstack/query
|
|
54
|
-
fetchStatus: import("@tanstack/query
|
|
55
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
56
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
53
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
54
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
55
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
56
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
57
57
|
hasNextPage: boolean;
|
|
58
58
|
hasPreviousPage: boolean;
|
|
59
59
|
isFetchingNextPage: boolean;
|
|
@@ -84,10 +84,10 @@ export declare function useInfiniteList<T>(options: InfiniteListOptions<T>): {
|
|
|
84
84
|
isRefetching: boolean;
|
|
85
85
|
isStale: boolean;
|
|
86
86
|
isEnabled: boolean;
|
|
87
|
-
refetch: (options?: import("@tanstack/query
|
|
88
|
-
fetchStatus: import("@tanstack/query
|
|
89
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
90
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
87
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
88
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
89
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
90
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
91
91
|
hasNextPage: boolean;
|
|
92
92
|
hasPreviousPage: boolean;
|
|
93
93
|
isFetchingNextPage: boolean;
|
|
@@ -119,10 +119,10 @@ export declare function useInfiniteList<T>(options: InfiniteListOptions<T>): {
|
|
|
119
119
|
isRefetching: boolean;
|
|
120
120
|
isStale: boolean;
|
|
121
121
|
isEnabled: boolean;
|
|
122
|
-
refetch: (options?: import("@tanstack/query
|
|
123
|
-
fetchStatus: import("@tanstack/query
|
|
124
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
125
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
122
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
123
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
124
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
125
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
126
126
|
hasNextPage: boolean;
|
|
127
127
|
hasPreviousPage: boolean;
|
|
128
128
|
isFetchingNextPage: boolean;
|
|
@@ -152,10 +152,10 @@ export declare function useInfiniteList<T>(options: InfiniteListOptions<T>): {
|
|
|
152
152
|
isRefetching: boolean;
|
|
153
153
|
isStale: boolean;
|
|
154
154
|
isEnabled: boolean;
|
|
155
|
-
refetch: (options?: import("@tanstack/query
|
|
156
|
-
fetchStatus: import("@tanstack/query
|
|
157
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
158
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
155
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
156
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
157
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
158
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
159
159
|
hasNextPage: boolean;
|
|
160
160
|
hasPreviousPage: boolean;
|
|
161
161
|
isFetchingNextPage: boolean;
|
|
@@ -186,10 +186,10 @@ export declare function useInfiniteList<T>(options: InfiniteListOptions<T>): {
|
|
|
186
186
|
isRefetching: boolean;
|
|
187
187
|
isStale: boolean;
|
|
188
188
|
isEnabled: boolean;
|
|
189
|
-
refetch: (options?: import("@tanstack/query
|
|
190
|
-
fetchStatus: import("@tanstack/query
|
|
191
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
192
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
189
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
190
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
191
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
192
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
193
193
|
hasNextPage: boolean;
|
|
194
194
|
hasPreviousPage: boolean;
|
|
195
195
|
isFetchNextPageError: boolean;
|
|
@@ -220,10 +220,10 @@ export declare function useInfiniteList<T>(options: InfiniteListOptions<T>): {
|
|
|
220
220
|
isRefetching: boolean;
|
|
221
221
|
isStale: boolean;
|
|
222
222
|
isEnabled: boolean;
|
|
223
|
-
refetch: (options?: import("@tanstack/query
|
|
224
|
-
fetchStatus: import("@tanstack/query
|
|
225
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
226
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
223
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
224
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
225
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
226
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<ListPage<T>, unknown>, Error>>;
|
|
227
227
|
hasNextPage: boolean;
|
|
228
228
|
hasPreviousPage: boolean;
|
|
229
229
|
isFetchingNextPage: boolean;
|
|
@@ -26,10 +26,10 @@ export declare function useWalletHistoryQuery(enabled?: boolean): {
|
|
|
26
26
|
isRefetching: boolean;
|
|
27
27
|
isStale: boolean;
|
|
28
28
|
isEnabled: boolean;
|
|
29
|
-
refetch: (options?: import("@tanstack/query
|
|
30
|
-
fetchStatus: import("@tanstack/query
|
|
31
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
32
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
29
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
30
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
31
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
32
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
33
33
|
hasNextPage: boolean;
|
|
34
34
|
hasPreviousPage: boolean;
|
|
35
35
|
isFetchingNextPage: boolean;
|
|
@@ -60,10 +60,10 @@ export declare function useWalletHistoryQuery(enabled?: boolean): {
|
|
|
60
60
|
isRefetching: boolean;
|
|
61
61
|
isStale: boolean;
|
|
62
62
|
isEnabled: boolean;
|
|
63
|
-
refetch: (options?: import("@tanstack/query
|
|
64
|
-
fetchStatus: import("@tanstack/query
|
|
65
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
66
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
63
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
64
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
65
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
66
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
67
67
|
hasNextPage: boolean;
|
|
68
68
|
hasPreviousPage: boolean;
|
|
69
69
|
isFetchingNextPage: boolean;
|
|
@@ -95,10 +95,10 @@ export declare function useWalletHistoryQuery(enabled?: boolean): {
|
|
|
95
95
|
isRefetching: boolean;
|
|
96
96
|
isStale: boolean;
|
|
97
97
|
isEnabled: boolean;
|
|
98
|
-
refetch: (options?: import("@tanstack/query
|
|
99
|
-
fetchStatus: import("@tanstack/query
|
|
100
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
101
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
98
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
99
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
100
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
101
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
102
102
|
hasNextPage: boolean;
|
|
103
103
|
hasPreviousPage: boolean;
|
|
104
104
|
isFetchingNextPage: boolean;
|
|
@@ -128,10 +128,10 @@ export declare function useWalletHistoryQuery(enabled?: boolean): {
|
|
|
128
128
|
isRefetching: boolean;
|
|
129
129
|
isStale: boolean;
|
|
130
130
|
isEnabled: boolean;
|
|
131
|
-
refetch: (options?: import("@tanstack/query
|
|
132
|
-
fetchStatus: import("@tanstack/query
|
|
133
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
134
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
131
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
132
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
133
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
134
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
135
135
|
hasNextPage: boolean;
|
|
136
136
|
hasPreviousPage: boolean;
|
|
137
137
|
isFetchingNextPage: boolean;
|
|
@@ -162,10 +162,10 @@ export declare function useWalletHistoryQuery(enabled?: boolean): {
|
|
|
162
162
|
isRefetching: boolean;
|
|
163
163
|
isStale: boolean;
|
|
164
164
|
isEnabled: boolean;
|
|
165
|
-
refetch: (options?: import("@tanstack/query
|
|
166
|
-
fetchStatus: import("@tanstack/query
|
|
167
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
168
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
165
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
166
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
167
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
168
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
169
169
|
hasNextPage: boolean;
|
|
170
170
|
hasPreviousPage: boolean;
|
|
171
171
|
isFetchNextPageError: boolean;
|
|
@@ -196,10 +196,10 @@ export declare function useWalletHistoryQuery(enabled?: boolean): {
|
|
|
196
196
|
isRefetching: boolean;
|
|
197
197
|
isStale: boolean;
|
|
198
198
|
isEnabled: boolean;
|
|
199
|
-
refetch: (options?: import("@tanstack/query
|
|
200
|
-
fetchStatus: import("@tanstack/query
|
|
201
|
-
fetchNextPage: (options?: import("@tanstack/query
|
|
202
|
-
fetchPreviousPage: (options?: import("@tanstack/query
|
|
199
|
+
refetch: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
200
|
+
fetchStatus: import("@tanstack/react-query").FetchStatus;
|
|
201
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
202
|
+
fetchPreviousPage: (options?: import("@tanstack/react-query").FetchPreviousPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("./use-infinite-list").ListPage<WalletEntry>, unknown>, Error>>;
|
|
203
203
|
hasNextPage: boolean;
|
|
204
204
|
hasPreviousPage: boolean;
|
|
205
205
|
isFetchingNextPage: boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -144,6 +144,7 @@ export * from "./sync/transition-endpoints";
|
|
|
144
144
|
export * from "./utils/business-hours";
|
|
145
145
|
export * from "./hooks/business-hours.hooks";
|
|
146
146
|
export * from "./domain/orders/service";
|
|
147
|
+
export * from "./domain/orders/order-flow";
|
|
147
148
|
export * from "./domain/orders/snapshots";
|
|
148
149
|
export { phoenixSocket } from "./realtime/phoenix-socket";
|
|
149
150
|
export { eventsService } from "./realtime/events.service";
|
package/dist/index.js
CHANGED
|
@@ -156,6 +156,7 @@ export * from "./hooks/business-hours.hooks";
|
|
|
156
156
|
// components/OrderStatusCard was folded into order-transitions (compat re-export lives in apps)
|
|
157
157
|
// ── Domain (offline-first primary DB) ──
|
|
158
158
|
export * from "./domain/orders/service";
|
|
159
|
+
export * from "./domain/orders/order-flow";
|
|
159
160
|
export * from "./domain/orders/snapshots";
|
|
160
161
|
// ── Realtime (single source — PHX WebSocket + business:{id}) ──
|
|
161
162
|
export { phoenixSocket } from "./realtime/phoenix-socket";
|
|
@@ -28,8 +28,10 @@ export async function ensureLease(businessId) {
|
|
|
28
28
|
try {
|
|
29
29
|
const leasedAt = getSync(`${LEASE_KEY(businessId)}:leased_at`);
|
|
30
30
|
const needsRefresh = !leasedAt || Date.now() - new Date(leasedAt).getTime() > LEASE_TTL_MS - 24 * 60 * 60 * 1000;
|
|
31
|
+
// Never make readiness wait on the refresh — a slow network must not
|
|
32
|
+
// hold POS startup when a valid cached lease already exists.
|
|
31
33
|
if (needsRefresh)
|
|
32
|
-
|
|
34
|
+
void refreshLease(businessId).catch(() => { });
|
|
33
35
|
}
|
|
34
36
|
catch {
|
|
35
37
|
// keep existing on any refresh failure
|
package/dist/sync/order-merge.js
CHANGED
|
@@ -27,14 +27,19 @@ export async function mergeOrderFromServer(db, businessId, serverOrder) {
|
|
|
27
27
|
return false;
|
|
28
28
|
try {
|
|
29
29
|
const intent = await getPendingOrderIntent(db, businessId, serverOrder.id);
|
|
30
|
+
// Capture the local payment BEFORE the server copy overwrites the row —
|
|
31
|
+
// a queued cash sale carries the paid timestamp only on the device.
|
|
32
|
+
const beforeMerge = intent.hasPending
|
|
33
|
+
? await getOrderById(db, businessId, serverOrder.id)
|
|
34
|
+
: null;
|
|
30
35
|
await upsertServerOrder(db, { ...serverOrder, business_id: businessId });
|
|
31
36
|
if (intent.hasPending) {
|
|
32
37
|
if (intent.status) {
|
|
33
38
|
await updateOrderStatus(db, businessId, serverOrder.id, intent.status);
|
|
34
39
|
}
|
|
35
40
|
if (intent.isPaid) {
|
|
36
|
-
const
|
|
37
|
-
|
|
41
|
+
const paidAt = beforeMerge?.payment?.paid_at ??
|
|
42
|
+
beforeMerge?.paid_at ??
|
|
38
43
|
new Date().toISOString();
|
|
39
44
|
await updateOrderPayment(db, businessId, serverOrder.id, {
|
|
40
45
|
is_paid: true,
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* exact list last seen while online is available offline.
|
|
15
15
|
*/
|
|
16
16
|
import { openSyncDatabase } from "../db/connection";
|
|
17
|
-
import { insertEvent, upsertEntitySnapshot, getEntitySnapshot, getEntitySnapshotsByType, pruneEntitySnapshots, } from "../db/operations";
|
|
17
|
+
import { insertEvent, upsertEntitySnapshot, getEntitySnapshot, getEntitySnapshotsByType, pruneEntitySnapshots, updateOrderPayment, } from "../db/operations";
|
|
18
18
|
import { syncLogger } from "../utils/sync-logger";
|
|
19
19
|
const RETAIN_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
20
20
|
const ORDER_EVENT_TYPES = new Set([
|
|
@@ -119,6 +119,22 @@ class OrderSnapshotsService {
|
|
|
119
119
|
const db = await openSyncDatabase();
|
|
120
120
|
await insertEvent(db, { event, origin });
|
|
121
121
|
const businessId = payload?.business_id ?? payload?.businessId ?? null;
|
|
122
|
+
// Dual-write the canonical orders row: POS/Orders screens read payment
|
|
123
|
+
// from there, not from the snapshot. Without this a mobile-money sale
|
|
124
|
+
// stayed UNPAID (and kept offering "Collect cash") after its payment
|
|
125
|
+
// completed, because only the snapshot list was patched.
|
|
126
|
+
if (businessId) {
|
|
127
|
+
await updateOrderPayment(db, businessId, orderId, { is_paid: true, paid_at: paidAt });
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
try {
|
|
131
|
+
const row = await db.getFirstAsync(`SELECT business_id FROM orders WHERE id = ? OR order_number = ? LIMIT 1;`, orderId, payload?.order_number ?? orderId);
|
|
132
|
+
if (row?.business_id) {
|
|
133
|
+
await updateOrderPayment(db, row.business_id, orderId, { is_paid: true, paid_at: paidAt });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch { }
|
|
137
|
+
}
|
|
122
138
|
const lists = businessId
|
|
123
139
|
? await getEntitySnapshotsByType(db, "seller_orders", businessId)
|
|
124
140
|
: await getEntitySnapshotsByType(db, "seller_orders");
|
|
@@ -77,25 +77,38 @@ export async function getStartupReadiness(businessId) {
|
|
|
77
77
|
export async function ensureStartupReady(businessId, opts) {
|
|
78
78
|
const timeoutMs = opts?.timeoutMs ?? 15000;
|
|
79
79
|
const { isOnline, isCloudReachable } = getConnectivityState();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
catch (e) {
|
|
92
|
-
syncLogger.warn("StartupReadiness", "lease catch-up failed", { err: String(e) });
|
|
93
|
-
}
|
|
94
|
-
})();
|
|
95
|
-
await raceWithTimeout(catchUp, timeoutMs);
|
|
80
|
+
const canUseNetwork = isOnline && isCloudReachable !== "unreachable";
|
|
81
|
+
// Evaluate the device first. If everything the POS needs is already cached,
|
|
82
|
+
// the terminal must open immediately — a slow network must never hold the
|
|
83
|
+
// seller on "Preparing offline data…". The catch-up then runs in the
|
|
84
|
+
// background and silently updates the cache.
|
|
85
|
+
const local = await getStartupReadiness(businessId);
|
|
86
|
+
if (local.ready) {
|
|
87
|
+
if (canUseNetwork)
|
|
88
|
+
void runCatchUp(businessId);
|
|
89
|
+
return local;
|
|
96
90
|
}
|
|
91
|
+
// Incomplete cache: one bounded network attempt may complete it. This is the
|
|
92
|
+
// only case where waiting is useful (e.g. first launch on a new device).
|
|
93
|
+
if (canUseNetwork)
|
|
94
|
+
await raceWithTimeout(runCatchUp(businessId), timeoutMs);
|
|
97
95
|
return getStartupReadiness(businessId);
|
|
98
96
|
}
|
|
97
|
+
/** Best-effort catch-up: reference data + device lease. Never throws. */
|
|
98
|
+
async function runCatchUp(businessId) {
|
|
99
|
+
try {
|
|
100
|
+
await referenceSyncService.sync({ businessId, keys: [...REQUIRED_ORDER_KEYS] });
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
syncLogger.warn("StartupReadiness", "reference catch-up failed", { err: String(e) });
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
await ensureLease(businessId);
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
syncLogger.warn("StartupReadiness", "lease catch-up failed", { err: String(e) });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
99
112
|
/** Resolve after either the promise settles or the timeout elapses. */
|
|
100
113
|
async function raceWithTimeout(promise, ms) {
|
|
101
114
|
let timer;
|