@withvlibe/base-sdk 1.0.1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { j as BaseRecord, V as VlibeBaseDatabase, w as UseCollectionOptions, v as UseCollectionReturn, x as UseKVReturn, c as VlibeBaseAuth, y as UseAuthReturn } from './VlibeBaseAuth-BxS9T0vB.js';
2
- export { z as UsePaymentsReturn, l as VlibeUser } from './VlibeBaseAuth-BxS9T0vB.js';
1
+ import { k as BaseRecord, V as VlibeBaseDatabase, J as UseCollectionOptions, I as UseCollectionReturn, K as UseKVReturn, c as VlibeBaseAuth, L as UseAuthReturn, d as VlibeBaseEcommerce, q as Product, v as CreateProductInput, t as CartItem, s as Address, O as Order, u as CartItemWithProduct } from './VlibeBaseEcommerce-DXjHdN_L.js';
2
+ export { w as CreateOrderInput, N as UsePaymentsReturn, m as VlibeUser } from './VlibeBaseEcommerce-DXjHdN_L.js';
3
3
 
4
4
  /**
5
5
  * React hook for working with a database collection
@@ -93,4 +93,109 @@ declare function useKV<T = unknown>(db: VlibeBaseDatabase, key: string): UseKVRe
93
93
  */
94
94
  declare function useAuth(auth: VlibeBaseAuth, initialToken?: string | null): UseAuthReturn;
95
95
 
96
- export { BaseRecord, UseAuthReturn, UseCollectionOptions, UseCollectionReturn, UseKVReturn, useAuth, useCollection, useKV };
96
+ interface UseProductsOptions {
97
+ category?: string;
98
+ isActive?: boolean;
99
+ autoLoad?: boolean;
100
+ }
101
+ interface UseProductsReturn {
102
+ products: Product[];
103
+ loading: boolean;
104
+ error: Error | null;
105
+ refresh: () => Promise<void>;
106
+ createProduct: (input: CreateProductInput) => Promise<Product>;
107
+ updateProduct: (productId: string, updates: Partial<Product>) => Promise<Product>;
108
+ deleteProduct: (productId: string) => Promise<void>;
109
+ updateInventory: (productId: string, quantity: number, operation: 'set' | 'increment' | 'decrement') => Promise<Product>;
110
+ }
111
+ /**
112
+ * React hook for managing products
113
+ *
114
+ * @param ecommerce - VlibeBaseEcommerce instance
115
+ * @param options - Optional filtering and configuration
116
+ * @returns Product list with CRUD operations
117
+ *
118
+ * @example
119
+ * ```tsx
120
+ * const { products, loading, createProduct } = useProducts(ecommerce, { isActive: true });
121
+ *
122
+ * const handleCreate = async () => {
123
+ * await createProduct({
124
+ * name: 'T-Shirt',
125
+ * price: 2999,
126
+ * stock: 50,
127
+ * currency: 'usd'
128
+ * });
129
+ * };
130
+ * ```
131
+ */
132
+ declare function useProducts(ecommerce: VlibeBaseEcommerce, options?: UseProductsOptions): UseProductsReturn;
133
+
134
+ interface UseCartReturn {
135
+ cart: CartItem[];
136
+ itemCount: number;
137
+ loading: boolean;
138
+ error: Error | null;
139
+ refresh: () => Promise<void>;
140
+ addItem: (item: CartItem) => Promise<CartItem[]>;
141
+ updateItem: (productId: string, quantity: number) => Promise<CartItem[]>;
142
+ removeItem: (productId: string) => Promise<CartItem[]>;
143
+ clear: () => Promise<void>;
144
+ checkout: (shippingAddress: Address, paymentMethodId?: string) => Promise<Order>;
145
+ calculateTotal: () => Promise<any>;
146
+ getCartWithDetails: () => Promise<CartItemWithProduct[]>;
147
+ }
148
+ /**
149
+ * React hook for managing shopping cart
150
+ *
151
+ * @param ecommerce - VlibeBaseEcommerce instance
152
+ * @param userId - User ID for cart ownership
153
+ * @returns Shopping cart with add/update/remove/checkout operations
154
+ *
155
+ * @example
156
+ * ```tsx
157
+ * const { cart, itemCount, addItem, checkout } = useCart(ecommerce, userId);
158
+ *
159
+ * const handleAddToCart = async (productId: string) => {
160
+ * await addItem({ productId, quantity: 1 });
161
+ * };
162
+ *
163
+ * const handleCheckout = async () => {
164
+ * const order = await checkout(shippingAddress, paymentMethodId);
165
+ * };
166
+ * ```
167
+ */
168
+ declare function useCart(ecommerce: VlibeBaseEcommerce, userId: string): UseCartReturn;
169
+
170
+ interface UseOrdersOptions {
171
+ userId?: string;
172
+ status?: Order['status'];
173
+ autoLoad?: boolean;
174
+ }
175
+ interface UseOrdersReturn {
176
+ orders: Order[];
177
+ loading: boolean;
178
+ error: Error | null;
179
+ refresh: () => Promise<void>;
180
+ updateStatus: (orderId: string, status: Order['status']) => Promise<Order>;
181
+ cancelOrder: (orderId: string, restoreInventory?: boolean) => Promise<Order>;
182
+ }
183
+ /**
184
+ * React hook for managing orders
185
+ *
186
+ * @param ecommerce - VlibeBaseEcommerce instance
187
+ * @param options - Optional filtering and configuration
188
+ * @returns Order list with status management operations
189
+ *
190
+ * @example
191
+ * ```tsx
192
+ * const { orders, loading, updateStatus } = useOrders(ecommerce, { userId: 'user123' });
193
+ *
194
+ * const handleShip = async (orderId: string) => {
195
+ * await updateStatus(orderId, 'shipped');
196
+ * };
197
+ * ```
198
+ */
199
+ declare function useOrders(ecommerce: VlibeBaseEcommerce, options?: UseOrdersOptions): UseOrdersReturn;
200
+
201
+ export { BaseRecord, CartItem, CartItemWithProduct, CreateProductInput, Order, Product, UseAuthReturn, type UseCartReturn, UseCollectionOptions, UseCollectionReturn, UseKVReturn, type UseOrdersOptions, type UseOrdersReturn, type UseProductsOptions, type UseProductsReturn, useAuth, useCart, useCollection, useKV, useOrders, useProducts };
package/dist/react.js CHANGED
@@ -22,8 +22,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var react_exports = {};
23
23
  __export(react_exports, {
24
24
  useAuth: () => useAuth,
25
+ useCart: () => useCart,
25
26
  useCollection: () => useCollection,
26
- useKV: () => useKV
27
+ useKV: () => useKV,
28
+ useOrders: () => useOrders,
29
+ useProducts: () => useProducts
27
30
  });
