@vaiftech/react 1.0.1 → 1.0.4
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 +563 -32
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,12 +32,23 @@ function App() {
|
|
|
32
32
|
}
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
## Hooks
|
|
35
|
+
## Hooks Overview
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
| Category | Hooks |
|
|
38
|
+
|----------|-------|
|
|
39
|
+
| **Auth** | `useAuth`, `useUser`, `useToken`, `usePasswordReset`, `useEmailVerification`, `useMagicLink`, `useOAuth`, `useMFA` |
|
|
40
|
+
| **Query** | `useQuery`, `useQueryById`, `useQueryFirst`, `usePaginatedQuery`, `useInfiniteQuery`, `useCount` |
|
|
41
|
+
| **Mutation** | `useMutation`, `useCreate`, `useUpdate`, `useDelete`, `useUpsert`, `useBatchCreate`, `useBatchUpdate`, `useBatchDelete`, `useOptimisticMutation` |
|
|
42
|
+
| **Realtime** | `useSubscription`, `useChannel`, `usePresence`, `useRealtimeConnection`, `useBroadcast` |
|
|
43
|
+
| **Storage** | `useUpload`, `useDownload`, `useFile`, `useFiles`, `useDropzone`, `usePublicUrl` |
|
|
44
|
+
| **Functions** | `useFunction`, `useRpc`, `useFunctionList`, `useBatchInvoke`, `useScheduledFunction` |
|
|
45
|
+
| **MongoDB** | `useMongoFind`, `useMongoFindOne`, `useMongoAggregate`, `useMongoInsertOne`, `useMongoInsertMany`, `useMongoUpdateOne`, `useMongoUpdateMany`, `useMongoDeleteOne`, `useMongoDeleteMany`, `useMongoInfiniteFind`, `useMongoCount`, `useMongoDistinct`, `useMongoCollection` |
|
|
46
|
+
| **Observability** | `useMetrics`, `useAuditLogs`, `useIncidents`, `useSystemHealth`, `useRealtimeStats`, `useErrorTracking` |
|
|
47
|
+
|
|
48
|
+
## Authentication
|
|
38
49
|
|
|
39
50
|
```tsx
|
|
40
|
-
import { useAuth, useUser, useSession } from '@vaiftech/react';
|
|
51
|
+
import { useAuth, useUser, useSession, useMFA, useOAuth } from '@vaiftech/react';
|
|
41
52
|
|
|
42
53
|
function AuthComponent() {
|
|
43
54
|
const { user, isLoading, signIn, signUp, signOut } = useAuth();
|
|
@@ -66,17 +77,79 @@ function Profile() {
|
|
|
66
77
|
return user ? <p>{user.email}</p> : null;
|
|
67
78
|
}
|
|
68
79
|
|
|
69
|
-
//
|
|
70
|
-
function
|
|
71
|
-
const {
|
|
72
|
-
|
|
80
|
+
// OAuth login
|
|
81
|
+
function OAuthLogin() {
|
|
82
|
+
const { signInWithProvider, isLoading } = useOAuth();
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div>
|
|
86
|
+
<button onClick={() => signInWithProvider('google')}>
|
|
87
|
+
Sign in with Google
|
|
88
|
+
</button>
|
|
89
|
+
<button onClick={() => signInWithProvider('github')}>
|
|
90
|
+
Sign in with GitHub
|
|
91
|
+
</button>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// MFA setup
|
|
97
|
+
function MFASetup() {
|
|
98
|
+
const { enroll, verify, isEnrolling, qrCode } = useMFA();
|
|
99
|
+
|
|
100
|
+
const handleSetup = async () => {
|
|
101
|
+
await enroll({ type: 'totp' });
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<div>
|
|
106
|
+
{qrCode && <img src={qrCode} alt="Scan with authenticator" />}
|
|
107
|
+
<button onClick={handleSetup}>Enable MFA</button>
|
|
108
|
+
</div>
|
|
109
|
+
);
|
|
73
110
|
}
|
|
74
111
|
```
|
|
75
112
|
|
|
76
|
-
###
|
|
113
|
+
### Standalone Auth Provider
|
|
114
|
+
|
|
115
|
+
For auth-only applications, use the standalone auth provider from `@vaiftech/auth`:
|
|
77
116
|
|
|
78
117
|
```tsx
|
|
79
|
-
import {
|
|
118
|
+
import { AuthProvider, useAuth, useSession } from '@vaiftech/react';
|
|
119
|
+
|
|
120
|
+
function App() {
|
|
121
|
+
return (
|
|
122
|
+
<AuthProvider config={{ url: 'https://api.vaif.studio', apiKey: 'your-key' }}>
|
|
123
|
+
<YourApp />
|
|
124
|
+
</AuthProvider>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function LoginPage() {
|
|
129
|
+
const { signInWithPassword, signInWithOAuth, isLoading } = useAuth();
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
<div>
|
|
133
|
+
<form onSubmit={(e) => {
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
signInWithPassword({ email, password });
|
|
136
|
+
}}>
|
|
137
|
+
<input type="email" />
|
|
138
|
+
<input type="password" />
|
|
139
|
+
<button type="submit">Sign In</button>
|
|
140
|
+
</form>
|
|
141
|
+
<button onClick={() => signInWithOAuth({ provider: 'google' })}>
|
|
142
|
+
Google
|
|
143
|
+
</button>
|
|
144
|
+
</div>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Data Fetching
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import { useQuery, useQueryById, usePaginatedQuery, useInfiniteQuery } from '@vaiftech/react';
|
|
80
153
|
|
|
81
154
|
interface Post {
|
|
82
155
|
id: string;
|
|
@@ -84,6 +157,7 @@ interface Post {
|
|
|
84
157
|
content: string;
|
|
85
158
|
}
|
|
86
159
|
|
|
160
|
+
// Basic query
|
|
87
161
|
function PostList() {
|
|
88
162
|
const { data: posts, isLoading, error, refetch } = useQuery<Post>('posts', {
|
|
89
163
|
filters: [{ field: 'published', operator: 'eq', value: true }],
|
|
@@ -103,8 +177,67 @@ function PostList() {
|
|
|
103
177
|
);
|
|
104
178
|
}
|
|
105
179
|
|
|
180
|
+
// Query by ID
|
|
181
|
+
function PostDetail({ postId }: { postId: string }) {
|
|
182
|
+
const { data: post, isLoading } = useQueryById<Post>('posts', postId);
|
|
183
|
+
|
|
184
|
+
if (isLoading) return <div>Loading...</div>;
|
|
185
|
+
return <h1>{post?.title}</h1>;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Paginated query
|
|
189
|
+
function PaginatedPosts() {
|
|
190
|
+
const {
|
|
191
|
+
data,
|
|
192
|
+
page,
|
|
193
|
+
totalPages,
|
|
194
|
+
nextPage,
|
|
195
|
+
prevPage,
|
|
196
|
+
isLoading
|
|
197
|
+
} = usePaginatedQuery<Post>('posts', {
|
|
198
|
+
pageSize: 20,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
return (
|
|
202
|
+
<div>
|
|
203
|
+
{data?.map(post => <div key={post.id}>{post.title}</div>)}
|
|
204
|
+
<button onClick={prevPage} disabled={page === 1}>Prev</button>
|
|
205
|
+
<span>{page} / {totalPages}</span>
|
|
206
|
+
<button onClick={nextPage} disabled={page === totalPages}>Next</button>
|
|
207
|
+
</div>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Infinite scroll
|
|
212
|
+
function InfinitePosts() {
|
|
213
|
+
const {
|
|
214
|
+
data,
|
|
215
|
+
fetchNextPage,
|
|
216
|
+
hasNextPage,
|
|
217
|
+
isFetchingNextPage
|
|
218
|
+
} = useInfiniteQuery<Post>('posts', { limit: 20 });
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<div>
|
|
222
|
+
{data?.map(post => <div key={post.id}>{post.title}</div>)}
|
|
223
|
+
{hasNextPage && (
|
|
224
|
+
<button onClick={fetchNextPage} disabled={isFetchingNextPage}>
|
|
225
|
+
{isFetchingNextPage ? 'Loading...' : 'Load More'}
|
|
226
|
+
</button>
|
|
227
|
+
)}
|
|
228
|
+
</div>
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Mutations
|
|
234
|
+
|
|
235
|
+
```tsx
|
|
236
|
+
import { useCreate, useUpdate, useDelete, useMutation, useOptimisticMutation } from '@vaiftech/react';
|
|
237
|
+
|
|
238
|
+
// Create
|
|
106
239
|
function CreatePost() {
|
|
107
|
-
const { create, isCreating } =
|
|
240
|
+
const { create, isCreating, error } = useCreate<Post>('posts');
|
|
108
241
|
|
|
109
242
|
const handleSubmit = async (data: Omit<Post, 'id'>) => {
|
|
110
243
|
const newPost = await create(data);
|
|
@@ -117,47 +250,131 @@ function CreatePost() {
|
|
|
117
250
|
</button>
|
|
118
251
|
);
|
|
119
252
|
}
|
|
253
|
+
|
|
254
|
+
// Update
|
|
255
|
+
function UpdatePost({ postId }: { postId: string }) {
|
|
256
|
+
const { update, isUpdating } = useUpdate<Post>('posts');
|
|
257
|
+
|
|
258
|
+
return (
|
|
259
|
+
<button
|
|
260
|
+
onClick={() => update(postId, { title: 'Updated Title' })}
|
|
261
|
+
disabled={isUpdating}
|
|
262
|
+
>
|
|
263
|
+
Update
|
|
264
|
+
</button>
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Delete
|
|
269
|
+
function DeletePost({ postId }: { postId: string }) {
|
|
270
|
+
const { remove, isDeleting } = useDelete('posts');
|
|
271
|
+
|
|
272
|
+
return (
|
|
273
|
+
<button onClick={() => remove(postId)} disabled={isDeleting}>
|
|
274
|
+
Delete
|
|
275
|
+
</button>
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Full mutation hook
|
|
280
|
+
function PostActions() {
|
|
281
|
+
const { create, update, remove, isLoading } = useMutation<Post>('posts');
|
|
282
|
+
|
|
283
|
+
// Use create, update, remove as needed
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Optimistic updates
|
|
287
|
+
function OptimisticLike({ postId }: { postId: string }) {
|
|
288
|
+
const { mutate } = useOptimisticMutation<Post>('posts', {
|
|
289
|
+
optimisticUpdate: (cache, postId) => {
|
|
290
|
+
return { ...cache[postId], likes: cache[postId].likes + 1 };
|
|
291
|
+
},
|
|
292
|
+
rollbackOnError: true,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
return <button onClick={() => mutate(postId, { likes: '+1' })}>Like</button>;
|
|
296
|
+
}
|
|
120
297
|
```
|
|
121
298
|
|
|
122
|
-
|
|
299
|
+
## Realtime
|
|
123
300
|
|
|
124
301
|
```tsx
|
|
125
|
-
import {
|
|
302
|
+
import { useSubscription, useChannel, usePresence, useBroadcast } from '@vaiftech/react';
|
|
126
303
|
|
|
127
|
-
// Subscribe to changes
|
|
304
|
+
// Subscribe to table changes
|
|
128
305
|
function MessageListener() {
|
|
129
|
-
|
|
306
|
+
useSubscription<Message>('messages', {
|
|
130
307
|
event: 'INSERT',
|
|
131
|
-
onInsert: (message) =>
|
|
132
|
-
|
|
133
|
-
|
|
308
|
+
onInsert: (message) => console.log('New message:', message),
|
|
309
|
+
onUpdate: (message) => console.log('Updated:', message),
|
|
310
|
+
onDelete: (message) => console.log('Deleted:', message.id),
|
|
134
311
|
});
|
|
135
312
|
|
|
136
313
|
return null;
|
|
137
314
|
}
|
|
138
315
|
|
|
139
|
-
//
|
|
140
|
-
function
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
316
|
+
// Channel communication
|
|
317
|
+
function ChatRoom({ roomId }: { roomId: string }) {
|
|
318
|
+
const channel = useChannel(`room-${roomId}`);
|
|
319
|
+
const [messages, setMessages] = useState<Message[]>([]);
|
|
320
|
+
|
|
321
|
+
useEffect(() => {
|
|
322
|
+
channel.on('message', (msg) => {
|
|
323
|
+
setMessages(prev => [...prev, msg]);
|
|
324
|
+
});
|
|
325
|
+
return () => channel.off('message');
|
|
326
|
+
}, [channel]);
|
|
327
|
+
|
|
328
|
+
const sendMessage = (text: string) => {
|
|
329
|
+
channel.send('message', { text, timestamp: Date.now() });
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
return <div>{/* Chat UI */}</div>;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Presence tracking
|
|
336
|
+
function OnlineUsers({ roomId }: { roomId: string }) {
|
|
337
|
+
const { users, track, leave } = usePresence(`room-${roomId}`);
|
|
338
|
+
|
|
339
|
+
useEffect(() => {
|
|
340
|
+
track({ status: 'online', name: currentUser.name });
|
|
341
|
+
return () => leave();
|
|
342
|
+
}, []);
|
|
145
343
|
|
|
146
344
|
return (
|
|
147
|
-
<
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
</ul>
|
|
345
|
+
<div>
|
|
346
|
+
<h4>Online ({users.length})</h4>
|
|
347
|
+
{users.map(u => <span key={u.id}>{u.name}</span>)}
|
|
348
|
+
</div>
|
|
152
349
|
);
|
|
153
350
|
}
|
|
351
|
+
|
|
352
|
+
// Broadcast events
|
|
353
|
+
function TypingIndicator({ roomId }: { roomId: string }) {
|
|
354
|
+
const { send, subscribe } = useBroadcast(`room-${roomId}`);
|
|
355
|
+
const [typing, setTyping] = useState<string[]>([]);
|
|
356
|
+
|
|
357
|
+
useEffect(() => {
|
|
358
|
+
subscribe('typing', (event) => {
|
|
359
|
+
setTyping(prev => [...prev, event.userId]);
|
|
360
|
+
setTimeout(() => {
|
|
361
|
+
setTyping(prev => prev.filter(id => id !== event.userId));
|
|
362
|
+
}, 3000);
|
|
363
|
+
});
|
|
364
|
+
}, []);
|
|
365
|
+
|
|
366
|
+
const onType = () => send('typing', { userId: currentUser.id });
|
|
367
|
+
|
|
368
|
+
return <div>{typing.length > 0 && `${typing.join(', ')} typing...`}</div>;
|
|
369
|
+
}
|
|
154
370
|
```
|
|
155
371
|
|
|
156
|
-
|
|
372
|
+
## Storage
|
|
157
373
|
|
|
158
374
|
```tsx
|
|
159
|
-
import { useUpload, useDownload, useFile, usePublicUrl } from '@vaiftech/react';
|
|
375
|
+
import { useUpload, useDownload, useFile, useFiles, useDropzone, usePublicUrl } from '@vaiftech/react';
|
|
160
376
|
|
|
377
|
+
// File upload with progress
|
|
161
378
|
function FileUpload() {
|
|
162
379
|
const { upload, progress, isUploading, error } = useUpload();
|
|
163
380
|
|
|
@@ -175,17 +392,50 @@ function FileUpload() {
|
|
|
175
392
|
);
|
|
176
393
|
}
|
|
177
394
|
|
|
395
|
+
// Drag and drop zone
|
|
396
|
+
function DropzoneUpload() {
|
|
397
|
+
const { getRootProps, getInputProps, isDragActive, files } = useDropzone({
|
|
398
|
+
accept: { 'image/*': ['.png', '.jpg', '.gif'] },
|
|
399
|
+
maxFiles: 5,
|
|
400
|
+
onDrop: async (files) => {
|
|
401
|
+
// Handle uploaded files
|
|
402
|
+
},
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
return (
|
|
406
|
+
<div {...getRootProps()}>
|
|
407
|
+
<input {...getInputProps()} />
|
|
408
|
+
{isDragActive ? 'Drop files here' : 'Drag files or click to upload'}
|
|
409
|
+
</div>
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Display files
|
|
178
414
|
function FileDisplay({ path }: { path: string }) {
|
|
179
415
|
const url = usePublicUrl(path);
|
|
180
416
|
return url ? <img src={url} alt="" /> : null;
|
|
181
417
|
}
|
|
418
|
+
|
|
419
|
+
// List files
|
|
420
|
+
function FileList({ prefix }: { prefix: string }) {
|
|
421
|
+
const { files, isLoading, refetch } = useFiles({ prefix });
|
|
422
|
+
|
|
423
|
+
return (
|
|
424
|
+
<ul>
|
|
425
|
+
{files?.map(file => (
|
|
426
|
+
<li key={file.path}>{file.name} ({file.size} bytes)</li>
|
|
427
|
+
))}
|
|
428
|
+
</ul>
|
|
429
|
+
);
|
|
430
|
+
}
|
|
182
431
|
```
|
|
183
432
|
|
|
184
|
-
|
|
433
|
+
## Edge Functions
|
|
185
434
|
|
|
186
435
|
```tsx
|
|
187
|
-
import { useFunction } from '@vaiftech/react';
|
|
436
|
+
import { useFunction, useRpc, useBatchInvoke } from '@vaiftech/react';
|
|
188
437
|
|
|
438
|
+
// Invoke function
|
|
189
439
|
function SendEmail() {
|
|
190
440
|
const { invoke, isInvoking, error, result } = useFunction('send-email');
|
|
191
441
|
|
|
@@ -202,6 +452,283 @@ function SendEmail() {
|
|
|
202
452
|
</button>
|
|
203
453
|
);
|
|
204
454
|
}
|
|
455
|
+
|
|
456
|
+
// RPC-style calls
|
|
457
|
+
function DataProcessor() {
|
|
458
|
+
const { call, isLoading, data } = useRpc<ProcessResult>('process-data');
|
|
459
|
+
|
|
460
|
+
return (
|
|
461
|
+
<button onClick={() => call({ input: rawData })}>
|
|
462
|
+
Process
|
|
463
|
+
</button>
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Batch invocations
|
|
468
|
+
function BatchProcessor() {
|
|
469
|
+
const { invoke, isInvoking, results } = useBatchInvoke();
|
|
470
|
+
|
|
471
|
+
const processAll = async () => {
|
|
472
|
+
await invoke([
|
|
473
|
+
{ name: 'resize-image', payload: { url: 'img1.jpg' } },
|
|
474
|
+
{ name: 'resize-image', payload: { url: 'img2.jpg' } },
|
|
475
|
+
{ name: 'resize-image', payload: { url: 'img3.jpg' } },
|
|
476
|
+
]);
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
return <button onClick={processAll}>Process All</button>;
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
## MongoDB Hooks
|
|
484
|
+
|
|
485
|
+
```tsx
|
|
486
|
+
import {
|
|
487
|
+
useMongoFind,
|
|
488
|
+
useMongoFindOne,
|
|
489
|
+
useMongoInsertOne,
|
|
490
|
+
useMongoUpdateOne,
|
|
491
|
+
useMongoDeleteOne,
|
|
492
|
+
useMongoAggregate,
|
|
493
|
+
useMongoCollection,
|
|
494
|
+
useMongoInfiniteFind,
|
|
495
|
+
} from '@vaiftech/react';
|
|
496
|
+
|
|
497
|
+
// Find documents
|
|
498
|
+
function UserList() {
|
|
499
|
+
const { data: users, isLoading, error, refetch } = useMongoFind<User>('users', {
|
|
500
|
+
filter: { status: 'active' },
|
|
501
|
+
sort: { createdAt: -1 },
|
|
502
|
+
limit: 20,
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
if (isLoading) return <div>Loading...</div>;
|
|
506
|
+
if (error) return <div>Error: {error.message}</div>;
|
|
507
|
+
|
|
508
|
+
return (
|
|
509
|
+
<ul>
|
|
510
|
+
{users?.map(user => <li key={user._id}>{user.name}</li>)}
|
|
511
|
+
</ul>
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// Find single document
|
|
516
|
+
function UserProfile({ id }: { id: string }) {
|
|
517
|
+
const { data: user, isLoading } = useMongoFindOne<User>('users', { _id: id });
|
|
518
|
+
return user ? <div>{user.name}</div> : null;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// Insert document
|
|
522
|
+
function CreateUser() {
|
|
523
|
+
const { insertOne, isInserting } = useMongoInsertOne<User>('users');
|
|
524
|
+
|
|
525
|
+
const handleCreate = async () => {
|
|
526
|
+
const result = await insertOne({
|
|
527
|
+
name: 'New User',
|
|
528
|
+
email: 'new@example.com',
|
|
529
|
+
createdAt: new Date(),
|
|
530
|
+
});
|
|
531
|
+
console.log('Created:', result.insertedId);
|
|
532
|
+
};
|
|
533
|
+
|
|
534
|
+
return (
|
|
535
|
+
<button onClick={handleCreate} disabled={isInserting}>
|
|
536
|
+
Create User
|
|
537
|
+
</button>
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Update document
|
|
542
|
+
function UpdateUser({ id }: { id: string }) {
|
|
543
|
+
const { updateOne, isUpdating } = useMongoUpdateOne('users');
|
|
544
|
+
|
|
545
|
+
return (
|
|
546
|
+
<button
|
|
547
|
+
onClick={() => updateOne({ _id: id }, { $set: { updatedAt: new Date() } })}
|
|
548
|
+
disabled={isUpdating}
|
|
549
|
+
>
|
|
550
|
+
Update
|
|
551
|
+
</button>
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Delete document
|
|
556
|
+
function DeleteUser({ id }: { id: string }) {
|
|
557
|
+
const { deleteOne, isDeleting } = useMongoDeleteOne('users');
|
|
558
|
+
return (
|
|
559
|
+
<button onClick={() => deleteOne({ _id: id })} disabled={isDeleting}>
|
|
560
|
+
Delete
|
|
561
|
+
</button>
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Aggregation pipeline
|
|
566
|
+
function UserStats() {
|
|
567
|
+
const { data: stats } = useMongoAggregate<{ _id: string; count: number }>('users', [
|
|
568
|
+
{ $match: { status: 'active' } },
|
|
569
|
+
{ $group: { _id: '$country', count: { $sum: 1 } } },
|
|
570
|
+
{ $sort: { count: -1 } },
|
|
571
|
+
]);
|
|
572
|
+
|
|
573
|
+
return (
|
|
574
|
+
<ul>
|
|
575
|
+
{stats?.map(stat => (
|
|
576
|
+
<li key={stat._id}>{stat._id}: {stat.count}</li>
|
|
577
|
+
))}
|
|
578
|
+
</ul>
|
|
579
|
+
);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Infinite scroll with MongoDB
|
|
583
|
+
function InfiniteUserList() {
|
|
584
|
+
const { data, fetchNextPage, hasNextPage } = useMongoInfiniteFind<User>('users', {
|
|
585
|
+
filter: { status: 'active' },
|
|
586
|
+
sort: { createdAt: -1 },
|
|
587
|
+
limit: 20,
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
return (
|
|
591
|
+
<div>
|
|
592
|
+
{data?.map(user => <div key={user._id}>{user.name}</div>)}
|
|
593
|
+
{hasNextPage && <button onClick={fetchNextPage}>Load More</button>}
|
|
594
|
+
</div>
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Full collection access
|
|
599
|
+
function AdvancedOps() {
|
|
600
|
+
const collection = useMongoCollection<User>('users');
|
|
601
|
+
|
|
602
|
+
const handleBulk = async () => {
|
|
603
|
+
const count = await collection.count({ status: 'active' });
|
|
604
|
+
const countries = await collection.distinct('country');
|
|
605
|
+
await collection.bulkWrite([
|
|
606
|
+
{ insertOne: { document: { name: 'Bulk User' } } },
|
|
607
|
+
]);
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
return <button onClick={handleBulk}>Run Operations</button>;
|
|
611
|
+
}
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
## Observability Hooks
|
|
615
|
+
|
|
616
|
+
```tsx
|
|
617
|
+
import {
|
|
618
|
+
useMetrics,
|
|
619
|
+
useAuditLogs,
|
|
620
|
+
useIncidents,
|
|
621
|
+
useSystemHealth,
|
|
622
|
+
useRealtimeStats,
|
|
623
|
+
useErrorTracking,
|
|
624
|
+
} from '@vaiftech/react';
|
|
625
|
+
|
|
626
|
+
// Metrics dashboard
|
|
627
|
+
function MetricsDashboard() {
|
|
628
|
+
const { metrics, isLoading, timeRange, setTimeRange, refresh } = useMetrics({
|
|
629
|
+
sources: ['api', 'database', 'storage'],
|
|
630
|
+
interval: '1h',
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
return (
|
|
634
|
+
<div>
|
|
635
|
+
<select onChange={(e) => setTimeRange(e.target.value)} value={timeRange}>
|
|
636
|
+
<option value="1h">Last Hour</option>
|
|
637
|
+
<option value="24h">Last 24 Hours</option>
|
|
638
|
+
<option value="7d">Last 7 Days</option>
|
|
639
|
+
</select>
|
|
640
|
+
{metrics?.map(m => (
|
|
641
|
+
<div key={m.name}>{m.name}: {m.value}</div>
|
|
642
|
+
))}
|
|
643
|
+
</div>
|
|
644
|
+
);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// Audit logs
|
|
648
|
+
function AuditLogViewer() {
|
|
649
|
+
const { logs, hasMore, loadMore, setFilters } = useAuditLogs({ limit: 50 });
|
|
650
|
+
|
|
651
|
+
return (
|
|
652
|
+
<div>
|
|
653
|
+
<select onChange={(e) => setFilters({ action: e.target.value })}>
|
|
654
|
+
<option value="">All Actions</option>
|
|
655
|
+
<option value="create">Create</option>
|
|
656
|
+
<option value="update">Update</option>
|
|
657
|
+
<option value="delete">Delete</option>
|
|
658
|
+
</select>
|
|
659
|
+
<ul>
|
|
660
|
+
{logs?.map(log => (
|
|
661
|
+
<li key={log.id}>{log.timestamp}: {log.action} by {log.userId}</li>
|
|
662
|
+
))}
|
|
663
|
+
</ul>
|
|
664
|
+
{hasMore && <button onClick={loadMore}>Load More</button>}
|
|
665
|
+
</div>
|
|
666
|
+
);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// Incident management
|
|
670
|
+
function IncidentList() {
|
|
671
|
+
const { incidents, activeCount, acknowledge, resolve } = useIncidents();
|
|
672
|
+
|
|
673
|
+
return (
|
|
674
|
+
<div>
|
|
675
|
+
<h3>Active Incidents: {activeCount}</h3>
|
|
676
|
+
{incidents?.map(incident => (
|
|
677
|
+
<div key={incident.id}>
|
|
678
|
+
<span>{incident.title} - {incident.severity}</span>
|
|
679
|
+
{incident.status === 'open' && (
|
|
680
|
+
<button onClick={() => acknowledge(incident.id)}>Ack</button>
|
|
681
|
+
)}
|
|
682
|
+
{incident.status === 'acknowledged' && (
|
|
683
|
+
<button onClick={() => resolve(incident.id)}>Resolve</button>
|
|
684
|
+
)}
|
|
685
|
+
</div>
|
|
686
|
+
))}
|
|
687
|
+
</div>
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
// System health
|
|
692
|
+
function SystemHealth() {
|
|
693
|
+
const { isHealthy, services, lastCheck } = useSystemHealth({ pollInterval: 30000 });
|
|
694
|
+
|
|
695
|
+
return (
|
|
696
|
+
<div>
|
|
697
|
+
<div>Status: {isHealthy ? 'Healthy' : 'Degraded'}</div>
|
|
698
|
+
<div>Last Check: {lastCheck?.toLocaleString()}</div>
|
|
699
|
+
{services?.map(svc => (
|
|
700
|
+
<div key={svc.name}>{svc.name}: {svc.status} ({svc.latency}ms)</div>
|
|
701
|
+
))}
|
|
702
|
+
</div>
|
|
703
|
+
);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Realtime stats
|
|
707
|
+
function RealtimeStats() {
|
|
708
|
+
const { connections, requestsPerSecond, activeUsers } = useRealtimeStats();
|
|
709
|
+
|
|
710
|
+
return (
|
|
711
|
+
<div>
|
|
712
|
+
<div>Connections: {connections}</div>
|
|
713
|
+
<div>Requests/sec: {requestsPerSecond}</div>
|
|
714
|
+
<div>Active Users: {activeUsers}</div>
|
|
715
|
+
</div>
|
|
716
|
+
);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// Error tracking
|
|
720
|
+
function ErrorTracker() {
|
|
721
|
+
const { errorRate, topErrors, trackError } = useErrorTracking({ timeRange: '24h' });
|
|
722
|
+
|
|
723
|
+
return (
|
|
724
|
+
<div>
|
|
725
|
+
<div>Error Rate: {errorRate}%</div>
|
|
726
|
+
{topErrors?.map(err => (
|
|
727
|
+
<div key={err.message}>{err.message} ({err.count})</div>
|
|
728
|
+
))}
|
|
729
|
+
</div>
|
|
730
|
+
);
|
|
731
|
+
}
|
|
205
732
|
```
|
|
206
733
|
|
|
207
734
|
## TypeScript Support
|
|
@@ -217,11 +744,15 @@ interface User {
|
|
|
217
744
|
|
|
218
745
|
const { data } = useQuery<User>('users');
|
|
219
746
|
// data is User[] | undefined
|
|
747
|
+
|
|
748
|
+
const { data: user } = useMongoFindOne<User>('users', { email: 'test@example.com' });
|
|
749
|
+
// user is User | null | undefined
|
|
220
750
|
```
|
|
221
751
|
|
|
222
752
|
## Related Packages
|
|
223
753
|
|
|
224
754
|
- [@vaiftech/client](https://www.npmjs.com/package/@vaiftech/client) - Core client SDK
|
|
755
|
+
- [@vaiftech/auth](https://www.npmjs.com/package/@vaiftech/auth) - Standalone auth client
|
|
225
756
|
- [@vaiftech/sdk-expo](https://www.npmjs.com/package/@vaiftech/sdk-expo) - React Native/Expo SDK
|
|
226
757
|
- [@vaiftech/cli](https://www.npmjs.com/package/@vaiftech/cli) - CLI tools
|
|
227
758
|
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var react$1=require('react'),client=require('@vaiftech/client'),jsxRuntime=require('react/jsx-runtime'),react=require('@vaiftech/auth/react');var te=react$1.createContext(null);function ne({config:t,children:e,onAuthStateChange:n,autoRefreshSession:o=true,storageKey:r="vaif-auth"}){let[a]=react$1.useState(()=>client.createVaifClient(t)),[u,d]=react$1.useState(null),[s,l]=react$1.useState(null),[i,h]=react$1.useState(null),[f,c]=react$1.useState(null),[y,g]=react$1.useState(true),T=react$1.useRef(null),p=react$1.useCallback((x,M,F)=>{let U={token:x,refreshToken:M,expiresAt:F};localStorage.setItem(r,JSON.stringify(U));},[r]),m=react$1.useCallback(()=>{localStorage.removeItem(r),d(null),l(null),h(null),c(null);},[r]);react$1.useEffect(()=>((async()=>{try{let M=localStorage.getItem(r);if(!M){g(!1);return}let F=JSON.parse(M);if(F.expiresAt&&new Date(F.expiresAt)<=new Date)if(F.refreshToken)try{let U=await a.auth.refreshToken(F.refreshToken);l(U.token),h(U.refreshToken??null),c(U.expiresAt),p(U.token,U.refreshToken,U.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();else {l(F.token),h(F.refreshToken??null),c(F.expiresAt??null);try{let U=await a.auth.getUser();d(U);}catch{if(F.refreshToken)try{let U=await a.auth.refreshToken(F.refreshToken);l(U.token),h(U.refreshToken??null),c(U.expiresAt),p(U.token,U.refreshToken,U.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();}}}catch{m();}finally{g(false);}})(),()=>{T.current&&clearTimeout(T.current);}),[a,r,p,m]),react$1.useEffect(()=>{if(!o||!f||!i)return;let x=new Date(f).getTime(),M=Date.now(),F=x-M-6e4;return F>0&&(T.current=setTimeout(async()=>{try{let U=await a.auth.refreshToken(i);l(U.token),h(U.refreshToken??null),c(U.expiresAt),p(U.token,U.refreshToken,U.expiresAt);}catch{m();}},F)),()=>{T.current&&clearTimeout(T.current);}},[o,a,f,i,p,m]),react$1.useEffect(()=>{y||n?.(u);},[u,y,n]);let b=react$1.useCallback(async(x,M)=>{let F=await a.auth.login(x,M);if("mfaRequired"in F)throw new Error("MFA required - use verifyMFA to complete login");let U=F;return d(U.user),l(U.token),h(U.refreshToken??null),c(U.expiresAt??null),p(U.token,U.refreshToken,U.expiresAt),U},[a,p]),w=react$1.useCallback(async(x,M,F)=>{let U=await a.auth.signUp(x,M,{metadata:F});return d(U.user),l(U.token),h(U.refreshToken??null),c(U.expiresAt??null),p(U.token,U.refreshToken,U.expiresAt),U},[a,p]),v=react$1.useCallback(async()=>{try{await a.auth.logout();}finally{m();}},[a,m]),E=react$1.useCallback(async()=>{if(!i)throw new Error("No refresh token available");let x=await a.auth.refreshToken(i);l(x.token),h(x.refreshToken??null),c(x.expiresAt),p(x.token,x.refreshToken,x.expiresAt);},[a,i,p]),C=react$1.useCallback(x=>{d(M=>M?{...M,...x}:null);},[]),q={client:a,user:u,token:s,isLoading:y,isAuthenticated:!!u,signIn:b,signUp:w,signOut:v,refreshSession:E,updateUser:C};return jsxRuntime.jsx(te.Provider,{value:q,children:e})}function D(){let t=react$1.useContext(te);if(!t)throw new Error("useVaif must be used within a VaifProvider");return t}function R(){let{client:t}=D();return t}function re(){let{user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}=D();return {user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}}function se(){let{user:t}=D();return t}function oe(){let{token:t}=D();return t}function ae(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(false),l=react$1.useCallback(async h=>{n(true),r(null);try{await t.auth.requestPasswordReset({email:h}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to request reset")),f}finally{n(false);}},[t]),i=react$1.useCallback(async(h,f)=>{n(true),r(null);try{await t.auth.confirmPasswordReset({token:h,password:f}),s(!0);}catch(c){throw r(c instanceof Error?c:new Error("Failed to reset password")),c}finally{n(false);}},[t]);return {requestReset:l,confirmReset:i,isLoading:e,error:o,isRequested:a,isConfirmed:d}}function ie(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(false),l=react$1.useCallback(async h=>{n(true),r(null);try{await t.auth.requestEmailVerification({email:h}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to send verification")),f}finally{n(false);}},[t]),i=react$1.useCallback(async h=>{n(true),r(null);try{await t.auth.confirmEmailVerification({token:h}),s(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to verify email")),f}finally{n(false);}},[t]);return {requestVerification:l,confirmVerification:i,isLoading:e,error:o,isSent:a,isVerified:d}}function le(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),d=react$1.useCallback(async l=>{n(true),r(null);try{await t.auth.requestMagicLink({email:l}),u(!0);}catch(i){throw r(i instanceof Error?i:new Error("Failed to send magic link")),i}finally{n(false);}},[t]),s=react$1.useCallback(async l=>{n(true),r(null);try{return await t.auth.verifyMagicLink({token:l})}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify magic link")),i}finally{n(false);}},[t]);return {sendMagicLink:d,verifyMagicLink:s,isLoading:e,error:o,isSent:a}}function ue(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null);return {signInWithOAuth:react$1.useCallback(async(u,d)=>{n(true),r(null);try{let s=await t.auth.getOAuthSignInUrl({provider:u,redirectUrl:d});s.url&&(window.location.href=s.url);}catch(s){throw r(s instanceof Error?s:new Error("Failed to start OAuth flow")),s}finally{n(false);}},[t]),isLoading:e,error:o}}function ce(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),a=react$1.useCallback(async s=>{n(true),r(null);try{return await t.auth.setupMFA(s)}catch(l){throw r(l instanceof Error?l:new Error("Failed to setup MFA")),l}finally{n(false);}},[t]),u=react$1.useCallback(async(s,l)=>{n(true),r(null);try{return await t.auth.verifyMFA(s,l)}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify MFA")),i}finally{n(false);}},[t]),d=react$1.useCallback(async s=>{n(true),r(null);try{await t.auth.disableMFA(s);}catch(l){throw r(l instanceof Error?l:new Error("Failed to disable MFA")),l}finally{n(false);}},[t]);return {setup:a,verify:u,disable:d,isLoading:e,error:o}}var de=new Map;function He(t,e){return `${t}:${JSON.stringify(e||{})}`}function fe(t,e){let n=R(),[o,r]=react$1.useState(e?.initialData||[]),[a,u]=react$1.useState(null),[d,s]=react$1.useState(e?.enabled===false?"idle":"loading"),[l,i]=react$1.useState(false),[h,f]=react$1.useState(true),c=react$1.useRef(0),y=e?.enabled!==false,g=e?.staleTime??0,T=e?.keepPreviousData??false,p=react$1.useCallback(async()=>{if(!y)return;let m={where:e?.where,orderBy:e?.orderBy,limit:e?.limit,offset:e?.offset,select:e?.select,include:e?.include,distinct:e?.distinct},b=He(t,m),w=de.get(b);if(w&&Date.now()-w.timestamp<g){r(w.data),s("success"),f(false);return}i(true),T||s("loading"),u(null);try{let v=await n.from(t).list(m);r(v.data),s("success"),f(!1),c.current=Date.now(),de.set(b,{data:v.data,timestamp:Date.now()}),e?.onSuccess?.(v.data);}catch(v){let E=v instanceof Error?v:new Error("Query failed");u(E),s("error"),e?.onError?.(E);}finally{i(false);}},[n,t,e,y,g,T]);return react$1.useEffect(()=>{p();},[p]),react$1.useEffect(()=>{if(!e?.refetchOnWindowFocus||!y)return;let m=()=>{Date.now()-c.current>g&&(f(true),p());};return window.addEventListener("focus",m),()=>window.removeEventListener("focus",m)},[e?.refetchOnWindowFocus,y,g,p]),react$1.useEffect(()=>{if(!e?.refetchInterval||e.refetchInterval<=0||!y)return;let m=setInterval(()=>{f(true),p();},e.refetchInterval);return ()=>clearInterval(m)},[e?.refetchInterval,y,p]),{data:o,isLoading:d==="loading",isFetching:l,error:a,status:d,refetch:p,isStale:h,isEnabled:y}}function pe(t,e,n){let o=R(),[r,a]=react$1.useState(null),[u,d]=react$1.useState(null),[s,l]=react$1.useState(!!e&&n?.enabled!==false),[i,h]=react$1.useState(false),f=!!e&&n?.enabled!==false,c=react$1.useCallback(async()=>{if(!(!f||!e)){l(true),d(null),h(false);try{let y=await o.from(t).get(e);a(y.data);}catch(y){let g=y instanceof Error?y:new Error("Query failed");g.message.includes("not found")||g.message.includes("404")?h(true):d(g);}finally{l(false);}}},[o,t,e,f]);return react$1.useEffect(()=>{c();},[c]),{data:r,isLoading:s,error:u,isNotFound:i,refetch:c}}function K(t,e,n){let o=t.from(e);if(n?.where){let r=Array.isArray(n.where)?{AND:n.where}:n.where;o=o.where(r);}if(n?.orderBy){let r=Array.isArray(n.orderBy)?n.orderBy:[n.orderBy];for(let a of r)o=o.orderBy(a.field,a.direction);}if(n?.select&&(o=o.select(...n.select)),n?.include)for(let r of n.include)o=o.include(r);return o}function ge(t,e){let n=R(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(null),[d,s]=react$1.useState(e?.enabled!==false),[l,i]=react$1.useState(false),h=e?.enabled!==false,f=react$1.useCallback(async()=>{if(h){s(true),u(null),i(false);try{let y=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).first();y?r(y):i(!0);}catch(c){let y=c instanceof Error?c:new Error("Query failed");u(y);}finally{s(false);}}},[n,t,e,h]);return react$1.useEffect(()=>{f();},[f]),{data:o,isLoading:d,error:a,isNotFound:l,refetch:f}}function ye(t,e){let n=R(),[o,r]=react$1.useState([]),[a,u]=react$1.useState(e?.initialPage??1),[d,s]=react$1.useState(null),[l,i]=react$1.useState(true),[h,f]=react$1.useState(null),c=e?.pageSize??10,y=react$1.useCallback(async C=>{i(true),f(null);try{let x=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).paginate({page:C,pageSize:c});r(x.data),s(x.pageInfo),u(x.pageInfo.page),e?.onSuccess?.(x);}catch(q){let x=q instanceof Error?q:new Error("Query failed");f(x),e?.onError?.(x);}finally{i(false);}},[n,t,e,c]);react$1.useEffect(()=>{y(a);},[y,a]);let g=d?.total??0,T=d?.pageCount??0,p=d?.hasNextPage??false,m=d?.hasPrevPage??false,b=react$1.useCallback(()=>{p&&u(C=>C+1);},[p]),w=react$1.useCallback(()=>{m&&u(C=>C-1);},[m]),v=react$1.useCallback(C=>{let q=Math.max(1,Math.min(C,T||1));u(q);},[T]),E=react$1.useCallback(()=>y(a),[y,a]);return {data:o,page:a,pageSize:c,totalCount:g,totalPages:T,hasNextPage:p,hasPrevPage:m,isLoading:l,error:h,nextPage:b,prevPage:w,goToPage:v,refetch:E}}function he(t,e){let n=R(),[o,r]=react$1.useState([]),[a,u]=react$1.useState(null),[d,s]=react$1.useState(true),[l,i]=react$1.useState(true),[h,f]=react$1.useState(false),[c,y]=react$1.useState(null),g=e?.pageSize??20,T=react$1.useCallback(async()=>{if(!d)return;o.length===0?i(true):f(true),y(null);try{let E=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({cursor:a??void 0,limit:g});r(C=>[...C,E.data]),u(E.nextCursor??null),s(E.hasMore),e?.onSuccess?.(E.data,E.hasMore);}catch(v){let E=v instanceof Error?v:new Error("Query failed");y(E),e?.onError?.(E);}finally{i(false),f(false);}},[n,t,e,a,d,o.length,g]);react$1.useEffect(()=>{T();},[]);let p=react$1.useCallback(async()=>{r([]),u(null),s(true),i(true);try{let v=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({limit:g});r([v.data]),u(v.nextCursor??null),s(v.hasMore);}catch(w){y(w instanceof Error?w:new Error("Query failed"));}finally{i(false);}},[n,t,e,g]),m=react$1.useCallback(()=>{r([]),u(null),s(true),i(true),y(null);},[]);return {data:o.flat(),pages:o,hasNextPage:d,isLoading:l,isFetchingNextPage:h,error:c,fetchNextPage:T,refetch:p,reset:m}}function me(t,e){let n=R(),[o,r]=react$1.useState(0),[a,u]=react$1.useState(e?.enabled!==false),[d,s]=react$1.useState(null),l=e?.enabled!==false,i=react$1.useCallback(async()=>{if(l){u(true),s(null);try{let h=n.from(t);e?.where&&(h=h.where(e.where));let f=await h.count();r(f);}catch(h){s(h instanceof Error?h:new Error("Count failed"));}finally{u(false);}}},[n,t,e?.where,l]);return react$1.useEffect(()=>{i();},[i]),{count:o,isLoading:a,error:d,refetch:i}}function B(t,e){let[n,o]=react$1.useState("idle"),[r,a]=react$1.useState(void 0),[u,d]=react$1.useState(null),s=react$1.useRef(0),l=react$1.useCallback(()=>{o("idle"),a(void 0),d(null),s.current=0;},[]),i=react$1.useCallback(async f=>{o("loading"),d(null);try{await e?.onMutate?.(f);let c=await t(f);return a(c),o("success"),s.current=0,await e?.onSuccess?.(c,f),await e?.onSettled?.(c,null,f),c}catch(c){let y=c instanceof Error?c:new Error("Mutation failed"),g=e?.retry??0;if(s.current<g){s.current++;let T=e?.retryDelay??1e3;return await new Promise(p=>setTimeout(p,T)),i(f)}throw d(y),o("error"),await e?.onError?.(y,f),await e?.onSettled?.(void 0,y,f),y}},[t,e]);return {mutate:react$1.useCallback(f=>{i(f).catch(()=>{});},[i]),mutateAsync:i,data:r,error:u,isLoading:n==="loading",isSuccess:n==="success",isError:n==="error",isIdle:n==="idle",status:n,reset:l}}function Ue(t,e){let n=R();return B(async o=>(await n.from(t).create(o)).data,e)}function be(t,e){let n=R();return B(async({id:o,data:r})=>(await n.from(t).update(o,r)).data,e)}function we(t,e){let n=R();return B(async o=>{await n.from(t).delete(o);},e)}function Re(t,e){let n=R();return B(async({data:o,conflictFields:r,updateFields:a})=>{let u={conflictFields:r,updateFields:a};return (await n.from(t).upsert(o,u)).data},e)}function ve(t,e){let n=R();return B(async o=>{let r=await n.from(t).createMany(o);return {count:r.count,records:r.records}},e)}function Pe(t,e){let n=R();return B(async({data:o,where:r})=>{let a=await n.from(t).where(r).updateMany(o);return {count:a.count,records:a.records}},e)}function xe(t,e){let n=R();return B(async o=>({count:(await n.from(t).where(o).deleteMany()).count}),e)}function Ee(t,e,n){let[o,r]=react$1.useState(t),[a,u]=react$1.useState(false),[d,s]=react$1.useState(null),l=react$1.useRef(t),i=react$1.useCallback(()=>{r(l.current);},[]),h=react$1.useCallback(async c=>{u(true),s(null),l.current=o;let y=n.optimisticUpdate(o,c);r(y);try{let g=await e(c);return r(g),n.onSuccess?.(g,c),n.onSettled?.(g,null,c),g}catch(g){let T=g instanceof Error?g:new Error("Mutation failed");throw s(T),i(),n.onError?.(T,c),n.onSettled?.(void 0,T,c),T}finally{u(false);}},[o,e,n,i]);return {mutate:react$1.useCallback(c=>{h(c).catch(()=>{});},[h]),mutateAsync:h,optimisticData:o,rollback:i,isLoading:a,error:d}}function Oe(t,e){let n=R(),[o,r]=react$1.useState(null),[a,u]=react$1.useState([]),[d,s]=react$1.useState(false),l=react$1.useRef(null),i=react$1.useRef(null),h=e?.enabled!==false;react$1.useEffect(()=>{if(!h)return;let c=n.realtime();l.current=c;let y=c.channel(`table:${t}`);return i.current=y,y.onDbChange({table:t,event:e?.operations||"*"},g=>{switch(g.new!==void 0&&r(g.new),u(T=>[...T,g]),g.operation){case "INSERT":g.new&&e?.onInsert?.(g.new);break;case "UPDATE":g.new&&e?.onUpdate?.(g.new,g.old??null);break;case "DELETE":g.old&&e?.onDelete?.(g.old);break}e?.onChange?.(g);}),y.subscribe(),s(true),()=>{y.unsubscribe(),c.disconnect(),s(false);}},[n,t,h,e]);let f=react$1.useCallback(()=>{u([]);},[]);return {data:o,changes:a,isSubscribed:d,clearChanges:f}}function Z(t,e){let n=R(),[o,r]=react$1.useState(null),[a,u]=react$1.useState([]),[d,s]=react$1.useState(false),l=react$1.useRef(null),i=react$1.useRef(null),h=e?.enabled!==false;react$1.useEffect(()=>{if(!h)return;let y=n.realtime();l.current=y;let g=y.channel(t,{type:e?.type||"public"});return i.current=g,g.on("*",T=>{let p={event:"*",payload:T};r(p),u(m=>[...m,p]);}),g.subscribe(),s(true),()=>{g.unsubscribe(),y.disconnect(),s(false);}},[n,t,h,e?.type]);let f=react$1.useCallback((y,g)=>{i.current?.broadcast({event:y,payload:g});},[]),c=react$1.useCallback(()=>{i.current?.unsubscribe(),s(false);},[]);return {broadcast:f,lastMessage:o,messages:a,isJoined:d,leave:c}}function Fe(t,e,n){let o=R(),[r,a]=react$1.useState({}),[u,d]=react$1.useState(false),s=react$1.useRef(null),l=react$1.useRef(null),i=n?.enabled!==false;react$1.useEffect(()=>{if(!i)return;let g=o.realtime();s.current=g;let T=g.channel(t,{type:"presence"});return l.current=T,T.presence.onSync(p=>{a(p);}),T.subscribe(),e&&(T.presence.track({state:e}),d(true)),()=>{T.unsubscribe(),g.disconnect(),d(false);}},[o,t,i,e]);let h=react$1.useCallback(g=>{l.current?.presence.update(g);},[]),f=react$1.useCallback(()=>{l.current?.presence.untrack(),d(false);},[]),c=Object.keys(r).length,y=Object.keys(r);return {presence:r,count:c,onlineUsers:y,update:h,leave:f,isTracking:u}}function ke(){let t=R(),[e,n]=react$1.useState("disconnected"),[o,r]=react$1.useState(null),a=react$1.useRef(null);react$1.useEffect(()=>{let s=t.realtime();return a.current=s,n(s.connectionState),r(s.connectionId),s.on("connect",()=>{n("connected"),r(s.connectionId);}),s.on("disconnect",()=>{n("disconnected"),r(null);}),s.on("reconnect",()=>{n("connected"),r(s.connectionId);}),s.on("error",()=>{n("disconnected");}),()=>{s.disconnect();}},[t]);let u=react$1.useCallback(()=>{a.current?.connect();},[]),d=react$1.useCallback(()=>{a.current?.disconnect();},[]);return {state:e,isConnected:e==="connected",connectionId:o,reconnect:u,disconnect:d}}function Se(t,e){let n=Z(t,e);return {send:n.broadcast,messages:n.messages,lastMessage:n.lastMessage,isConnected:n.isJoined}}function ee(t){let e=R(),[n,o]=react$1.useState(0),[r,a]=react$1.useState(false),[u,d]=react$1.useState(null),[s,l]=react$1.useState(null),[i,h]=react$1.useState([]),f=react$1.useCallback(T=>{if(t?.maxSize&&T.size>t.maxSize)throw new Error(`File size (${Math.round(T.size/1024/1024)}MB) exceeds maximum allowed (${Math.round(t.maxSize/1024/1024)}MB)`);if(t?.allowedTypes&&t.allowedTypes.length>0&&!t.allowedTypes.includes(T.type))throw new Error(`File type "${T.type}" is not allowed. Allowed types: ${t.allowedTypes.join(", ")}`)},[t?.maxSize,t?.allowedTypes]),c=react$1.useCallback(async(T,p)=>{a(true),d(null),o(0);try{f(p),t?.onUploadStart?.(p);let m=await e.storage.upload(T,p,{contentType:p.type,metadata:t?.metadata,isPublic:t?.isPublic});return o(100),l(m),h(b=>[...b,m]),t?.onSuccess?.(m,p),m}catch(m){let b=m instanceof Error?m:new Error("Upload failed");throw d(b),t?.onError?.(b,p),b}finally{a(false);}},[e,t,f]),y=react$1.useCallback(async T=>{let p=[];for(let{key:m,file:b}of T){let w=await c(m,b);p.push(w);}return p},[c]),g=react$1.useCallback(()=>{o(0),a(false),d(null),l(null),h([]);},[]);return {upload:c,uploadMultiple:y,progress:n,isUploading:r,error:u,result:s,results:i,reset:g}}function Ie(t){let e=R(),[n,o]=react$1.useState(false),[r,a]=react$1.useState(null),u=react$1.useCallback(async(s,l)=>{o(true),a(null);try{let i=await e.storage.download(s);return t?.onSuccess?.(i,l||s.split("/").pop()||"download"),i}catch(i){let h=i instanceof Error?i:new Error("Download failed");throw a(h),t?.onError?.(h),h}finally{o(false);}},[e,t]),d=react$1.useCallback(async(s,l)=>{let i=await u(s,l),h=l||s.split("/").pop()||"download",f=URL.createObjectURL(i),c=document.createElement("a");c.href=f,c.download=h,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(f);},[u]);return {download:u,downloadAndSave:d,isDownloading:n,error:r}}function Ce(t,e){let n=R(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(null),[d,s]=react$1.useState(!!t&&e?.enabled!==false),[l,i]=react$1.useState(null),h=!!t&&e?.enabled!==false,f=react$1.useCallback(async()=>{if(!(!h||!t)){s(true),i(null);try{let y=await n.storage.createSignedUrl(t,e?.expiresIn);r(y);let g=await n.storage.getMetadata(t);u(g);}catch(y){i(y instanceof Error?y:new Error("Failed to load file"));}finally{s(false);}}},[n,t,e?.expiresIn,h]),c=react$1.useCallback(async()=>{t&&(await n.storage.delete(t),r(null),u(null));},[n,t]);return {url:o,metadata:a,isLoading:d,error:l,refresh:f,deleteFile:c}}function Me(t){let e=R(),[n,o]=react$1.useState([]),[r,a]=react$1.useState(t?.enabled!==false),[u,d]=react$1.useState(null),s=t?.enabled!==false,l=react$1.useCallback(async()=>{if(s){a(true),d(null);try{let i=await e.storage.list({prefix:t?.prefix,limit:t?.limit});o(i.files);}catch(i){d(i instanceof Error?i:new Error("Failed to list files"));}finally{a(false);}}},[e,t,s]);return {files:n,isLoading:r,error:u,refresh:l}}function De(t){let e=ee(t),[n,o]=react$1.useState(false),[r,a]=react$1.useState([]),u=react$1.useRef(null),d=react$1.useCallback(p=>{p.preventDefault(),p.stopPropagation(),o(true);},[]),s=react$1.useCallback(p=>{p.preventDefault(),p.stopPropagation(),o(false);},[]),l=react$1.useCallback(p=>{let m=t?.basePath||"uploads",b=Date.now().toString(36)+Math.random().toString(36).substr(2,9),w=p.name.split(".").pop()||"";return t?.uniqueKey?`${m}/${b}.${w}`:`${m}/${p.name}`},[t?.basePath,t?.uniqueKey]),i=react$1.useCallback(async p=>{p.preventDefault(),p.stopPropagation(),o(false);let m=Array.from(p.dataTransfer.files);if(m.length===0)return;let b=t?.multiple?m:[m[0]];a(b),await e.uploadMultiple(b.map(w=>({key:l(w),file:w})));},[t?.multiple,e,l]),h=react$1.useCallback(async p=>{let m=Array.from(p.target.files||[]);m.length!==0&&(a(m),await e.uploadMultiple(m.map(b=>({key:l(b),file:b}))));},[e,l]),f=react$1.useCallback(()=>{u.current?.click();},[]),c=react$1.useCallback(()=>{a([]),e.reset();},[e]),y=react$1.useCallback(p=>{a(m=>m.filter((b,w)=>w!==p));},[]),g=react$1.useCallback(()=>({onDragOver:d,onDragLeave:s,onDrop:i,onClick:f}),[d,s,i,f]),T=react$1.useCallback(()=>({type:"file",onChange:h,multiple:t?.multiple??false,accept:t?.allowedTypes?.join(",")??"",style:{display:"none"},ref:p=>{u.current=p;}}),[h,t?.multiple,t?.allowedTypes]);return {...e,dropzone:{isDragOver:n,selectedFiles:r},getDropzoneProps:g,getInputProps:T,openFilePicker:f,clearFiles:c,removeFile:y}}function Ae(t){return R().storage.getPublicUrl(t)}var G=new Map;function Le(t,e){let n=R(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(null),[l,i]=react$1.useState(false),[h,f]=react$1.useState(null),c=react$1.useRef(0),y=react$1.useCallback(async T=>{u(true),s(null),i(false);try{let p={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(p.retry={maxRetries:e.maxRetries??3});let m=await n.functions.invoke(t,{body:T},p);return r(m.data),f(m),i(!0),c.current=0,e?.onSuccess?.(m.data,T),m.data}catch(p){let m=p instanceof Error?p:new Error("Function invocation failed");throw s(m),e?.onError?.(m,T),m}finally{u(false);}},[n,t,e]),g=react$1.useCallback(()=>{r(null),u(false),s(null),i(false),f(null),c.current=0;},[]);return {invoke:y,data:o,isLoading:a,error:d,isSuccess:l,invocation:h,reset:g}}function Ve(t,e){let n=R(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(null),[l,i]=react$1.useState(false),[h,f]=react$1.useState(null),c=e?.cache??false,y=e?.cacheTtl??6e4,g=react$1.useCallback(b=>`${t}:${JSON.stringify(b)}`,[t]),T=react$1.useCallback(async b=>{if(c){let w=g(b),v=G.get(w);if(v&&Date.now()-v.timestamp<y){let E=v.data;return r(E),i(true),e?.onSuccess?.(E,b),E}}u(true),s(null),i(false);try{let w={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(w.retry={maxRetries:e.maxRetries??3});let E=await n.functions.rpc(t,w)(b);if(r(E),i(!0),c){let C=g(b);G.set(C,{data:E,timestamp:Date.now()});}return e?.onSuccess?.(E,b),E}catch(w){let v=w instanceof Error?w:new Error("RPC call failed");throw s(v),e?.onError?.(v,b),v}finally{u(false);}},[n,t,e,c,y,g]),p=react$1.useCallback(()=>{let b=`${t}:`;for(let w of G.keys())w.startsWith(b)&&G.delete(w);},[t]),m=react$1.useCallback(()=>{r(null),u(false),s(null),i(false),f(null);},[]);return {invoke:T,data:o,isLoading:a,error:d,isSuccess:l,invocation:h,reset:m,clearCache:p}}function Qe(t){let e=R(),[n,o]=react$1.useState([]),[r,a]=react$1.useState(true),[u,d]=react$1.useState(null),s=react$1.useCallback(async()=>{a(true),d(null);try{let l=await e.functions.list({projectId:t.projectId,envId:t.envId,enabled:t.enabled,limit:t.limit,offset:t.offset});o(l);}catch(l){d(l instanceof Error?l:new Error("Failed to list functions"));}finally{a(false);}},[e,t.projectId,t.envId,t.enabled,t.limit,t.offset]);return react$1.useEffect(()=>{s();},[s]),{functions:n,isLoading:r,error:u,refresh:s}}function Be(t,e){let n=R(),[o,r]=react$1.useState([]),[a,u]=react$1.useState(false),[d,s]=react$1.useState(0),[l,i]=react$1.useState(null);return {invoke:react$1.useCallback(async f=>{u(true),i(null),s(0),r([]);let c=[],y=e?.concurrency??5,g=f.length,T=0;try{for(let p=0;p<f.length;p+=y){let m=f.slice(p,p+y),b=await Promise.all(m.map(async w=>(await n.functions.invoke(t,{body:w})).data));c.push(...b),T+=m.length,s(Math.round(T/g*100)),r([...c]),e?.onProgress?.(T,g);}return e?.onSuccess?.(c),c}catch(p){let m=p instanceof Error?p:new Error("Batch invocation failed");throw i(m),e?.onError?.(m),m}finally{u(false);}},[n,t,e]),results:o,isLoading:a,progress:d,error:l}}function ze(t){let e=R(),[n,o]=react$1.useState(false),[r,a]=react$1.useState(null),[u,d]=react$1.useState(null),[s,l]=react$1.useState(null),i=react$1.useCallback(async(f,c)=>{l(null);try{let g=(await e.functions.invoke(t,{body:f})).requestId??`scheduled-${Date.now()}`;return d(g),o(!0),a(new Date(Date.now()+c.delayMs)),g}catch(y){let g=y instanceof Error?y:new Error("Failed to schedule function");throw l(g),g}},[e,t]),h=react$1.useCallback(async()=>{o(false),a(null),d(null);},[]);return {schedule:i,cancel:h,isScheduled:n,scheduledAt:r,requestId:u,error:s}}Object.defineProperty(exports,"AuthProvider",{enumerable:true,get:function(){return react.AuthProvider}});Object.defineProperty(exports,"VaifAuthClient",{enumerable:true,get:function(){return react.VaifAuthClient}});Object.defineProperty(exports,"createAuthClient",{enumerable:true,get:function(){return react.createAuthClient}});Object.defineProperty(exports,"useAuthClient",{enumerable:true,get:function(){return react.useAuthClient}});Object.defineProperty(exports,"useIdentities",{enumerable:true,get:function(){return react.useIdentities}});Object.defineProperty(exports,"useIsAuthenticated",{enumerable:true,get:function(){return react.useIsAuthenticated}});Object.defineProperty(exports,"usePassword",{enumerable:true,get:function(){return react.usePassword}});Object.defineProperty(exports,"useSession",{enumerable:true,get:function(){return react.useSession}});Object.defineProperty(exports,"useSessions",{enumerable:true,get:function(){return react.useSessions}});Object.defineProperty(exports,"useStandaloneAuth",{enumerable:true,get:function(){return react.useAuth}});Object.defineProperty(exports,"useStandaloneMFA",{enumerable:true,get:function(){return react.useMFA}});Object.defineProperty(exports,"useStandaloneUser",{enumerable:true,get:function(){return react.useUser}});exports.VaifProvider=ne;exports.useAuth=re;exports.useBatchCreate=ve;exports.useBatchDelete=xe;exports.useBatchInvoke=Be;exports.useBatchUpdate=Pe;exports.useBroadcast=Se;exports.useChannel=Z;exports.useCount=me;exports.useCreate=Ue;exports.useDelete=we;exports.useDownload=Ie;exports.useDropzone=De;exports.useEmailVerification=ie;exports.useFile=Ce;exports.useFiles=Me;exports.useFunction=Le;exports.useFunctionList=Qe;exports.useInfiniteQuery=he;exports.useMFA=ce;exports.useMagicLink=le;exports.useMutation=B;exports.useOAuth=ue;exports.useOptimisticMutation=Ee;exports.usePaginatedQuery=ye;exports.usePasswordReset=ae;exports.usePresence=Fe;exports.usePublicUrl=Ae;exports.useQuery=fe;exports.useQueryById=pe;exports.useQueryFirst=ge;exports.useRealtimeConnection=ke;exports.useRpc=Ve;exports.useScheduledFunction=ze;exports.useSubscription=Oe;exports.useToken=oe;exports.useUpdate=be;exports.useUpload=ee;exports.useUpsert=Re;exports.useUser=se;exports.useVaif=D;exports.useVaifClient=R;
|
|
1
|
+
'use strict';var react$1=require('react'),client=require('@vaiftech/client'),jsxRuntime=require('react/jsx-runtime'),react=require('@vaiftech/auth/react');var te=react$1.createContext(null);function ne({config:t,children:e,onAuthStateChange:n,autoRefreshSession:o=true,storageKey:r="vaif-auth"}){let[a]=react$1.useState(()=>client.createVaifClient(t)),[u,d]=react$1.useState(null),[s,l]=react$1.useState(null),[i,y]=react$1.useState(null),[f,c]=react$1.useState(null),[h,p]=react$1.useState(true),T=react$1.useRef(null),g=react$1.useCallback((w,C,P)=>{let b={token:w,refreshToken:C,expiresAt:P};localStorage.setItem(r,JSON.stringify(b));},[r]),m=react$1.useCallback(()=>{localStorage.removeItem(r),d(null),l(null),y(null),c(null);},[r]);react$1.useEffect(()=>((async()=>{try{let C=localStorage.getItem(r);if(!C){p(!1);return}let P=JSON.parse(C);if(P.expiresAt&&new Date(P.expiresAt)<=new Date)if(P.refreshToken)try{let b=await a.auth.refreshToken(P.refreshToken);l(b.token),y(b.refreshToken??null),c(b.expiresAt),g(b.token,b.refreshToken,b.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();else {l(P.token),y(P.refreshToken??null),c(P.expiresAt??null);try{let b=await a.auth.getUser();d(b);}catch{if(P.refreshToken)try{let b=await a.auth.refreshToken(P.refreshToken);l(b.token),y(b.refreshToken??null),c(b.expiresAt),g(b.token,b.refreshToken,b.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();}}}catch{m();}finally{p(false);}})(),()=>{T.current&&clearTimeout(T.current);}),[a,r,g,m]),react$1.useEffect(()=>{if(!o||!f||!i)return;let w=new Date(f).getTime(),C=Date.now(),P=w-C-6e4;return P>0&&(T.current=setTimeout(async()=>{try{let b=await a.auth.refreshToken(i);l(b.token),y(b.refreshToken??null),c(b.expiresAt),g(b.token,b.refreshToken,b.expiresAt);}catch{m();}},P)),()=>{T.current&&clearTimeout(T.current);}},[o,a,f,i,g,m]),react$1.useEffect(()=>{h||n?.(u);},[u,h,n]);let U=react$1.useCallback(async(w,C)=>{let P=await a.auth.login(w,C);if("mfaRequired"in P)throw new Error("MFA required - use verifyMFA to complete login");let b=P;return d(b.user),l(b.token),y(b.refreshToken??null),c(b.expiresAt??null),g(b.token,b.refreshToken,b.expiresAt),b},[a,g]),M=react$1.useCallback(async(w,C,P)=>{let b=await a.auth.signUp(w,C,{metadata:P});return d(b.user),l(b.token),y(b.refreshToken??null),c(b.expiresAt??null),g(b.token,b.refreshToken,b.expiresAt),b},[a,g]),R=react$1.useCallback(async()=>{try{await a.auth.logout();}finally{m();}},[a,m]),x=react$1.useCallback(async()=>{if(!i)throw new Error("No refresh token available");let w=await a.auth.refreshToken(i);l(w.token),y(w.refreshToken??null),c(w.expiresAt),g(w.token,w.refreshToken,w.expiresAt);},[a,i,g]),k=react$1.useCallback(w=>{d(C=>C?{...C,...w}:null);},[]),q={client:a,user:u,token:s,isLoading:h,isAuthenticated:!!u,signIn:U,signUp:M,signOut:R,refreshSession:x,updateUser:k};return jsxRuntime.jsx(te.Provider,{value:q,children:e})}function D(){let t=react$1.useContext(te);if(!t)throw new Error("useVaif must be used within a VaifProvider");return t}function v(){let{client:t}=D();return t}function re(){let{user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}=D();return {user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}}function se(){let{user:t}=D();return t}function oe(){let{token:t}=D();return t}function ae(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(false),l=react$1.useCallback(async y=>{n(true),r(null);try{await t.auth.requestPasswordReset({email:y}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to request reset")),f}finally{n(false);}},[t]),i=react$1.useCallback(async(y,f)=>{n(true),r(null);try{await t.auth.confirmPasswordReset({token:y,password:f}),s(!0);}catch(c){throw r(c instanceof Error?c:new Error("Failed to reset password")),c}finally{n(false);}},[t]);return {requestReset:l,confirmReset:i,isLoading:e,error:o,isRequested:a,isConfirmed:d}}function ie(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(false),l=react$1.useCallback(async y=>{n(true),r(null);try{await t.auth.requestEmailVerification({email:y}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to send verification")),f}finally{n(false);}},[t]),i=react$1.useCallback(async y=>{n(true),r(null);try{await t.auth.confirmEmailVerification({token:y}),s(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to verify email")),f}finally{n(false);}},[t]);return {requestVerification:l,confirmVerification:i,isLoading:e,error:o,isSent:a,isVerified:d}}function le(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),d=react$1.useCallback(async l=>{n(true),r(null);try{await t.auth.requestMagicLink({email:l}),u(!0);}catch(i){throw r(i instanceof Error?i:new Error("Failed to send magic link")),i}finally{n(false);}},[t]),s=react$1.useCallback(async l=>{n(true),r(null);try{return await t.auth.verifyMagicLink({token:l})}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify magic link")),i}finally{n(false);}},[t]);return {sendMagicLink:d,verifyMagicLink:s,isLoading:e,error:o,isSent:a}}function ue(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null);return {signInWithOAuth:react$1.useCallback(async(u,d)=>{n(true),r(null);try{let s=await t.auth.getOAuthSignInUrl({provider:u,redirectUrl:d});s.url&&(window.location.href=s.url);}catch(s){throw r(s instanceof Error?s:new Error("Failed to start OAuth flow")),s}finally{n(false);}},[t]),isLoading:e,error:o}}function ce(){let{client:t}=D(),[e,n]=react$1.useState(false),[o,r]=react$1.useState(null),a=react$1.useCallback(async s=>{n(true),r(null);try{return await t.auth.setupMFA(s)}catch(l){throw r(l instanceof Error?l:new Error("Failed to setup MFA")),l}finally{n(false);}},[t]),u=react$1.useCallback(async(s,l)=>{n(true),r(null);try{return await t.auth.verifyMFA(s,l)}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify MFA")),i}finally{n(false);}},[t]),d=react$1.useCallback(async s=>{n(true),r(null);try{await t.auth.disableMFA(s);}catch(l){throw r(l instanceof Error?l:new Error("Failed to disable MFA")),l}finally{n(false);}},[t]);return {setup:a,verify:u,disable:d,isLoading:e,error:o}}var de=new Map;function Je(t,e){return `${t}:${JSON.stringify(e||{})}`}function fe(t,e){let n=v(),[o,r]=react$1.useState(e?.initialData||[]),[a,u]=react$1.useState(null),[d,s]=react$1.useState(e?.enabled===false?"idle":"loading"),[l,i]=react$1.useState(false),[y,f]=react$1.useState(true),c=react$1.useRef(0),h=e?.enabled!==false,p=e?.staleTime??0,T=e?.keepPreviousData??false,g=react$1.useCallback(async()=>{if(!h)return;let m={where:e?.where,orderBy:e?.orderBy,limit:e?.limit,offset:e?.offset,select:e?.select,include:e?.include,distinct:e?.distinct},U=Je(t,m),M=de.get(U);if(M&&Date.now()-M.timestamp<p){r(M.data),s("success"),f(false);return}i(true),T||s("loading"),u(null);try{let R=await n.from(t).list(m);r(R.data),s("success"),f(!1),c.current=Date.now(),de.set(U,{data:R.data,timestamp:Date.now()}),e?.onSuccess?.(R.data);}catch(R){let x=R instanceof Error?R:new Error("Query failed");u(x),s("error"),e?.onError?.(x);}finally{i(false);}},[n,t,e,h,p,T]);return react$1.useEffect(()=>{g();},[g]),react$1.useEffect(()=>{if(!e?.refetchOnWindowFocus||!h)return;let m=()=>{Date.now()-c.current>p&&(f(true),g());};return window.addEventListener("focus",m),()=>window.removeEventListener("focus",m)},[e?.refetchOnWindowFocus,h,p,g]),react$1.useEffect(()=>{if(!e?.refetchInterval||e.refetchInterval<=0||!h)return;let m=setInterval(()=>{f(true),g();},e.refetchInterval);return ()=>clearInterval(m)},[e?.refetchInterval,h,g]),{data:o,isLoading:d==="loading",isFetching:l,error:a,status:d,refetch:g,isStale:y,isEnabled:h}}function ge(t,e,n){let o=v(),[r,a]=react$1.useState(null),[u,d]=react$1.useState(null),[s,l]=react$1.useState(!!e&&n?.enabled!==false),[i,y]=react$1.useState(false),f=!!e&&n?.enabled!==false,c=react$1.useCallback(async()=>{if(!(!f||!e)){l(true),d(null),y(false);try{let h=await o.from(t).get(e);a(h.data);}catch(h){let p=h instanceof Error?h:new Error("Query failed");p.message.includes("not found")||p.message.includes("404")?y(true):d(p);}finally{l(false);}}},[o,t,e,f]);return react$1.useEffect(()=>{c();},[c]),{data:r,isLoading:s,error:u,isNotFound:i,refetch:c}}function _(t,e,n){let o=t.from(e);if(n?.where){let r=Array.isArray(n.where)?{AND:n.where}:n.where;o=o.where(r);}if(n?.orderBy){let r=Array.isArray(n.orderBy)?n.orderBy:[n.orderBy];for(let a of r)o=o.orderBy(a.field,a.direction);}if(n?.select&&(o=o.select(...n.select)),n?.include)for(let r of n.include)o=o.include(r);return o}function pe(t,e){let n=v(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(null),[d,s]=react$1.useState(e?.enabled!==false),[l,i]=react$1.useState(false),y=e?.enabled!==false,f=react$1.useCallback(async()=>{if(y){s(true),u(null),i(false);try{let h=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).first();h?r(h):i(!0);}catch(c){let h=c instanceof Error?c:new Error("Query failed");u(h);}finally{s(false);}}},[n,t,e,y]);return react$1.useEffect(()=>{f();},[f]),{data:o,isLoading:d,error:a,isNotFound:l,refetch:f}}function he(t,e){let n=v(),[o,r]=react$1.useState([]),[a,u]=react$1.useState(e?.initialPage??1),[d,s]=react$1.useState(null),[l,i]=react$1.useState(true),[y,f]=react$1.useState(null),c=e?.pageSize??10,h=react$1.useCallback(async k=>{i(true),f(null);try{let w=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).paginate({page:k,pageSize:c});r(w.data),s(w.pageInfo),u(w.pageInfo.page),e?.onSuccess?.(w);}catch(q){let w=q instanceof Error?q:new Error("Query failed");f(w),e?.onError?.(w);}finally{i(false);}},[n,t,e,c]);react$1.useEffect(()=>{h(a);},[h,a]);let p=d?.total??0,T=d?.pageCount??0,g=d?.hasNextPage??false,m=d?.hasPrevPage??false,U=react$1.useCallback(()=>{g&&u(k=>k+1);},[g]),M=react$1.useCallback(()=>{m&&u(k=>k-1);},[m]),R=react$1.useCallback(k=>{let q=Math.max(1,Math.min(k,T||1));u(q);},[T]),x=react$1.useCallback(()=>h(a),[h,a]);return {data:o,page:a,pageSize:c,totalCount:p,totalPages:T,hasNextPage:g,hasPrevPage:m,isLoading:l,error:y,nextPage:U,prevPage:M,goToPage:R,refetch:x}}function ye(t,e){let n=v(),[o,r]=react$1.useState([]),[a,u]=react$1.useState(null),[d,s]=react$1.useState(true),[l,i]=react$1.useState(true),[y,f]=react$1.useState(false),[c,h]=react$1.useState(null),p=e?.pageSize??20,T=react$1.useCallback(async()=>{if(!d)return;o.length===0?i(true):f(true),h(null);try{let x=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({cursor:a??void 0,limit:p});r(k=>[...k,x.data]),u(x.nextCursor??null),s(x.hasMore),e?.onSuccess?.(x.data,x.hasMore);}catch(R){let x=R instanceof Error?R:new Error("Query failed");h(x),e?.onError?.(x);}finally{i(false),f(false);}},[n,t,e,a,d,o.length,p]);react$1.useEffect(()=>{T();},[]);let g=react$1.useCallback(async()=>{r([]),u(null),s(true),i(true);try{let R=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({limit:p});r([R.data]),u(R.nextCursor??null),s(R.hasMore);}catch(M){h(M instanceof Error?M:new Error("Query failed"));}finally{i(false);}},[n,t,e,p]),m=react$1.useCallback(()=>{r([]),u(null),s(true),i(true),h(null);},[]);return {data:o.flat(),pages:o,hasNextPage:d,isLoading:l,isFetchingNextPage:y,error:c,fetchNextPage:T,refetch:g,reset:m}}function me(t,e){let n=v(),[o,r]=react$1.useState(0),[a,u]=react$1.useState(e?.enabled!==false),[d,s]=react$1.useState(null),l=e?.enabled!==false,i=react$1.useCallback(async()=>{if(l){u(true),s(null);try{let y=n.from(t);e?.where&&(y=y.where(e.where));let f=await y.count();r(f);}catch(y){s(y instanceof Error?y:new Error("Count failed"));}finally{u(false);}}},[n,t,e?.where,l]);return react$1.useEffect(()=>{i();},[i]),{count:o,isLoading:a,error:d,refetch:i}}function B(t,e){let[n,o]=react$1.useState("idle"),[r,a]=react$1.useState(void 0),[u,d]=react$1.useState(null),s=react$1.useRef(0),l=react$1.useCallback(()=>{o("idle"),a(void 0),d(null),s.current=0;},[]),i=react$1.useCallback(async f=>{o("loading"),d(null);try{await e?.onMutate?.(f);let c=await t(f);return a(c),o("success"),s.current=0,await e?.onSuccess?.(c,f),await e?.onSettled?.(c,null,f),c}catch(c){let h=c instanceof Error?c:new Error("Mutation failed"),p=e?.retry??0;if(s.current<p){s.current++;let T=e?.retryDelay??1e3;return await new Promise(g=>setTimeout(g,T)),i(f)}throw d(h),o("error"),await e?.onError?.(h,f),await e?.onSettled?.(void 0,h,f),h}},[t,e]);return {mutate:react$1.useCallback(f=>{i(f).catch(()=>{});},[i]),mutateAsync:i,data:r,error:u,isLoading:n==="loading",isSuccess:n==="success",isError:n==="error",isIdle:n==="idle",status:n,reset:l}}function be(t,e){let n=v();return B(async o=>(await n.from(t).create(o)).data,e)}function Ue(t,e){let n=v();return B(async({id:o,data:r})=>(await n.from(t).update(o,r)).data,e)}function ve(t,e){let n=v();return B(async o=>{await n.from(t).delete(o);},e)}function Me(t,e){let n=v();return B(async({data:o,conflictFields:r,updateFields:a})=>{let u={conflictFields:r,updateFields:a};return (await n.from(t).upsert(o,u)).data},e)}function Re(t,e){let n=v();return B(async o=>{let r=await n.from(t).createMany(o);return {count:r.count,records:r.records}},e)}function Ee(t,e){let n=v();return B(async({data:o,where:r})=>{let a=await n.from(t).where(r).updateMany(o);return {count:a.count,records:a.records}},e)}function we(t,e){let n=v();return B(async o=>({count:(await n.from(t).where(o).deleteMany()).count}),e)}function xe(t,e,n){let[o,r]=react$1.useState(t),[a,u]=react$1.useState(false),[d,s]=react$1.useState(null),l=react$1.useRef(t),i=react$1.useCallback(()=>{r(l.current);},[]),y=react$1.useCallback(async c=>{u(true),s(null),l.current=o;let h=n.optimisticUpdate(o,c);r(h);try{let p=await e(c);return r(p),n.onSuccess?.(p,c),n.onSettled?.(p,null,c),p}catch(p){let T=p instanceof Error?p:new Error("Mutation failed");throw s(T),i(),n.onError?.(T,c),n.onSettled?.(void 0,T,c),T}finally{u(false);}},[o,e,n,i]);return {mutate:react$1.useCallback(c=>{y(c).catch(()=>{});},[y]),mutateAsync:y,optimisticData:o,rollback:i,isLoading:a,error:d}}function Oe(t,e){let n=v(),[o,r]=react$1.useState(null),[a,u]=react$1.useState([]),[d,s]=react$1.useState(false),l=react$1.useRef(null),i=react$1.useRef(null),y=e?.enabled!==false;react$1.useEffect(()=>{if(!y)return;let c=n.realtime();l.current=c;let h=c.channel(`table:${t}`);return i.current=h,h.onDbChange({table:t,event:e?.operations||"*"},p=>{switch(p.new!==void 0&&r(p.new),u(T=>[...T,p]),p.operation){case "INSERT":p.new&&e?.onInsert?.(p.new);break;case "UPDATE":p.new&&e?.onUpdate?.(p.new,p.old??null);break;case "DELETE":p.old&&e?.onDelete?.(p.old);break}e?.onChange?.(p);}),h.subscribe(),s(true),()=>{h.unsubscribe(),c.disconnect(),s(false);}},[n,t,y,e]);let f=react$1.useCallback(()=>{u([]);},[]);return {data:o,changes:a,isSubscribed:d,clearChanges:f}}function Z(t,e){let n=v(),[o,r]=react$1.useState(null),[a,u]=react$1.useState([]),[d,s]=react$1.useState(false),l=react$1.useRef(null),i=react$1.useRef(null),y=e?.enabled!==false;react$1.useEffect(()=>{if(!y)return;let h=n.realtime();l.current=h;let p=h.channel(t,{type:e?.type||"public"});return i.current=p,p.on("*",T=>{let g={event:"*",payload:T};r(g),u(m=>[...m,g]);}),p.subscribe(),s(true),()=>{p.unsubscribe(),h.disconnect(),s(false);}},[n,t,y,e?.type]);let f=react$1.useCallback((h,p)=>{i.current?.broadcast({event:h,payload:p});},[]),c=react$1.useCallback(()=>{i.current?.unsubscribe(),s(false);},[]);return {broadcast:f,lastMessage:o,messages:a,isJoined:d,leave:c}}function Pe(t,e,n){let o=v(),[r,a]=react$1.useState({}),[u,d]=react$1.useState(false),s=react$1.useRef(null),l=react$1.useRef(null),i=n?.enabled!==false;react$1.useEffect(()=>{if(!i)return;let p=o.realtime();s.current=p;let T=p.channel(t,{type:"presence"});return l.current=T,T.presence.onSync(g=>{a(g);}),T.subscribe(),e&&(T.presence.track({state:e}),d(true)),()=>{T.unsubscribe(),p.disconnect(),d(false);}},[o,t,i,e]);let y=react$1.useCallback(p=>{l.current?.presence.update(p);},[]),f=react$1.useCallback(()=>{l.current?.presence.untrack(),d(false);},[]),c=Object.keys(r).length,h=Object.keys(r);return {presence:r,count:c,onlineUsers:h,update:y,leave:f,isTracking:u}}function Ie(){let t=v(),[e,n]=react$1.useState("disconnected"),[o,r]=react$1.useState(null),a=react$1.useRef(null);react$1.useEffect(()=>{let s=t.realtime();return a.current=s,n(s.connectionState),r(s.connectionId),s.on("connect",()=>{n("connected"),r(s.connectionId);}),s.on("disconnect",()=>{n("disconnected"),r(null);}),s.on("reconnect",()=>{n("connected"),r(s.connectionId);}),s.on("error",()=>{n("disconnected");}),()=>{s.disconnect();}},[t]);let u=react$1.useCallback(()=>{a.current?.connect();},[]),d=react$1.useCallback(()=>{a.current?.disconnect();},[]);return {state:e,isConnected:e==="connected",connectionId:o,reconnect:u,disconnect:d}}function Se(t,e){let n=Z(t,e);return {send:n.broadcast,messages:n.messages,lastMessage:n.lastMessage,isConnected:n.isJoined}}function ee(t){let e=v(),[n,o]=react$1.useState(0),[r,a]=react$1.useState(false),[u,d]=react$1.useState(null),[s,l]=react$1.useState(null),[i,y]=react$1.useState([]),f=react$1.useCallback(T=>{if(t?.maxSize&&T.size>t.maxSize)throw new Error(`File size (${Math.round(T.size/1024/1024)}MB) exceeds maximum allowed (${Math.round(t.maxSize/1024/1024)}MB)`);if(t?.allowedTypes&&t.allowedTypes.length>0&&!t.allowedTypes.includes(T.type))throw new Error(`File type "${T.type}" is not allowed. Allowed types: ${t.allowedTypes.join(", ")}`)},[t?.maxSize,t?.allowedTypes]),c=react$1.useCallback(async(T,g)=>{a(true),d(null),o(0);try{f(g),t?.onUploadStart?.(g);let m=await e.storage.upload(T,g,{contentType:g.type,metadata:t?.metadata,isPublic:t?.isPublic});return o(100),l(m),y(U=>[...U,m]),t?.onSuccess?.(m,g),m}catch(m){let U=m instanceof Error?m:new Error("Upload failed");throw d(U),t?.onError?.(U,g),U}finally{a(false);}},[e,t,f]),h=react$1.useCallback(async T=>{let g=[];for(let{key:m,file:U}of T){let M=await c(m,U);g.push(M);}return g},[c]),p=react$1.useCallback(()=>{o(0),a(false),d(null),l(null),y([]);},[]);return {upload:c,uploadMultiple:h,progress:n,isUploading:r,error:u,result:s,results:i,reset:p}}function Fe(t){let e=v(),[n,o]=react$1.useState(false),[r,a]=react$1.useState(null),u=react$1.useCallback(async(s,l)=>{o(true),a(null);try{let i=await e.storage.download(s);return t?.onSuccess?.(i,l||s.split("/").pop()||"download"),i}catch(i){let y=i instanceof Error?i:new Error("Download failed");throw a(y),t?.onError?.(y),y}finally{o(false);}},[e,t]),d=react$1.useCallback(async(s,l)=>{let i=await u(s,l),y=l||s.split("/").pop()||"download",f=URL.createObjectURL(i),c=document.createElement("a");c.href=f,c.download=y,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(f);},[u]);return {download:u,downloadAndSave:d,isDownloading:n,error:r}}function ke(t,e){let n=v(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(null),[d,s]=react$1.useState(!!t&&e?.enabled!==false),[l,i]=react$1.useState(null),y=!!t&&e?.enabled!==false,f=react$1.useCallback(async()=>{if(!(!y||!t)){s(true),i(null);try{let h=await n.storage.createSignedUrl(t,e?.expiresIn);r(h);let p=await n.storage.getMetadata(t);u(p);}catch(h){i(h instanceof Error?h:new Error("Failed to load file"));}finally{s(false);}}},[n,t,e?.expiresIn,y]),c=react$1.useCallback(async()=>{t&&(await n.storage.delete(t),r(null),u(null));},[n,t]);return {url:o,metadata:a,isLoading:d,error:l,refresh:f,deleteFile:c}}function Ce(t){let e=v(),[n,o]=react$1.useState([]),[r,a]=react$1.useState(t?.enabled!==false),[u,d]=react$1.useState(null),s=t?.enabled!==false,l=react$1.useCallback(async()=>{if(s){a(true),d(null);try{let i=await e.storage.list({prefix:t?.prefix,limit:t?.limit});o(i.files);}catch(i){d(i instanceof Error?i:new Error("Failed to list files"));}finally{a(false);}}},[e,t,s]);return {files:n,isLoading:r,error:u,refresh:l}}function De(t){let e=ee(t),[n,o]=react$1.useState(false),[r,a]=react$1.useState([]),u=react$1.useRef(null),d=react$1.useCallback(g=>{g.preventDefault(),g.stopPropagation(),o(true);},[]),s=react$1.useCallback(g=>{g.preventDefault(),g.stopPropagation(),o(false);},[]),l=react$1.useCallback(g=>{let m=t?.basePath||"uploads",U=Date.now().toString(36)+Math.random().toString(36).substr(2,9),M=g.name.split(".").pop()||"";return t?.uniqueKey?`${m}/${U}.${M}`:`${m}/${g.name}`},[t?.basePath,t?.uniqueKey]),i=react$1.useCallback(async g=>{g.preventDefault(),g.stopPropagation(),o(false);let m=Array.from(g.dataTransfer.files);if(m.length===0)return;let U=t?.multiple?m:[m[0]];a(U),await e.uploadMultiple(U.map(M=>({key:l(M),file:M})));},[t?.multiple,e,l]),y=react$1.useCallback(async g=>{let m=Array.from(g.target.files||[]);m.length!==0&&(a(m),await e.uploadMultiple(m.map(U=>({key:l(U),file:U}))));},[e,l]),f=react$1.useCallback(()=>{u.current?.click();},[]),c=react$1.useCallback(()=>{a([]),e.reset();},[e]),h=react$1.useCallback(g=>{a(m=>m.filter((U,M)=>M!==g));},[]),p=react$1.useCallback(()=>({onDragOver:d,onDragLeave:s,onDrop:i,onClick:f}),[d,s,i,f]),T=react$1.useCallback(()=>({type:"file",onChange:y,multiple:t?.multiple??false,accept:t?.allowedTypes?.join(",")??"",style:{display:"none"},ref:g=>{u.current=g;}}),[y,t?.multiple,t?.allowedTypes]);return {...e,dropzone:{isDragOver:n,selectedFiles:r},getDropzoneProps:p,getInputProps:T,openFilePicker:f,clearFiles:c,removeFile:h}}function Le(t){return v().storage.getPublicUrl(t)}var G=new Map;function Ae(t,e){let n=v(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(null),[l,i]=react$1.useState(false),[y,f]=react$1.useState(null),c=react$1.useRef(0),h=react$1.useCallback(async T=>{u(true),s(null),i(false);try{let g={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(g.retry={maxRetries:e.maxRetries??3});let m=await n.functions.invoke(t,{body:T},g);return r(m.data),f(m),i(!0),c.current=0,e?.onSuccess?.(m.data,T),m.data}catch(g){let m=g instanceof Error?g:new Error("Function invocation failed");throw s(m),e?.onError?.(m,T),m}finally{u(false);}},[n,t,e]),p=react$1.useCallback(()=>{r(null),u(false),s(null),i(false),f(null),c.current=0;},[]);return {invoke:h,data:o,isLoading:a,error:d,isSuccess:l,invocation:y,reset:p}}function Ve(t,e){let n=v(),[o,r]=react$1.useState(null),[a,u]=react$1.useState(false),[d,s]=react$1.useState(null),[l,i]=react$1.useState(false),[y,f]=react$1.useState(null),c=e?.cache??false,h=e?.cacheTtl??6e4,p=react$1.useCallback(U=>`${t}:${JSON.stringify(U)}`,[t]),T=react$1.useCallback(async U=>{if(c){let M=p(U),R=G.get(M);if(R&&Date.now()-R.timestamp<h){let x=R.data;return r(x),i(true),e?.onSuccess?.(x,U),x}}u(true),s(null),i(false);try{let M={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(M.retry={maxRetries:e.maxRetries??3});let x=await n.functions.rpc(t,M)(U);if(r(x),i(!0),c){let k=p(U);G.set(k,{data:x,timestamp:Date.now()});}return e?.onSuccess?.(x,U),x}catch(M){let R=M instanceof Error?M:new Error("RPC call failed");throw s(R),e?.onError?.(R,U),R}finally{u(false);}},[n,t,e,c,h,p]),g=react$1.useCallback(()=>{let U=`${t}:`;for(let M of G.keys())M.startsWith(U)&&G.delete(M);},[t]),m=react$1.useCallback(()=>{r(null),u(false),s(null),i(false),f(null);},[]);return {invoke:T,data:o,isLoading:a,error:d,isSuccess:l,invocation:y,reset:m,clearCache:g}}function Qe(t){let e=v(),[n,o]=react$1.useState([]),[r,a]=react$1.useState(true),[u,d]=react$1.useState(null),s=react$1.useCallback(async()=>{a(true),d(null);try{let l=await e.functions.list({projectId:t.projectId,envId:t.envId,enabled:t.enabled,limit:t.limit,offset:t.offset});o(l);}catch(l){d(l instanceof Error?l:new Error("Failed to list functions"));}finally{a(false);}},[e,t.projectId,t.envId,t.enabled,t.limit,t.offset]);return react$1.useEffect(()=>{s();},[s]),{functions:n,isLoading:r,error:u,refresh:s}}function Be(t,e){let n=v(),[o,r]=react$1.useState([]),[a,u]=react$1.useState(false),[d,s]=react$1.useState(0),[l,i]=react$1.useState(null);return {invoke:react$1.useCallback(async f=>{u(true),i(null),s(0),r([]);let c=[],h=e?.concurrency??5,p=f.length,T=0;try{for(let g=0;g<f.length;g+=h){let m=f.slice(g,g+h),U=await Promise.all(m.map(async M=>(await n.functions.invoke(t,{body:M})).data));c.push(...U),T+=m.length,s(Math.round(T/p*100)),r([...c]),e?.onProgress?.(T,p);}return e?.onSuccess?.(c),c}catch(g){let m=g instanceof Error?g:new Error("Batch invocation failed");throw i(m),e?.onError?.(m),m}finally{u(false);}},[n,t,e]),results:o,isLoading:a,progress:d,error:l}}function ze(t){let e=v(),[n,o]=react$1.useState(false),[r,a]=react$1.useState(null),[u,d]=react$1.useState(null),[s,l]=react$1.useState(null),i=react$1.useCallback(async(f,c)=>{l(null);try{let p=(await e.functions.invoke(t,{body:f})).requestId??`scheduled-${Date.now()}`;return d(p),o(!0),a(new Date(Date.now()+c.delayMs)),p}catch(h){let p=h instanceof Error?h:new Error("Failed to schedule function");throw l(p),p}},[e,t]),y=react$1.useCallback(async()=>{o(false),a(null),d(null);},[]);return {schedule:i,cancel:y,isScheduled:n,scheduledAt:r,requestId:u,error:s}}Object.defineProperty(exports,"AuthProvider",{enumerable:true,get:function(){return react.AuthProvider}});Object.defineProperty(exports,"VaifAuthClient",{enumerable:true,get:function(){return react.VaifAuthClient}});Object.defineProperty(exports,"createAuthClient",{enumerable:true,get:function(){return react.createAuthClient}});Object.defineProperty(exports,"useAuthClient",{enumerable:true,get:function(){return react.useAuthClient}});Object.defineProperty(exports,"useIdentities",{enumerable:true,get:function(){return react.useIdentities}});Object.defineProperty(exports,"useIsAuthenticated",{enumerable:true,get:function(){return react.useIsAuthenticated}});Object.defineProperty(exports,"usePassword",{enumerable:true,get:function(){return react.usePassword}});Object.defineProperty(exports,"useSession",{enumerable:true,get:function(){return react.useSession}});Object.defineProperty(exports,"useSessions",{enumerable:true,get:function(){return react.useSessions}});Object.defineProperty(exports,"useStandaloneAuth",{enumerable:true,get:function(){return react.useAuth}});Object.defineProperty(exports,"useStandaloneMFA",{enumerable:true,get:function(){return react.useMFA}});Object.defineProperty(exports,"useStandaloneUser",{enumerable:true,get:function(){return react.useUser}});exports.VaifProvider=ne;exports.useAuth=re;exports.useBatchCreate=Re;exports.useBatchDelete=we;exports.useBatchInvoke=Be;exports.useBatchUpdate=Ee;exports.useBroadcast=Se;exports.useChannel=Z;exports.useCount=me;exports.useCreate=be;exports.useDelete=ve;exports.useDownload=Fe;exports.useDropzone=De;exports.useEmailVerification=ie;exports.useFile=ke;exports.useFiles=Ce;exports.useFunction=Ae;exports.useFunctionList=Qe;exports.useInfiniteQuery=ye;exports.useMFA=ce;exports.useMagicLink=le;exports.useMutation=B;exports.useOAuth=ue;exports.useOptimisticMutation=xe;exports.usePaginatedQuery=he;exports.usePasswordReset=ae;exports.usePresence=Pe;exports.usePublicUrl=Le;exports.useQuery=fe;exports.useQueryById=ge;exports.useQueryFirst=pe;exports.useRealtimeConnection=Ie;exports.useRpc=Ve;exports.useScheduledFunction=ze;exports.useSubscription=Oe;exports.useToken=oe;exports.useUpdate=Ue;exports.useUpload=ee;exports.useUpsert=Me;exports.useUser=se;exports.useVaif=D;exports.useVaifClient=v;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {createContext,useState,useRef,useCallback,useEffect,useContext}from'react';import {createVaifClient}from'@vaiftech/client';import {jsx}from'react/jsx-runtime';export{AuthProvider,VaifAuthClient,createAuthClient,useAuthClient,useIdentities,useIsAuthenticated,usePassword,useSession,useSessions,useAuth as useStandaloneAuth,useMFA as useStandaloneMFA,useUser as useStandaloneUser}from'@vaiftech/auth/react';var te=createContext(null);function ne({config:t,children:e,onAuthStateChange:n,autoRefreshSession:o=true,storageKey:r="vaif-auth"}){let[a]=useState(()=>createVaifClient(t)),[u,d]=useState(null),[s,l]=useState(null),[i,h]=useState(null),[f,c]=useState(null),[y,g]=useState(true),T=useRef(null),p=useCallback((x,M,F)=>{let U={token:x,refreshToken:M,expiresAt:F};localStorage.setItem(r,JSON.stringify(U));},[r]),m=useCallback(()=>{localStorage.removeItem(r),d(null),l(null),h(null),c(null);},[r]);useEffect(()=>((async()=>{try{let M=localStorage.getItem(r);if(!M){g(!1);return}let F=JSON.parse(M);if(F.expiresAt&&new Date(F.expiresAt)<=new Date)if(F.refreshToken)try{let U=await a.auth.refreshToken(F.refreshToken);l(U.token),h(U.refreshToken??null),c(U.expiresAt),p(U.token,U.refreshToken,U.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();else {l(F.token),h(F.refreshToken??null),c(F.expiresAt??null);try{let U=await a.auth.getUser();d(U);}catch{if(F.refreshToken)try{let U=await a.auth.refreshToken(F.refreshToken);l(U.token),h(U.refreshToken??null),c(U.expiresAt),p(U.token,U.refreshToken,U.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();}}}catch{m();}finally{g(false);}})(),()=>{T.current&&clearTimeout(T.current);}),[a,r,p,m]),useEffect(()=>{if(!o||!f||!i)return;let x=new Date(f).getTime(),M=Date.now(),F=x-M-6e4;return F>0&&(T.current=setTimeout(async()=>{try{let U=await a.auth.refreshToken(i);l(U.token),h(U.refreshToken??null),c(U.expiresAt),p(U.token,U.refreshToken,U.expiresAt);}catch{m();}},F)),()=>{T.current&&clearTimeout(T.current);}},[o,a,f,i,p,m]),useEffect(()=>{y||n?.(u);},[u,y,n]);let b=useCallback(async(x,M)=>{let F=await a.auth.login(x,M);if("mfaRequired"in F)throw new Error("MFA required - use verifyMFA to complete login");let U=F;return d(U.user),l(U.token),h(U.refreshToken??null),c(U.expiresAt??null),p(U.token,U.refreshToken,U.expiresAt),U},[a,p]),w=useCallback(async(x,M,F)=>{let U=await a.auth.signUp(x,M,{metadata:F});return d(U.user),l(U.token),h(U.refreshToken??null),c(U.expiresAt??null),p(U.token,U.refreshToken,U.expiresAt),U},[a,p]),v=useCallback(async()=>{try{await a.auth.logout();}finally{m();}},[a,m]),E=useCallback(async()=>{if(!i)throw new Error("No refresh token available");let x=await a.auth.refreshToken(i);l(x.token),h(x.refreshToken??null),c(x.expiresAt),p(x.token,x.refreshToken,x.expiresAt);},[a,i,p]),C=useCallback(x=>{d(M=>M?{...M,...x}:null);},[]),q={client:a,user:u,token:s,isLoading:y,isAuthenticated:!!u,signIn:b,signUp:w,signOut:v,refreshSession:E,updateUser:C};return jsx(te.Provider,{value:q,children:e})}function D(){let t=useContext(te);if(!t)throw new Error("useVaif must be used within a VaifProvider");return t}function R(){let{client:t}=D();return t}function re(){let{user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}=D();return {user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}}function se(){let{user:t}=D();return t}function oe(){let{token:t}=D();return t}function ae(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(false),l=useCallback(async h=>{n(true),r(null);try{await t.auth.requestPasswordReset({email:h}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to request reset")),f}finally{n(false);}},[t]),i=useCallback(async(h,f)=>{n(true),r(null);try{await t.auth.confirmPasswordReset({token:h,password:f}),s(!0);}catch(c){throw r(c instanceof Error?c:new Error("Failed to reset password")),c}finally{n(false);}},[t]);return {requestReset:l,confirmReset:i,isLoading:e,error:o,isRequested:a,isConfirmed:d}}function ie(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(false),l=useCallback(async h=>{n(true),r(null);try{await t.auth.requestEmailVerification({email:h}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to send verification")),f}finally{n(false);}},[t]),i=useCallback(async h=>{n(true),r(null);try{await t.auth.confirmEmailVerification({token:h}),s(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to verify email")),f}finally{n(false);}},[t]);return {requestVerification:l,confirmVerification:i,isLoading:e,error:o,isSent:a,isVerified:d}}function le(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),[a,u]=useState(false),d=useCallback(async l=>{n(true),r(null);try{await t.auth.requestMagicLink({email:l}),u(!0);}catch(i){throw r(i instanceof Error?i:new Error("Failed to send magic link")),i}finally{n(false);}},[t]),s=useCallback(async l=>{n(true),r(null);try{return await t.auth.verifyMagicLink({token:l})}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify magic link")),i}finally{n(false);}},[t]);return {sendMagicLink:d,verifyMagicLink:s,isLoading:e,error:o,isSent:a}}function ue(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null);return {signInWithOAuth:useCallback(async(u,d)=>{n(true),r(null);try{let s=await t.auth.getOAuthSignInUrl({provider:u,redirectUrl:d});s.url&&(window.location.href=s.url);}catch(s){throw r(s instanceof Error?s:new Error("Failed to start OAuth flow")),s}finally{n(false);}},[t]),isLoading:e,error:o}}function ce(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),a=useCallback(async s=>{n(true),r(null);try{return await t.auth.setupMFA(s)}catch(l){throw r(l instanceof Error?l:new Error("Failed to setup MFA")),l}finally{n(false);}},[t]),u=useCallback(async(s,l)=>{n(true),r(null);try{return await t.auth.verifyMFA(s,l)}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify MFA")),i}finally{n(false);}},[t]),d=useCallback(async s=>{n(true),r(null);try{await t.auth.disableMFA(s);}catch(l){throw r(l instanceof Error?l:new Error("Failed to disable MFA")),l}finally{n(false);}},[t]);return {setup:a,verify:u,disable:d,isLoading:e,error:o}}var de=new Map;function He(t,e){return `${t}:${JSON.stringify(e||{})}`}function fe(t,e){let n=R(),[o,r]=useState(e?.initialData||[]),[a,u]=useState(null),[d,s]=useState(e?.enabled===false?"idle":"loading"),[l,i]=useState(false),[h,f]=useState(true),c=useRef(0),y=e?.enabled!==false,g=e?.staleTime??0,T=e?.keepPreviousData??false,p=useCallback(async()=>{if(!y)return;let m={where:e?.where,orderBy:e?.orderBy,limit:e?.limit,offset:e?.offset,select:e?.select,include:e?.include,distinct:e?.distinct},b=He(t,m),w=de.get(b);if(w&&Date.now()-w.timestamp<g){r(w.data),s("success"),f(false);return}i(true),T||s("loading"),u(null);try{let v=await n.from(t).list(m);r(v.data),s("success"),f(!1),c.current=Date.now(),de.set(b,{data:v.data,timestamp:Date.now()}),e?.onSuccess?.(v.data);}catch(v){let E=v instanceof Error?v:new Error("Query failed");u(E),s("error"),e?.onError?.(E);}finally{i(false);}},[n,t,e,y,g,T]);return useEffect(()=>{p();},[p]),useEffect(()=>{if(!e?.refetchOnWindowFocus||!y)return;let m=()=>{Date.now()-c.current>g&&(f(true),p());};return window.addEventListener("focus",m),()=>window.removeEventListener("focus",m)},[e?.refetchOnWindowFocus,y,g,p]),useEffect(()=>{if(!e?.refetchInterval||e.refetchInterval<=0||!y)return;let m=setInterval(()=>{f(true),p();},e.refetchInterval);return ()=>clearInterval(m)},[e?.refetchInterval,y,p]),{data:o,isLoading:d==="loading",isFetching:l,error:a,status:d,refetch:p,isStale:h,isEnabled:y}}function pe(t,e,n){let o=R(),[r,a]=useState(null),[u,d]=useState(null),[s,l]=useState(!!e&&n?.enabled!==false),[i,h]=useState(false),f=!!e&&n?.enabled!==false,c=useCallback(async()=>{if(!(!f||!e)){l(true),d(null),h(false);try{let y=await o.from(t).get(e);a(y.data);}catch(y){let g=y instanceof Error?y:new Error("Query failed");g.message.includes("not found")||g.message.includes("404")?h(true):d(g);}finally{l(false);}}},[o,t,e,f]);return useEffect(()=>{c();},[c]),{data:r,isLoading:s,error:u,isNotFound:i,refetch:c}}function K(t,e,n){let o=t.from(e);if(n?.where){let r=Array.isArray(n.where)?{AND:n.where}:n.where;o=o.where(r);}if(n?.orderBy){let r=Array.isArray(n.orderBy)?n.orderBy:[n.orderBy];for(let a of r)o=o.orderBy(a.field,a.direction);}if(n?.select&&(o=o.select(...n.select)),n?.include)for(let r of n.include)o=o.include(r);return o}function ge(t,e){let n=R(),[o,r]=useState(null),[a,u]=useState(null),[d,s]=useState(e?.enabled!==false),[l,i]=useState(false),h=e?.enabled!==false,f=useCallback(async()=>{if(h){s(true),u(null),i(false);try{let y=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).first();y?r(y):i(!0);}catch(c){let y=c instanceof Error?c:new Error("Query failed");u(y);}finally{s(false);}}},[n,t,e,h]);return useEffect(()=>{f();},[f]),{data:o,isLoading:d,error:a,isNotFound:l,refetch:f}}function ye(t,e){let n=R(),[o,r]=useState([]),[a,u]=useState(e?.initialPage??1),[d,s]=useState(null),[l,i]=useState(true),[h,f]=useState(null),c=e?.pageSize??10,y=useCallback(async C=>{i(true),f(null);try{let x=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).paginate({page:C,pageSize:c});r(x.data),s(x.pageInfo),u(x.pageInfo.page),e?.onSuccess?.(x);}catch(q){let x=q instanceof Error?q:new Error("Query failed");f(x),e?.onError?.(x);}finally{i(false);}},[n,t,e,c]);useEffect(()=>{y(a);},[y,a]);let g=d?.total??0,T=d?.pageCount??0,p=d?.hasNextPage??false,m=d?.hasPrevPage??false,b=useCallback(()=>{p&&u(C=>C+1);},[p]),w=useCallback(()=>{m&&u(C=>C-1);},[m]),v=useCallback(C=>{let q=Math.max(1,Math.min(C,T||1));u(q);},[T]),E=useCallback(()=>y(a),[y,a]);return {data:o,page:a,pageSize:c,totalCount:g,totalPages:T,hasNextPage:p,hasPrevPage:m,isLoading:l,error:h,nextPage:b,prevPage:w,goToPage:v,refetch:E}}function he(t,e){let n=R(),[o,r]=useState([]),[a,u]=useState(null),[d,s]=useState(true),[l,i]=useState(true),[h,f]=useState(false),[c,y]=useState(null),g=e?.pageSize??20,T=useCallback(async()=>{if(!d)return;o.length===0?i(true):f(true),y(null);try{let E=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({cursor:a??void 0,limit:g});r(C=>[...C,E.data]),u(E.nextCursor??null),s(E.hasMore),e?.onSuccess?.(E.data,E.hasMore);}catch(v){let E=v instanceof Error?v:new Error("Query failed");y(E),e?.onError?.(E);}finally{i(false),f(false);}},[n,t,e,a,d,o.length,g]);useEffect(()=>{T();},[]);let p=useCallback(async()=>{r([]),u(null),s(true),i(true);try{let v=await K(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({limit:g});r([v.data]),u(v.nextCursor??null),s(v.hasMore);}catch(w){y(w instanceof Error?w:new Error("Query failed"));}finally{i(false);}},[n,t,e,g]),m=useCallback(()=>{r([]),u(null),s(true),i(true),y(null);},[]);return {data:o.flat(),pages:o,hasNextPage:d,isLoading:l,isFetchingNextPage:h,error:c,fetchNextPage:T,refetch:p,reset:m}}function me(t,e){let n=R(),[o,r]=useState(0),[a,u]=useState(e?.enabled!==false),[d,s]=useState(null),l=e?.enabled!==false,i=useCallback(async()=>{if(l){u(true),s(null);try{let h=n.from(t);e?.where&&(h=h.where(e.where));let f=await h.count();r(f);}catch(h){s(h instanceof Error?h:new Error("Count failed"));}finally{u(false);}}},[n,t,e?.where,l]);return useEffect(()=>{i();},[i]),{count:o,isLoading:a,error:d,refetch:i}}function B(t,e){let[n,o]=useState("idle"),[r,a]=useState(void 0),[u,d]=useState(null),s=useRef(0),l=useCallback(()=>{o("idle"),a(void 0),d(null),s.current=0;},[]),i=useCallback(async f=>{o("loading"),d(null);try{await e?.onMutate?.(f);let c=await t(f);return a(c),o("success"),s.current=0,await e?.onSuccess?.(c,f),await e?.onSettled?.(c,null,f),c}catch(c){let y=c instanceof Error?c:new Error("Mutation failed"),g=e?.retry??0;if(s.current<g){s.current++;let T=e?.retryDelay??1e3;return await new Promise(p=>setTimeout(p,T)),i(f)}throw d(y),o("error"),await e?.onError?.(y,f),await e?.onSettled?.(void 0,y,f),y}},[t,e]);return {mutate:useCallback(f=>{i(f).catch(()=>{});},[i]),mutateAsync:i,data:r,error:u,isLoading:n==="loading",isSuccess:n==="success",isError:n==="error",isIdle:n==="idle",status:n,reset:l}}function Ue(t,e){let n=R();return B(async o=>(await n.from(t).create(o)).data,e)}function be(t,e){let n=R();return B(async({id:o,data:r})=>(await n.from(t).update(o,r)).data,e)}function we(t,e){let n=R();return B(async o=>{await n.from(t).delete(o);},e)}function Re(t,e){let n=R();return B(async({data:o,conflictFields:r,updateFields:a})=>{let u={conflictFields:r,updateFields:a};return (await n.from(t).upsert(o,u)).data},e)}function ve(t,e){let n=R();return B(async o=>{let r=await n.from(t).createMany(o);return {count:r.count,records:r.records}},e)}function Pe(t,e){let n=R();return B(async({data:o,where:r})=>{let a=await n.from(t).where(r).updateMany(o);return {count:a.count,records:a.records}},e)}function xe(t,e){let n=R();return B(async o=>({count:(await n.from(t).where(o).deleteMany()).count}),e)}function Ee(t,e,n){let[o,r]=useState(t),[a,u]=useState(false),[d,s]=useState(null),l=useRef(t),i=useCallback(()=>{r(l.current);},[]),h=useCallback(async c=>{u(true),s(null),l.current=o;let y=n.optimisticUpdate(o,c);r(y);try{let g=await e(c);return r(g),n.onSuccess?.(g,c),n.onSettled?.(g,null,c),g}catch(g){let T=g instanceof Error?g:new Error("Mutation failed");throw s(T),i(),n.onError?.(T,c),n.onSettled?.(void 0,T,c),T}finally{u(false);}},[o,e,n,i]);return {mutate:useCallback(c=>{h(c).catch(()=>{});},[h]),mutateAsync:h,optimisticData:o,rollback:i,isLoading:a,error:d}}function Oe(t,e){let n=R(),[o,r]=useState(null),[a,u]=useState([]),[d,s]=useState(false),l=useRef(null),i=useRef(null),h=e?.enabled!==false;useEffect(()=>{if(!h)return;let c=n.realtime();l.current=c;let y=c.channel(`table:${t}`);return i.current=y,y.onDbChange({table:t,event:e?.operations||"*"},g=>{switch(g.new!==void 0&&r(g.new),u(T=>[...T,g]),g.operation){case "INSERT":g.new&&e?.onInsert?.(g.new);break;case "UPDATE":g.new&&e?.onUpdate?.(g.new,g.old??null);break;case "DELETE":g.old&&e?.onDelete?.(g.old);break}e?.onChange?.(g);}),y.subscribe(),s(true),()=>{y.unsubscribe(),c.disconnect(),s(false);}},[n,t,h,e]);let f=useCallback(()=>{u([]);},[]);return {data:o,changes:a,isSubscribed:d,clearChanges:f}}function Z(t,e){let n=R(),[o,r]=useState(null),[a,u]=useState([]),[d,s]=useState(false),l=useRef(null),i=useRef(null),h=e?.enabled!==false;useEffect(()=>{if(!h)return;let y=n.realtime();l.current=y;let g=y.channel(t,{type:e?.type||"public"});return i.current=g,g.on("*",T=>{let p={event:"*",payload:T};r(p),u(m=>[...m,p]);}),g.subscribe(),s(true),()=>{g.unsubscribe(),y.disconnect(),s(false);}},[n,t,h,e?.type]);let f=useCallback((y,g)=>{i.current?.broadcast({event:y,payload:g});},[]),c=useCallback(()=>{i.current?.unsubscribe(),s(false);},[]);return {broadcast:f,lastMessage:o,messages:a,isJoined:d,leave:c}}function Fe(t,e,n){let o=R(),[r,a]=useState({}),[u,d]=useState(false),s=useRef(null),l=useRef(null),i=n?.enabled!==false;useEffect(()=>{if(!i)return;let g=o.realtime();s.current=g;let T=g.channel(t,{type:"presence"});return l.current=T,T.presence.onSync(p=>{a(p);}),T.subscribe(),e&&(T.presence.track({state:e}),d(true)),()=>{T.unsubscribe(),g.disconnect(),d(false);}},[o,t,i,e]);let h=useCallback(g=>{l.current?.presence.update(g);},[]),f=useCallback(()=>{l.current?.presence.untrack(),d(false);},[]),c=Object.keys(r).length,y=Object.keys(r);return {presence:r,count:c,onlineUsers:y,update:h,leave:f,isTracking:u}}function ke(){let t=R(),[e,n]=useState("disconnected"),[o,r]=useState(null),a=useRef(null);useEffect(()=>{let s=t.realtime();return a.current=s,n(s.connectionState),r(s.connectionId),s.on("connect",()=>{n("connected"),r(s.connectionId);}),s.on("disconnect",()=>{n("disconnected"),r(null);}),s.on("reconnect",()=>{n("connected"),r(s.connectionId);}),s.on("error",()=>{n("disconnected");}),()=>{s.disconnect();}},[t]);let u=useCallback(()=>{a.current?.connect();},[]),d=useCallback(()=>{a.current?.disconnect();},[]);return {state:e,isConnected:e==="connected",connectionId:o,reconnect:u,disconnect:d}}function Se(t,e){let n=Z(t,e);return {send:n.broadcast,messages:n.messages,lastMessage:n.lastMessage,isConnected:n.isJoined}}function ee(t){let e=R(),[n,o]=useState(0),[r,a]=useState(false),[u,d]=useState(null),[s,l]=useState(null),[i,h]=useState([]),f=useCallback(T=>{if(t?.maxSize&&T.size>t.maxSize)throw new Error(`File size (${Math.round(T.size/1024/1024)}MB) exceeds maximum allowed (${Math.round(t.maxSize/1024/1024)}MB)`);if(t?.allowedTypes&&t.allowedTypes.length>0&&!t.allowedTypes.includes(T.type))throw new Error(`File type "${T.type}" is not allowed. Allowed types: ${t.allowedTypes.join(", ")}`)},[t?.maxSize,t?.allowedTypes]),c=useCallback(async(T,p)=>{a(true),d(null),o(0);try{f(p),t?.onUploadStart?.(p);let m=await e.storage.upload(T,p,{contentType:p.type,metadata:t?.metadata,isPublic:t?.isPublic});return o(100),l(m),h(b=>[...b,m]),t?.onSuccess?.(m,p),m}catch(m){let b=m instanceof Error?m:new Error("Upload failed");throw d(b),t?.onError?.(b,p),b}finally{a(false);}},[e,t,f]),y=useCallback(async T=>{let p=[];for(let{key:m,file:b}of T){let w=await c(m,b);p.push(w);}return p},[c]),g=useCallback(()=>{o(0),a(false),d(null),l(null),h([]);},[]);return {upload:c,uploadMultiple:y,progress:n,isUploading:r,error:u,result:s,results:i,reset:g}}function Ie(t){let e=R(),[n,o]=useState(false),[r,a]=useState(null),u=useCallback(async(s,l)=>{o(true),a(null);try{let i=await e.storage.download(s);return t?.onSuccess?.(i,l||s.split("/").pop()||"download"),i}catch(i){let h=i instanceof Error?i:new Error("Download failed");throw a(h),t?.onError?.(h),h}finally{o(false);}},[e,t]),d=useCallback(async(s,l)=>{let i=await u(s,l),h=l||s.split("/").pop()||"download",f=URL.createObjectURL(i),c=document.createElement("a");c.href=f,c.download=h,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(f);},[u]);return {download:u,downloadAndSave:d,isDownloading:n,error:r}}function Ce(t,e){let n=R(),[o,r]=useState(null),[a,u]=useState(null),[d,s]=useState(!!t&&e?.enabled!==false),[l,i]=useState(null),h=!!t&&e?.enabled!==false,f=useCallback(async()=>{if(!(!h||!t)){s(true),i(null);try{let y=await n.storage.createSignedUrl(t,e?.expiresIn);r(y);let g=await n.storage.getMetadata(t);u(g);}catch(y){i(y instanceof Error?y:new Error("Failed to load file"));}finally{s(false);}}},[n,t,e?.expiresIn,h]),c=useCallback(async()=>{t&&(await n.storage.delete(t),r(null),u(null));},[n,t]);return {url:o,metadata:a,isLoading:d,error:l,refresh:f,deleteFile:c}}function Me(t){let e=R(),[n,o]=useState([]),[r,a]=useState(t?.enabled!==false),[u,d]=useState(null),s=t?.enabled!==false,l=useCallback(async()=>{if(s){a(true),d(null);try{let i=await e.storage.list({prefix:t?.prefix,limit:t?.limit});o(i.files);}catch(i){d(i instanceof Error?i:new Error("Failed to list files"));}finally{a(false);}}},[e,t,s]);return {files:n,isLoading:r,error:u,refresh:l}}function De(t){let e=ee(t),[n,o]=useState(false),[r,a]=useState([]),u=useRef(null),d=useCallback(p=>{p.preventDefault(),p.stopPropagation(),o(true);},[]),s=useCallback(p=>{p.preventDefault(),p.stopPropagation(),o(false);},[]),l=useCallback(p=>{let m=t?.basePath||"uploads",b=Date.now().toString(36)+Math.random().toString(36).substr(2,9),w=p.name.split(".").pop()||"";return t?.uniqueKey?`${m}/${b}.${w}`:`${m}/${p.name}`},[t?.basePath,t?.uniqueKey]),i=useCallback(async p=>{p.preventDefault(),p.stopPropagation(),o(false);let m=Array.from(p.dataTransfer.files);if(m.length===0)return;let b=t?.multiple?m:[m[0]];a(b),await e.uploadMultiple(b.map(w=>({key:l(w),file:w})));},[t?.multiple,e,l]),h=useCallback(async p=>{let m=Array.from(p.target.files||[]);m.length!==0&&(a(m),await e.uploadMultiple(m.map(b=>({key:l(b),file:b}))));},[e,l]),f=useCallback(()=>{u.current?.click();},[]),c=useCallback(()=>{a([]),e.reset();},[e]),y=useCallback(p=>{a(m=>m.filter((b,w)=>w!==p));},[]),g=useCallback(()=>({onDragOver:d,onDragLeave:s,onDrop:i,onClick:f}),[d,s,i,f]),T=useCallback(()=>({type:"file",onChange:h,multiple:t?.multiple??false,accept:t?.allowedTypes?.join(",")??"",style:{display:"none"},ref:p=>{u.current=p;}}),[h,t?.multiple,t?.allowedTypes]);return {...e,dropzone:{isDragOver:n,selectedFiles:r},getDropzoneProps:g,getInputProps:T,openFilePicker:f,clearFiles:c,removeFile:y}}function Ae(t){return R().storage.getPublicUrl(t)}var G=new Map;function Le(t,e){let n=R(),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(null),[l,i]=useState(false),[h,f]=useState(null),c=useRef(0),y=useCallback(async T=>{u(true),s(null),i(false);try{let p={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(p.retry={maxRetries:e.maxRetries??3});let m=await n.functions.invoke(t,{body:T},p);return r(m.data),f(m),i(!0),c.current=0,e?.onSuccess?.(m.data,T),m.data}catch(p){let m=p instanceof Error?p:new Error("Function invocation failed");throw s(m),e?.onError?.(m,T),m}finally{u(false);}},[n,t,e]),g=useCallback(()=>{r(null),u(false),s(null),i(false),f(null),c.current=0;},[]);return {invoke:y,data:o,isLoading:a,error:d,isSuccess:l,invocation:h,reset:g}}function Ve(t,e){let n=R(),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(null),[l,i]=useState(false),[h,f]=useState(null),c=e?.cache??false,y=e?.cacheTtl??6e4,g=useCallback(b=>`${t}:${JSON.stringify(b)}`,[t]),T=useCallback(async b=>{if(c){let w=g(b),v=G.get(w);if(v&&Date.now()-v.timestamp<y){let E=v.data;return r(E),i(true),e?.onSuccess?.(E,b),E}}u(true),s(null),i(false);try{let w={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(w.retry={maxRetries:e.maxRetries??3});let E=await n.functions.rpc(t,w)(b);if(r(E),i(!0),c){let C=g(b);G.set(C,{data:E,timestamp:Date.now()});}return e?.onSuccess?.(E,b),E}catch(w){let v=w instanceof Error?w:new Error("RPC call failed");throw s(v),e?.onError?.(v,b),v}finally{u(false);}},[n,t,e,c,y,g]),p=useCallback(()=>{let b=`${t}:`;for(let w of G.keys())w.startsWith(b)&&G.delete(w);},[t]),m=useCallback(()=>{r(null),u(false),s(null),i(false),f(null);},[]);return {invoke:T,data:o,isLoading:a,error:d,isSuccess:l,invocation:h,reset:m,clearCache:p}}function Qe(t){let e=R(),[n,o]=useState([]),[r,a]=useState(true),[u,d]=useState(null),s=useCallback(async()=>{a(true),d(null);try{let l=await e.functions.list({projectId:t.projectId,envId:t.envId,enabled:t.enabled,limit:t.limit,offset:t.offset});o(l);}catch(l){d(l instanceof Error?l:new Error("Failed to list functions"));}finally{a(false);}},[e,t.projectId,t.envId,t.enabled,t.limit,t.offset]);return useEffect(()=>{s();},[s]),{functions:n,isLoading:r,error:u,refresh:s}}function Be(t,e){let n=R(),[o,r]=useState([]),[a,u]=useState(false),[d,s]=useState(0),[l,i]=useState(null);return {invoke:useCallback(async f=>{u(true),i(null),s(0),r([]);let c=[],y=e?.concurrency??5,g=f.length,T=0;try{for(let p=0;p<f.length;p+=y){let m=f.slice(p,p+y),b=await Promise.all(m.map(async w=>(await n.functions.invoke(t,{body:w})).data));c.push(...b),T+=m.length,s(Math.round(T/g*100)),r([...c]),e?.onProgress?.(T,g);}return e?.onSuccess?.(c),c}catch(p){let m=p instanceof Error?p:new Error("Batch invocation failed");throw i(m),e?.onError?.(m),m}finally{u(false);}},[n,t,e]),results:o,isLoading:a,progress:d,error:l}}function ze(t){let e=R(),[n,o]=useState(false),[r,a]=useState(null),[u,d]=useState(null),[s,l]=useState(null),i=useCallback(async(f,c)=>{l(null);try{let g=(await e.functions.invoke(t,{body:f})).requestId??`scheduled-${Date.now()}`;return d(g),o(!0),a(new Date(Date.now()+c.delayMs)),g}catch(y){let g=y instanceof Error?y:new Error("Failed to schedule function");throw l(g),g}},[e,t]),h=useCallback(async()=>{o(false),a(null),d(null);},[]);return {schedule:i,cancel:h,isScheduled:n,scheduledAt:r,requestId:u,error:s}}export{ne as VaifProvider,re as useAuth,ve as useBatchCreate,xe as useBatchDelete,Be as useBatchInvoke,Pe as useBatchUpdate,Se as useBroadcast,Z as useChannel,me as useCount,Ue as useCreate,we as useDelete,Ie as useDownload,De as useDropzone,ie as useEmailVerification,Ce as useFile,Me as useFiles,Le as useFunction,Qe as useFunctionList,he as useInfiniteQuery,ce as useMFA,le as useMagicLink,B as useMutation,ue as useOAuth,Ee as useOptimisticMutation,ye as usePaginatedQuery,ae as usePasswordReset,Fe as usePresence,Ae as usePublicUrl,fe as useQuery,pe as useQueryById,ge as useQueryFirst,ke as useRealtimeConnection,Ve as useRpc,ze as useScheduledFunction,Oe as useSubscription,oe as useToken,be as useUpdate,ee as useUpload,Re as useUpsert,se as useUser,D as useVaif,R as useVaifClient};
|
|
1
|
+
import {createContext,useState,useRef,useCallback,useEffect,useContext}from'react';import {createVaifClient}from'@vaiftech/client';import {jsx}from'react/jsx-runtime';export{AuthProvider,VaifAuthClient,createAuthClient,useAuthClient,useIdentities,useIsAuthenticated,usePassword,useSession,useSessions,useAuth as useStandaloneAuth,useMFA as useStandaloneMFA,useUser as useStandaloneUser}from'@vaiftech/auth/react';var te=createContext(null);function ne({config:t,children:e,onAuthStateChange:n,autoRefreshSession:o=true,storageKey:r="vaif-auth"}){let[a]=useState(()=>createVaifClient(t)),[u,d]=useState(null),[s,l]=useState(null),[i,y]=useState(null),[f,c]=useState(null),[h,p]=useState(true),T=useRef(null),g=useCallback((w,C,P)=>{let b={token:w,refreshToken:C,expiresAt:P};localStorage.setItem(r,JSON.stringify(b));},[r]),m=useCallback(()=>{localStorage.removeItem(r),d(null),l(null),y(null),c(null);},[r]);useEffect(()=>((async()=>{try{let C=localStorage.getItem(r);if(!C){p(!1);return}let P=JSON.parse(C);if(P.expiresAt&&new Date(P.expiresAt)<=new Date)if(P.refreshToken)try{let b=await a.auth.refreshToken(P.refreshToken);l(b.token),y(b.refreshToken??null),c(b.expiresAt),g(b.token,b.refreshToken,b.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();else {l(P.token),y(P.refreshToken??null),c(P.expiresAt??null);try{let b=await a.auth.getUser();d(b);}catch{if(P.refreshToken)try{let b=await a.auth.refreshToken(P.refreshToken);l(b.token),y(b.refreshToken??null),c(b.expiresAt),g(b.token,b.refreshToken,b.expiresAt);let X=await a.auth.getUser();d(X);}catch{m();}else m();}}}catch{m();}finally{p(false);}})(),()=>{T.current&&clearTimeout(T.current);}),[a,r,g,m]),useEffect(()=>{if(!o||!f||!i)return;let w=new Date(f).getTime(),C=Date.now(),P=w-C-6e4;return P>0&&(T.current=setTimeout(async()=>{try{let b=await a.auth.refreshToken(i);l(b.token),y(b.refreshToken??null),c(b.expiresAt),g(b.token,b.refreshToken,b.expiresAt);}catch{m();}},P)),()=>{T.current&&clearTimeout(T.current);}},[o,a,f,i,g,m]),useEffect(()=>{h||n?.(u);},[u,h,n]);let U=useCallback(async(w,C)=>{let P=await a.auth.login(w,C);if("mfaRequired"in P)throw new Error("MFA required - use verifyMFA to complete login");let b=P;return d(b.user),l(b.token),y(b.refreshToken??null),c(b.expiresAt??null),g(b.token,b.refreshToken,b.expiresAt),b},[a,g]),M=useCallback(async(w,C,P)=>{let b=await a.auth.signUp(w,C,{metadata:P});return d(b.user),l(b.token),y(b.refreshToken??null),c(b.expiresAt??null),g(b.token,b.refreshToken,b.expiresAt),b},[a,g]),R=useCallback(async()=>{try{await a.auth.logout();}finally{m();}},[a,m]),x=useCallback(async()=>{if(!i)throw new Error("No refresh token available");let w=await a.auth.refreshToken(i);l(w.token),y(w.refreshToken??null),c(w.expiresAt),g(w.token,w.refreshToken,w.expiresAt);},[a,i,g]),k=useCallback(w=>{d(C=>C?{...C,...w}:null);},[]),q={client:a,user:u,token:s,isLoading:h,isAuthenticated:!!u,signIn:U,signUp:M,signOut:R,refreshSession:x,updateUser:k};return jsx(te.Provider,{value:q,children:e})}function D(){let t=useContext(te);if(!t)throw new Error("useVaif must be used within a VaifProvider");return t}function v(){let{client:t}=D();return t}function re(){let{user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}=D();return {user:t,token:e,isLoading:n,isAuthenticated:o,signIn:r,signUp:a,signOut:u,refreshSession:d}}function se(){let{user:t}=D();return t}function oe(){let{token:t}=D();return t}function ae(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(false),l=useCallback(async y=>{n(true),r(null);try{await t.auth.requestPasswordReset({email:y}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to request reset")),f}finally{n(false);}},[t]),i=useCallback(async(y,f)=>{n(true),r(null);try{await t.auth.confirmPasswordReset({token:y,password:f}),s(!0);}catch(c){throw r(c instanceof Error?c:new Error("Failed to reset password")),c}finally{n(false);}},[t]);return {requestReset:l,confirmReset:i,isLoading:e,error:o,isRequested:a,isConfirmed:d}}function ie(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(false),l=useCallback(async y=>{n(true),r(null);try{await t.auth.requestEmailVerification({email:y}),u(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to send verification")),f}finally{n(false);}},[t]),i=useCallback(async y=>{n(true),r(null);try{await t.auth.confirmEmailVerification({token:y}),s(!0);}catch(f){throw r(f instanceof Error?f:new Error("Failed to verify email")),f}finally{n(false);}},[t]);return {requestVerification:l,confirmVerification:i,isLoading:e,error:o,isSent:a,isVerified:d}}function le(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),[a,u]=useState(false),d=useCallback(async l=>{n(true),r(null);try{await t.auth.requestMagicLink({email:l}),u(!0);}catch(i){throw r(i instanceof Error?i:new Error("Failed to send magic link")),i}finally{n(false);}},[t]),s=useCallback(async l=>{n(true),r(null);try{return await t.auth.verifyMagicLink({token:l})}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify magic link")),i}finally{n(false);}},[t]);return {sendMagicLink:d,verifyMagicLink:s,isLoading:e,error:o,isSent:a}}function ue(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null);return {signInWithOAuth:useCallback(async(u,d)=>{n(true),r(null);try{let s=await t.auth.getOAuthSignInUrl({provider:u,redirectUrl:d});s.url&&(window.location.href=s.url);}catch(s){throw r(s instanceof Error?s:new Error("Failed to start OAuth flow")),s}finally{n(false);}},[t]),isLoading:e,error:o}}function ce(){let{client:t}=D(),[e,n]=useState(false),[o,r]=useState(null),a=useCallback(async s=>{n(true),r(null);try{return await t.auth.setupMFA(s)}catch(l){throw r(l instanceof Error?l:new Error("Failed to setup MFA")),l}finally{n(false);}},[t]),u=useCallback(async(s,l)=>{n(true),r(null);try{return await t.auth.verifyMFA(s,l)}catch(i){throw r(i instanceof Error?i:new Error("Failed to verify MFA")),i}finally{n(false);}},[t]),d=useCallback(async s=>{n(true),r(null);try{await t.auth.disableMFA(s);}catch(l){throw r(l instanceof Error?l:new Error("Failed to disable MFA")),l}finally{n(false);}},[t]);return {setup:a,verify:u,disable:d,isLoading:e,error:o}}var de=new Map;function Je(t,e){return `${t}:${JSON.stringify(e||{})}`}function fe(t,e){let n=v(),[o,r]=useState(e?.initialData||[]),[a,u]=useState(null),[d,s]=useState(e?.enabled===false?"idle":"loading"),[l,i]=useState(false),[y,f]=useState(true),c=useRef(0),h=e?.enabled!==false,p=e?.staleTime??0,T=e?.keepPreviousData??false,g=useCallback(async()=>{if(!h)return;let m={where:e?.where,orderBy:e?.orderBy,limit:e?.limit,offset:e?.offset,select:e?.select,include:e?.include,distinct:e?.distinct},U=Je(t,m),M=de.get(U);if(M&&Date.now()-M.timestamp<p){r(M.data),s("success"),f(false);return}i(true),T||s("loading"),u(null);try{let R=await n.from(t).list(m);r(R.data),s("success"),f(!1),c.current=Date.now(),de.set(U,{data:R.data,timestamp:Date.now()}),e?.onSuccess?.(R.data);}catch(R){let x=R instanceof Error?R:new Error("Query failed");u(x),s("error"),e?.onError?.(x);}finally{i(false);}},[n,t,e,h,p,T]);return useEffect(()=>{g();},[g]),useEffect(()=>{if(!e?.refetchOnWindowFocus||!h)return;let m=()=>{Date.now()-c.current>p&&(f(true),g());};return window.addEventListener("focus",m),()=>window.removeEventListener("focus",m)},[e?.refetchOnWindowFocus,h,p,g]),useEffect(()=>{if(!e?.refetchInterval||e.refetchInterval<=0||!h)return;let m=setInterval(()=>{f(true),g();},e.refetchInterval);return ()=>clearInterval(m)},[e?.refetchInterval,h,g]),{data:o,isLoading:d==="loading",isFetching:l,error:a,status:d,refetch:g,isStale:y,isEnabled:h}}function ge(t,e,n){let o=v(),[r,a]=useState(null),[u,d]=useState(null),[s,l]=useState(!!e&&n?.enabled!==false),[i,y]=useState(false),f=!!e&&n?.enabled!==false,c=useCallback(async()=>{if(!(!f||!e)){l(true),d(null),y(false);try{let h=await o.from(t).get(e);a(h.data);}catch(h){let p=h instanceof Error?h:new Error("Query failed");p.message.includes("not found")||p.message.includes("404")?y(true):d(p);}finally{l(false);}}},[o,t,e,f]);return useEffect(()=>{c();},[c]),{data:r,isLoading:s,error:u,isNotFound:i,refetch:c}}function _(t,e,n){let o=t.from(e);if(n?.where){let r=Array.isArray(n.where)?{AND:n.where}:n.where;o=o.where(r);}if(n?.orderBy){let r=Array.isArray(n.orderBy)?n.orderBy:[n.orderBy];for(let a of r)o=o.orderBy(a.field,a.direction);}if(n?.select&&(o=o.select(...n.select)),n?.include)for(let r of n.include)o=o.include(r);return o}function pe(t,e){let n=v(),[o,r]=useState(null),[a,u]=useState(null),[d,s]=useState(e?.enabled!==false),[l,i]=useState(false),y=e?.enabled!==false,f=useCallback(async()=>{if(y){s(true),u(null),i(false);try{let h=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).first();h?r(h):i(!0);}catch(c){let h=c instanceof Error?c:new Error("Query failed");u(h);}finally{s(false);}}},[n,t,e,y]);return useEffect(()=>{f();},[f]),{data:o,isLoading:d,error:a,isNotFound:l,refetch:f}}function he(t,e){let n=v(),[o,r]=useState([]),[a,u]=useState(e?.initialPage??1),[d,s]=useState(null),[l,i]=useState(true),[y,f]=useState(null),c=e?.pageSize??10,h=useCallback(async k=>{i(true),f(null);try{let w=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).paginate({page:k,pageSize:c});r(w.data),s(w.pageInfo),u(w.pageInfo.page),e?.onSuccess?.(w);}catch(q){let w=q instanceof Error?q:new Error("Query failed");f(w),e?.onError?.(w);}finally{i(false);}},[n,t,e,c]);useEffect(()=>{h(a);},[h,a]);let p=d?.total??0,T=d?.pageCount??0,g=d?.hasNextPage??false,m=d?.hasPrevPage??false,U=useCallback(()=>{g&&u(k=>k+1);},[g]),M=useCallback(()=>{m&&u(k=>k-1);},[m]),R=useCallback(k=>{let q=Math.max(1,Math.min(k,T||1));u(q);},[T]),x=useCallback(()=>h(a),[h,a]);return {data:o,page:a,pageSize:c,totalCount:p,totalPages:T,hasNextPage:g,hasPrevPage:m,isLoading:l,error:y,nextPage:U,prevPage:M,goToPage:R,refetch:x}}function ye(t,e){let n=v(),[o,r]=useState([]),[a,u]=useState(null),[d,s]=useState(true),[l,i]=useState(true),[y,f]=useState(false),[c,h]=useState(null),p=e?.pageSize??20,T=useCallback(async()=>{if(!d)return;o.length===0?i(true):f(true),h(null);try{let x=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({cursor:a??void 0,limit:p});r(k=>[...k,x.data]),u(x.nextCursor??null),s(x.hasMore),e?.onSuccess?.(x.data,x.hasMore);}catch(R){let x=R instanceof Error?R:new Error("Query failed");h(x),e?.onError?.(x);}finally{i(false),f(false);}},[n,t,e,a,d,o.length,p]);useEffect(()=>{T();},[]);let g=useCallback(async()=>{r([]),u(null),s(true),i(true);try{let R=await _(n,t,{where:e?.where,orderBy:e?.orderBy,select:e?.select,include:e?.include}).cursorPaginate({limit:p});r([R.data]),u(R.nextCursor??null),s(R.hasMore);}catch(M){h(M instanceof Error?M:new Error("Query failed"));}finally{i(false);}},[n,t,e,p]),m=useCallback(()=>{r([]),u(null),s(true),i(true),h(null);},[]);return {data:o.flat(),pages:o,hasNextPage:d,isLoading:l,isFetchingNextPage:y,error:c,fetchNextPage:T,refetch:g,reset:m}}function me(t,e){let n=v(),[o,r]=useState(0),[a,u]=useState(e?.enabled!==false),[d,s]=useState(null),l=e?.enabled!==false,i=useCallback(async()=>{if(l){u(true),s(null);try{let y=n.from(t);e?.where&&(y=y.where(e.where));let f=await y.count();r(f);}catch(y){s(y instanceof Error?y:new Error("Count failed"));}finally{u(false);}}},[n,t,e?.where,l]);return useEffect(()=>{i();},[i]),{count:o,isLoading:a,error:d,refetch:i}}function B(t,e){let[n,o]=useState("idle"),[r,a]=useState(void 0),[u,d]=useState(null),s=useRef(0),l=useCallback(()=>{o("idle"),a(void 0),d(null),s.current=0;},[]),i=useCallback(async f=>{o("loading"),d(null);try{await e?.onMutate?.(f);let c=await t(f);return a(c),o("success"),s.current=0,await e?.onSuccess?.(c,f),await e?.onSettled?.(c,null,f),c}catch(c){let h=c instanceof Error?c:new Error("Mutation failed"),p=e?.retry??0;if(s.current<p){s.current++;let T=e?.retryDelay??1e3;return await new Promise(g=>setTimeout(g,T)),i(f)}throw d(h),o("error"),await e?.onError?.(h,f),await e?.onSettled?.(void 0,h,f),h}},[t,e]);return {mutate:useCallback(f=>{i(f).catch(()=>{});},[i]),mutateAsync:i,data:r,error:u,isLoading:n==="loading",isSuccess:n==="success",isError:n==="error",isIdle:n==="idle",status:n,reset:l}}function be(t,e){let n=v();return B(async o=>(await n.from(t).create(o)).data,e)}function Ue(t,e){let n=v();return B(async({id:o,data:r})=>(await n.from(t).update(o,r)).data,e)}function ve(t,e){let n=v();return B(async o=>{await n.from(t).delete(o);},e)}function Me(t,e){let n=v();return B(async({data:o,conflictFields:r,updateFields:a})=>{let u={conflictFields:r,updateFields:a};return (await n.from(t).upsert(o,u)).data},e)}function Re(t,e){let n=v();return B(async o=>{let r=await n.from(t).createMany(o);return {count:r.count,records:r.records}},e)}function Ee(t,e){let n=v();return B(async({data:o,where:r})=>{let a=await n.from(t).where(r).updateMany(o);return {count:a.count,records:a.records}},e)}function we(t,e){let n=v();return B(async o=>({count:(await n.from(t).where(o).deleteMany()).count}),e)}function xe(t,e,n){let[o,r]=useState(t),[a,u]=useState(false),[d,s]=useState(null),l=useRef(t),i=useCallback(()=>{r(l.current);},[]),y=useCallback(async c=>{u(true),s(null),l.current=o;let h=n.optimisticUpdate(o,c);r(h);try{let p=await e(c);return r(p),n.onSuccess?.(p,c),n.onSettled?.(p,null,c),p}catch(p){let T=p instanceof Error?p:new Error("Mutation failed");throw s(T),i(),n.onError?.(T,c),n.onSettled?.(void 0,T,c),T}finally{u(false);}},[o,e,n,i]);return {mutate:useCallback(c=>{y(c).catch(()=>{});},[y]),mutateAsync:y,optimisticData:o,rollback:i,isLoading:a,error:d}}function Oe(t,e){let n=v(),[o,r]=useState(null),[a,u]=useState([]),[d,s]=useState(false),l=useRef(null),i=useRef(null),y=e?.enabled!==false;useEffect(()=>{if(!y)return;let c=n.realtime();l.current=c;let h=c.channel(`table:${t}`);return i.current=h,h.onDbChange({table:t,event:e?.operations||"*"},p=>{switch(p.new!==void 0&&r(p.new),u(T=>[...T,p]),p.operation){case "INSERT":p.new&&e?.onInsert?.(p.new);break;case "UPDATE":p.new&&e?.onUpdate?.(p.new,p.old??null);break;case "DELETE":p.old&&e?.onDelete?.(p.old);break}e?.onChange?.(p);}),h.subscribe(),s(true),()=>{h.unsubscribe(),c.disconnect(),s(false);}},[n,t,y,e]);let f=useCallback(()=>{u([]);},[]);return {data:o,changes:a,isSubscribed:d,clearChanges:f}}function Z(t,e){let n=v(),[o,r]=useState(null),[a,u]=useState([]),[d,s]=useState(false),l=useRef(null),i=useRef(null),y=e?.enabled!==false;useEffect(()=>{if(!y)return;let h=n.realtime();l.current=h;let p=h.channel(t,{type:e?.type||"public"});return i.current=p,p.on("*",T=>{let g={event:"*",payload:T};r(g),u(m=>[...m,g]);}),p.subscribe(),s(true),()=>{p.unsubscribe(),h.disconnect(),s(false);}},[n,t,y,e?.type]);let f=useCallback((h,p)=>{i.current?.broadcast({event:h,payload:p});},[]),c=useCallback(()=>{i.current?.unsubscribe(),s(false);},[]);return {broadcast:f,lastMessage:o,messages:a,isJoined:d,leave:c}}function Pe(t,e,n){let o=v(),[r,a]=useState({}),[u,d]=useState(false),s=useRef(null),l=useRef(null),i=n?.enabled!==false;useEffect(()=>{if(!i)return;let p=o.realtime();s.current=p;let T=p.channel(t,{type:"presence"});return l.current=T,T.presence.onSync(g=>{a(g);}),T.subscribe(),e&&(T.presence.track({state:e}),d(true)),()=>{T.unsubscribe(),p.disconnect(),d(false);}},[o,t,i,e]);let y=useCallback(p=>{l.current?.presence.update(p);},[]),f=useCallback(()=>{l.current?.presence.untrack(),d(false);},[]),c=Object.keys(r).length,h=Object.keys(r);return {presence:r,count:c,onlineUsers:h,update:y,leave:f,isTracking:u}}function Ie(){let t=v(),[e,n]=useState("disconnected"),[o,r]=useState(null),a=useRef(null);useEffect(()=>{let s=t.realtime();return a.current=s,n(s.connectionState),r(s.connectionId),s.on("connect",()=>{n("connected"),r(s.connectionId);}),s.on("disconnect",()=>{n("disconnected"),r(null);}),s.on("reconnect",()=>{n("connected"),r(s.connectionId);}),s.on("error",()=>{n("disconnected");}),()=>{s.disconnect();}},[t]);let u=useCallback(()=>{a.current?.connect();},[]),d=useCallback(()=>{a.current?.disconnect();},[]);return {state:e,isConnected:e==="connected",connectionId:o,reconnect:u,disconnect:d}}function Se(t,e){let n=Z(t,e);return {send:n.broadcast,messages:n.messages,lastMessage:n.lastMessage,isConnected:n.isJoined}}function ee(t){let e=v(),[n,o]=useState(0),[r,a]=useState(false),[u,d]=useState(null),[s,l]=useState(null),[i,y]=useState([]),f=useCallback(T=>{if(t?.maxSize&&T.size>t.maxSize)throw new Error(`File size (${Math.round(T.size/1024/1024)}MB) exceeds maximum allowed (${Math.round(t.maxSize/1024/1024)}MB)`);if(t?.allowedTypes&&t.allowedTypes.length>0&&!t.allowedTypes.includes(T.type))throw new Error(`File type "${T.type}" is not allowed. Allowed types: ${t.allowedTypes.join(", ")}`)},[t?.maxSize,t?.allowedTypes]),c=useCallback(async(T,g)=>{a(true),d(null),o(0);try{f(g),t?.onUploadStart?.(g);let m=await e.storage.upload(T,g,{contentType:g.type,metadata:t?.metadata,isPublic:t?.isPublic});return o(100),l(m),y(U=>[...U,m]),t?.onSuccess?.(m,g),m}catch(m){let U=m instanceof Error?m:new Error("Upload failed");throw d(U),t?.onError?.(U,g),U}finally{a(false);}},[e,t,f]),h=useCallback(async T=>{let g=[];for(let{key:m,file:U}of T){let M=await c(m,U);g.push(M);}return g},[c]),p=useCallback(()=>{o(0),a(false),d(null),l(null),y([]);},[]);return {upload:c,uploadMultiple:h,progress:n,isUploading:r,error:u,result:s,results:i,reset:p}}function Fe(t){let e=v(),[n,o]=useState(false),[r,a]=useState(null),u=useCallback(async(s,l)=>{o(true),a(null);try{let i=await e.storage.download(s);return t?.onSuccess?.(i,l||s.split("/").pop()||"download"),i}catch(i){let y=i instanceof Error?i:new Error("Download failed");throw a(y),t?.onError?.(y),y}finally{o(false);}},[e,t]),d=useCallback(async(s,l)=>{let i=await u(s,l),y=l||s.split("/").pop()||"download",f=URL.createObjectURL(i),c=document.createElement("a");c.href=f,c.download=y,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(f);},[u]);return {download:u,downloadAndSave:d,isDownloading:n,error:r}}function ke(t,e){let n=v(),[o,r]=useState(null),[a,u]=useState(null),[d,s]=useState(!!t&&e?.enabled!==false),[l,i]=useState(null),y=!!t&&e?.enabled!==false,f=useCallback(async()=>{if(!(!y||!t)){s(true),i(null);try{let h=await n.storage.createSignedUrl(t,e?.expiresIn);r(h);let p=await n.storage.getMetadata(t);u(p);}catch(h){i(h instanceof Error?h:new Error("Failed to load file"));}finally{s(false);}}},[n,t,e?.expiresIn,y]),c=useCallback(async()=>{t&&(await n.storage.delete(t),r(null),u(null));},[n,t]);return {url:o,metadata:a,isLoading:d,error:l,refresh:f,deleteFile:c}}function Ce(t){let e=v(),[n,o]=useState([]),[r,a]=useState(t?.enabled!==false),[u,d]=useState(null),s=t?.enabled!==false,l=useCallback(async()=>{if(s){a(true),d(null);try{let i=await e.storage.list({prefix:t?.prefix,limit:t?.limit});o(i.files);}catch(i){d(i instanceof Error?i:new Error("Failed to list files"));}finally{a(false);}}},[e,t,s]);return {files:n,isLoading:r,error:u,refresh:l}}function De(t){let e=ee(t),[n,o]=useState(false),[r,a]=useState([]),u=useRef(null),d=useCallback(g=>{g.preventDefault(),g.stopPropagation(),o(true);},[]),s=useCallback(g=>{g.preventDefault(),g.stopPropagation(),o(false);},[]),l=useCallback(g=>{let m=t?.basePath||"uploads",U=Date.now().toString(36)+Math.random().toString(36).substr(2,9),M=g.name.split(".").pop()||"";return t?.uniqueKey?`${m}/${U}.${M}`:`${m}/${g.name}`},[t?.basePath,t?.uniqueKey]),i=useCallback(async g=>{g.preventDefault(),g.stopPropagation(),o(false);let m=Array.from(g.dataTransfer.files);if(m.length===0)return;let U=t?.multiple?m:[m[0]];a(U),await e.uploadMultiple(U.map(M=>({key:l(M),file:M})));},[t?.multiple,e,l]),y=useCallback(async g=>{let m=Array.from(g.target.files||[]);m.length!==0&&(a(m),await e.uploadMultiple(m.map(U=>({key:l(U),file:U}))));},[e,l]),f=useCallback(()=>{u.current?.click();},[]),c=useCallback(()=>{a([]),e.reset();},[e]),h=useCallback(g=>{a(m=>m.filter((U,M)=>M!==g));},[]),p=useCallback(()=>({onDragOver:d,onDragLeave:s,onDrop:i,onClick:f}),[d,s,i,f]),T=useCallback(()=>({type:"file",onChange:y,multiple:t?.multiple??false,accept:t?.allowedTypes?.join(",")??"",style:{display:"none"},ref:g=>{u.current=g;}}),[y,t?.multiple,t?.allowedTypes]);return {...e,dropzone:{isDragOver:n,selectedFiles:r},getDropzoneProps:p,getInputProps:T,openFilePicker:f,clearFiles:c,removeFile:h}}function Le(t){return v().storage.getPublicUrl(t)}var G=new Map;function Ae(t,e){let n=v(),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(null),[l,i]=useState(false),[y,f]=useState(null),c=useRef(0),h=useCallback(async T=>{u(true),s(null),i(false);try{let g={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(g.retry={maxRetries:e.maxRetries??3});let m=await n.functions.invoke(t,{body:T},g);return r(m.data),f(m),i(!0),c.current=0,e?.onSuccess?.(m.data,T),m.data}catch(g){let m=g instanceof Error?g:new Error("Function invocation failed");throw s(m),e?.onError?.(m,T),m}finally{u(false);}},[n,t,e]),p=useCallback(()=>{r(null),u(false),s(null),i(false),f(null),c.current=0;},[]);return {invoke:h,data:o,isLoading:a,error:d,isSuccess:l,invocation:y,reset:p}}function Ve(t,e){let n=v(),[o,r]=useState(null),[a,u]=useState(false),[d,s]=useState(null),[l,i]=useState(false),[y,f]=useState(null),c=e?.cache??false,h=e?.cacheTtl??6e4,p=useCallback(U=>`${t}:${JSON.stringify(U)}`,[t]),T=useCallback(async U=>{if(c){let M=p(U),R=G.get(M);if(R&&Date.now()-R.timestamp<h){let x=R.data;return r(x),i(true),e?.onSuccess?.(x,U),x}}u(true),s(null),i(false);try{let M={timeout:e?.timeout,includeLogs:e?.includeLogs,version:e?.version};e?.retry&&(M.retry={maxRetries:e.maxRetries??3});let x=await n.functions.rpc(t,M)(U);if(r(x),i(!0),c){let k=p(U);G.set(k,{data:x,timestamp:Date.now()});}return e?.onSuccess?.(x,U),x}catch(M){let R=M instanceof Error?M:new Error("RPC call failed");throw s(R),e?.onError?.(R,U),R}finally{u(false);}},[n,t,e,c,h,p]),g=useCallback(()=>{let U=`${t}:`;for(let M of G.keys())M.startsWith(U)&&G.delete(M);},[t]),m=useCallback(()=>{r(null),u(false),s(null),i(false),f(null);},[]);return {invoke:T,data:o,isLoading:a,error:d,isSuccess:l,invocation:y,reset:m,clearCache:g}}function Qe(t){let e=v(),[n,o]=useState([]),[r,a]=useState(true),[u,d]=useState(null),s=useCallback(async()=>{a(true),d(null);try{let l=await e.functions.list({projectId:t.projectId,envId:t.envId,enabled:t.enabled,limit:t.limit,offset:t.offset});o(l);}catch(l){d(l instanceof Error?l:new Error("Failed to list functions"));}finally{a(false);}},[e,t.projectId,t.envId,t.enabled,t.limit,t.offset]);return useEffect(()=>{s();},[s]),{functions:n,isLoading:r,error:u,refresh:s}}function Be(t,e){let n=v(),[o,r]=useState([]),[a,u]=useState(false),[d,s]=useState(0),[l,i]=useState(null);return {invoke:useCallback(async f=>{u(true),i(null),s(0),r([]);let c=[],h=e?.concurrency??5,p=f.length,T=0;try{for(let g=0;g<f.length;g+=h){let m=f.slice(g,g+h),U=await Promise.all(m.map(async M=>(await n.functions.invoke(t,{body:M})).data));c.push(...U),T+=m.length,s(Math.round(T/p*100)),r([...c]),e?.onProgress?.(T,p);}return e?.onSuccess?.(c),c}catch(g){let m=g instanceof Error?g:new Error("Batch invocation failed");throw i(m),e?.onError?.(m),m}finally{u(false);}},[n,t,e]),results:o,isLoading:a,progress:d,error:l}}function ze(t){let e=v(),[n,o]=useState(false),[r,a]=useState(null),[u,d]=useState(null),[s,l]=useState(null),i=useCallback(async(f,c)=>{l(null);try{let p=(await e.functions.invoke(t,{body:f})).requestId??`scheduled-${Date.now()}`;return d(p),o(!0),a(new Date(Date.now()+c.delayMs)),p}catch(h){let p=h instanceof Error?h:new Error("Failed to schedule function");throw l(p),p}},[e,t]),y=useCallback(async()=>{o(false),a(null),d(null);},[]);return {schedule:i,cancel:y,isScheduled:n,scheduledAt:r,requestId:u,error:s}}export{ne as VaifProvider,re as useAuth,Re as useBatchCreate,we as useBatchDelete,Be as useBatchInvoke,Ee as useBatchUpdate,Se as useBroadcast,Z as useChannel,me as useCount,be as useCreate,ve as useDelete,Fe as useDownload,De as useDropzone,ie as useEmailVerification,ke as useFile,Ce as useFiles,Ae as useFunction,Qe as useFunctionList,ye as useInfiniteQuery,ce as useMFA,le as useMagicLink,B as useMutation,ue as useOAuth,xe as useOptimisticMutation,he as usePaginatedQuery,ae as usePasswordReset,Pe as usePresence,Le as usePublicUrl,fe as useQuery,ge as useQueryById,pe as useQueryFirst,Ie as useRealtimeConnection,Ve as useRpc,ze as useScheduledFunction,Oe as useSubscription,oe as useToken,Ue as useUpdate,ee as useUpload,Me as useUpsert,se as useUser,D as useVaif,v as useVaifClient};
|