@hanzo/commerce 7.6.1 → 7.6.3
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/LICENSE.md +21 -0
- package/client.ts +120 -4
- package/dist/billing.d.ts +2 -0
- package/dist/billing.js +3 -0
- package/dist/billing.js.map +1 -0
- package/dist/client.d.ts +464 -0
- package/dist/client.js +424 -0
- package/dist/client.js.map +1 -0
- package/dist/components/Icons.d.ts +18 -0
- package/dist/components/Icons.js +19 -0
- package/dist/components/Icons.js.map +1 -0
- package/dist/components/add-to-cart-widget.d.ts +11 -0
- package/dist/components/add-to-cart-widget.js +85 -0
- package/dist/components/add-to-cart-widget.js.map +1 -0
- package/dist/components/buy/buy-card.d.ts +30 -0
- package/dist/components/buy/buy-card.js +109 -0
- package/dist/components/buy/buy-card.js.map +1 -0
- package/dist/components/buy/carousel-buy-card.d.ts +12 -0
- package/dist/components/buy/carousel-buy-card.js +94 -0
- package/dist/components/buy/carousel-buy-card.js.map +1 -0
- package/dist/components/buy/multi-family/all-variants-carousel.d.ts +4 -0
- package/dist/components/buy/multi-family/all-variants-carousel.js +115 -0
- package/dist/components/buy/multi-family/all-variants-carousel.js.map +1 -0
- package/dist/components/buy/multi-family/family-carousel/index.d.ts +4 -0
- package/dist/components/buy/multi-family/family-carousel/index.js +27 -0
- package/dist/components/buy/multi-family/family-carousel/index.js.map +1 -0
- package/dist/components/buy/multi-family/family-carousel/slide.d.ts +11 -0
- package/dist/components/buy/multi-family/family-carousel/slide.js +35 -0
- package/dist/components/buy/multi-family/family-carousel/slide.js.map +1 -0
- package/dist/components/buy/multi-family/family-carousel/state.d.ts +20 -0
- package/dist/components/buy/multi-family/family-carousel/state.js +59 -0
- package/dist/components/buy/multi-family/family-carousel/state.js.map +1 -0
- package/dist/components/buy/multi-family/index.d.ts +2 -0
- package/dist/components/buy/multi-family/index.js +3 -0
- package/dist/components/buy/multi-family/index.js.map +1 -0
- package/dist/components/buy/single-family-selector.d.ts +15 -0
- package/dist/components/buy/single-family-selector.js +28 -0
- package/dist/components/buy/single-family-selector.js.map +1 -0
- package/dist/components/buy/title-and-byline.d.ts +8 -0
- package/dist/components/buy/title-and-byline.js +7 -0
- package/dist/components/buy/title-and-byline.js.map +1 -0
- package/dist/components/cart/cart-panel/cart-line-item.d.ts +11 -0
- package/dist/components/cart/cart-panel/cart-line-item.js +25 -0
- package/dist/components/cart/cart-panel/cart-line-item.js.map +1 -0
- package/dist/components/cart/cart-panel/index.d.ts +19 -0
- package/dist/components/cart/cart-panel/index.js +65 -0
- package/dist/components/cart/cart-panel/index.js.map +1 -0
- package/dist/components/cart/cart-panel/promo-code.d.ts +4 -0
- package/dist/components/cart/cart-panel/promo-code.js +62 -0
- package/dist/components/cart/cart-panel/promo-code.js.map +1 -0
- package/dist/components/cart/cart-panel/total-area.d.ts +7 -0
- package/dist/components/cart/cart-panel/total-area.js +14 -0
- package/dist/components/cart/cart-panel/total-area.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icon-row.d.ts +2 -0
- package/dist/components/checkout/payment-step-form/card-icon-row.js +14 -0
- package/dist/components/checkout/payment-step-form/card-icon-row.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icons/amex.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/card-icons/amex.js +6 -0
- package/dist/components/checkout/payment-step-form/card-icons/amex.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icons/diners-club.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/card-icons/diners-club.js +6 -0
- package/dist/components/checkout/payment-step-form/card-icons/diners-club.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icons/discover.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/card-icons/discover.js +6 -0
- package/dist/components/checkout/payment-step-form/card-icons/discover.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icons/jcb.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/card-icons/jcb.js +6 -0
- package/dist/components/checkout/payment-step-form/card-icons/jcb.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icons/mastercard.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/card-icons/mastercard.js +6 -0
- package/dist/components/checkout/payment-step-form/card-icons/mastercard.js.map +1 -0
- package/dist/components/checkout/payment-step-form/card-icons/visa.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/card-icons/visa.js +6 -0
- package/dist/components/checkout/payment-step-form/card-icons/visa.js.map +1 -0
- package/dist/components/checkout/payment-step-form/cc-button.d.ts +3 -0
- package/dist/components/checkout/payment-step-form/cc-button.js +6 -0
- package/dist/components/checkout/payment-step-form/cc-button.js.map +1 -0
- package/dist/components/checkout/payment-step-form/contact-form.d.ts +5 -0
- package/dist/components/checkout/payment-step-form/contact-form.js +6 -0
- package/dist/components/checkout/payment-step-form/contact-form.js.map +1 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/btc.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/btc.js +6 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/btc.js.map +1 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/eth.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/eth.js +6 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/eth.js.map +1 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/usdt.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/usdt.js +6 -0
- package/dist/components/checkout/payment-step-form/crypto-icons/usdt.js.map +1 -0
- package/dist/components/checkout/payment-step-form/index.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/index.js +66 -0
- package/dist/components/checkout/payment-step-form/index.js.map +1 -0
- package/dist/components/checkout/payment-step-form/methods/bank-transfer.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/methods/bank-transfer.js +24 -0
- package/dist/components/checkout/payment-step-form/methods/bank-transfer.js.map +1 -0
- package/dist/components/checkout/payment-step-form/methods/card.d.ts +4 -0
- package/dist/components/checkout/payment-step-form/methods/card.js +160 -0
- package/dist/components/checkout/payment-step-form/methods/card.js.map +1 -0
- package/dist/components/checkout/payment-step-form/methods/crypto.d.ts +9 -0
- package/dist/components/checkout/payment-step-form/methods/crypto.js +137 -0
- package/dist/components/checkout/payment-step-form/methods/crypto.js.map +1 -0
- package/dist/components/checkout/payment-step-form/methods/index.d.ts +6 -0
- package/dist/components/checkout/payment-step-form/methods/index.js +21 -0
- package/dist/components/checkout/payment-step-form/methods/index.js.map +1 -0
- package/dist/components/checkout/shipping-step-form.d.ts +3 -0
- package/dist/components/checkout/shipping-step-form.js +53 -0
- package/dist/components/checkout/shipping-step-form.js.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.js +9 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/item/product-card.d.ts +7 -0
- package/dist/components/item/product-card.js +9 -0
- package/dist/components/item/product-card.js.map +1 -0
- package/dist/components/item-selector/button.d.ts +4 -0
- package/dist/components/item-selector/button.js +47 -0
- package/dist/components/item-selector/button.js.map +1 -0
- package/dist/components/item-selector/carousel/index.d.ts +12 -0
- package/dist/components/item-selector/carousel/index.js +74 -0
- package/dist/components/item-selector/carousel/index.js.map +1 -0
- package/dist/components/item-selector/carousel/slider.d.ts +8 -0
- package/dist/components/item-selector/carousel/slider.js +12 -0
- package/dist/components/item-selector/carousel/slider.js.map +1 -0
- package/dist/components/item-selector/index.d.ts +2 -0
- package/dist/components/item-selector/index.js +3 -0
- package/dist/components/item-selector/index.js.map +1 -0
- package/dist/components/item-selector/quantity-indicator.d.ts +9 -0
- package/dist/components/item-selector/quantity-indicator.js +16 -0
- package/dist/components/item-selector/quantity-indicator.js.map +1 -0
- package/dist/components/node-tabs/index.d.ts +14 -0
- package/dist/components/node-tabs/index.js +42 -0
- package/dist/components/node-tabs/index.js.map +1 -0
- package/dist/components/node-tabs/node-image.d.ts +6 -0
- package/dist/components/node-tabs/node-image.js +13 -0
- package/dist/components/node-tabs/node-image.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/metering.d.ts +162 -0
- package/dist/metering.js +204 -0
- package/dist/metering.js.map +1 -0
- package/dist/metering.test.d.ts +13 -0
- package/dist/metering.test.js +181 -0
- package/dist/metering.test.js.map +1 -0
- package/dist/service/context.d.ts +8 -0
- package/dist/service/context.js +19 -0
- package/dist/service/context.js.map +1 -0
- package/dist/service/debug.d.ts +10 -0
- package/dist/service/debug.js +30 -0
- package/dist/service/debug.js.map +1 -0
- package/dist/service/impls/standalone/actual-line-item.d.ts +40 -0
- package/dist/service/impls/standalone/actual-line-item.js +84 -0
- package/dist/service/impls/standalone/actual-line-item.js.map +1 -0
- package/dist/service/impls/standalone/get-instance.d.ts +2 -0
- package/dist/service/impls/standalone/get-instance.js +39 -0
- package/dist/service/impls/standalone/get-instance.js.map +1 -0
- package/dist/service/impls/standalone/index.d.ts +67 -0
- package/dist/service/impls/standalone/index.js +416 -0
- package/dist/service/impls/standalone/index.js.map +1 -0
- package/dist/service/impls/standalone/order/firebase.d.ts +6 -0
- package/dist/service/impls/standalone/order/firebase.js +6 -0
- package/dist/service/impls/standalone/order/firebase.js.map +1 -0
- package/dist/service/impls/standalone/order/index.d.ts +30 -0
- package/dist/service/impls/standalone/order/index.js +21 -0
- package/dist/service/impls/standalone/order/index.js.map +1 -0
- package/dist/service/impls/standalone/persistence.d.ts +4 -0
- package/dist/service/impls/standalone/persistence.js +22 -0
- package/dist/service/impls/standalone/persistence.js.map +1 -0
- package/dist/service/path-utils.d.ts +7 -0
- package/dist/service/path-utils.js +16 -0
- package/dist/service/path-utils.js.map +1 -0
- package/dist/service/sep.d.ts +6 -0
- package/dist/service/sep.js +6 -0
- package/dist/service/sep.js.map +1 -0
- package/dist/types/category-node.d.ts +36 -0
- package/dist/types/category-node.js +2 -0
- package/dist/types/category-node.js.map +1 -0
- package/dist/types/checkout.d.ts +33 -0
- package/dist/types/checkout.js +2 -0
- package/dist/types/checkout.js.map +1 -0
- package/dist/types/commerce-config.d.ts +11 -0
- package/dist/types/commerce-config.js +2 -0
- package/dist/types/commerce-config.js.map +1 -0
- package/dist/types/commerce-service.d.ts +109 -0
- package/dist/types/commerce-service.js +2 -0
- package/dist/types/commerce-service.js.map +1 -0
- package/dist/types/family.d.ts +16 -0
- package/dist/types/family.js +2 -0
- package/dist/types/family.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/item-selector.d.ts +72 -0
- package/dist/types/item-selector.js +2 -0
- package/dist/types/item-selector.js.map +1 -0
- package/dist/types/line-item.d.ts +14 -0
- package/dist/types/line-item.js +2 -0
- package/dist/types/line-item.js.map +1 -0
- package/dist/types/multi-family-selector-props.d.ts +16 -0
- package/dist/types/multi-family-selector-props.js +2 -0
- package/dist/types/multi-family-selector-props.js.map +1 -0
- package/dist/types/product.d.ts +15 -0
- package/dist/types/product.js +2 -0
- package/dist/types/product.js.map +1 -0
- package/dist/types/promo.d.ts +7 -0
- package/dist/types/promo.js +2 -0
- package/dist/types/promo.js.map +1 -0
- package/dist/types/selection-ui-specifier.d.ts +40 -0
- package/dist/types/selection-ui-specifier.js +2 -0
- package/dist/types/selection-ui-specifier.js.map +1 -0
- package/dist/types/string-mutator.d.ts +9 -0
- package/dist/types/string-mutator.js +2 -0
- package/dist/types/string-mutator.js.map +1 -0
- package/dist/types/token-separators.d.ts +6 -0
- package/dist/types/token-separators.js +2 -0
- package/dist/types/token-separators.js.map +1 -0
- package/dist/util/analytics.d.ts +9 -0
- package/dist/util/analytics.js +10 -0
- package/dist/util/analytics.js.map +1 -0
- package/dist/util/countries.d.ts +7 -0
- package/dist/util/countries.js +197 -0
- package/dist/util/countries.js.map +1 -0
- package/dist/util/error.d.ts +1 -0
- package/dist/util/error.js +22 -0
- package/dist/util/error.js.map +1 -0
- package/dist/util/index.d.ts +15 -0
- package/dist/util/index.js +54 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/item-selector-options-accessor.d.ts +3 -0
- package/dist/util/item-selector-options-accessor.js +27 -0
- package/dist/util/item-selector-options-accessor.js.map +1 -0
- package/dist/util/line-item-ref.d.ts +8 -0
- package/dist/util/line-item-ref.js +15 -0
- package/dist/util/line-item-ref.js.map +1 -0
- package/dist/util/multi-family-selector-options-accessor.d.ts +3 -0
- package/dist/util/multi-family-selector-options-accessor.js +11 -0
- package/dist/util/multi-family-selector-options-accessor.js.map +1 -0
- package/dist/util/obs-string-mutator.d.ts +8 -0
- package/dist/util/obs-string-mutator.js +15 -0
- package/dist/util/obs-string-mutator.js.map +1 -0
- package/dist/util/product-media-accessor.d.ts +29 -0
- package/dist/util/product-media-accessor.js +22 -0
- package/dist/util/product-media-accessor.js.map +1 -0
- package/dist/util/promo-codes.d.ts +3 -0
- package/dist/util/promo-codes.js +100 -0
- package/dist/util/promo-codes.js.map +1 -0
- package/dist/util/selection-ui-specifiers.d.ts +3 -0
- package/dist/util/selection-ui-specifiers.js +24 -0
- package/dist/util/selection-ui-specifiers.js.map +1 -0
- package/dist/util/square-payment.d.ts +7 -0
- package/dist/util/square-payment.js +37 -0
- package/dist/util/square-payment.js.map +1 -0
- package/dist/util/use-sync-sku-param-w-current-item.d.ts +2 -0
- package/dist/util/use-sync-sku-param-w-current-item.js +61 -0
- package/dist/util/use-sync-sku-param-w-current-item.js.map +1 -0
- package/index.ts +18 -1
- package/metering.test.ts +199 -0
- package/metering.ts +289 -0
- package/package.json +18 -16
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { observer } from 'mobx-react-lite';
|
|
5
|
+
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
|
|
6
|
+
import { Image, Label, RadioGroup, ScrollArea } from '@hanzo/ui/primitives';
|
|
7
|
+
import { cn } from '@hanzo/ui/util';
|
|
8
|
+
import { accessItemOptions, formatCurrencyValue } from '../../util';
|
|
9
|
+
import QuantityIndicator from './quantity-indicator';
|
|
10
|
+
const DEFAULT_CONSTRAINT = { h: 36, w: 72 }; // // Apple suggest 42px for clickability
|
|
11
|
+
const ImageRadioGroupItem = React.forwardRef(({ item, constrainTo, className, ...props }, ref) => {
|
|
12
|
+
const img = item.optionImg ? item.optionImg : item.img;
|
|
13
|
+
return (_jsx(RadioGroupPrimitive.Item, { ref: ref, "data-vaul-no-drag": true, className: cn('ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring', 'focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', className, 'overflow-hidden', img?.rounded ? `rounded-${img.rounded}` : 'rounded-sm'), ...props, id: item.sku, value: item.sku, children: img ? (_jsx(Image, { def: img, constrainTo: constrainTo, preload: true, className: '' })) : ( // placeholder so things align
|
|
14
|
+
_jsx("div", { style: { height: constrainTo.h, width: constrainTo.w } })) }));
|
|
15
|
+
});
|
|
16
|
+
ImageRadioGroupItem.displayName = 'ImageRadioGroupItem';
|
|
17
|
+
const ButtonItemSelector = observer(({ items, selectedItemRef: itemRef, selectSku, clx = '', itemClx = '', soleItemClx = '', scrollable = false, mobile = false, options = {} }) => {
|
|
18
|
+
const { showPrice, showQuantity, showFamilyInOption, buttonType, horizButtons, showButtonIfOnlyOne } = accessItemOptions(options);
|
|
19
|
+
const showImage = buttonType !== 'text';
|
|
20
|
+
const showText = buttonType !== 'image';
|
|
21
|
+
const showBoth = buttonType === 'image-and-text';
|
|
22
|
+
const labelAndPrice = (item) => ((showFamilyInOption ? (item.familyTitle + ', ' + item.optionLabel) : item.optionLabel) +
|
|
23
|
+
(showPrice ? ((showFamilyInOption ? ': ' : ', ') + formatCurrencyValue(item.price)) : ''));
|
|
24
|
+
const Item = observer(({ item, selected }) => {
|
|
25
|
+
const textClx = (selected) ? 'text-accent' : 'text-muted';
|
|
26
|
+
const cursorClx = (selected) ? 'hover:cursor-default' : 'hover:cursor-pointer';
|
|
27
|
+
const justifyClx = (showBoth) ? '' : 'justify-center';
|
|
28
|
+
// If no image, the Label must fill the entire button since it has to be
|
|
29
|
+
// clickable all the way to the border
|
|
30
|
+
const paddingClx = (showImage) ? (scrollable ? 'px-4 py-2' : 'px-2 py-2') : '';
|
|
31
|
+
let bgClx = '';
|
|
32
|
+
let borderClx = '';
|
|
33
|
+
if (scrollable) {
|
|
34
|
+
borderClx += (selected) ? 'border-foreground border ' : 'border-b border-muted-2 ';
|
|
35
|
+
}
|
|
36
|
+
else if (!showImage) {
|
|
37
|
+
borderClx += 'border rounded-lg ';
|
|
38
|
+
borderClx += (selected) ? 'border-foreground ' : 'border-muted-2 ';
|
|
39
|
+
bgClx += 'hover:bg-level-2';
|
|
40
|
+
}
|
|
41
|
+
const outerClx = ['h-10 flex items-center', justifyClx, paddingClx, bgClx, borderClx];
|
|
42
|
+
return (_jsxs("div", { className: cn(...outerClx, itemClx), "data-vaul-no-drag": true, children: [_jsx(ImageRadioGroupItem, { item: item, constrainTo: DEFAULT_CONSTRAINT, className: cn(cursorClx, (scrollable ? '' : 'border-transparent border-2 data-[state=checked]:border-foreground'), showBoth ? 'mr-2' : (showImage ? '' : 'hidden')) }), _jsxs(Label, { htmlFor: item.sku, className: cn(showQuantity ? 'flex items-center' : 'block', textClx, cursorClx, (showImage ? '' : 'self-stretch w-full flex items-center justify-center px-3 py-2'), (showText ? '' : 'hidden')), children: [_jsx("div", { className: showQuantity ? 'grow' : '', children: labelAndPrice(item) }), showQuantity && (_jsx(QuantityIndicator, { item: item, clx: 'grow-0 shrink-0 h-[20px] ml-2', iconClx: selected ? 'fill-foreground' : 'fill-muted', digitClx: 'font-semibold text-primary-fg leading-none font-sans text-xxs' }))] })] }));
|
|
43
|
+
});
|
|
44
|
+
return showButtonIfOnlyOne || items.length > 1 ? (_jsx(RadioGroup, { className: cn((scrollable ? 'shrink min-h-0 gap-0' : (mobile ? 'gap-3' : 'gap-1')), (horizButtons ? `grid grid-cols-${items.length} gap-1` : 'flex flex-col'), (mobile && showText) ? 'min-w-pr-50' : '', clx), onValueChange: selectSku, value: itemRef.item ? itemRef.item.sku : '', "data-vaul-no-drag": true, children: scrollable ? (_jsx(ScrollArea, { className: 'mt-2 w-full h-full py-0 border border-muted-2', "data-vaul-no-drag": true, children: items.map((item) => (_jsx(Item, { item: item, selected: itemRef.item?.sku === item.sku }, item.sku))) })) : (_jsx(_Fragment, { children: items.map((item) => (_jsx(Item, { item: item, selected: itemRef.item?.sku === item.sku }, item.sku))) })) })) : (_jsxs("div", { className: cn(showQuantity ? 'flex items-center' : 'block', soleItemClx), children: [_jsx("div", { className: showQuantity ? 'grow' : '', children: labelAndPrice(items[0]) }), showQuantity && (_jsx(QuantityIndicator, { item: items[0], clx: 'grow-0 shrink-0 font-semibold text-sm leading-none px-2' }))] }));
|
|
45
|
+
});
|
|
46
|
+
export default ButtonItemSelector;
|
|
47
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../../components/item-selector/button.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Dimensions } from '@hanzo/ui/types';
|
|
3
|
+
import { type CarouselOptions } from '@hanzo/ui/primitives';
|
|
4
|
+
import type { ItemSelectorProps } from '../../../types';
|
|
5
|
+
interface CarouselItemSelectorPropsExt {
|
|
6
|
+
constrainTo: Dimensions;
|
|
7
|
+
options?: CarouselOptions;
|
|
8
|
+
/** Do not show Family and / or Item title and Price */
|
|
9
|
+
imageOnly?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const CarouselItemSelector: React.FC<ItemSelectorProps>;
|
|
12
|
+
export { type CarouselItemSelectorPropsExt, CarouselItemSelector as default };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { reaction } from 'mobx';
|
|
5
|
+
import { observer } from 'mobx-react-lite';
|
|
6
|
+
import { cn } from '@hanzo/ui/util';
|
|
7
|
+
import { ApplyTypography, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, MediaStack, } from '@hanzo/ui/primitives';
|
|
8
|
+
import { formatCurrencyValue, accessItemOptions } from '../../../util';
|
|
9
|
+
import QuantityIndicator from '../quantity-indicator';
|
|
10
|
+
import ItemCarouselSlider from './slider';
|
|
11
|
+
const DEFAULT_CONSTRAINT = { w: 250, h: 250 };
|
|
12
|
+
const ItemSlide = ({ item, constrainTo, clx = '' }) => (_jsx(CarouselItem, { className: cn('p-2 flex flex-col justify-center items-center', clx), children: _jsx(MediaStack, { media: item, constrainTo: constrainTo, clx: 'my-4' }) }));
|
|
13
|
+
const CarouselItemSelector = observer(({ items, selectSku, selectedItemRef: itemRef, clx = '', itemClx = '', options = {}, ext = {
|
|
14
|
+
options: { loop: true },
|
|
15
|
+
constrainTo: DEFAULT_CONSTRAINT,
|
|
16
|
+
imageOnly: false
|
|
17
|
+
} }) => {
|
|
18
|
+
const { showPrice, showQuantity, showFamilyInOption, showByline, showSlider, } = accessItemOptions(options);
|
|
19
|
+
const elbaApiRef = useRef(undefined);
|
|
20
|
+
const scrollToRef = useRef(undefined);
|
|
21
|
+
const dontRespondRef = useRef(false);
|
|
22
|
+
const setApi = (api) => { elbaApiRef.current = api; };
|
|
23
|
+
const setScrollTo = (scrollTo) => { scrollToRef.current = scrollTo; };
|
|
24
|
+
const carouselOptions = 'options' in ext ? ext.options : undefined;
|
|
25
|
+
const constrainTo = 'constrainTo' in ext ? ext.constrainTo : DEFAULT_CONSTRAINT;
|
|
26
|
+
const imageOnly = 'imageOnly' in ext ? ext.imageOnly : false;
|
|
27
|
+
const onSelect = useCallback((emblaApi) => {
|
|
28
|
+
if (dontRespondRef.current) {
|
|
29
|
+
dontRespondRef.current = false;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const index = emblaApi.selectedScrollSnap();
|
|
33
|
+
if (index !== -1) {
|
|
34
|
+
selectSku(items[index].sku);
|
|
35
|
+
if (scrollToRef.current) {
|
|
36
|
+
scrollToRef.current(index);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
dontRespondRef.current = false;
|
|
40
|
+
}, [scrollToRef.current]);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
return reaction(() => (itemRef.item), (item) => {
|
|
43
|
+
if (elbaApiRef.current) {
|
|
44
|
+
const index = items.findIndex((el) => (el.sku === item?.sku));
|
|
45
|
+
if (index !== -1) {
|
|
46
|
+
dontRespondRef.current = true;
|
|
47
|
+
elbaApiRef.current.scrollTo(index);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}, []);
|
|
52
|
+
const optionLabel = () => (showFamilyInOption ?
|
|
53
|
+
(itemRef.item?.familyTitle + ', ' + itemRef.item?.optionLabel)
|
|
54
|
+
:
|
|
55
|
+
itemRef.item?.optionLabel);
|
|
56
|
+
const debugBorder = (c) => {
|
|
57
|
+
return '';
|
|
58
|
+
switch (c) {
|
|
59
|
+
case 'r': return ' border border-[#ffaaaa] ';
|
|
60
|
+
case 'g': return ' border border-[#aaffaa] ';
|
|
61
|
+
case 'b': return ' border border-[#aaaaff] ';
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const onScrollIndexChange = (index) => {
|
|
65
|
+
dontRespondRef.current = true;
|
|
66
|
+
selectSku(items[index].sku);
|
|
67
|
+
elbaApiRef.current?.scrollTo(index);
|
|
68
|
+
};
|
|
69
|
+
return (_jsxs("div", { className: cn('w-full flex flex-col items-center', clx), children: [_jsxs(Carousel, { options: showSlider ? { ...carouselOptions, loop: false } : carouselOptions, className: 'w-full px-2' + debugBorder('r'), onCarouselSelect: onSelect, setApi: setApi, children: [_jsx(CarouselContent, { children: items.map((item) => (_jsx(ItemSlide, { item: item, constrainTo: constrainTo, clx: itemClx }, item.sku))) }), !showSlider && (_jsxs(_Fragment, { children: [_jsx(CarouselPrevious, { className: 'left-1' }), _jsx(CarouselNext, { className: 'right-1' })] }))] }), (!imageOnly && itemRef.item) && (_jsxs(_Fragment, { children: [_jsxs(ApplyTypography, { className: 'flex flex-col items-center [&>*]:!m-0 !gap-1 ', children: [_jsxs("div", { className: 'flex items-center gap-1 [&>*]:!m-0 ' + debugBorder('g') +
|
|
70
|
+
(showFamilyInOption ? 'flex-col' : 'flex-row'), children: [_jsx("h6", { className: 'font-semibold', children: optionLabel() + (showPrice && !showFamilyInOption ? ',' : '') }), _jsxs("div", { className: 'flex items-center gap-1 [&>*]:!m-0 flex-row ' + debugBorder('b') +
|
|
71
|
+
(showFamilyInOption ? 'w-full justify-between' : ''), children: [showPrice && (_jsx("p", { children: formatCurrencyValue(itemRef.item.price) })), showQuantity && (_jsx(QuantityIndicator, { item: itemRef.item, clx: 'h-[22px] ml-4', iconClx: 'fill-foreground', digitClx: 'not-typography font-semibold text-primary-fg leading-none font-sans text-xs' }))] })] }), showByline && itemRef.item.byline && (_jsx("p", { children: itemRef.item.byline }))] }), showSlider && items.length > 1 && (_jsx(ItemCarouselSlider, { clx: 'mt-5 w-[320px]', numStops: items.length, setScrollTo: setScrollTo, onIndexChange: onScrollIndexChange }))] }))] }));
|
|
72
|
+
});
|
|
73
|
+
export { CarouselItemSelector as default };
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/item-selector/carousel/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import React, { useEffect, useState } from 'react';
|
|
4
|
+
import { Slider } from '@hanzo/ui/primitives';
|
|
5
|
+
const ItemCarouselSlider = ({ clx = '', setScrollTo, onIndexChange, numStops, }) => {
|
|
6
|
+
const [index, setIndex] = useState(0);
|
|
7
|
+
useEffect(() => { setScrollTo(setIndex); }, [setScrollTo]);
|
|
8
|
+
const onValueChange = (v) => { setIndex(v[0]); onIndexChange(v[0]); };
|
|
9
|
+
return (_jsx(Slider, { className: clx, thumbClx: 'w-8 border-muted border-2 bg-level-1 focus-visible:ring-0 focus-visible:ring-offset-0 transition-none', trackBgClx: 'bg-level-3', rangeBgClx: 'bg-level-3', thumbSlidingClx: 'bg-muted-2', defaultValue: [0], min: 0, max: numStops - 1, step: 1, value: [index], onValueChange: onValueChange }));
|
|
10
|
+
};
|
|
11
|
+
export default ItemCarouselSlider;
|
|
12
|
+
//# sourceMappingURL=slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider.js","sourceRoot":"","sources":["../../../../components/item-selector/carousel/slider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AACZ,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,MAAM,kBAAkB,GAKnB,CAAC,EACJ,GAAG,GAAC,EAAE,EACN,WAAW,EACX,aAAa,EACb,QAAQ,GACT,EAAE,EAAE;IAEH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAA;IAC7C,SAAS,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEzD,MAAM,aAAa,GAAG,CAAC,CAAW,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;IAE9E,OAAO,CACL,KAAC,MAAM,IACL,SAAS,EAAE,GAAG,EACd,QAAQ,EAAC,uGAAuG,EAChH,UAAU,EAAC,YAAY,EACvB,UAAU,EAAC,YAAY,EACvB,eAAe,EAAC,YAAY,EAC5B,YAAY,EAAE,CAAC,CAAC,CAAC,EACjB,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,QAAQ,GAAG,CAAC,EACjB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,KAAK,CAAC,EACd,aAAa,EAAE,aAAa,GAC5B,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/item-selector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EACL,OAAO,IAAI,oBAAoB,EAEhC,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { observer } from 'mobx-react-lite';
|
|
5
|
+
import {} from 'lucide-react';
|
|
6
|
+
import { cn } from '@hanzo/ui/util';
|
|
7
|
+
// Generalize this.
|
|
8
|
+
const BagIcon = (props) => (_jsx("svg", { fill: "currentColor", viewBox: '0 0 20 23', ...props, children: _jsx("path", { fillRule: "evenodd", d: "M5 5a5 5 0 0 1 10 0v1h-2V5a3 3 0 1 0-6 0v1H5V5Zm0 1v4h2V6h6v4h2V6h3.5a1 1 0 0 1 1 1v15a1 1 0 0 1-1 1h-17a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1H5Z", clipRule: "evenodd" }) }));
|
|
9
|
+
const QuantityIndicator = observer(({ item, clx = '', iconClx = '', digitClx = '' }) => {
|
|
10
|
+
if (!item.isInCart) {
|
|
11
|
+
return _jsx("div", {});
|
|
12
|
+
}
|
|
13
|
+
return (_jsxs("div", { className: cn('relative aspect-square flex items-center justify-center', clx), children: [_jsxs("div", { className: cn('z-above-content flex flex-col justify-center items-center', 'absolute left-0 right-0 top-0 bottom-0', digitClx), children: [_jsx("div", { className: 'h-[1px] w-full' }), _jsx("div", { style: { color: 'black' /* tailwind bug */ }, children: item.quantity })] }), _jsx(BagIcon, { className: cn('relative -top-[12%] h-full ', iconClx), "aria-hidden": "true" })] }));
|
|
14
|
+
}); // -top-[3px]
|
|
15
|
+
export default QuantityIndicator;
|
|
16
|
+
//# sourceMappingURL=quantity-indicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantity-indicator.js","sourceRoot":"","sources":["../../../components/item-selector/quantity-indicator.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AACZ,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAoB,MAAM,cAAc,CAAA;AAE/C,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGjC,mBAAmB;AACrB,MAAM,OAAO,GAA0B,CAAC,KAAkB,EAAE,EAAE,CAAC,CAC7D,cAAK,IAAI,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,KAAK,KAAK,YACpD,eAAM,QAAQ,EAAC,SAAS,EAAC,CAAC,EAAC,2IAA2I,EAAC,QAAQ,EAAC,SAAS,GAAE,GACvL,CACP,CAAA;AAED,MAAM,iBAAiB,GAKlB,QAAQ,CAAC,CAAC,EACb,IAAI,EACJ,GAAG,GAAC,EAAE,EACN,OAAO,GAAC,EAAE,EACV,QAAQ,GAAC,EAAE,EACZ,EAAE,EAAE;IAEH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,eAAO,CAAA;IAChB,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,yDAAyD,EAAE,GAAG,CAAC,aAChF,eAAK,SAAS,EAAE,EAAE,CAChB,2DAA2D,EAC3D,wCAAwC,EACxC,QAAQ,CACT,aACC,cAAK,SAAS,EAAC,gBAAgB,GAAG,EAClC,cAAK,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,EAAC,YAAG,IAAI,CAAC,QAAQ,GAAO,IAClE,EACN,KAAC,OAAO,IAAC,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,OAAO,CAAG,iBAAc,MAAM,GAAG,IACnF,CACP,CAAA;AACH,CAAC,CAAC,CAAA,CAAC,cAAc;AAEjB,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CategoryNode, StringMutator, StringArrayMutator } from '../../types';
|
|
3
|
+
declare const NodeTabs: React.FC<{
|
|
4
|
+
levelNodes: CategoryNode[];
|
|
5
|
+
mutator: StringMutator | StringArrayMutator;
|
|
6
|
+
multiple?: boolean;
|
|
7
|
+
className?: string;
|
|
8
|
+
buttonClx?: string;
|
|
9
|
+
itemClx?: string;
|
|
10
|
+
mobile?: boolean;
|
|
11
|
+
tabSize?: string;
|
|
12
|
+
show?: 'image' | 'label' | 'image-and-label';
|
|
13
|
+
}>;
|
|
14
|
+
export default NodeTabs;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { ToggleGroup, ToggleGroupItem } from "@hanzo/ui/primitives";
|
|
5
|
+
import { cn } from '@hanzo/ui/util';
|
|
6
|
+
import NodeImage from './node-image';
|
|
7
|
+
const NodeTabs = ({ levelNodes, mutator, multiple = false, buttonClx = '', itemClx = '', className = '', mobile = false, tabSize, show = 'image-and-label' }) => {
|
|
8
|
+
const [last, setLast] = useState(undefined);
|
|
9
|
+
const handleChangeMultiple = (selected) => {
|
|
10
|
+
mutator.set(selected);
|
|
11
|
+
setLast(selected.length === 1 ? selected[0] : undefined);
|
|
12
|
+
};
|
|
13
|
+
const handleChangeSingle = (selected) => {
|
|
14
|
+
mutator.set(selected);
|
|
15
|
+
if (selected) {
|
|
16
|
+
setLast(selected);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const roundedToSpread = {};
|
|
20
|
+
if (multiple) {
|
|
21
|
+
roundedToSpread.rounded = 'xl';
|
|
22
|
+
}
|
|
23
|
+
const val = multiple ?
|
|
24
|
+
mutator.get()
|
|
25
|
+
:
|
|
26
|
+
mutator.get();
|
|
27
|
+
return (_jsx(ToggleGroup, { type: multiple ? 'multiple' : 'single', value: val, variant: 'default', size: tabSize ? tabSize : (mobile ? 'sm' : 'default'), onValueChange: multiple ? handleChangeMultiple : handleChangeSingle, className: className, ...roundedToSpread, children: levelNodes.map((treeNode, index) => {
|
|
28
|
+
const roundedToSpread = {};
|
|
29
|
+
if (!multiple) {
|
|
30
|
+
roundedToSpread.rounded = 'none';
|
|
31
|
+
if (index === 0) {
|
|
32
|
+
roundedToSpread.rounded = 'llg';
|
|
33
|
+
}
|
|
34
|
+
else if (index === levelNodes.length - 1) {
|
|
35
|
+
roundedToSpread.rounded = 'rlg';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return (_jsx(ToggleGroupItem, { value: treeNode.skuToken, disabled: (last && last === treeNode.skuToken || treeNode.skuToken === mutator.get()), "aria-label": `Select ${treeNode.label}`, ...roundedToSpread, className: buttonClx, children: _jsxs("span", { className: cn('flex flex-row justify-center gap-1 h-6 items-center', itemClx), children: [!(show === 'label') && (_jsx(NodeImage, { treeNode: treeNode })), (!(show === 'image') || !treeNode.img) && (_jsx("span", { className: 'whitespace-nowrap', children: treeNode.label }))] }) }, treeNode.skuToken));
|
|
39
|
+
}) }));
|
|
40
|
+
};
|
|
41
|
+
export default NodeTabs;
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/node-tabs/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import Image from 'next/image';
|
|
4
|
+
const ICON_SIZE = 20;
|
|
5
|
+
const NodeImage = ({ treeNode: { img, imgAR: ar, label } }) => {
|
|
6
|
+
if (!img) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
// treat as URL
|
|
10
|
+
return (typeof img === 'string') ? (_jsx(Image, { src: img, alt: `Toggle ${label}`, className: 'block mr-1 ', width: ar ? ar * ICON_SIZE : ICON_SIZE, height: ICON_SIZE })) : img;
|
|
11
|
+
};
|
|
12
|
+
export default NodeImage;
|
|
13
|
+
//# sourceMappingURL=node-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-image.js","sourceRoot":"","sources":["../../../components/node-tabs/node-image.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,MAAM,YAAY,CAAA;AAI9B,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,MAAM,SAAS,GAEV,CAAC,EACJ,QAAQ,EAAE,EACR,GAAG,EACH,KAAK,EAAE,EAAE,EACT,KAAK,EACN,EACF,EAAE,EAAE;IAEH,IAAI,CAAC,GAAG,EAAE,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IACvB,eAAe;IACjB,OAAO,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CACjC,KAAC,KAAK,IACJ,GAAG,EAAE,GAAa,EAClB,GAAG,EAAE,UAAU,KAAK,EAAE,EACtB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,EACvC,MAAM,EAAE,SAAS,GACjB,CACH,CAAC,CAAC,CAAE,GAAuB,CAAA;AAC9B,CAAC,CAAA;AAED,eAAe,SAAS,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './service/context';
|
|
2
|
+
export * from './components';
|
|
3
|
+
export type { StandaloneServiceOptions as ServiceOptions } from './service/impls/standalone';
|
|
4
|
+
export { useSyncSkuParamWithCurrentItem, getFacetValuesMutator, formatCurrencyValue, ProductMediaAccessor, LineItemRef } from './util';
|
|
5
|
+
export * from './util/selection-ui-specifiers';
|
|
6
|
+
export { Commerce, CommerceApiError, hanzoCommerce } from './client';
|
|
7
|
+
export type { CommerceClientConfig, Balance, TierResponse, Transaction, Subscription, Plan, Payment, UsageRecord, Coupon, CouponType, CouponValidateResult, Discount, CheckoutItem, CheckoutSessionRequest, CheckoutSessionResponse, CardTokenizeRequest, CardTokenizeResult, PaymentMethod, PaymentMethodType, Referral, Referrer, Affiliate, CreditGrant, } from './client';
|
|
8
|
+
export { Metering, DEFAULT_COMMERCE_URL, identityFromHeaders, HEADER_USER_ID, HEADER_ORG_ID, } from './metering';
|
|
9
|
+
export type { MeteringConfig, MeteringIdentity, UsageEvent, RecordResult, AuthDecision, } from './metering';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './service/context';
|
|
2
|
+
export * from './components';
|
|
3
|
+
export { useSyncSkuParamWithCurrentItem, getFacetValuesMutator, formatCurrencyValue, ProductMediaAccessor, LineItemRef } from './util';
|
|
4
|
+
export * from './util/selection-ui-specifiers';
|
|
5
|
+
// Commerce API client
|
|
6
|
+
export { Commerce, CommerceApiError, hanzoCommerce } from './client';
|
|
7
|
+
// Server-side usage metering (the one way every product meters to commerce)
|
|
8
|
+
export { Metering, DEFAULT_COMMERCE_URL, identityFromHeaders, HEADER_USER_ID, HEADER_ORG_ID, } from './metering';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAG5B,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACZ,MAAM,QAAQ,CAAA;AAEf,cAAc,gCAAgC,CAAA;AAE9C,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AA2BpE,4EAA4E;AAC5E,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hanzo/commerce/metering
|
|
3
|
+
*
|
|
4
|
+
* The ONE way every Hanzo product meters usage to commerce — the single
|
|
5
|
+
* billing source of truth — so that everything (not only the LLM/cloud path)
|
|
6
|
+
* can be paid for. This is the TypeScript counterpart of
|
|
7
|
+
* github.com/hanzoai/go-sdk/metering; the two share an identical wire contract.
|
|
8
|
+
*
|
|
9
|
+
* It provides two operations against commerce's canonical billing API:
|
|
10
|
+
*
|
|
11
|
+
* - authorize(): a pre-request balance gate. Fail-closed by default — if the
|
|
12
|
+
* balance cannot be determined the request is denied, exactly like the
|
|
13
|
+
* gateway's prepaid-balance gate. With tierAware it consults the effective
|
|
14
|
+
* balance (prepaid + included plan allotment, e.g. the free-tier daily
|
|
15
|
+
* credit) so included usage is honored before prepaid funds.
|
|
16
|
+
*
|
|
17
|
+
* - record(): a post-request usage write that debits the user's balance.
|
|
18
|
+
*
|
|
19
|
+
* Composition over duplication: this wraps the existing {@link Commerce}
|
|
20
|
+
* client (GET /v1/billing/balance, GET /v1/billing/tier, POST /v1/billing/usage)
|
|
21
|
+
* rather than re-implementing the HTTP layer.
|
|
22
|
+
*
|
|
23
|
+
* Auth is the commerce service token (admin-scoped S2S), sent as
|
|
24
|
+
* `Authorization: Bearer <token>` plus the tenant org as `X-IAM-Org-Id`. The
|
|
25
|
+
* token is a secret and MUST come from KMS (the operator wires it into
|
|
26
|
+
* COMMERCE_SERVICE_TOKEN); this module never reads it from disk.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { Metering } from '@hanzo/commerce/metering'
|
|
31
|
+
*
|
|
32
|
+
* const meter = Metering.fromEnv() // COMMERCE_URL + COMMERCE_SERVICE_TOKEN (KMS) + COMMERCE_SERVICE_ORG
|
|
33
|
+
*
|
|
34
|
+
* // Pre-request gate (fail-closed).
|
|
35
|
+
* const gate = await meter.authorize({ user: 'hanzo/alice' })
|
|
36
|
+
* if (!gate.allowed) {
|
|
37
|
+
* res.status(gate.reason === 'insufficient_balance' ? 402 : 503).end()
|
|
38
|
+
* return
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* // ... do the work, compute cost ...
|
|
42
|
+
*
|
|
43
|
+
* // Post-request record (best-effort).
|
|
44
|
+
* await meter.record({ user: 'hanzo/alice', amount: 5, provider: 'search' })
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
/** Canonical in-cluster commerce address (matches the gateway default). */
|
|
48
|
+
export declare const DEFAULT_COMMERCE_URL = "http://commerce.hanzo.svc.cluster.local:8001";
|
|
49
|
+
export type MeteringConfig = {
|
|
50
|
+
/**
|
|
51
|
+
* Commerce base URL (no /v1 suffix). When empty the meter is in
|
|
52
|
+
* "not configured" mode: authorize allows and record is a no-op.
|
|
53
|
+
*/
|
|
54
|
+
baseUrl?: string;
|
|
55
|
+
/** Commerce service token (admin-scoped S2S). MUST be KMS-sourced. */
|
|
56
|
+
token?: string;
|
|
57
|
+
/** Default tenant org slug sent as X-IAM-Org-Id (default "hanzo"). */
|
|
58
|
+
org?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Gate on the tier-aware effective balance (prepaid + included plan
|
|
61
|
+
* allotment) instead of the bare prepaid balance. Default false.
|
|
62
|
+
*/
|
|
63
|
+
tierAware?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Allow-on-error. Default false (fail-closed, like the gateway). Set true
|
|
66
|
+
* only where availability outranks billing.
|
|
67
|
+
*/
|
|
68
|
+
failOpen?: boolean;
|
|
69
|
+
/** Request timeout in ms. Default 5000 (the gateway's value). */
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
};
|
|
72
|
+
/** Who to authorize / charge. user is the IAM "org/sub" identity. */
|
|
73
|
+
export type MeteringIdentity = {
|
|
74
|
+
user: string;
|
|
75
|
+
org?: string;
|
|
76
|
+
currency?: string;
|
|
77
|
+
};
|
|
78
|
+
/** One usage event to record. Mirrors commerce's usageRequest one-for-one. */
|
|
79
|
+
export type UsageEvent = {
|
|
80
|
+
user: string;
|
|
81
|
+
org?: string;
|
|
82
|
+
/** Cost to debit, in cents. */
|
|
83
|
+
amount: number;
|
|
84
|
+
currency?: string;
|
|
85
|
+
model?: string;
|
|
86
|
+
provider?: string;
|
|
87
|
+
promptTokens?: number;
|
|
88
|
+
completionTokens?: number;
|
|
89
|
+
totalTokens?: number;
|
|
90
|
+
requestId?: string;
|
|
91
|
+
premium?: boolean;
|
|
92
|
+
stream?: boolean;
|
|
93
|
+
status?: string;
|
|
94
|
+
clientIp?: string;
|
|
95
|
+
};
|
|
96
|
+
/** Result of a usage write. */
|
|
97
|
+
export type RecordResult = {
|
|
98
|
+
transactionId: string;
|
|
99
|
+
user: string;
|
|
100
|
+
amount: number;
|
|
101
|
+
currency: string;
|
|
102
|
+
type: string;
|
|
103
|
+
};
|
|
104
|
+
/** Outcome of an authorize() gate. */
|
|
105
|
+
export type AuthDecision = {
|
|
106
|
+
allowed: boolean;
|
|
107
|
+
/** 'insufficient_balance' -> 402 ; 'balance_unavailable' -> 503 (fail-closed). */
|
|
108
|
+
reason?: 'insufficient_balance' | 'balance_unavailable';
|
|
109
|
+
/** Spendable balance in cents that the decision was based on (when known). */
|
|
110
|
+
available?: number;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Metering is the server-side hook a product uses to charge for usage. It is
|
|
114
|
+
* safe to share a single instance across requests.
|
|
115
|
+
*/
|
|
116
|
+
export declare class Metering {
|
|
117
|
+
private readonly commerce;
|
|
118
|
+
private readonly org;
|
|
119
|
+
private readonly tierAware;
|
|
120
|
+
private readonly failOpen;
|
|
121
|
+
constructor(config?: MeteringConfig);
|
|
122
|
+
/**
|
|
123
|
+
* Build a Metering instance from the canonical environment variables. This
|
|
124
|
+
* is the one-liner products use at startup. Honors METERING_DISABLED for
|
|
125
|
+
* local dev.
|
|
126
|
+
*/
|
|
127
|
+
static fromEnv(env?: Record<string, string | undefined>): Metering;
|
|
128
|
+
/** Whether a commerce base URL is configured. */
|
|
129
|
+
get enabled(): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Pre-request balance gate. Never throws — returns a decision so callers map
|
|
132
|
+
* it to a status code. When not configured it always allows.
|
|
133
|
+
*
|
|
134
|
+
* Outcomes (matching the gateway):
|
|
135
|
+
* { allowed: true } -> allow.
|
|
136
|
+
* { allowed: false, reason: 'insufficient_balance' } -> 402 (out of funds).
|
|
137
|
+
* { allowed: false, reason: 'balance_unavailable' } -> 503 (fail-closed).
|
|
138
|
+
*/
|
|
139
|
+
authorize(id: MeteringIdentity): Promise<AuthDecision>;
|
|
140
|
+
/**
|
|
141
|
+
* Record a usage event, debiting the user's balance. No-op when not
|
|
142
|
+
* configured or amount <= 0 (commerce treats zero-cost usage as skipped).
|
|
143
|
+
* Decoupled from gating: the work already happened, so balance is not
|
|
144
|
+
* re-checked here. Returns null on no-op.
|
|
145
|
+
*/
|
|
146
|
+
record(usage: UsageEvent): Promise<RecordResult | null>;
|
|
147
|
+
/**
|
|
148
|
+
* Convenience for products that prefer to throw on denial. Throws a
|
|
149
|
+
* {@link CommerceApiError} with status 402 (insufficient) or 503 (unknown).
|
|
150
|
+
*/
|
|
151
|
+
authorizeOrThrow(id: MeteringIdentity): Promise<void>;
|
|
152
|
+
}
|
|
153
|
+
/** Gateway-minted identity headers. */
|
|
154
|
+
export declare const HEADER_USER_ID = "x-user-id";
|
|
155
|
+
export declare const HEADER_ORG_ID = "x-org-id";
|
|
156
|
+
/**
|
|
157
|
+
* Build a {@link MeteringIdentity} from gateway-minted identity headers. The
|
|
158
|
+
* user is "{org}/{sub}" (commerce's iam-user form) when both are present.
|
|
159
|
+
* Accepts a header bag with string | string[] | undefined values (Node http,
|
|
160
|
+
* Next.js, fetch Headers via Object.fromEntries).
|
|
161
|
+
*/
|
|
162
|
+
export declare function identityFromHeaders(headers: Record<string, string | string[] | undefined> | Headers): MeteringIdentity;
|