28
31
  module.exports = __toCommonJS(react_exports);
29
32
 
@@ -265,9 +268,181 @@ function useAuth(auth, initialToken) {
265
268
  hasSubscription
266
269
  };
267
270
  }
271
+
272
+ // src/hooks/useProducts.ts
273
+ var import_react4 = require("react");
274
+ function useProducts(ecommerce, options) {
275
+ const [products, setProducts] = (0, import_react4.useState)([]);
276
+ const [loading, setLoading] = (0, import_react4.useState)(true);
277
+ const [error, setError] = (0, import_react4.useState)(null);
278
+ const loadProducts = (0, import_react4.useCallback)(async () => {
279
+ try {
280
+ setLoading(true);
281
+ setError(null);
282
+ const result = await ecommerce.listProducts(options);
283
+ setProducts(result.products);
284
+ } catch (err) {
285
+ setError(err instanceof Error ? err : new Error("Failed to load products"));
286
+ } finally {
287
+ setLoading(false);
288
+ }
289
+ }, [ecommerce, options?.category, options?.isActive]);
290
+ (0, import_react4.useEffect)(() => {
291
+ if (options?.autoLoad !== false) {
292
+ loadProducts();
293
+ }
294
+ }, [loadProducts, options?.autoLoad]);
295
+ const createProduct = (0, import_react4.useCallback)(async (input) => {
296
+ const product = await ecommerce.createProduct(input);
297
+ setProducts((prev) => [product, ...prev]);
298
+ return product;
299
+ }, [ecommerce]);
300
+ const updateProduct = (0, import_react4.useCallback)(async (productId, updates) => {
301
+ const product = await ecommerce.updateProduct(productId, updates);
302
+ setProducts((prev) => prev.map((p) => p.id === productId ? product : p));
303
+ return product;
304
+ }, [ecommerce]);
305
+ const deleteProduct = (0, import_react4.useCallback)(async (productId) => {
306
+ await ecommerce.deleteProduct(productId);
307
+ setProducts((prev) => prev.filter((p) => p.id !== productId));
308
+ }, [ecommerce]);
309
+ const updateInventory = (0, import_react4.useCallback)(async (productId, quantity, operation) => {
310
+ const product = await ecommerce.updateInventory(productId, quantity, operation);
311
+ setProducts((prev) => prev.map((p) => p.id === productId ? product : p));
312
+ return product;
313
+ }, [ecommerce]);
314
+ return {
315
+ products,
316
+ loading,
317
+ error,
318
+ refresh: loadProducts,
319
+ createProduct,
320
+ updateProduct,
321
+ deleteProduct,
322
+ updateInventory
323
+ };
324
+ }
325
+
326
+ // src/hooks/useCart.ts
327
+ var import_react5 = require("react");
328
+ function useCart(ecommerce, userId) {
329
+ const [cart, setCart] = (0, import_react5.useState)([]);
330
+ const [loading, setLoading] = (0, import_react5.useState)(true);
331
+ const [error, setError] = (0, import_react5.useState)(null);
332
+ const loadCart = (0, import_react5.useCallback)(async () => {
333
+ if (!userId) {
334
+ setLoading(false);
335
+ return;
336
+ }
337
+ try {
338
+ setLoading(true);
339
+ setError(null);
340
+ const items = await ecommerce.getCart(userId);
341
+ setCart(items);
342
+ } catch (err) {
343
+ setError(err instanceof Error ? err : new Error("Failed to load cart"));
344
+ } finally {
345
+ setLoading(false);
346
+ }
347
+ }, [ecommerce, userId]);
348
+ (0, import_react5.useEffect)(() => {
349
+ if (userId) {
350
+ loadCart();
351
+ }
352
+ }, [loadCart, userId]);
353
+ const addItem = (0, import_react5.useCallback)(async (item) => {
354
+ const updated = await ecommerce.addToCart(userId, item);
355
+ setCart(updated);
356
+ return updated;
357
+ }, [ecommerce, userId]);
358
+ const updateItem = (0, import_react5.useCallback)(async (productId, quantity) => {
359
+ const updated = await ecommerce.updateCartItem(userId, productId, quantity);
360
+ setCart(updated);
361
+ return updated;
362
+ }, [ecommerce, userId]);
363
+ const removeItem = (0, import_react5.useCallback)(async (productId) => {
364
+ return updateItem(productId, 0);
365
+ }, [updateItem]);
366
+ const clear = (0, import_react5.useCallback)(async () => {
367
+ await ecommerce.clearCart(userId);
368
+ setCart([]);
369
+ }, [ecommerce, userId]);
370
+ const checkout = (0, import_react5.useCallback)(async (shippingAddress, paymentMethodId) => {
371
+ const order = await ecommerce.checkout(userId, shippingAddress, paymentMethodId);
372
+ setCart([]);
373
+ return order;
374
+ }, [ecommerce, userId]);
375
+ const calculateTotal = (0, import_react5.useCallback)(async () => {
376
+ return ecommerce.calculateOrderTotal(cart);
377
+ }, [ecommerce, cart]);
378
+ const getCartWithDetails = (0, import_react5.useCallback)(async () => {
379
+ return ecommerce.getCartWithDetails(userId);
380
+ }, [ecommerce, userId]);
381
+ const itemCount = cart.reduce((sum, item) => sum + item.quantity, 0);
382
+ return {
383
+ cart,
384
+ itemCount,
385
+ loading,
386
+ error,
387
+ refresh: loadCart,
388
+ addItem,
389
+ updateItem,
390
+ removeItem,
391
+ clear,
392
+ checkout,
393
+ calculateTotal,
394
+ getCartWithDetails
395
+ };
396
+ }
397
+
398
+ // src/hooks/useOrders.ts
399
+ var import_react6 = require("react");
400
+ function useOrders(ecommerce, options) {
401
+ const [orders, setOrders] = (0, import_react6.useState)([]);
402
+ const [loading, setLoading] = (0, import_react6.useState)(true);
403
+ const [error, setError] = (0, import_react6.useState)(null);
404
+ const loadOrders = (0, import_react6.useCallback)(async () => {
405
+ try {
406
+ setLoading(true);
407
+ setError(null);
408
+ const result = await ecommerce.listOrders(options);
409
+ setOrders(result.orders);
410
+ } catch (err) {
411
+ setError(err instanceof Error ? err : new Error("Failed to load orders"));
412
+ } finally {
413
+ setLoading(false);
414
+ }
415
+ }, [ecommerce, options?.userId, options?.status]);
416
+ (0, import_react6.useEffect)(() => {
417
+ if (options?.autoLoad !== false) {
418
+ loadOrders();
419
+ }
420
+ }, [loadOrders, options?.autoLoad]);
421
+ const updateStatus = (0, import_react6.useCallback)(async (orderId, status) => {
422
+ const order = await ecommerce.updateOrderStatus(orderId, status);
423
+ setOrders((prev) => prev.map((o) => o.id === orderId ? order : o));
424
+ return order;
425
+ }, [ecommerce]);
426
+ const cancelOrder = (0, import_react6.useCallback)(async (orderId, restoreInventory = true) => {
427
+ const order = await ecommerce.cancelOrder(orderId, restoreInventory);
428
+ setOrders((prev) => prev.map((o) => o.id === orderId ? order : o));
429
+ return order;
430
+ }, [ecommerce]);
431
+ return {
432
+ orders,
433
+ loading,
434
+ error,
435
+ refresh: loadOrders,
436
+ updateStatus,
437
+ cancelOrder
438
+ };
439
+ }
268
440
  // Annotate the CommonJS export names for ESM import in node:
