@edgebasejs/react-native 0.1.8 → 0.1.9
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 +18 -0
- package/dist/client-core/src/index.d.ts +4 -0
- package/dist/client-core/src/index.d.ts.map +1 -1
- package/dist/client-core/src/index.js +4 -0
- package/dist/client-core/src/index.js.map +1 -1
- package/dist/client-core/src/mutations/batch-processor-client.d.ts +67 -0
- package/dist/client-core/src/mutations/batch-processor-client.d.ts.map +1 -0
- package/dist/client-core/src/mutations/batch-processor-client.js +64 -0
- package/dist/client-core/src/mutations/batch-processor-client.js.map +1 -0
- package/dist/client-core/src/mutations/transaction-hook.d.ts +80 -0
- package/dist/client-core/src/mutations/transaction-hook.d.ts.map +1 -0
- package/dist/client-core/src/mutations/transaction-hook.js +204 -0
- package/dist/client-core/src/mutations/transaction-hook.js.map +1 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.d.ts +55 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.d.ts.map +1 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.js +208 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.js.map +1 -0
- package/dist/client-core/src/realtime/subscription-handler.d.ts +74 -0
- package/dist/client-core/src/realtime/subscription-handler.d.ts.map +1 -0
- package/dist/client-core/src/realtime/subscription-handler.js +224 -0
- package/dist/client-core/src/realtime/subscription-handler.js.map +1 -0
- package/dist/client-core/src/sync/sync-engine.d.ts +10 -0
- package/dist/client-core/src/sync/sync-engine.d.ts.map +1 -1
- package/dist/client-core/src/sync/sync-engine.js +37 -5
- package/dist/client-core/src/sync/sync-engine.js.map +1 -1
- package/dist/client-react-native/src/hooks/index.d.ts +10 -0
- package/dist/client-react-native/src/hooks/index.d.ts.map +1 -1
- package/dist/client-react-native/src/hooks/index.js +8 -0
- package/dist/client-react-native/src/hooks/index.js.map +1 -1
- package/dist/client-react-native/src/hooks/use-audit.d.ts +65 -0
- package/dist/client-react-native/src/hooks/use-audit.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-audit.js +201 -0
- package/dist/client-react-native/src/hooks/use-audit.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.d.ts +56 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.js +95 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-encryption.d.ts +45 -0
- package/dist/client-react-native/src/hooks/use-encryption.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-encryption.js +143 -0
- package/dist/client-react-native/src/hooks/use-encryption.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-manager.d.ts +38 -0
- package/dist/client-react-native/src/hooks/use-file-manager.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-manager.js +174 -0
- package/dist/client-react-native/src/hooks/use-file-manager.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-upload.d.ts +34 -0
- package/dist/client-react-native/src/hooks/use-file-upload.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-upload.js +85 -0
- package/dist/client-react-native/src/hooks/use-file-upload.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-mutation.d.ts.map +1 -1
- package/dist/client-react-native/src/hooks/use-mutation.js +34 -6
- package/dist/client-react-native/src/hooks/use-mutation.js.map +1 -1
- package/dist/client-react-native/src/hooks/use-search.d.ts +33 -0
- package/dist/client-react-native/src/hooks/use-search.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-search.js +174 -0
- package/dist/client-react-native/src/hooks/use-search.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-subscribe.d.ts +14 -0
- package/dist/client-react-native/src/hooks/use-subscribe.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-subscribe.js +165 -0
- package/dist/client-react-native/src/hooks/use-subscribe.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-transaction.d.ts +27 -0
- package/dist/client-react-native/src/hooks/use-transaction.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-transaction.js +160 -0
- package/dist/client-react-native/src/hooks/use-transaction.js.map +1 -0
- package/dist/client-react-native/src/provider.d.ts +5 -2
- package/dist/client-react-native/src/provider.d.ts.map +1 -1
- package/dist/client-react-native/src/provider.js +23 -23
- package/dist/client-react-native/src/provider.js.map +1 -1
- package/dist/core/src/access-rules/column-security.d.ts +80 -0
- package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
- package/dist/core/src/access-rules/column-security.js +191 -0
- package/dist/core/src/access-rules/column-security.js.map +1 -0
- package/dist/core/src/access-rules/engine.d.ts +26 -0
- package/dist/core/src/access-rules/engine.d.ts.map +1 -0
- package/dist/core/src/access-rules/engine.js +76 -0
- package/dist/core/src/access-rules/engine.js.map +1 -0
- package/dist/core/src/access-rules/index.d.ts +3 -0
- package/dist/core/src/access-rules/index.d.ts.map +1 -0
- package/dist/core/src/access-rules/index.js +3 -0
- package/dist/core/src/access-rules/index.js.map +1 -0
- package/dist/core/src/audit/audit-manager.d.ts +108 -0
- package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
- package/dist/core/src/audit/audit-manager.js +265 -0
- package/dist/core/src/audit/audit-manager.js.map +1 -0
- package/dist/core/src/auth/auth-service.d.ts +71 -0
- package/dist/core/src/auth/auth-service.d.ts.map +1 -0
- package/dist/core/src/auth/auth-service.js +177 -0
- package/dist/core/src/auth/auth-service.js.map +1 -0
- package/dist/core/src/auth/index.d.ts +4 -0
- package/dist/core/src/auth/index.d.ts.map +1 -0
- package/dist/core/src/auth/index.js +4 -0
- package/dist/core/src/auth/index.js.map +1 -0
- package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
- package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
- package/dist/core/src/encryption/encryption-manager.js +224 -0
- package/dist/core/src/encryption/encryption-manager.js.map +1 -0
- package/dist/core/src/index.d.ts +16 -0
- package/dist/core/src/index.d.ts.map +1 -0
- package/dist/core/src/index.js +16 -0
- package/dist/core/src/index.js.map +1 -0
- package/dist/core/src/realtime/change-notifier.d.ts +50 -0
- package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
- package/dist/core/src/realtime/change-notifier.js +145 -0
- package/dist/core/src/realtime/change-notifier.js.map +1 -0
- package/dist/core/src/realtime/message-types.d.ts +39 -0
- package/dist/core/src/realtime/message-types.d.ts.map +1 -0
- package/dist/core/src/realtime/message-types.js +5 -0
- package/dist/core/src/realtime/message-types.js.map +1 -0
- package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
- package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
- package/dist/core/src/realtime/subscription-manager.js +229 -0
- package/dist/core/src/realtime/subscription-manager.js.map +1 -0
- package/dist/core/src/search/search-manager.d.ts +93 -0
- package/dist/core/src/search/search-manager.d.ts.map +1 -0
- package/dist/core/src/search/search-manager.js +258 -0
- package/dist/core/src/search/search-manager.js.map +1 -0
- package/dist/core/src/storage/file-manager.d.ts +138 -0
- package/dist/core/src/storage/file-manager.d.ts.map +1 -0
- package/dist/core/src/storage/file-manager.js +224 -0
- package/dist/core/src/storage/file-manager.js.map +1 -0
- package/dist/core/src/sync/batch-processor.d.ts +97 -0
- package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
- package/dist/core/src/sync/batch-processor.js +313 -0
- package/dist/core/src/sync/batch-processor.js.map +1 -0
- package/dist/core/src/sync/csv-processor.d.ts +66 -0
- package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
- package/dist/core/src/sync/csv-processor.js +223 -0
- package/dist/core/src/sync/csv-processor.js.map +1 -0
- package/dist/core/src/sync/index.d.ts +3 -0
- package/dist/core/src/sync/index.d.ts.map +1 -0
- package/dist/core/src/sync/index.js +3 -0
- package/dist/core/src/sync/index.js.map +1 -0
- package/dist/core/src/sync/sync-engine.d.ts +68 -0
- package/dist/core/src/sync/sync-engine.d.ts.map +1 -0
- package/dist/core/src/sync/sync-engine.js +317 -0
- package/dist/core/src/sync/sync-engine.js.map +1 -0
- package/dist/core/src/sync/transaction-manager.d.ts +83 -0
- package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
- package/dist/core/src/sync/transaction-manager.js +227 -0
- package/dist/core/src/sync/transaction-manager.js.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.js +334 -0
- package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
- package/package.json +4 -6
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { useContext, useCallback, useState, useEffect } from 'react';
|
|
2
|
+
import { EdgeBaseContext } from '../provider';
|
|
3
|
+
/**
|
|
4
|
+
* Hook for full-text search
|
|
5
|
+
*/
|
|
6
|
+
export function useSearch(options) {
|
|
7
|
+
const context = useContext(EdgeBaseContext);
|
|
8
|
+
if (!context) {
|
|
9
|
+
throw new Error('useSearch must be used within EdgeBaseProvider');
|
|
10
|
+
}
|
|
11
|
+
const { authManager } = context;
|
|
12
|
+
const [results, setResults] = useState([]);
|
|
13
|
+
const [total, setTotal] = useState(0);
|
|
14
|
+
const [hasMore, setHasMore] = useState(false);
|
|
15
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
16
|
+
const [error, setError] = useState(null);
|
|
17
|
+
const [currentQuery, setCurrentQuery] = useState(options.query);
|
|
18
|
+
const [currentOffset, setCurrentOffset] = useState(0);
|
|
19
|
+
/**
|
|
20
|
+
* Execute search
|
|
21
|
+
*/
|
|
22
|
+
const search = useCallback(async (query) => {
|
|
23
|
+
const searchQuery = query ?? currentQuery;
|
|
24
|
+
if (!searchQuery || searchQuery.trim() === '') {
|
|
25
|
+
setResults([]);
|
|
26
|
+
setTotal(0);
|
|
27
|
+
setHasMore(false);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
setError(null);
|
|
31
|
+
setIsLoading(true);
|
|
32
|
+
try {
|
|
33
|
+
const accessToken = authManager.getAccessToken();
|
|
34
|
+
if (!accessToken) {
|
|
35
|
+
throw new Error('Not authenticated');
|
|
36
|
+
}
|
|
37
|
+
const apiUrl = typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000';
|
|
38
|
+
const response = await fetch(`${apiUrl}/search/${options.entity}`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
Authorization: `Bearer ${accessToken}`,
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
query: searchQuery,
|
|
46
|
+
columns: options.columns,
|
|
47
|
+
limit: options.limit || 20,
|
|
48
|
+
offset: 0,
|
|
49
|
+
highlight: options.highlight !== false,
|
|
50
|
+
rank: options.rank !== false,
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const errorData = await response.json().catch(() => ({}));
|
|
55
|
+
throw new Error(errorData.error || `Search failed with status ${response.status}`);
|
|
56
|
+
}
|
|
57
|
+
const data = await response.json();
|
|
58
|
+
setResults(data.results || []);
|
|
59
|
+
setTotal(data.total || 0);
|
|
60
|
+
setHasMore(data.hasMore || false);
|
|
61
|
+
setCurrentQuery(searchQuery);
|
|
62
|
+
setCurrentOffset(data.results?.length || 0);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const error = err instanceof Error ? err : new Error('Search failed');
|
|
66
|
+
setError(error);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
setIsLoading(false);
|
|
71
|
+
}
|
|
72
|
+
}, [authManager, options.entity, options.columns, options.limit, options.highlight, options.rank, currentQuery]);
|
|
73
|
+
/**
|
|
74
|
+
* Load more results (pagination)
|
|
75
|
+
*/
|
|
76
|
+
const loadMore = useCallback(async () => {
|
|
77
|
+
if (!hasMore || isLoading) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setError(null);
|
|
81
|
+
setIsLoading(true);
|
|
82
|
+
try {
|
|
83
|
+
const accessToken = authManager.getAccessToken();
|
|
84
|
+
if (!accessToken) {
|
|
85
|
+
throw new Error('Not authenticated');
|
|
86
|
+
}
|
|
87
|
+
const apiUrl = typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000';
|
|
88
|
+
const response = await fetch(`${apiUrl}/search/${options.entity}`, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
Authorization: `Bearer ${accessToken}`,
|
|
93
|
+
},
|
|
94
|
+
body: JSON.stringify({
|
|
95
|
+
query: currentQuery,
|
|
96
|
+
columns: options.columns,
|
|
97
|
+
limit: options.limit || 20,
|
|
98
|
+
offset: currentOffset,
|
|
99
|
+
highlight: options.highlight !== false,
|
|
100
|
+
rank: options.rank !== false,
|
|
101
|
+
}),
|
|
102
|
+
});
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
const errorData = await response.json().catch(() => ({}));
|
|
105
|
+
throw new Error(errorData.error || `Search failed with status ${response.status}`);
|
|
106
|
+
}
|
|
107
|
+
const data = await response.json();
|
|
108
|
+
setResults((prev) => [...prev, ...(data.results || [])]);
|
|
109
|
+
setHasMore(data.hasMore || false);
|
|
110
|
+
setCurrentOffset((prev) => prev + (data.results?.length || 0));
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const error = err instanceof Error ? err : new Error('Failed to load more results');
|
|
114
|
+
setError(error);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
setIsLoading(false);
|
|
119
|
+
}
|
|
120
|
+
}, [
|
|
121
|
+
authManager,
|
|
122
|
+
options.entity,
|
|
123
|
+
options.columns,
|
|
124
|
+
options.limit,
|
|
125
|
+
options.highlight,
|
|
126
|
+
options.rank,
|
|
127
|
+
currentQuery,
|
|
128
|
+
currentOffset,
|
|
129
|
+
hasMore,
|
|
130
|
+
isLoading,
|
|
131
|
+
]);
|
|
132
|
+
/**
|
|
133
|
+
* Reset search state
|
|
134
|
+
*/
|
|
135
|
+
const reset = useCallback(() => {
|
|
136
|
+
setResults([]);
|
|
137
|
+
setTotal(0);
|
|
138
|
+
setHasMore(false);
|
|
139
|
+
setError(null);
|
|
140
|
+
setCurrentOffset(0);
|
|
141
|
+
}, []);
|
|
142
|
+
// Auto-search with debounce
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
if (!options.autoSearch) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const debounceMs = options.debounceMs || 300;
|
|
148
|
+
const timer = setTimeout(() => {
|
|
149
|
+
if (currentQuery !== options.query) {
|
|
150
|
+
setCurrentQuery(options.query);
|
|
151
|
+
search(options.query);
|
|
152
|
+
}
|
|
153
|
+
}, debounceMs);
|
|
154
|
+
return () => clearTimeout(timer);
|
|
155
|
+
}, [options.autoSearch, options.debounceMs, options.query, currentQuery, search]);
|
|
156
|
+
// Initial search if autoSearch is enabled
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
if (options.autoSearch && options.query) {
|
|
159
|
+
search(options.query);
|
|
160
|
+
}
|
|
161
|
+
}, []); // Run once on mount
|
|
162
|
+
return {
|
|
163
|
+
results,
|
|
164
|
+
total,
|
|
165
|
+
hasMore,
|
|
166
|
+
isLoading,
|
|
167
|
+
error,
|
|
168
|
+
search,
|
|
169
|
+
loadMore,
|
|
170
|
+
reset,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export default useSearch;
|
|
174
|
+
//# sourceMappingURL=use-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-search.js","sourceRoot":"","sources":["../../../../src/hooks/use-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface UseSubscribeResult<T> {
|
|
2
|
+
data: T[] | null;
|
|
3
|
+
isConnected: boolean;
|
|
4
|
+
isLoading: boolean;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
refetch: () => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Hook to subscribe to real-time data changes from an entity
|
|
10
|
+
* Falls back to polling if WebSocket is unavailable
|
|
11
|
+
*/
|
|
12
|
+
export declare function useSubscribe<T = any>(entity: string, filters?: Record<string, any>): UseSubscribeResult<T>;
|
|
13
|
+
export default useSubscribe;
|
|
14
|
+
//# sourceMappingURL=use-subscribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-subscribe.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-subscribe.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAClC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,kBAAkB,CAAC,CAAC,CAAC,CAoLvB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { useContext, useCallback, useState, useEffect, useRef } from 'react';
|
|
2
|
+
import { EdgeBaseContext } from '../provider';
|
|
3
|
+
import { RealtimeSyncManager } from '@edgebasejs/client-core';
|
|
4
|
+
/**
|
|
5
|
+
* Hook to subscribe to real-time data changes from an entity
|
|
6
|
+
* Falls back to polling if WebSocket is unavailable
|
|
7
|
+
*/
|
|
8
|
+
export function useSubscribe(entity, filters) {
|
|
9
|
+
const context = useContext(EdgeBaseContext);
|
|
10
|
+
if (!context) {
|
|
11
|
+
throw new Error('useSubscribe must be used within EdgeBaseProvider');
|
|
12
|
+
}
|
|
13
|
+
const { storage, subscriptionHandler } = context;
|
|
14
|
+
const [data, setData] = useState(null);
|
|
15
|
+
const [isConnected, setIsConnected] = useState(false);
|
|
16
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
17
|
+
const [error, setError] = useState(null);
|
|
18
|
+
const [subscriptionId, setSubscriptionId] = useState(null);
|
|
19
|
+
const syncManagerRef = useRef(null);
|
|
20
|
+
// Initialize sync manager once
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (!syncManagerRef.current) {
|
|
23
|
+
syncManagerRef.current = new RealtimeSyncManager(storage);
|
|
24
|
+
}
|
|
25
|
+
}, [storage]);
|
|
26
|
+
// Load initial data from local storage
|
|
27
|
+
const loadInitialData = useCallback(async () => {
|
|
28
|
+
setIsLoading(true);
|
|
29
|
+
setError(null);
|
|
30
|
+
try {
|
|
31
|
+
const records = await syncManagerRef.current.getEntityData(entity);
|
|
32
|
+
// Apply filters if provided
|
|
33
|
+
const filtered = filters
|
|
34
|
+
? records.filter((record) => {
|
|
35
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
36
|
+
if (record[key] !== value) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
})
|
|
42
|
+
: records;
|
|
43
|
+
setData(filtered);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const error = err instanceof Error ? err : new Error('Failed to load data');
|
|
47
|
+
setError(error);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
setIsLoading(false);
|
|
51
|
+
}
|
|
52
|
+
}, [entity, filters]);
|
|
53
|
+
// Handle incoming changes
|
|
54
|
+
const handleChange = useCallback(async (change) => {
|
|
55
|
+
if (change.entity !== entity)
|
|
56
|
+
return;
|
|
57
|
+
try {
|
|
58
|
+
// Update storage via sync manager
|
|
59
|
+
await syncManagerRef.current.handleChange(change);
|
|
60
|
+
// Get updated data from storage
|
|
61
|
+
const records = await syncManagerRef.current.getEntityData(entity);
|
|
62
|
+
// Apply filters if provided
|
|
63
|
+
const filtered = filters
|
|
64
|
+
? records.filter((record) => {
|
|
65
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
66
|
+
if (record[key] !== value) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
})
|
|
72
|
+
: records;
|
|
73
|
+
// Update state
|
|
74
|
+
setData(filtered);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
console.error('Failed to update data from change:', err);
|
|
78
|
+
}
|
|
79
|
+
}, [entity, filters]);
|
|
80
|
+
// Subscribe to changes
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
let mounted = true;
|
|
83
|
+
const setupSubscription = async () => {
|
|
84
|
+
await loadInitialData();
|
|
85
|
+
if (!subscriptionHandler) {
|
|
86
|
+
console.warn('Subscription handler not available, using polling');
|
|
87
|
+
// Fallback to polling every 30 seconds
|
|
88
|
+
const pollInterval = setInterval(() => {
|
|
89
|
+
loadInitialData().catch(console.error);
|
|
90
|
+
}, 30000);
|
|
91
|
+
return () => clearInterval(pollInterval);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// Check if WebSocket is connected, if not try to connect
|
|
95
|
+
if (!subscriptionHandler.isConnected()) {
|
|
96
|
+
await subscriptionHandler.connect();
|
|
97
|
+
}
|
|
98
|
+
if (mounted) {
|
|
99
|
+
setIsConnected(true);
|
|
100
|
+
}
|
|
101
|
+
// Subscribe to local storage changes from sync manager
|
|
102
|
+
const unsubscribeLocal = syncManagerRef.current.onEntityChange(entity, handleChange);
|
|
103
|
+
// Subscribe to WebSocket changes
|
|
104
|
+
const subId = subscriptionHandler.subscribe({
|
|
105
|
+
entity,
|
|
106
|
+
filters,
|
|
107
|
+
onData: handleChange,
|
|
108
|
+
onError: (err) => {
|
|
109
|
+
if (mounted) {
|
|
110
|
+
setError(err);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
onSubscribed: (subscriptionId) => {
|
|
114
|
+
if (mounted) {
|
|
115
|
+
setSubscriptionId(subscriptionId);
|
|
116
|
+
console.log(`Subscribed to ${entity} with ID: ${subscriptionId}`);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
onUnsubscribed: () => {
|
|
120
|
+
if (mounted) {
|
|
121
|
+
setSubscriptionId(null);
|
|
122
|
+
console.log(`Unsubscribed from ${entity}`);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
if (mounted) {
|
|
127
|
+
setSubscriptionId(subId);
|
|
128
|
+
}
|
|
129
|
+
return () => {
|
|
130
|
+
if (subId) {
|
|
131
|
+
subscriptionHandler.unsubscribe(subId);
|
|
132
|
+
}
|
|
133
|
+
if (unsubscribeLocal) {
|
|
134
|
+
unsubscribeLocal();
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.warn('Failed to establish WebSocket subscription, falling back to polling', err);
|
|
140
|
+
// Fallback to polling
|
|
141
|
+
const pollInterval = setInterval(() => {
|
|
142
|
+
loadInitialData().catch(console.error);
|
|
143
|
+
}, 30000);
|
|
144
|
+
if (mounted) {
|
|
145
|
+
setIsConnected(false);
|
|
146
|
+
}
|
|
147
|
+
return () => clearInterval(pollInterval);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const cleanup = setupSubscription();
|
|
151
|
+
return () => {
|
|
152
|
+
mounted = false;
|
|
153
|
+
cleanup.then((fn) => fn?.()).catch(console.error);
|
|
154
|
+
};
|
|
155
|
+
}, [entity, filters, subscriptionHandler, loadInitialData, handleChange]);
|
|
156
|
+
return {
|
|
157
|
+
data,
|
|
158
|
+
isConnected,
|
|
159
|
+
isLoading,
|
|
160
|
+
error,
|
|
161
|
+
refetch: loadInitialData,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export default useSubscribe;
|
|
165
|
+
//# sourceMappingURL=use-subscribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-subscribe.js","sourceRoot":"","sources":["../../../../src/hooks/use-subscribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type TransactionOptions } from '@edgebasejs/client-core';
|
|
2
|
+
export interface UseTransactionResult {
|
|
3
|
+
transactionId: string | null;
|
|
4
|
+
status: string | null;
|
|
5
|
+
changeCount: number;
|
|
6
|
+
appliedCount: number | undefined;
|
|
7
|
+
conflictCount: number | undefined;
|
|
8
|
+
isCommitting: boolean;
|
|
9
|
+
error: Error | null;
|
|
10
|
+
begin: (options?: TransactionOptions) => Promise<string>;
|
|
11
|
+
addChange: (entity: string, recordId: string, operation: 'create' | 'update' | 'delete', data: Record<string, any>) => void;
|
|
12
|
+
commit: () => Promise<{
|
|
13
|
+
success: boolean;
|
|
14
|
+
appliedCount: number;
|
|
15
|
+
errors: string[];
|
|
16
|
+
}>;
|
|
17
|
+
rollback: () => Promise<void>;
|
|
18
|
+
getStatus: () => Promise<any>;
|
|
19
|
+
reset: () => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Hook for managing transactions in React components
|
|
23
|
+
* Provides ACID transaction support with automatic state management
|
|
24
|
+
*/
|
|
25
|
+
export declare function useTransaction(): UseTransactionResult;
|
|
26
|
+
export default useTransaction;
|
|
27
|
+
//# sourceMappingURL=use-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-transaction.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-transaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,SAAS,EAAE,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACtB,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACpF,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,CA0LrD;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { useContext, useCallback, useState, useEffect, useRef } from 'react';
|
|
2
|
+
import { EdgeBaseContext } from '../provider';
|
|
3
|
+
import { ClientTransactionManager, } from '@edgebasejs/client-core';
|
|
4
|
+
/**
|
|
5
|
+
* Hook for managing transactions in React components
|
|
6
|
+
* Provides ACID transaction support with automatic state management
|
|
7
|
+
*/
|
|
8
|
+
export function useTransaction() {
|
|
9
|
+
const context = useContext(EdgeBaseContext);
|
|
10
|
+
if (!context) {
|
|
11
|
+
throw new Error('useTransaction must be used within EdgeBaseProvider');
|
|
12
|
+
}
|
|
13
|
+
const { authManager } = context;
|
|
14
|
+
const [transaction, setTransaction] = useState(null);
|
|
15
|
+
const [isCommitting, setIsCommitting] = useState(false);
|
|
16
|
+
const [error, setError] = useState(null);
|
|
17
|
+
const txnManagerRef = useRef(null);
|
|
18
|
+
// Initialize transaction manager
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const initializeManager = async () => {
|
|
21
|
+
const accessToken = authManager.getAccessToken();
|
|
22
|
+
if (accessToken && !txnManagerRef.current) {
|
|
23
|
+
// Get API URL from context or construct from window location
|
|
24
|
+
const apiUrl = typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000';
|
|
25
|
+
txnManagerRef.current = new ClientTransactionManager(apiUrl, accessToken);
|
|
26
|
+
// Subscribe to transaction changes
|
|
27
|
+
txnManagerRef.current.subscribe((txn) => {
|
|
28
|
+
setTransaction({ ...txn });
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
initializeManager();
|
|
33
|
+
}, [authManager]);
|
|
34
|
+
// Update access token on auth changes
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
const unsubscribe = authManager.subscribe((state) => {
|
|
37
|
+
if (state.accessToken && txnManagerRef.current) {
|
|
38
|
+
// Re-create manager with new token
|
|
39
|
+
const apiUrl = typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000';
|
|
40
|
+
txnManagerRef.current = new ClientTransactionManager(apiUrl, state.accessToken);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return unsubscribe;
|
|
44
|
+
}, [authManager]);
|
|
45
|
+
/**
|
|
46
|
+
* Begin a new transaction
|
|
47
|
+
*/
|
|
48
|
+
const begin = useCallback(async (options) => {
|
|
49
|
+
setError(null);
|
|
50
|
+
try {
|
|
51
|
+
if (!txnManagerRef.current) {
|
|
52
|
+
throw new Error('Transaction manager not initialized');
|
|
53
|
+
}
|
|
54
|
+
const transactionId = await txnManagerRef.current.begin(options);
|
|
55
|
+
return transactionId;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const error = err instanceof Error ? err : new Error('Failed to begin transaction');
|
|
59
|
+
setError(error);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}, []);
|
|
63
|
+
/**
|
|
64
|
+
* Add a change to the transaction
|
|
65
|
+
*/
|
|
66
|
+
const addChange = useCallback((entity, recordId, operation, data) => {
|
|
67
|
+
try {
|
|
68
|
+
if (!txnManagerRef.current) {
|
|
69
|
+
throw new Error('Transaction manager not initialized');
|
|
70
|
+
}
|
|
71
|
+
txnManagerRef.current.addChange(entity, recordId, operation, data);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const error = err instanceof Error ? err : new Error('Failed to add change');
|
|
75
|
+
setError(error);
|
|
76
|
+
}
|
|
77
|
+
}, []);
|
|
78
|
+
/**
|
|
79
|
+
* Commit the transaction
|
|
80
|
+
*/
|
|
81
|
+
const commit = useCallback(async () => {
|
|
82
|
+
setError(null);
|
|
83
|
+
setIsCommitting(true);
|
|
84
|
+
try {
|
|
85
|
+
if (!txnManagerRef.current) {
|
|
86
|
+
throw new Error('Transaction manager not initialized');
|
|
87
|
+
}
|
|
88
|
+
const result = await txnManagerRef.current.commit();
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const error = err instanceof Error ? err : new Error('Failed to commit transaction');
|
|
93
|
+
setError(error);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
setIsCommitting(false);
|
|
98
|
+
}
|
|
99
|
+
}, []);
|
|
100
|
+
/**
|
|
101
|
+
* Rollback the transaction
|
|
102
|
+
*/
|
|
103
|
+
const rollback = useCallback(async () => {
|
|
104
|
+
setError(null);
|
|
105
|
+
try {
|
|
106
|
+
if (!txnManagerRef.current) {
|
|
107
|
+
throw new Error('Transaction manager not initialized');
|
|
108
|
+
}
|
|
109
|
+
await txnManagerRef.current.rollback();
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const error = err instanceof Error ? err : new Error('Failed to rollback transaction');
|
|
113
|
+
setError(error);
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}, []);
|
|
117
|
+
/**
|
|
118
|
+
* Get transaction status
|
|
119
|
+
*/
|
|
120
|
+
const getStatus = useCallback(async () => {
|
|
121
|
+
try {
|
|
122
|
+
if (!txnManagerRef.current) {
|
|
123
|
+
throw new Error('Transaction manager not initialized');
|
|
124
|
+
}
|
|
125
|
+
return await txnManagerRef.current.getStatus();
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const error = err instanceof Error ? err : new Error('Failed to get status');
|
|
129
|
+
setError(error);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}, []);
|
|
133
|
+
/**
|
|
134
|
+
* Reset transaction state
|
|
135
|
+
*/
|
|
136
|
+
const reset = useCallback(() => {
|
|
137
|
+
if (txnManagerRef.current) {
|
|
138
|
+
txnManagerRef.current.reset();
|
|
139
|
+
}
|
|
140
|
+
setTransaction(null);
|
|
141
|
+
setError(null);
|
|
142
|
+
}, []);
|
|
143
|
+
return {
|
|
144
|
+
transactionId: transaction?.id || null,
|
|
145
|
+
status: transaction?.status || null,
|
|
146
|
+
changeCount: transaction?.changes.length || 0,
|
|
147
|
+
appliedCount: transaction?.appliedCount,
|
|
148
|
+
conflictCount: transaction?.conflictCount,
|
|
149
|
+
isCommitting,
|
|
150
|
+
error,
|
|
151
|
+
begin,
|
|
152
|
+
addChange,
|
|
153
|
+
commit,
|
|
154
|
+
rollback,
|
|
155
|
+
getStatus,
|
|
156
|
+
reset,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
export default useTransaction;
|
|
160
|
+
//# sourceMappingURL=use-transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-transaction.js","sourceRoot":"","sources":["../../../../src/hooks/use-transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { AuthManager, ClientSyncEngine, OutboxManager, type IStorageAdapter } from '@edgebasejs/client-core';
|
|
2
|
+
import { AuthManager, ClientSyncEngine, OutboxManager, ClientSubscriptionHandler, type IStorageAdapter } from '@edgebasejs/client-core';
|
|
3
3
|
export interface EdgeBaseContextValue {
|
|
4
|
+
apiUrl: string;
|
|
4
5
|
storage: IStorageAdapter;
|
|
5
6
|
authManager: AuthManager;
|
|
6
7
|
syncEngine: ClientSyncEngine;
|
|
7
8
|
outboxManager: OutboxManager;
|
|
9
|
+
subscriptionHandler?: ClientSubscriptionHandler;
|
|
8
10
|
isInitialized: boolean;
|
|
9
11
|
}
|
|
10
12
|
export declare const EdgeBaseContext: React.Context<EdgeBaseContextValue | null>;
|
|
@@ -12,10 +14,11 @@ export interface EdgeBaseProviderProps {
|
|
|
12
14
|
apiUrl: string;
|
|
13
15
|
children: React.ReactNode;
|
|
14
16
|
useMemoryStorage?: boolean;
|
|
17
|
+
autoSync?: boolean;
|
|
15
18
|
}
|
|
16
19
|
/**
|
|
17
20
|
* EdgeBase provider component
|
|
18
21
|
* Wraps the app to provide EdgeBase functionality via context
|
|
19
22
|
*/
|
|
20
|
-
export declare function EdgeBaseProvider({ apiUrl, children, useMemoryStorage, }: EdgeBaseProviderProps):
|
|
23
|
+
export declare function EdgeBaseProvider({ apiUrl, children, useMemoryStorage, autoSync, }: EdgeBaseProviderProps): React.JSX.Element | null;
|
|
21
24
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EAEb,yBAAyB,EACzB,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,4CAAyD,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,QAAQ,EACR,gBAAwB,EACxB,QAAe,GAChB,EAAE,qBAAqB,4BA2FvB"}
|