269
441
  0 && (module.exports = {
270
442
  useAuth,
443
+ useCart,
271
444
  useCollection,
272
- useKV
445
+ useKV,
446
+ useOrders,
447
+ useProducts
273
448
  });
package/dist/react.mjs CHANGED
@@ -238,8 +238,180 @@ function useAuth(auth, initialToken) {
238
238
  hasSubscription
239
239
  };
240
240
  }
241
+
242
+ // src/hooks/useProducts.ts
243
+ import { useState as useState4, useEffect as useEffect4, useCallback as useCallback4 } from "react";
244
+ function useProducts(ecommerce, options) {
245
+ const [products, setProducts] = useState4([]);
246
+ const [loading, setLoading] = useState4(true);
247
+ const [error, setError] = useState4(null);
248
+ const loadProducts = useCallback4(async () => {
249
+ try {
250
+ setLoading(true);
251
+ setError(null);
252
+ const result = await ecommerce.listProducts(options);
253
+ setProducts(result.products);
254
+ } catch (err) {
255
+ setError(err instanceof Error ? err : new Error("Failed to load products"));
256
+ } finally {
257
+ setLoading(false);
258
+ }
259
+ }, [ecommerce, options?.category, options?.isActive]);
260
+ useEffect4(() => {
261
+ if (options?.autoLoad !== false) {
262
+ loadProducts();
263
+ }
264
+ }, [loadProducts, options?.autoLoad]);
265
+ const createProduct = useCallback4(async (input) => {
266
+ const product = await ecommerce.createProduct(input);
267
+ setProducts((prev) => [product, ...prev]);
268
+ return product;
269
+ }, [ecommerce]);
270
+ const updateProduct = useCallback4(async (productId, updates) => {
271
+ const product = await ecommerce.updateProduct(productId, updates);
272
+ setProducts((prev) => prev.map((p) => p.id === productId ? product : p));
273
+ return product;
274
+ }, [ecommerce]);
275
+ const deleteProduct = useCallback4(async (productId) => {
276
+ await ecommerce.deleteProduct(productId);
277
+ setProducts((prev) => prev.filter((p) => p.id !== productId));
278
+ }, [ecommerce]);
279
+ const updateInventory = useCallback4(async (productId, quantity, operation) => {
280
+ const product = await ecommerce.updateInventory(productId, quantity, operation);
281
+ setProducts((prev) => prev.map((p) => p.id === productId ? product : p));
282
+ return product;
283
+ }, [ecommerce]);
284
+ return {
285
+ products,
286
+ loading,
287
+ error,
288
+ refresh: loadProducts,
289
+ createProduct,
290
+ updateProduct,
291
+ deleteProduct,
292
+ updateInventory
293
+ };
294
+ }
295
+
296
+ // src/hooks/useCart.ts
297
+ import { useState as useState5, useEffect as useEffect5, useCallback as useCallback5 } from "react";
298
+ function useCart(ecommerce, userId) {
299
+ const [cart, setCart] = useState5([]);
300
+ const [loading, setLoading] = useState5(true);
301
+ const [error, setError] = useState5(null);
302
+ const loadCart = useCallback5(async () => {
303
+ if (!userId) {
304
+ setLoading(false);
305
+ return;
306
+ }
307
+ try {
308
+ setLoading(true);
309
+ setError(null);
310
+ const items = await ecommerce.getCart(userId);
311
+ setCart(items);
312
+ } catch (err) {
313
+ setError(err instanceof Error ? err : new Error("Failed to load cart"));
314
+ } finally {
315
+ setLoading(false);
316
+ }
317
+ }, [ecommerce, userId]);
318
+ useEffect5(() => {
319
+ if (userId) {
320
+ loadCart();
321
+ }
322
+ }, [loadCart, userId]);
323
+ const addItem = useCallback5(async (item) => {
324
+ const updated = await ecommerce.addToCart(userId, item);
325
+ setCart(updated);
326
+ return updated;
327
+ }, [ecommerce, userId]);
328
+ const updateItem = useCallback5(async (productId, quantity) => {
329
+ const updated = await ecommerce.updateCartItem(userId, productId, quantity);
330
+ setCart(updated);
331
+ return updated;
332
+ }, [ecommerce, userId]);
333
+ const removeItem = useCallback5(async (productId) => {
334
+ return updateItem(productId, 0);
335
+ }, [updateItem]);
336
+ const clear = useCallback5(async () => {
337
+ await ecommerce.clearCart(userId);
338
+ setCart([]);
339
+ }, [ecommerce, userId]);
340
+ const checkout = useCallback5(async (shippingAddress, paymentMethodId) => {
341
+ const order = await ecommerce.checkout(userId, shippingAddress, paymentMethodId);
342
+ setCart([]);
343
+ return order;
344
+ }, [ecommerce, userId]);
345
+ const calculateTotal = useCallback5(async () => {
346
+ return ecommerce.calculateOrderTotal(cart);
347
+ }, [ecommerce, cart]);
348
+ const getCartWithDetails = useCallback5(async () => {
349
+ return ecommerce.getCartWithDetails(userId);
350
+ }, [ecommerce, userId]);
351
+ const itemCount = cart.reduce((sum, item) => sum + item.quantity, 0);
352
+ return {
353
+ cart,
354
+ itemCount,
355
+ loading,
356
+ error,
357
+ refresh: loadCart,
358
+ addItem,
359
+ updateItem,
360
+ removeItem,
361
+ clear,
362
+ checkout,
363
+ calculateTotal,
364
+ getCartWithDetails
365
+ };
366
+ }
367
+
368
+ // src/hooks/useOrders.ts
369
+ import { useState as useState6, useEffect as useEffect6, useCallback as useCallback6 } from "react";
370
+ function useOrders(ecommerce, options) {
371
+ const [orders, setOrders] = useState6([]);
372
+ const [loading, setLoading] = useState6(true);
373
+ const [error, setError] = useState6(null);
374
+ const loadOrders = useCallback6(async () => {
375
+ try {
376
+ setLoading(true);
377
+ setError(null);
378
+ const result = await ecommerce.listOrders(options);
379
+ setOrders(result.orders);
380
+ } catch (err) {
381
+ setError(err instanceof Error ? err : new Error("Failed to load orders"));
382
+ } finally {
383
+ setLoading(false);
384
+ }
385
+ }, [ecommerce, options?.userId, options?.status]);
386
+ useEffect6(() => {
387
+ if (options?.autoLoad !== false) {
388
+ loadOrders();
389
+ }
390
+ }, [loadOrders, options?.autoLoad]);
391
+ const updateStatus = useCallback6(async (orderId, status) => {
392
+ const order = await ecommerce.updateOrderStatus(orderId, status);
393
+ setOrders((prev) => prev.map((o) => o.id === orderId ? order : o));
394
+ return order;
395
+ }, [ecommerce]);
396
+ const cancelOrder = useCallback6(async (orderId, restoreInventory = true) => {
397
+ const order = await ecommerce.cancelOrder(orderId, restoreInventory);
398
+ setOrders((prev) => prev.map((o) => o.id === orderId ? order : o));
399
+ return order;
400
+ }, [ecommerce]);
401
+ return {
402
+ orders,
403
+ loading,
404
+ error,
405
+ refresh: loadOrders,
406
+ updateStatus,
407
+ cancelOrder
408
+ };
409
+ }
241
410
  export {
242
411
  useAuth,
412
+ useCart,
243
413
  useCollection,
244
- useKV
414
+ useKV,
415
+ useOrders,
416
+ useProducts
245
417
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@withvlibe/base-sdk",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "description": "SDK for Vlibe Base Apps - includes authentication, database, payments with transaction fees, and category-specific helpers for websites, SaaS, and e-commerce",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",