@anker-in/shopify-react 0.1.1-beta.10 → 0.1.1-beta.12
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/hooks/index.d.mts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +24 -53
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +24 -53
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/{index-Dwc-_zEo.d.ts → index-BOsx-Rx3.d.ts} +1 -1
- package/dist/{index-CwP6qHUo.d.mts → index-D5VVTzBT.d.mts} +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +24 -53
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -53
- package/dist/index.mjs.map +1 -1
- package/dist/provider/index.js +12 -1
- package/dist/provider/index.js.map +1 -1
- package/dist/provider/index.mjs +12 -1
- package/dist/provider/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/provider/index.js
CHANGED
|
@@ -767,7 +767,7 @@ var useCartAttributes = ({
|
|
|
767
767
|
return "new_user_login";
|
|
768
768
|
}, [customer]);
|
|
769
769
|
const memberAttributes = react.useMemo(() => {
|
|
770
|
-
|
|
770
|
+
const attributes = [
|
|
771
771
|
{
|
|
772
772
|
key: "_token",
|
|
773
773
|
value: profile?.token
|
|
@@ -786,8 +786,19 @@ var useCartAttributes = ({
|
|
|
786
786
|
{
|
|
787
787
|
key: "_is_login",
|
|
788
788
|
value: profile?.token ? "true" : "false"
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
key: "_last_url",
|
|
792
|
+
value: typeof window !== "undefined" ? window.location.origin + window.location.pathname : ""
|
|
789
793
|
}
|
|
790
794
|
];
|
|
795
|
+
if (profile?.token) {
|
|
796
|
+
attributes.push({
|
|
797
|
+
key: "_login_user",
|
|
798
|
+
value: "1"
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
return attributes;
|
|
791
802
|
}, [profile?.memberType, profile?.token, userType, hasPlusMember]);
|
|
792
803
|
const functionAttributes = react.useMemo(() => {
|
|
793
804
|
const hasFunctionEnvAttribute = cart?.lineItems.some(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/provider/context.ts","../../src/adapters/browser-cookie.ts","../../src/adapters/browser-cart-cookie.ts","../../src/provider/provider.tsx","../../src/provider/use-shopify.ts","../../src/hooks/cart/const.ts","../../src/hooks/cart/utils/normalize-add-to-cart-lines.ts","../../src/hooks/cart/utils/index.ts","../../src/hooks/cart/utils/auto-free-gift.ts","../../src/hooks/cart/feature/use-calc-auto-free-gift.ts","../../src/hooks/cart/feature/use-script-auto-free-gift.ts","../../src/hooks/cart/use-update-cart-attributes.ts","../../src/hooks/member/plus/use-has-plus-member-in-cart.ts","../../src/hooks/cart/feature/use-cart-attributes.ts","../../src/hooks/cart/feature/use-update-line-code-amount-attributes.ts","../../src/hooks/member/plus/context.tsx","../../src/provider/cart-context.tsx"],"names":["createContext","Cookies","useMemo","createShopifyClient","jsx","useContext","attr","newAttr","product","Decimal","useRef","useSWR","getProductsByHandles","useState","useEffect","upgrade_multiple","upgrade_value","useCallback","updateCartAttributes","useSWRMutation","useRequest","updateCartLines","getCart","attributes"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext } from 'react'\nimport type { ShopifyClient, ShopifyConfig } from '@anker-in/shopify-sdk'\nimport type {\n CookieAdapter,\n RouterAdapter,\n UserContextAdapter,\n CartCookieAdapter,\n} from '../adapters'\n\nexport interface ShopifyContextValue {\n client: ShopifyClient\n config: ShopifyConfig\n locale: string\n locales?: string[]\n cookieAdapter: CookieAdapter\n cartCookieAdapter: CartCookieAdapter\n routerAdapter?: RouterAdapter\n userAdapter?: UserContextAdapter\n}\n\nexport const ShopifyContext = createContext<ShopifyContextValue | null>(null)\n","import Cookies from 'js-cookie'\nimport type { CookieAdapter, CookieOptions } from './types'\n\n/**\n * Browser cookie adapter using js-cookie\n */\nexport const browserCookieAdapter: CookieAdapter = {\n get(key: string): string | undefined {\n return Cookies.get(key)\n },\n\n set(key: string, value: string, options?: CookieOptions): void {\n Cookies.set(key, value, {\n domain: options?.domain,\n path: options?.path || '/',\n expires: options?.expires,\n secure: options?.secure,\n sameSite: options?.sameSite,\n })\n },\n\n remove(key: string): void {\n Cookies.remove(key)\n },\n}\n","import Cookies from 'js-cookie'\nimport type { CartCookieAdapter } from '@anker-in/shopify-sdk'\n\n/**\n * Cookie name mapping for cart IDs by locale\n * Format: {locale}-shopify-cart-id\n */\nfunction getCartCookieName(locale: string): string {\n return `${locale}-shopify-cart-id`\n}\n\n/**\n * Browser cart cookie adapter using js-cookie\n * Manages cart ID storage across different locales\n */\nexport const browserCartCookieAdapter: CartCookieAdapter = {\n getCartId(locale: string): string | undefined {\n return Cookies.get(getCartCookieName(locale))\n },\n\n setCartId(locale: string, cartId: string): void {\n Cookies.set(getCartCookieName(locale), cartId, {\n path: '/',\n expires: 30, // 30 days\n })\n },\n\n removeCartId(locale: string): void {\n Cookies.remove(getCartCookieName(locale))\n },\n}\n","import React, { PropsWithChildren, useMemo } from 'react'\nimport { createShopifyClient, type CartCookieAdapter, ShopifyConfig } from '@anker-in/shopify-sdk'\nimport { ShopifyContext } from './context'\nimport { browserCookieAdapter, browserCartCookieAdapter } from '../adapters'\nimport type { CookieAdapter, RouterAdapter, UserContextAdapter } from '../adapters'\n\nexport interface ShopifyProviderProps {\n config: ShopifyConfig\n locale: string\n locales?: string[]\n cookieAdapter?: CookieAdapter\n cartCookieAdapter?: CartCookieAdapter\n routerAdapter?: RouterAdapter\n userAdapter?: UserContextAdapter\n children: React.ReactNode\n}\n\n/**\n * Shopify Provider Component\n * Provides Shopify context to all child components\n */\nexport function ShopifyProvider({\n config,\n locale,\n locales,\n cookieAdapter = browserCookieAdapter,\n cartCookieAdapter = browserCartCookieAdapter,\n routerAdapter,\n userAdapter,\n children,\n}: ShopifyProviderProps) {\n const client = useMemo(() => {\n return createShopifyClient(config, locale)\n }, [config, locale])\n\n const value = useMemo(() => {\n return {\n client,\n config,\n locale,\n locales: locales || config.getLocales(),\n cookieAdapter,\n cartCookieAdapter,\n routerAdapter,\n userAdapter,\n }\n }, [\n client,\n config,\n locale,\n locales,\n cookieAdapter,\n cartCookieAdapter,\n routerAdapter,\n userAdapter,\n ])\n\n return <ShopifyContext.Provider value={value}>{children}</ShopifyContext.Provider>\n}\n","import { useContext } from 'react'\nimport { ShopifyContext } from './context'\n\n/**\n * Hook to access Shopify context\n * @throws Error if used outside ShopifyProvider\n */\nexport function useShopify() {\n const context = useContext(ShopifyContext)\n\n if (!context) {\n throw new Error('useShopify must be used within a ShopifyProvider')\n }\n\n return context\n}\n","import { SWRMutationConfiguration } from 'swr/mutation'\n\nexport const currencyCodeMapping = {\n us: 'USD',\n ca: 'CAD',\n gb: 'GBP',\n eu: 'EUR',\n au: 'AUD',\n nz: 'NZD',\n de: 'EUR',\n fr: 'EUR',\n es: 'EUR',\n it: 'EUR',\n nl: 'EUR',\n pl: 'EUR',\n ro: 'EUR',\n} as Record<string, string>\n\nexport const defaultSWRMutationConfiguration: SWRMutationConfiguration<any, any, any, any, any> & {\n throwOnError?: boolean\n} = {\n throwOnError: false,\n}\n\n// Shopify 常量定义\nexport const CUSTOMER_ATTRIBUTE_KEY = '_discounts_function_env'\nexport const CUSTOMER_SCRIPT_GIFT_KEY = '_giveaway_gradient_gifts'\n\nexport const CODE_AMOUNT_KEY = '_sku_code_money'\nexport const SCRIPT_CODE_AMOUNT_KEY = '_code_money'\n\n// 主产品公开 code\nexport const MAIN_PRODUCT_CODE = ['WS24', 'WSTD', 'WS7D', 'WSCP', 'WSPE', 'WSPD']\n","import type { NormalizedLineItem } from '@anker-in/shopify-sdk'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\n\n/**\n * Normalize AddToCartLineItem[] to NormalizedLineItem[] format\n * This is used to calculate gifts from lines before they are added to cart\n */\nexport function normalizeAddToCartLines(lines: AddToCartLineItem[]): NormalizedLineItem[] {\n return lines\n .filter((line) => line.variant?.id)\n .map((line, index) => {\n const variant = line.variant!\n const product = variant.product\n const quantity = line.quantity || 1\n\n // Calculate prices\n const price = variant.finalPrice?.amount\n ? Number(variant.finalPrice.amount)\n : variant.compareAtPrice?.amount\n ? Number(variant.compareAtPrice.amount)\n : variant.price?.amount\n ? Number(variant.price.amount)\n : 0\n\n const subtotalAmount = price * quantity\n const totalAmount = subtotalAmount // No discounts before adding to cart\n\n return {\n id: `temp-line-${index}-${variant.id}`, // Temporary ID for pre-cart lines\n name: product?.title || variant.title || '',\n quantity,\n variantId: variant.id,\n productId: product?.id || variant.id.split('/').slice(0, -2).join('/'),\n totalAmount,\n subtotalAmount,\n discountAllocations: [],\n customAttributes: line.attributes || [],\n variant: {\n id: variant.id,\n price,\n listPrice: variant.compareAtPrice?.amount ? Number(variant.compareAtPrice.amount) : 0,\n sku: variant.sku || '',\n name: variant.title || '',\n image: variant.image\n ? {\n url: variant.image.url,\n altText: variant.image.altText || undefined,\n }\n : undefined,\n requiresShipping: false, // Default value, not available in NormalizedProductVariant\n availableForSale: variant.availableForSale ?? true,\n quantityAvailable: variant.quantityAvailable ?? 0,\n currentlyNotInStock: false, // Default value, will be updated when added to cart\n weight: variant.weight,\n metafields: variant.metafields,\n },\n product: product,\n path: product?.handle ? `/products/${product.handle}` : '',\n discounts: [],\n options: variant.selectedOptions?.map((opt: any) => ({\n name: opt.name,\n value: opt.value,\n })),\n }\n })\n}\n\n/**\n * Create a mock cart structure from AddToCartLineItem[]\n * This is useful for calculating gifts before actual cart operations\n */\nexport function createMockCartFromLines(lines: AddToCartLineItem[], existingCart?: any): any {\n const normalizedLines = normalizeAddToCartLines(lines)\n\n const subtotalPrice = normalizedLines.reduce((sum, line) => sum + line.subtotalAmount, 0)\n\n const totalPrice = normalizedLines.reduce((sum, line) => sum + line.totalAmount, 0)\n\n return {\n id: existingCart?.id || 'temp-cart-id',\n customerId: existingCart?.customerId,\n email: existingCart?.email,\n createdAt: existingCart?.createdAt || new Date().toISOString(),\n currency: existingCart?.currency || { code: 'USD' },\n taxesIncluded: existingCart?.taxesIncluded,\n lineItems: normalizedLines,\n totalLineItemsDiscount: 0,\n orderDiscounts: 0,\n lineItemsSubtotalPrice: subtotalPrice,\n subtotalPrice,\n totalPrice,\n totalTaxAmount: 0,\n discountCodes: existingCart?.discountCodes || [],\n discountAllocations: [],\n url: existingCart?.url || '',\n ready: true,\n customAttributes: existingCart?.customAttributes,\n }\n}\n","export const getQuery = (): Record<string, string> => {\n const url = typeof window !== 'undefined' ? window.location.search : ''\n const theRequest: Record<string, string> = {}\n if (url.indexOf('?') != -1) {\n const str = url.substr(1),\n strs = str.split('&')\n for (let i = 0; i < strs.length; i++) {\n const parts = strs[i]?.split('=')\n const key = parts?.[0]\n const value = parts?.[1]\n if (key && value) {\n theRequest[key] = decodeURIComponent(value)\n }\n }\n }\n return theRequest\n}\n\nexport function atobID(id: string) {\n if (id && typeof id === 'string' && id.includes('/')) {\n return id.split('/').pop()?.split('?')?.shift()\n } else {\n return id\n }\n}\n\nexport function btoaID(id: string, type: 'ProductVariant' | 'Product' = 'ProductVariant') {\n return `gid://shopify/${type}/${id}`\n}\n\n// Export normalize utilities\nexport * from './normalize-add-to-cart-lines'\n","import {\n AutoFreeGiftMainProduct,\n SpendMoneyType,\n RuleCondition,\n FormattedGift,\n} from '../types/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { atobID } from './index'\nimport type { UseScriptAutoFreeGiftResult } from '../feature/use-script-auto-free-gift'\nimport Cookies from 'js-cookie'\nimport Decimal from 'decimal.js'\nimport { getQuery } from './index'\nimport { Attribute, NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport const getMatchedMainProductSubTotal = (\n cartData: any,\n variant_list: AutoFreeGiftMainProduct['variant_id_list'],\n main_product: AutoFreeGiftMainProduct\n) => {\n const isAllStoreVariant = main_product?.all_store_variant ?? false\n const matchedList = cartData?.lineItems?.filter((line: any) => {\n // 包含在主商品列表中\n const { is_gift } = getDiscountEnvAttributeValue(line.customAttributes) // 获取折扣环境属性值\n return isAllStoreVariant\n ? !is_gift\n : variant_list?.find((item: any) => {\n return !is_gift && atobID(line.variantId) === item\n })\n })\n return (\n matchedList?.reduce((acc: number, line: any) => {\n return (\n acc +\n (main_product?.spend_money_type === SpendMoneyType.ORIGIN_PRICE\n ? Number(line.subtotalAmount) || 0\n : Number(line.totalAmount) || 0)\n )\n }, 0) || 0 // 计算总金额\n )\n}\n\nexport const safeParse = (str: string) => {\n try {\n return JSON.parse(str)\n } catch (err) {\n return {}\n }\n}\n\nexport const getDiscountEnvAttributeValue = (\n // 函数接受一个名为 attributes 的参数,其类型为包含 key 和 value 字符串属性的对象数组,默认值为空数组\n attributes: { key: string; value: string }[] = []\n) => {\n // 在 attributes 数组中查找 key 值等于 CUSTOMER_ATTRIBUTE_KEY 的对象,并将其赋值给 attr 变量\n const attr = attributes.find((attr) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n // 尝试解析 attr 对象的 value 属性为 JSON,如果解析失败或 attr 不存在,则返回一个空对象\n return safeParse(attr?.value ?? '') ?? {}\n}\n\nexport const checkAttributesUpdateNeeded = (\n oldAttributes: Attribute[],\n newAttributes: Attribute[],\n customAttributesNeedRemove: { key: string }[]\n) => {\n // 判断是否需要更新 attributes,需要更新的场景有:\n // 1. 有新的 attribute\n // 2. 有旧的 attribute 的 value 发生变化\n // 3. 有需要删除的 attribute, 且旧 attributes 中存在该 key\n return (\n oldAttributes.some((attr) => {\n const newAttr = newAttributes.find((newAttr) => newAttr.key === attr.key)\n return newAttr ? newAttr.value !== attr.value : true\n }) ||\n newAttributes.some((attr) => !oldAttributes.some((oldAttr) => oldAttr.key === attr.key)) ||\n customAttributesNeedRemove.some((removeAttr) =>\n oldAttributes.some((oldAttr) => oldAttr.key === removeAttr.key)\n )\n )\n}\n\n/**\n * 检查 source 数组是否包含 requiredItems 数组中的所有元素。\n * @param source - 源数据数组,例如用户的标签列表。\n * @param requiredItems - 必须包含的项的数组。\n * @returns boolean\n */\nconst containsAll = (source: string[], requiredItems: string[] = []): boolean => {\n // 如果没有必须包含的项,则条件默认满足。\n if (!requiredItems?.length) return true\n\n const sourceSet = new Set(source)\n // 检查每一个 requiredItem 是否都存在于 sourceSet 中。\n return requiredItems.every((item) => sourceSet.has(item))\n}\n\n/**\n * 检查 source 数组是否不包含 forbiddenItems 数组中的任何元素。\n * @param source - 源数据数组。\n * @param forbiddenItems - 禁止包含的项的数组。\n * @returns boolean\n */\nconst containsNone = (source: string[], forbiddenItems: string[] = []): boolean => {\n // 如果没有禁止的项,则条件默认满足。\n if (!forbiddenItems?.length) return true\n\n const sourceSet = new Set(source)\n // 只要在 sourceSet 中找到任何一个 forbiddenItem,条件就不满足。\n return !forbiddenItems.some((item) => sourceSet.has(item))\n}\n\nexport function preCheck(\n rule_conditions: RuleCondition[],\n userTags: string[],\n currentDealsTypes: string[]\n): boolean {\n // 1. 处理边界情况 (Guard Clauses),保持不变\n if (!Array.isArray(rule_conditions)) return false\n if (rule_conditions.length === 0) return true\n\n // 2. 使用 .some() 替代 for...of 循环和 break\n // .some() 会在找到第一个满足条件的元素后立即返回 true,并停止遍历,\n // 这完美地复刻了 for + break 的行为。\n return rule_conditions.some((rule) => {\n // 检查标签条件是否满足\n const tagsAreValid =\n containsAll(userTags, rule.with_user_tags) && containsNone(userTags, rule.without_user_tags)\n\n // 检查URL参数条件是否满足\n const paramsAreValid =\n containsAll(currentDealsTypes, rule.with_special_url_params) &&\n containsNone(currentDealsTypes, rule.without_special_url_params)\n\n // 只有当两个条件都满足时,此规则才算匹配\n return tagsAreValid && paramsAreValid\n })\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatScriptAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatScriptAutoFreeGift = ({\n scriptAutoFreeGiftResult,\n gradient_gifts,\n locale,\n}: {\n scriptAutoFreeGiftResult: UseScriptAutoFreeGiftResult\n gradient_gifts: any\n locale: string\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n freeGiftLevel: scriptAutoFreeGiftResult?.freeGiftLevel\n ? {\n items:\n scriptAutoFreeGiftResult.freeGiftLevel.giveawayProducts?.map((item) => ({\n handle: item.handle,\n sku: item.sku,\n quantity: 1,\n })) || [],\n }\n : null,\n giftProductsLength: scriptAutoFreeGiftResult?.giftProductsResult?.length || 0,\n giftProductsIds: scriptAutoFreeGiftResult?.giftProductsResult?.map((p) => p.id).sort() || [],\n gradientGiftsId: gradient_gifts?.id || gradient_gifts?.name || '',\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatScriptAutoFreeGiftCache && formatScriptAutoFreeGiftCache.key === cacheKey) {\n return formatScriptAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n scriptAutoFreeGiftResult?.freeGiftLevel?.giveawayProducts\n ?.filter((item) =>\n scriptAutoFreeGiftResult?.giftProductsResult?.some(\n (product) => product.handle === item.handle\n )\n )\n .map((item, index) => {\n const product = scriptAutoFreeGiftResult?.giftProductsResult?.find(\n (product) => product.handle === item.handle\n )\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.sku)\n : undefined\n\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n const addUTMFreeItem =\n gradient_gifts.activityAvailableQuery &&\n utmCampaign?.includes(gradient_gifts.activityAvailableQuery)\n\n let points_subscribe = false\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n points_subscribe = !!isPointsSubscribe\n }\n\n const customAttributes: { key: string; value: string }[] = [\n {\n key: '_giveaway_gradient_gifts',\n value: '_giveaway_gradient_gifts',\n },\n ...(points_subscribe\n ? [\n { key: '_amount_upgrade_multiple', value: '1.2' },\n { key: '_amount_upgrade_value', value: '40' },\n ]\n : []),\n ...(addUTMFreeItem && gradient_gifts?.activityQroperty\n ? [\n {\n key: gradient_gifts.activityQroperty,\n value: gradient_gifts.activityQroperty,\n },\n ]\n : []),\n ]\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatScriptAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatFunctionAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatFunctionAutoFreeGift = ({\n qualifyingGift,\n giftProductsResult,\n locale,\n}: {\n locale: string\n qualifyingGift?: FormattedGift | null\n giftProductsResult?: NormalizedProduct[] | []\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n qualifyingGift: qualifyingGift\n ? {\n spend: qualifyingGift.tier?.spend_sum_money,\n items:\n qualifyingGift.itemsToAdd?.map((item) => ({\n variantId: item.variant.id,\n handle: item.variant.handle,\n sku: item.variant.sku,\n quantity: item.quantity ?? 1,\n attributes: item.attributes,\n })) || [],\n }\n : null,\n giftProductsLength: giftProductsResult?.length || 0,\n giftProductsIds: giftProductsResult?.map((p) => p.id).sort() || [],\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatFunctionAutoFreeGiftCache && formatFunctionAutoFreeGiftCache.key === cacheKey) {\n return formatFunctionAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n qualifyingGift?.itemsToAdd?.map((item, index) => {\n const product = giftProductsResult?.find((product) => product.handle === item.variant.handle)\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.variant.sku)\n : undefined\n console.log('qualifyingGift variant', product, variant)\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes: item.attributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatFunctionAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n","import { useMemo, useRef } from 'react'\nimport {\n FunctionGiftResult,\n FormattedGift,\n CartLineInput,\n AutoFreeGiftConfig,\n} from '../types/auto-free-gift'\nimport { preCheck, getMatchedMainProductSubTotal } from '../utils/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { btoaID } from '../utils'\nimport { getProductsByHandles } from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n/**\n * [计算型 Hook]\n * 根据购物车、活动配置和用户信息,计算出应得的赠品和下一个目标。\n * 此 Hook 不产生任何副作用。\n * 使用示例:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig);\n *\n * 也可以传入 lines 参数来计算加购前的赠品:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig, customer, lines);\n */\nexport const useCalcAutoFreeGift = (\n cart: any,\n autoFreeGiftConfig: AutoFreeGiftConfig,\n customer: any,\n lines?: AddToCartLineItem[]\n): FunctionGiftResult => {\n const tags = useMemo(() => customer?.tags || [], [customer?.tags])\n const isCustomerLoading = useMemo(() => (!customer ? true : false), [customer])\n const dealsType: string = '' // 可从URL或Context获取\n const { client, locale } = useShopify()\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n // 1. 找到当前生效的活动和用于计算的子总价\n const { activeCampaign, subtotal } = useMemo(() => {\n // 遍历所有活动配置\n for (const campaign of autoFreeGiftConfig) {\n const { rule_conditions = [], rule_result } = campaign\n const { spend_get_reward } = rule_result || {}\n\n // 前置检查,判断用户和环境是否满足活动条件\n const isPreCheckPassed = preCheck(rule_conditions, tags, dealsType ? [dealsType] : [])\n\n if (isPreCheckPassed && spend_get_reward) {\n // 计算参与活动的主商品的总价\n const matchedSubtotal = getMatchedMainProductSubTotal(\n effectiveCart,\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n {\n spend_money_type: spend_get_reward.main_product?.spend_money_type || 1,\n variant_id_list:\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n all_store_variant: spend_get_reward.main_product?.all_store_variant || false,\n }\n )\n\n // 如果有主商品在购物车中,则此活动为当前生效的活动\n if (matchedSubtotal > 0) {\n return { activeCampaign: campaign, subtotal: matchedSubtotal }\n }\n }\n }\n // 没有找到生效的活动\n return { activeCampaign: null, subtotal: 0 }\n }, [autoFreeGiftConfig, effectiveCart, tags, dealsType])\n\n // 2. 根据子总价,计算应得赠品和下一个目标\n const { qualifyingGift, nextTierGoal } = useMemo(() => {\n if (!activeCampaign || !activeCampaign.rule_result?.spend_get_reward?.gift_product) {\n return { qualifyingGift: null, nextTierGoal: null }\n }\n\n const giftTiers = activeCampaign.rule_result.spend_get_reward.gift_product\n\n // a. 找到当前满足条件的最高阶梯(按金额从高到低排序后查找)\n const qualifyingTier = [...giftTiers]\n .sort((a: any, b: any) => Number(b.spend_sum_money) - Number(a.spend_sum_money))\n .find((tier: any) => subtotal >= Number(tier.spend_sum_money))\n\n // b. 找到下一个目标阶梯 (第一个门槛比当前subtotal高的)\n const nextGoal = giftTiers.find((tier) => subtotal < Number(tier.spend_sum_money))\n\n if (!qualifyingTier) {\n return { qualifyingGift: null, nextTierGoal: nextGoal || null }\n }\n\n // c. 将应得的赠品阶梯格式化为待添加购物车的结构\n const formattedGift: FormattedGift = {\n tier: qualifyingTier,\n itemsToAdd: qualifyingTier.reward_list\n ?.map((reward: any) => {\n const giftProduct = reward?.variant_list?.[0]\n if (!giftProduct) return null\n return {\n variant: {\n id: btoaID(giftProduct.variant_id),\n handle: giftProduct.handle,\n sku: giftProduct.sku,\n },\n quantity: reward?.get_unit || 1,\n attributes: [\n {\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n is_gift: true,\n rule_id: activeCampaign.rule_id,\n spend_sum_money: qualifyingTier.spend_sum_money,\n }),\n },\n ],\n }\n })\n .filter((item: any): item is CartLineInput => item !== null),\n }\n\n return { qualifyingGift: formattedGift, nextTierGoal: nextGoal || null }\n }, [activeCampaign, subtotal])\n\n const giftHandles = useMemo(() => {\n const giftVariant = autoFreeGiftConfig\n .map((item) =>\n item.rule_result?.spend_get_reward?.gift_product\n ?.map((v) =>\n v.reward_list.map((reward) => reward.variant_list.map((variant) => variant.handle))\n )\n .flat()\n )\n .flat()\n return giftVariant.flat(2).filter(Boolean)\n }, [autoFreeGiftConfig])\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n\n // 使用缓存的数据或新获取的数据 \n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n \n return {\n qualifyingGift,\n nextTierGoal,\n activeCampaign,\n isLoading: isCustomerLoading,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","import { useEffect, useMemo, useCallback, useState, useRef } from 'react'\nimport Decimal from 'decimal.js'\nimport Cookies from 'js-cookie'\nimport {\n NormalizedCart,\n NormalizedLineItem,\n NormalizedProduct,\n getProductsByHandles,\n} from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { getQuery } from '../utils'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n// 兼容老script满赠 ----- 待拆解优化\ninterface GiveawayProduct {\n handle: string\n sku: string\n}\n\ninterface Breakpoint {\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n}\n\ninterface Campaign {\n activityAvailableQuery?: string\n activityQroperty?: string\n breakpoints?: Array<{\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n }>\n includeTags?: string[]\n useTotalAmount?: boolean\n}\n\nexport interface UseScriptAutoFreeGiftResult {\n involvedLines: NormalizedLineItem[]\n reorder: (a: NormalizedLineItem, b: NormalizedLineItem) => number\n disableCodeRemove: boolean\n nextFreeGiftLevel: Breakpoint | null\n freeGiftLevel: Breakpoint | null\n involvedSubTotal: Decimal\n giftProductsResult?: NormalizedProduct[]\n}\n\n// --- 3. 优化后的 Hook 主体 ---\nexport const useScriptAutoFreeGift = ({\n campaign,\n _giveaway,\n cart,\n locale: providedLocale,\n lines,\n}: {\n campaign: Campaign | null\n _giveaway: string\n cart: NormalizedCart | undefined\n locale?: string\n lines?: AddToCartLineItem[]\n}): UseScriptAutoFreeGiftResult => {\n const { client, locale: contextLocale } = useShopify()\n const locale = providedLocale || contextLocale\n\n // --- 状态管理 ---\n const [points_subscribe, set_points_subscribe] = useState<boolean>(false)\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n useEffect(() => {\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n set_points_subscribe(!!isPointsSubscribe)\n }\n }, [locale])\n\n // 检查活动是否可用:\n // 1. campaign 不存在\n // 2. 配置了 activityAvailableQuery 但utmCampaign不包含activityAvailableQuery\n const isActivityAvailable = useMemo(() => {\n if (!campaign) return false\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n if (campaign.activityAvailableQuery && !utmCampaign?.includes(campaign.activityAvailableQuery))\n return false\n return true\n }, [campaign])\n\n // --- 计算层 ---\n // 使用 useMemo 进行性能优化,处理所有纯计算逻辑。\n\n const [upgrade_multiple, upgrade_value] = useMemo((): [number, number] => {\n let upgrade_multiple = 1\n let upgrade_value = 0\n if (points_subscribe) {\n upgrade_multiple = 1.2\n upgrade_value = 40\n }\n effectiveCart?.lineItems?.forEach(({ customAttributes}: { customAttributes: { key: string; value: string }[] }) => {\n customAttributes?.forEach(({ key, value }: { key: string; value: string }) => {\n if (key === '_amount_upgrade_multiple') upgrade_multiple = Number(value) || 1\n if (key === '_amount_upgrade_value') upgrade_value = Number(value) || 0\n })\n })\n return [upgrade_multiple, upgrade_value]\n }, [effectiveCart?.lineItems, points_subscribe])\n\n const breakpoints = useMemo((): Breakpoint[] => {\n if (!isActivityAvailable) return []\n return (campaign?.breakpoints || []).map((item) => ({\n breakpoint: new Decimal(item.breakpoint)\n .minus(new Decimal(upgrade_value))\n .dividedBy(new Decimal(upgrade_multiple))\n .toFixed(2, Decimal.ROUND_DOWN),\n giveawayProducts: item.giveawayProducts || [],\n }))\n }, [campaign, upgrade_multiple, upgrade_value])\n\n const giftHandles = useMemo(\n (): string[] =>\n // 使用 Set 去重,然后拼接字符串\n [\n ...new Set(\n breakpoints.flatMap((b) => b.giveawayProducts.map((p) => p.handle)).filter(Boolean)\n ),\n ],\n [breakpoints]\n )\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const involvedLines = useMemo((): NormalizedLineItem[] => {\n if (!isActivityAvailable) return []\n return (effectiveCart?.lineItems || []).filter((line: NormalizedLineItem) => {\n const isNotGift =\n line?.totalAmount &&\n Number(line.totalAmount) > 0 &&\n line.customAttributes?.every(\n (item: { key: string; value: string }) => item.key !== _giveaway\n )\n const hasCampaignTag = line.product?.tags?.some(\n (tag: string) =>\n campaign?.includeTags?.includes(tag.trim()) && line.variant?.availableForSale\n )\n return isNotGift && hasCampaignTag\n })\n }, [effectiveCart?.lineItems, isActivityAvailable, _giveaway])\n\n const involvedSubTotal = useMemo((): Decimal => {\n if (!isActivityAvailable) return new Decimal(0)\n return involvedLines.reduce((prev, item) => {\n const amount = campaign?.useTotalAmount ? item.totalAmount : item.subtotalAmount\n return new Decimal(prev).plus(new Decimal(amount || 0))\n }, new Decimal(0))\n }, [involvedLines, isActivityAvailable])\n\n const [freeGiftLevel, nextFreeGiftLevel] = useMemo((): [Breakpoint | null, Breakpoint | null] => {\n if (!isActivityAvailable) return [null, null]\n const sortedLevels = [...breakpoints].sort(\n (a, b) => Number(b.breakpoint) - Number(a.breakpoint)\n )\n const levelIndex = sortedLevels.findIndex(\n (level) => involvedSubTotal.gte(new Decimal(level.breakpoint)) && involvedLines.length > 0\n )\n\n if (levelIndex === -1) {\n return [\n null,\n sortedLevels.length > 0 ? (sortedLevels[sortedLevels.length - 1] ?? null) : null,\n ]\n }\n\n const currentLevel = sortedLevels[levelIndex] ?? null\n const nextLevel = levelIndex > 0 ? (sortedLevels[levelIndex - 1] ?? null) : null\n return [currentLevel, nextLevel]\n }, [breakpoints, involvedSubTotal, involvedLines.length])\n\n // --- 数据获取层 ---\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n // 使用缓存的数据或新获取的数据\n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n\n // 使用 useCallback 创建一个稳定的排序函数,用于优化渲染。\n // 它会根据商品类型(赠品、活动商品、普通商品)进行排序。\n const reorder = useCallback(\n (a: NormalizedLineItem, b: NormalizedLineItem): number => {\n const getPriority = (item: NormalizedLineItem): number => {\n // 优先级 0: 赠品 (排在最后)\n if (\n item.customAttributes?.some(\n (attribute: { key: string; value: string }) => attribute.key === _giveaway\n )\n )\n return 0\n // 优先级 1: 参与活动的商品 (BUG修复:应检查 product.tags)\n if (item.product?.tags?.some((tag: string) => campaign?.includeTags?.includes(tag)))\n return 1\n // 优先级 2: 其他普通商品 (排在最前)\n return 2\n }\n // b 的优先级减 a 的优先级,实现降序排列\n return getPriority(b) - getPriority(a)\n },\n [campaign?.includeTags, _giveaway]\n )\n\n return {\n involvedLines,\n reorder,\n disableCodeRemove: involvedLines.length > 0,\n nextFreeGiftLevel,\n freeGiftLevel,\n involvedSubTotal,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n updateCartAttributes,\n type NormalizedCart,\n type HasMetafieldsIdentifier,\n} from '@anker-in/shopify-sdk'\n\nexport interface UpdateCartAttributesInput {\n /** Cart ID (optional, will use cookie) */\n cartId?: string\n /** Custom attributes to set on cart */\n attributes: Array<{ key: string; value: string }>\n}\n\n/**\n * Hook for updating cart attributes (custom key-value pairs)\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useUpdateCartAttributes()\n *\n * await trigger({\n * attributes: [\n * { key: 'gift_message', value: 'Happy Birthday!' },\n * { key: 'gift_wrap', value: 'true' }\n * ]\n * })\n * ```\n */\nexport function useUpdateCartAttributes(\n mutate: (cart: NormalizedCart | undefined) => void,\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n },\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'update-cart-attributes',\n UpdateCartAttributesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n\n const updateAttributes = useCallback(\n async (_key: string, { arg }: { arg: UpdateCartAttributesInput }) => {\n const updatedCart = await updateCartAttributes(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n console.log('useUpdateCartAttributes updatedCart', updatedCart)\n if (updatedCart) {\n mutate(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutate]\n )\n\n return useSWRMutation('update-cart-attributes', updateAttributes, options)\n}\n","/**\n * useHasPlusMemberInCart Hook\n * 判断购物车中是否包含年费会员或月费会员产品\n */\n\nimport { useMemo } from 'react'\nimport type { PlusMemberSettingsMetafields } from './types'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\n\nexport interface UseHasPlusMemberInCartProps {\n /** Plus Member 配置 */\n memberSetting?: PlusMemberSettingsMetafields\n /** 购物车数据 */\n cart?: NormalizedCart\n}\n\nexport interface HasPlusMemberInCartResult {\n /** 购物车中是否有任何会员产品 */\n hasPlusMember: boolean\n /** 购物车中是否有月费会员产品 */\n hasMonthlyPlus: boolean\n /** 购物车中是否有年费会员产品 */\n hasAnnualPlus: boolean\n /** 月费会员产品的 line item */\n monthlyPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n /** 年费会员产品的 line item */\n annualPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n}\n\n/**\n * 判断购物车中是否包含年费会员或月费会员产品\n *\n * @param props - Hook 参数\n * @param props.metafields - Plus Member 配置\n * @returns 会员产品信息\n *\n * @example\n * ```tsx\n * const {\n * hasPlusMember,\n * hasMonthlyPlus,\n * hasAnnualPlus,\n * monthlyPlusItem,\n * annualPlusItem,\n * } = useHasPlusMemberInCart({\n * memberSetting: plusMemberSettings,\n * })\n *\n * if (hasPlusMember) {\n * console.log('购物车中有会员产品')\n * }\n * ```\n */\nexport function useHasPlusMemberInCart({\n memberSetting,\n cart,\n}: UseHasPlusMemberInCartProps): HasPlusMemberInCartResult {\n const { plus_monthly_product, plus_annual_product } = memberSetting || {}\n\n return useMemo(() => {\n if (!cart?.lineItems) {\n return {\n hasPlusMember: false,\n hasMonthlyPlus: false,\n hasAnnualPlus: false,\n }\n }\n\n // 查找月费会员产品\n const monthlyPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_monthly_product?.handle &&\n item.variant?.sku === plus_monthly_product?.sku\n )\n\n // 查找年费会员产品\n const annualPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_annual_product?.handle &&\n item.variant?.sku === plus_annual_product?.sku\n )\n\n const hasMonthlyPlus = !!monthlyPlusItem\n const hasAnnualPlus = !!annualPlusItem\n const hasPlusMember = hasMonthlyPlus || hasAnnualPlus\n\n return {\n hasPlusMember,\n hasMonthlyPlus,\n hasAnnualPlus,\n monthlyPlusItem: monthlyPlusItem,\n annualPlusItem: annualPlusItem,\n }\n }, [cart?.lineItems, plus_monthly_product, plus_annual_product])\n}\n","import Cookies from 'js-cookie'\nimport { useEffect, useMemo, useState } from 'react'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\nimport Decimal from 'decimal.js'\nimport { PlusMemberSettingsMetafields } from '../../member'\nimport { useHasPlusMemberInCart } from '../../member/plus/use-has-plus-member-in-cart'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\n\nexport const getReferralAttributes = () => {\n const inviteCode = Cookies.get('invite_code')\n const playModeId = Cookies.get('playModeId')\n const popup = Cookies.get('_popup')\n if (inviteCode && playModeId) {\n return popup\n ? [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n { key: '_popup', value: popup },\n ]\n : [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n ]\n }\n return []\n}\n\nexport const useCartAttributes = ({\n profile,\n customer,\n cart,\n memberSetting,\n}: {\n profile: any\n customer: any\n cart?: NormalizedCart\n memberSetting?: PlusMemberSettingsMetafields\n}): { attributes: Array<{ key: string; value: any }> } => {\n const [currentUrl, setCurrentUrl] = useState('')\n const { hasPlusMember } = useHasPlusMemberInCart({\n memberSetting,\n cart,\n })\n\n useEffect(() => {\n setCurrentUrl(window.location.href)\n }, [])\n\n const userType = useMemo(() => {\n let userInfo: any = Cookies.get('userInfo')\n if (userInfo) {\n userInfo = JSON.parse(userInfo)\n let arr = typeof userInfo?.id == 'string' && userInfo?.id.split('/')\n userInfo.setId = arr[arr.length - 1]\n }\n const customerInfo = userInfo || customer\n if (!customerInfo) {\n return 'new_user_unlogin'\n }\n if (customer) {\n const { orders = {} } = customer\n if (orders?.edges?.length === 1) {\n return 'old_user_orders_once'\n } else if (orders?.edges?.length > 1) {\n return 'old_user_orders_twice'\n }\n }\n return 'new_user_login'\n }, [customer])\n\n // 用户相关\n const memberAttributes = useMemo(() => {\n return [\n {\n key: '_token',\n value: profile?.token, //是否登录\n },\n {\n key: '_member_type',\n value: hasPlusMember ? '2' : profile?.memberType, //:0(游客),1(普通会员),2(付费会员)\n },\n {\n key: '_user_type',\n value: userType, // n\n },\n {\n key: '_is_login',\n value: profile?.token ? 'true' : 'false',\n },\n ]\n }, [profile?.memberType, profile?.token, userType, hasPlusMember])\n\n const functionAttributes = useMemo(() => {\n const hasFunctionEnvAttribute = cart?.lineItems.some((item) =>\n item.customAttributes?.some((attr: any) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n )\n const discountCodes = cart?.discountCodes.map((item) => item.code).filter((code) => code) || []\n return hasFunctionEnvAttribute\n ? [\n {\n key: '_discounts_function_env',\n value: JSON.stringify({\n discount_code: discountCodes,\n user_tags: customer?.tags || [],\n }),\n },\n ]\n : []\n }, [cart])\n\n // console.log('functionAttributes', cart, functionAttributes)\n\n const presellAttributes = useMemo(() => {\n return [\n {\n key: '_presale',\n value: cart?.lineItems.some((item) => item?.variant?.metafields?.presell === 'presell'),\n },\n ]\n }, [cart])\n\n const weightAttributes = useMemo(() => {\n return [\n {\n key: '_weight',\n value: cart?.lineItems\n .reduce<number>((acc, item) => {\n return new Decimal(acc).plus(item.variant.weight ?? 0).toNumber()\n }, 0)\n .toString(),\n },\n {\n key: '_app_source_name',\n value: 'dtc',\n },\n ]\n }, [cart])\n\n const trackingAttributes = useMemo(() => {\n return [\n {\n key: 'utm_params',\n value: currentUrl,\n },\n ]\n }, [currentUrl])\n\n return useMemo(\n () => ({\n attributes: [\n ...memberAttributes,\n ...functionAttributes,\n ...presellAttributes,\n ...weightAttributes,\n ...trackingAttributes,\n ...getReferralAttributes(),\n ].filter((item) => item?.value) as Array<{ key: string; value: any }>,\n }),\n [memberAttributes, functionAttributes, presellAttributes, weightAttributes, trackingAttributes]\n )\n}\n","import { useEffect, useMemo } from 'react'\nimport {\n CODE_AMOUNT_KEY,\n CUSTOMER_ATTRIBUTE_KEY,\n MAIN_PRODUCT_CODE,\n SCRIPT_CODE_AMOUNT_KEY,\n} from '../const'\nimport { updateCartLines } from '@anker-in/shopify-sdk'\nimport type { NormalizedCart, HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\nimport { useRequest } from 'ahooks'\nimport { getDiscountEnvAttributeValue } from '../utils/auto-free-gift'\nimport { useShopify } from '../../../provider'\n\nexport const useUpdateLineCodeAmountAttributes = ({\n cart,\n mutateCart,\n isCartLoading,\n setLoadingState,\n metafieldIdentifiers,\n}: {\n cart?: NormalizedCart\n mutateCart: (cart: NormalizedCart | undefined) => void\n isCartLoading: boolean\n setLoadingState: React.Dispatch<React.SetStateAction<any>>\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}) => {\n const { client, cartCookieAdapter } = useShopify()\n\n const mainProductDiscountCodes = useMemo(\n () =>\n cart?.discountCodes\n .filter(\n ({ code, applicable }) =>\n applicable && MAIN_PRODUCT_CODE.some((codePrefix) => code.startsWith(codePrefix))\n )\n .map(({ code }) => code),\n [cart]\n )\n\n const linesNeedUpdate = useMemo(\n () =>\n cart?.lineItems\n .map((line) => {\n const attrNeedUpdate: Array<{ key: string; value: string }> = []\n const attrNeedDelete = []\n\n const codeDiscount = line.discountAllocations?.find((allocation) =>\n mainProductDiscountCodes?.includes(allocation.code)\n )\n\n // 是否有 _discounts_function_env 属性\n const hasFunctionEnvAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) => attr.key === CUSTOMER_ATTRIBUTE_KEY\n )\n const functionEnvValue = getDiscountEnvAttributeValue(line.customAttributes)\n // lineItem 折后总价与attr中的不一致的情况\n const hasSameFunctionEnvAttribute =\n Number(functionEnvValue.discounted_amount) === Number(line.totalAmount)\n\n if (!hasSameFunctionEnvAttribute && hasFunctionEnvAttribute) {\n attrNeedUpdate.push({\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n ...functionEnvValue,\n discounted_amount: Number(line.totalAmount),\n }),\n })\n }\n\n const codeDiscountAmount = codeDiscount?.amount || 0\n // 是否有 code_money 属性\n const hasCodeAmountAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY || attr.key === SCRIPT_CODE_AMOUNT_KEY\n )\n // 两个属性都存在且值相同,则不更新\n const hasSameCodeAmountAttribute =\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n ) &&\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === SCRIPT_CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n )\n\n if (codeDiscount && !hasSameCodeAmountAttribute) {\n attrNeedUpdate.push({\n key: CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n attrNeedUpdate.push({\n key: SCRIPT_CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n } else if (!codeDiscount && hasCodeAmountAttribute) {\n // 没有 code 需要删除的情况\n attrNeedDelete.push(CODE_AMOUNT_KEY)\n attrNeedDelete.push(SCRIPT_CODE_AMOUNT_KEY)\n }\n\n return {\n line,\n attrNeedUpdate,\n attrNeedDelete,\n }\n })\n .filter(\n ({ attrNeedUpdate, attrNeedDelete }) => attrNeedUpdate.length || attrNeedDelete.length\n )\n .map(({ line, attrNeedUpdate, attrNeedDelete }) => {\n if (attrNeedUpdate.length) {\n return {\n id: line.id,\n attributes: [\n ...(line.customAttributes?.filter(\n (attr: { key: string; value: string }) =>\n !attrNeedUpdate.some((updateAttr) => updateAttr.key === attr.key)\n ) || []),\n ...attrNeedUpdate,\n ],\n }\n } else if (attrNeedDelete.length) {\n return {\n id: line.id,\n attributes:\n line.customAttributes?.filter(\n (attr: { key: string; value: string }) => !attrNeedDelete.includes(attr.key)\n ) || [],\n }\n } else {\n return {\n id: line.id,\n attributes: line.customAttributes || [],\n }\n }\n }),\n [cart?.lineItems, mainProductDiscountCodes]\n )\n\n const { loading } = useRequest(\n async () => {\n if (linesNeedUpdate?.length && !isCartLoading) {\n const result = await updateCartLines(client, {\n cartId: cart?.id || '',\n lines: linesNeedUpdate,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n if (result) {\n mutateCart(result)\n }\n }\n },\n {\n throttleWait: 3000, // 3 秒内只触发最后一次更新\n throttleTrailing: true,\n refreshDeps: [linesNeedUpdate, isCartLoading],\n }\n )\n\n useEffect(() => {\n setLoadingState((prev: any) => {\n return {\n ...prev,\n editLineCodeAmountLoading: loading,\n }\n })\n }, [loading, setLoadingState])\n}\n","/**\n * Plus Member Context\n * Provides Plus Member state management\n */\n\nimport { createContext } from 'react'\nimport type {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n SelectedPlusMemberProduct,\n DeliveryPlusType,\n} from './types'\nimport { NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport interface ShippingMethodsContext {\n freeShippingMethods: PlusMemberShippingMethodConfig[]\n paymentShippingMethods: PlusMemberShippingMethodConfig[]\n nddOverweight: boolean\n tddOverweight: boolean\n}\n\nexport interface PlusMemberContextValue<TProduct = any, TVariant = any, TProfile = any> {\n // Metafields configuration\n plusMemberMetafields: PlusMemberSettingsMetafields\n shopCommon?: Record<string, any>\n\n // Zip code state\n zipCode: string\n setZipCode: (value: string) => void\n\n // Delivery availability\n allowNextDayDelivery: boolean\n setAllowNextDayDelivery: (value: boolean) => void\n allowThirdDayDelivery: boolean\n setAllowThirdDayDelivery: (value: boolean) => void\n\n // Plus member mode selection\n selectedPlusMemberMode: DeliveryPlusType\n setSelectedPlusMemberMode: (value: DeliveryPlusType) => void\n\n // Area check modal\n showAreaCheckModal: boolean\n setShowAreaCheckModal: (value: boolean) => void\n\n // Shipping method selection\n selectedShippingMethod?: PlusMemberShippingMethodConfig\n setSelectedShippingMethod: (value: PlusMemberShippingMethodConfig) => void\n\n // Tip display\n showTip: boolean\n setShowTip: (value: boolean) => void\n\n // More shipping methods display\n showMoreShippingMethod: boolean\n setShowMoreShippingMethod: (value: boolean) => void\n\n // Product and variant (generic types)\n variant: TVariant\n product: TProduct\n\n // Shipping methods context\n shippingMethodsContext: ShippingMethodsContext\n\n // Selected plus member product\n selectedPlusMemberProduct: SelectedPlusMemberProduct\n\n // Plus member products list\n plusMemberProducts: NormalizedProduct[]\n\n // Plus member benefit modal\n showPlusMemberBenefit: boolean\n setShowPlusMemberBenefit: (value: boolean) => void\n\n // Margin bottom control\n deleteMarginBottom: boolean\n setDeleteMarginBottom: (value: boolean) => void\n\n // Profile (user profile information)\n profile?: TProfile\n\n // Locale (language/region code)\n locale?: string\n}\n\nconst createInitialValue = <\n TProduct = any,\n TVariant = any,\n TProfile = any,\n>(): PlusMemberContextValue<TProduct, TVariant, TProfile> => ({\n zipCode: '',\n plusMemberMetafields: {} as PlusMemberSettingsMetafields,\n setZipCode: () => {},\n allowNextDayDelivery: false,\n setAllowNextDayDelivery: () => {},\n allowThirdDayDelivery: false,\n setAllowThirdDayDelivery: () => {},\n selectedPlusMemberMode: 'free' as DeliveryPlusType,\n setSelectedPlusMemberMode: () => {},\n showAreaCheckModal: false,\n setShowAreaCheckModal: () => {},\n selectedShippingMethod: undefined,\n setSelectedShippingMethod: () => {},\n showTip: false,\n setShowTip: () => {},\n showMoreShippingMethod: false,\n setShowMoreShippingMethod: () => {},\n variant: {} as TVariant,\n product: {} as TProduct,\n shippingMethodsContext: {\n freeShippingMethods: [],\n paymentShippingMethods: [],\n nddOverweight: false,\n tddOverweight: false,\n },\n selectedPlusMemberProduct: null,\n plusMemberProducts: [],\n showPlusMemberBenefit: false,\n setShowPlusMemberBenefit: () => {},\n deleteMarginBottom: false,\n setDeleteMarginBottom: () => {},\n profile: undefined,\n locale: undefined,\n})\n\nexport const PlusMemberContext = createContext<PlusMemberContextValue>(createInitialValue())\n","/**\n * Cart Context\n * Provides cart state and mutation methods with business logic\n */\n\nimport React, { createContext, useContext, useCallback, useMemo, useState, useEffect } from 'react'\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCart, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useShopify } from './use-shopify'\nimport { useCalcAutoFreeGift } from '../hooks/cart/feature/use-calc-auto-free-gift'\nimport { CUSTOMER_SCRIPT_GIFT_KEY, CUSTOMER_ATTRIBUTE_KEY } from '../hooks/cart/const'\nimport { useScriptAutoFreeGift } from '../hooks/cart/feature/use-script-auto-free-gift'\nimport {\n getDiscountEnvAttributeValue,\n formatScriptAutoFreeGift,\n formatFunctionAutoFreeGift,\n checkAttributesUpdateNeeded,\n} from '../hooks/cart/utils/auto-free-gift'\nimport {\n PlusMemberSettingsMetafields,\n useCartAttributes,\n useUpdateCartAttributes,\n useUpdateLineCodeAmountAttributes,\n} from '../hooks'\nimport { useRequest } from 'ahooks'\nimport type { HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\n\n// Simple types defined locally to avoid import issues\nexport type AttributeInput = {\n key: string\n value: string\n}\n\nexport type LoadingState = {\n editLineQuantityLoading: boolean\n editLineCodeAmountLoading: boolean\n listingAutoCodeApplying: boolean\n userCodeApplying: boolean\n}\n\nexport interface CartContextValue {\n /** Current cart data */\n cart: NormalizedCart | undefined\n /** Whether cart is loading */\n isCartLoading: boolean\n /** Manually trigger cart fetch */\n triggerFetch: () => void\n /** Mutate cart data */\n mutateCart: (cart: NormalizedCart | undefined) => void\n /** Add custom attributes */\n addCustomAttributes: (attributes: AttributeInput[]) => void\n /** Remove custom attributes */\n removeCustomAttributes: (attributes: { key: string }[]) => void\n /** Set custom attributes */\n setCustomAttributes: (attributes: AttributeInput[]) => void\n /** Current locale */\n locale: string\n /** Whether discount code is changing */\n isCodeChanging: boolean\n /** Set discount code changing state */\n setIsCodeChanging: (isCodeChanging: boolean) => void\n /** Set loading state */\n setLoadingState: React.Dispatch<React.SetStateAction<LoadingState>>\n /** Loading state */\n loadingState: LoadingState\n /** Script auto free gift items */\n scriptAutoFreeGift?: any[]\n /** Function auto free gift items */\n functionAutoFreeGift?: any[]\n /** Set function auto free gift */\n setFunctionAutoFreeGift: (functionAutoFreeGift: any[]) => void\n /** Set script auto free gift */\n setScriptAutoFreeGift: (scriptAutoFreeGift: any[]) => void\n /** Script auto free gift result */\n scriptAutoFreeGiftResult?: any\n /** Function auto free gift result */\n functionAutoFreeGiftResult?: any\n /** Calculated auto free gift result */\n calculatedAutoFreeGift?: any\n /** Gifts that need to be added to cart */\n giftNeedAddToCartLines: any[]\n /** Auto free gift config */\n autoFreeGiftConfig?: any\n /** Gradient gifts config */\n gradientGiftsConfig?: any\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}\n\nconst CartContext = createContext<CartContextValue | null>(null)\n\nexport interface CartProviderProps {\n children: React.ReactNode\n /** SWR configuration options */\n swrOptions?: SWRConfiguration<NormalizedCart | undefined, Error>\n /** Auto free gift configuration */\n autoFreeGiftConfig?: any\n /** Gradient gifts configuration (for script gifts) */\n gradientGiftsConfig?: any\n /** Function gift configuration */\n fnGiftConf?: any\n /** User profile */\n profile?: any\n /** Customer data */\n customer?: any\n /** Current locale */\n locale: string\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n /** Plus member settings */\n memberSetting?: PlusMemberSettingsMetafields\n}\n\n/**\n * Cart Provider Component\n *\n * Provides cart state management with business logic\n *\n * @example\n * ```tsx\n * <ShopifyProvider {...config}>\n * <CartProvider\n * locale=\"us\"\n * autoFreeGiftConfig={config}\n * profile={profile}\n * customer={customer}\n * >\n * <App />\n * </CartProvider>\n * </ShopifyProvider>\n * ```\n */\nexport function CartProvider({\n children,\n // swrOptions,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n profile,\n customer,\n locale,\n metafieldIdentifiers,\n memberSetting,\n}: CartProviderProps) {\n const { client, cartCookieAdapter } = useShopify()\n\n // Local state\n const [customAttributes, setCustomAttributes] = useState<AttributeInput[]>([])\n const [customAttributesNeedDelete, setCustomAttributesNeedDelete] = useState<{ key: string }[]>(\n []\n )\n const [isCodeChanging, setIsCodeChanging] = useState(false)\n const [loadingState, setLoadingState] = useState<LoadingState>({\n editLineQuantityLoading: false,\n editLineCodeAmountLoading: false,\n listingAutoCodeApplying: false,\n userCodeApplying: false,\n })\n const [scriptAutoFreeGift, setScriptAutoFreeGift] = useState<any[]>([])\n const [functionAutoFreeGift, setFunctionAutoFreeGift] = useState<any[]>([])\n\n const {\n run: fetchCart,\n data: cart,\n loading: isCartLoading,\n mutate: mutateCart,\n } = useRequest<NormalizedCart | undefined, any>(\n async () => {\n return getCart(client, {\n cookieAdapter: cartCookieAdapter,\n metafieldIdentifiers,\n })\n },\n {\n refreshDeps: [locale],\n }\n )\n\n // 更新 attributes\n const { trigger: updateAttributes } = useUpdateCartAttributes(mutateCart, metafieldIdentifiers)\n // 公共 attributes\n const { attributes } = useCartAttributes({ profile, customer, cart, memberSetting })\n\n useRequest(\n () => {\n // 去重逻辑\n const newAttributes = [...attributes, ...customAttributes]\n\n const needUpdate =\n cart &&\n !checkAttributesUpdateNeeded(\n cart.customAttributes,\n newAttributes,\n customAttributesNeedDelete\n )\n\n // 如果 attributes 没有变化,不更新\n if (needUpdate) {\n return updateAttributes({ attributes: newAttributes })\n } else {\n return Promise.resolve(cart)\n }\n },\n {\n throttleWait: 1000, // 1 秒内只触发最后一次更新\n throttleTrailing: true,\n throttleLeading: false,\n refreshDeps: [attributes, customAttributes],\n }\n )\n\n // 更新 code 时,同步更新 line item 中的 code amount attribute\n useUpdateLineCodeAmountAttributes({\n cart,\n mutateCart,\n isCartLoading: isCartLoading || isCodeChanging,\n setLoadingState,\n })\n\n // Custom attribute management\n const removeCustomAttributes = useCallback(\n (attributes: { key: string }[]) => {\n setCustomAttributesNeedDelete(attributes)\n },\n [setCustomAttributesNeedDelete]\n )\n\n const addCustomAttributes = useCallback(\n (attributes: AttributeInput[]) => {\n const sameAttributes = attributes.filter((attr) =>\n customAttributes.some((a) => a.key === attr.key)\n )\n\n if (sameAttributes.length) {\n setCustomAttributes((prev) => {\n const removedAttributes = prev.filter(\n (attr) => !sameAttributes.some((a) => a.key === attr.key)\n )\n return [...removedAttributes, ...attributes]\n })\n } else {\n setCustomAttributes((prev) => [...prev, ...attributes])\n }\n },\n [customAttributes]\n )\n\n const functionAutoFreeGiftResult = useCalcAutoFreeGift(cart, autoFreeGiftConfig || [], customer)\n const scriptAutoFreeGiftResult = useScriptAutoFreeGift({\n campaign: gradientGiftsConfig || null,\n _giveaway: CUSTOMER_SCRIPT_GIFT_KEY,\n cart,\n })\n\n const formattedScriptGifts = useMemo(() => {\n return formatScriptAutoFreeGift({\n scriptAutoFreeGiftResult,\n gradient_gifts: gradientGiftsConfig,\n locale,\n })\n }, [scriptAutoFreeGiftResult, gradientGiftsConfig, locale])\n\n const formattedFunctionGifts = useMemo(() => {\n return formatFunctionAutoFreeGift({\n qualifyingGift: functionAutoFreeGiftResult?.qualifyingGift || null,\n giftProductsResult: (functionAutoFreeGiftResult?.giftProductsResult as any[]) || [],\n locale,\n })\n }, [functionAutoFreeGiftResult, locale])\n\n // 当格式化结果变化时更新状态\n useEffect(() => {\n if (\n loadingState.userCodeApplying ||\n loadingState.editLineQuantityLoading ||\n loadingState.editLineCodeAmountLoading ||\n loadingState.listingAutoCodeApplying\n ) {\n return\n }\n\n setScriptAutoFreeGift(formattedScriptGifts)\n setFunctionAutoFreeGift(formattedFunctionGifts)\n }, [\n formattedScriptGifts,\n formattedFunctionGifts,\n loadingState.userCodeApplying,\n loadingState.editLineQuantityLoading,\n loadingState.editLineCodeAmountLoading,\n loadingState.listingAutoCodeApplying,\n ])\n\n const giftNeedAddToCartLines = useMemo(() => {\n const cartGiftLineItems = cart?.lineItems.filter((line) =>\n line.customAttributes?.some((attr: any) =>\n [CUSTOMER_ATTRIBUTE_KEY, CUSTOMER_SCRIPT_GIFT_KEY].includes(attr.key)\n )\n )\n const result = [...scriptAutoFreeGift, ...functionAutoFreeGift].filter(\n (item) =>\n // 如果购物车中已经存在对应赠品,且标记了 function 满赠的属性,则不添加\n !cartGiftLineItems?.find((line) => {\n return (\n line.variantId === item.line.variantId &&\n line.customAttributes?.some((attr: any) => {\n if (attr.key === '_discounts_function_env') {\n return getDiscountEnvAttributeValue(line.customAttributes).is_gift\n }\n\n return false\n })\n )\n })\n )\n return result\n }, [cart?.lineItems, scriptAutoFreeGift, functionAutoFreeGift])\n\n const value = useMemo(\n () => ({\n cart,\n isCartLoading,\n triggerFetch: fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n setCustomAttributes,\n locale,\n isCodeChanging,\n setIsCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n setLoadingState,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n }),\n [\n cart,\n isCartLoading,\n fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n locale,\n isCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n ]\n )\n\n return <CartContext.Provider value={value}>{children}</CartContext.Provider>\n}\n\n/**\n * Hook to access cart context\n *\n * @throws Error if used outside CartProvider\n * @returns Cart context value\n *\n * @example\n * ```tsx\n * const { cart, mutateCart, isCartLoading, loadingState } = useCartContext()\n * ```\n */\nexport function useCartContext(): CartContextValue {\n const context = useContext(CartContext)\n\n if (!context) {\n throw new Error('useCartContext must be used within a CartProvider')\n }\n\n return context\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/provider/context.ts","../../src/adapters/browser-cookie.ts","../../src/adapters/browser-cart-cookie.ts","../../src/provider/provider.tsx","../../src/provider/use-shopify.ts","../../src/hooks/cart/const.ts","../../src/hooks/cart/utils/normalize-add-to-cart-lines.ts","../../src/hooks/cart/utils/index.ts","../../src/hooks/cart/utils/auto-free-gift.ts","../../src/hooks/cart/feature/use-calc-auto-free-gift.ts","../../src/hooks/cart/feature/use-script-auto-free-gift.ts","../../src/hooks/cart/use-update-cart-attributes.ts","../../src/hooks/member/plus/use-has-plus-member-in-cart.ts","../../src/hooks/cart/feature/use-cart-attributes.ts","../../src/hooks/cart/feature/use-update-line-code-amount-attributes.ts","../../src/hooks/member/plus/context.tsx","../../src/provider/cart-context.tsx"],"names":["createContext","Cookies","useMemo","createShopifyClient","jsx","useContext","attr","newAttr","product","Decimal","useRef","useSWR","getProductsByHandles","useState","useEffect","upgrade_multiple","upgrade_value","useCallback","updateCartAttributes","useSWRMutation","useRequest","updateCartLines","getCart","attributes"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBO,IAAM,cAAA,GAAiBA,oBAA0C,IAAI;ACdrE,IAAM,oBAAA,GAAsC;AAAA,EACjD,IAAI,GAAA,EAAiC;AACnC,IAAA,OAAOC,yBAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,EACxB,CAAA;AAAA,EAEA,GAAA,CAAI,GAAA,EAAa,KAAA,EAAe,OAAA,EAA+B;AAC7D,IAAAA,yBAAA,CAAQ,GAAA,CAAI,KAAK,KAAA,EAAO;AAAA,MACtB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,IAAA,EAAM,SAAS,IAAA,IAAQ,GAAA;AAAA,MACvB,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,UAAU,OAAA,EAAS;AAAA,KACpB,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,OAAO,GAAA,EAAmB;AACxB,IAAAA,yBAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACpB;AACF,CAAA;ACjBA,SAAS,kBAAkB,MAAA,EAAwB;AACjD,EAAA,OAAO,GAAG,MAAM,CAAA,gBAAA,CAAA;AAClB;AAMO,IAAM,wBAAA,GAA8C;AAAA,EACzD,UAAU,MAAA,EAAoC;AAC5C,IAAA,OAAOA,yBAAAA,CAAQ,GAAA,CAAI,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,EAC9C,CAAA;AAAA,EAEA,SAAA,CAAU,QAAgB,MAAA,EAAsB;AAC9C,IAAAA,yBAAAA,CAAQ,GAAA,CAAI,iBAAA,CAAkB,MAAM,GAAG,MAAA,EAAQ;AAAA,MAC7C,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS;AAAA;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAAA,yBAAAA,CAAQ,MAAA,CAAO,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,EAC1C;AACF,CAAA;ACTO,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,oBAAA;AAAA,EAChB,iBAAA,GAAoB,wBAAA;AAAA,EACpB,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,MAAA,GAASC,cAAQ,MAAM;AAC3B,IAAA,OAAOC,8BAAA,CAAoB,QAAQ,MAAM,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,EAAA,MAAM,KAAA,GAAQD,cAAQ,MAAM;AAC1B,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,UAAA,EAAW;AAAA,MACtC,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBAAOE,cAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAe,QAAA,EAAS,CAAA;AAC1D;ACnDO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,OAAA,GAAUC,iBAAW,cAAc,CAAA;AAEzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAEA,EAAA,OAAO,OAAA;AACT;;;ACUO,IAAM,sBAAA,GAAyB,yBAAA;AAC/B,IAAM,wBAAA,GAA2B,0BAAA;AAEjC,IAAM,eAAA,GAAkB,iBAAA;AACxB,IAAM,sBAAA,GAAyB,aAAA;AAG/B,IAAM,oBAAoB,CAAC,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;;;ACzBzE,SAAS,wBAAwB,KAAA,EAAkD;AACxF,EAAA,OAAO,KAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA,CACjC,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,CAAA;AAGlC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,UAAA,EAAY,MAAA,GAC9B,MAAA,CAAO,QAAQ,UAAA,CAAW,MAAM,CAAA,GAChC,OAAA,CAAQ,cAAA,EAAgB,MAAA,GACtB,OAAO,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,GACpC,OAAA,CAAQ,KAAA,EAAO,SACb,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,GAC3B,CAAA;AAER,IAAA,MAAM,iBAAiB,KAAA,GAAQ,QAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,cAAA;AAEpB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,CAAA;AAAA;AAAA,MACpC,IAAA,EAAM,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,IAAS,EAAA;AAAA,MACzC,QAAA;AAAA,MACA,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,SAAA,EAAW,OAAA,EAAS,EAAA,IAAM,OAAA,CAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MACrE,WAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAqB,EAAC;AAAA,MACtB,gBAAA,EAAkB,IAAA,CAAK,UAAA,IAAc,EAAC;AAAA,MACtC,OAAA,EAAS;AAAA,QACP,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,KAAA;AAAA,QACA,SAAA,EAAW,QAAQ,cAAA,EAAgB,MAAA,GAAS,OAAO,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,GAAI,CAAA;AAAA,QACpF,GAAA,EAAK,QAAQ,GAAA,IAAO,EAAA;AAAA,QACpB,IAAA,EAAM,QAAQ,KAAA,IAAS,EAAA;AAAA,QACvB,KAAA,EAAO,QAAQ,KAAA,GACX;AAAA,UACE,GAAA,EAAK,QAAQ,KAAA,CAAM,GAAA;AAAA,UACnB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,IAAW;AAAA,SACpC,GACA,MAAA;AAAA,QACJ,gBAAA,EAAkB,KAAA;AAAA;AAAA,QAClB,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,IAAA;AAAA,QAC9C,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,CAAA;AAAA,QAChD,mBAAA,EAAqB,KAAA;AAAA;AAAA,QACrB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,YAAY,OAAA,CAAQ;AAAA,OACtB;AAAA,MACA,OAAA;AAAA,MACA,MAAM,OAAA,EAAS,MAAA,GAAS,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,MACxD,WAAW,EAAC;AAAA,MACZ,OAAA,EAAS,OAAA,CAAQ,eAAA,EAAiB,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,QACnD,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAO,GAAA,CAAI;AAAA,OACb,CAAE;AAAA,KACJ;AAAA,EACF,CAAC,CAAA;AACL;AAMO,SAAS,uBAAA,CAAwB,OAA4B,YAAA,EAAyB;AAC3F,EAAA,MAAM,eAAA,GAAkB,wBAAwB,KAAK,CAAA;AAErD,EAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,cAAA,EAAgB,CAAC,CAAA;AAExF,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAc,EAAA,IAAM,cAAA;AAAA,IACxB,YAAY,YAAA,EAAc,UAAA;AAAA,IAC1B,OAAO,YAAA,EAAc,KAAA;AAAA,IACrB,WAAW,YAAA,EAAc,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IAC7D,QAAA,EAAU,YAAA,EAAc,QAAA,IAAY,EAAE,MAAM,KAAA,EAAM;AAAA,IAClD,eAAe,YAAA,EAAc,aAAA;AAAA,IAC7B,SAAA,EAAW,eAAA;AAAA,IACX,sBAAA,EAAwB,CAAA;AAAA,IACxB,cAAA,EAAgB,CAAA;AAAA,IAChB,sBAAA,EAAwB,aAAA;AAAA,IACxB,aAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA,EAAgB,CAAA;AAAA,IAChB,aAAA,EAAe,YAAA,EAAc,aAAA,IAAiB,EAAC;AAAA,IAC/C,qBAAqB,EAAC;AAAA,IACtB,GAAA,EAAK,cAAc,GAAA,IAAO,EAAA;AAAA,IAC1B,KAAA,EAAO,IAAA;AAAA,IACP,kBAAkB,YAAA,EAAc;AAAA,GAClC;AACF;;;AClGO,IAAM,WAAW,MAA8B;AACpD,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AACrE,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAA,EAAI;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,CAAC,GACtB,IAAA,GAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,GAAG,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT,CAAA;AAEO,SAAS,OAAO,EAAA,EAAY;AACjC,EAAA,IAAI,MAAM,OAAO,EAAA,KAAO,YAAY,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,IAAA,OAAO,EAAA,CAAG,MAAM,GAAG,CAAA,CAAE,KAAI,EAAG,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,EAAM;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,SAAS,MAAA,CAAO,EAAA,EAAY,IAAA,GAAqC,gBAAA,EAAkB;AACxF,EAAA,OAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AACpC;ACdO,IAAM,6BAAA,GAAgC,CAC3C,QAAA,EACA,YAAA,EACA,YAAA,KACG;AACH,EAAA,MAAM,iBAAA,GAAoB,cAAc,iBAAA,IAAqB,KAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,CAAC,IAAA,KAAc;AAE7D,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,4BAAA,CAA6B,KAAK,gBAAgB,CAAA;AACtE,IAAA,OAAO,oBACH,CAAC,OAAA,GACD,YAAA,EAAc,IAAA,CAAK,CAAC,IAAA,KAAc;AAChC,MAAA,OAAO,CAAC,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,KAAM,IAAA;AAAA,IAChD,CAAC,CAAA;AAAA,EACP,CAAC,CAAA;AACD,EAAA,OACE,WAAA,EAAa,MAAA,CAAO,CAAC,GAAA,EAAa,IAAA,KAAc;AAC9C,IAAA,OACE,GAAA,IACC,YAAA,EAAc,gBAAA,KAAA,CAAA,sBACX,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,IAAK,CAAA,GAC/B,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,IAAK,CAAA,CAAA;AAAA,EAEpC,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AAEb,CAAA;AAEO,IAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAC;AAAA,EACV;AACF,CAAA;AAEO,IAAM,4BAAA,GAA+B,CAE1C,UAAA,GAA+C,EAAC,KAC7C;AAEH,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA,CAAK,CAACC,KAAAA,KAASA,KAAAA,CAAK,QAAQ,sBAAsB,CAAA;AAE1E,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,EAAE,KAAK,EAAC;AAC1C,CAAA;AAEO,IAAM,2BAAA,GAA8B,CACzC,aAAA,EACA,aAAA,EACA,0BAAA,KACG;AAKH,EAAA,OACE,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS;AAC3B,IAAA,MAAM,OAAA,GAAU,cAAc,IAAA,CAAK,CAACC,aAAYA,QAAAA,CAAQ,GAAA,KAAQ,KAAK,GAAG,CAAA;AACxE,IAAA,OAAO,OAAA,GAAU,OAAA,CAAQ,KAAA,KAAU,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EAClD,CAAC,CAAA,IACD,aAAA,CAAc,IAAA,CAAK,CAAC,SAAS,CAAC,aAAA,CAAc,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,GAAA,KAAQ,KAAK,GAAG,CAAC,KACvF,0BAAA,CAA2B,IAAA;AAAA,IAAK,CAAC,eAC/B,aAAA,CAAc,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,GAAA,KAAQ,UAAA,CAAW,GAAG;AAAA,GAChE;AAEJ,CAAA;AAQA,IAAM,WAAA,GAAc,CAAC,MAAA,EAAkB,aAAA,GAA0B,EAAC,KAAe;AAE/E,EAAA,IAAI,CAAC,aAAA,EAAe,MAAA,EAAQ,OAAO,IAAA;AAEnC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAM,CAAA;AAEhC,EAAA,OAAO,cAAc,KAAA,CAAM,CAAC,SAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AAC1D,CAAA;AAQA,IAAM,YAAA,GAAe,CAAC,MAAA,EAAkB,cAAA,GAA2B,EAAC,KAAe;AAEjF,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAA,EAAQ,OAAO,IAAA;AAEpC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAM,CAAA;AAEhC,EAAA,OAAO,CAAC,eAAe,IAAA,CAAK,CAAC,SAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AAC3D,CAAA;AAEO,SAAS,QAAA,CACd,eAAA,EACA,QAAA,EACA,iBAAA,EACS;AAET,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAKzC,EAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,KAAS;AAEpC,IAAA,MAAM,YAAA,GACJ,YAAY,QAAA,EAAU,IAAA,CAAK,cAAc,CAAA,IAAK,YAAA,CAAa,QAAA,EAAU,IAAA,CAAK,iBAAiB,CAAA;AAG7F,IAAA,MAAM,cAAA,GACJ,YAAY,iBAAA,EAAmB,IAAA,CAAK,uBAAuB,CAAA,IAC3D,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,0BAA0B,CAAA;AAGjE,IAAA,OAAO,YAAA,IAAgB,cAAA;AAAA,EACzB,CAAC,CAAA;AACH;AAGA,IAAI,6BAAA,GAGO,IAAA;AAEJ,IAAM,2BAA2B,CAAC;AAAA,EACvC,wBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAIM;AAEJ,EAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU;AAAA,IAC9B,aAAA,EAAe,0BAA0B,aAAA,GACrC;AAAA,MACE,OACE,wBAAA,CAAyB,aAAA,CAAc,gBAAA,EAAkB,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACtE,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ,CAAE,KAAK;AAAC,KACZ,GACA,IAAA;AAAA,IACJ,kBAAA,EAAoB,wBAAA,EAA0B,kBAAA,EAAoB,MAAA,IAAU,CAAA;AAAA,IAC5E,eAAA,EAAiB,wBAAA,EAA0B,kBAAA,EAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,EAAK,IAAK,EAAC;AAAA,IAC3F,eAAA,EAAiB,cAAA,EAAgB,EAAA,IAAM,cAAA,EAAgB,IAAA,IAAQ,EAAA;AAAA,IAC/D;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,6BAAA,IAAiC,6BAAA,CAA8B,GAAA,KAAQ,QAAA,EAAU;AACnF,IAAA,OAAO,6BAAA,CAA8B,MAAA;AAAA,EACvC;AAGA,EAAA,MAAM,MAAA,GACJ,wBAAA,EAA0B,aAAA,EAAe,gBAAA,EACrC,MAAA;AAAA,IAAO,CAAC,IAAA,KACR,wBAAA,EAA0B,kBAAA,EAAoB,IAAA;AAAA,MAC5C,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,KAAW,IAAA,CAAK;AAAA;AACvC,GACF,CACC,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACpB,IAAA,MAAM,OAAA,GAAU,0BAA0B,kBAAA,EAAoB,IAAA;AAAA,MAC5D,CAACC,QAAAA,KAAYA,QAAAA,CAAQ,MAAA,KAAW,IAAA,CAAK;AAAA,KACvC;AACA,IAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAClC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAG,CAAA,GAC5C,MAAA;AAEJ,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,WAAA,GAAcP,yBAAAA,CAAQ,GAAA,CAAI,cAAc,KAAM,KAAA,EAAe,YAAA;AACnE,IAAA,MAAM,iBACJ,cAAA,CAAe,sBAAA,IACf,WAAA,EAAa,QAAA,CAAS,eAAe,sBAAsB,CAAA;AAE7D,IAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,iBAAA,GAAoBA,yBAAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACxD,MAAA,gBAAA,GAAmB,CAAC,CAAC,iBAAA;AAAA,IACvB;AAEA,IAAA,MAAM,gBAAA,GAAqD;AAAA,MACzD;AAAA,QACE,GAAA,EAAK,0BAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACT;AAAA,MACA,GAAI,gBAAA,GACA;AAAA,QACE,EAAE,GAAA,EAAK,0BAAA,EAA4B,KAAA,EAAO,KAAA,EAAM;AAAA,QAChD,EAAE,GAAA,EAAK,uBAAA,EAAyB,KAAA,EAAO,IAAA;AAAK,UAE9C,EAAC;AAAA,MACL,GAAI,cAAA,IAAkB,cAAA,EAAgB,gBAAA,GAClC;AAAA,QACE;AAAA,UACE,KAAK,cAAA,CAAe,gBAAA;AAAA,UACpB,OAAO,cAAA,CAAe;AAAA;AACxB,UAEF;AAAC,KACP;AAEA,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,EAAA,EAAI,OAAA,EAAS,EAAA,GAAK,GAAA,GAAM,KAAA;AAAA,MACxB,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,IAAA,EAAO,OAAA,EAAiB,IAAA,IAAS,OAAA,EAAiB,KAAA,IAAS,EAAA;AAAA,MAC3D,QAAA,EAAU,CAAA;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,IAAA,EAAM,SAAS,MAAA,IAAU,EAAA;AAAA,MACzB,OAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,gBAAgB,IAAIQ,yBAAA;AAAA,QAClB,OAAO,SAAS,KAAA,KAAU,QAAA,GAAW,SAAS,KAAA,EAAO,MAAA,IAAU,CAAA,GAAI,OAAA,EAAS,KAAA,IAAS;AAAA,QACrF,QAAA,EAAS;AAAA,MACX,SAAS,EAAC;AAAA,MACV,qBAAqB,EAAC;AAAA,MACtB,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA,EAAiB,MAAA;AAAA,MACjB,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA,EAAW,CAAC,OAAA,EAAS;AAAA,KACvB;AAAA,EACF,CAAC,KAAK,EAAC;AAGX,EAAA,6BAAA,GAAgC;AAAA,IAC9B,GAAA,EAAK,QAAA;AAAA,IACL;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAGA,IAAI,+BAAA,GAGO,IAAA;AAEJ,IAAM,6BAA6B,CAAC;AAAA,EACzC,cAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,KAIM;AAEJ,EAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU;AAAA,IAC9B,gBAAgB,cAAA,GACZ;AAAA,MACE,KAAA,EAAO,eAAe,IAAA,EAAM,eAAA;AAAA,MAC5B,KAAA,EACE,cAAA,CAAe,UAAA,EAAY,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACxC,SAAA,EAAW,KAAK,OAAA,CAAQ,EAAA;AAAA,QACxB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,QACrB,GAAA,EAAK,KAAK,OAAA,CAAQ,GAAA;AAAA,QAClB,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,QAC3B,YAAY,IAAA,CAAK;AAAA,OACnB,CAAE,KAAK;AAAC,KACZ,GACA,IAAA;AAAA,IACJ,kBAAA,EAAoB,oBAAoB,MAAA,IAAU,CAAA;AAAA,IAClD,eAAA,EAAiB,kBAAA,EAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA,CAAE,IAAA,EAAK,IAAK,EAAC;AAAA,IACjE;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,+BAAA,IAAmC,+BAAA,CAAgC,GAAA,KAAQ,QAAA,EAAU;AACvF,IAAA,OAAO,+BAAA,CAAgC,MAAA;AAAA,EACzC;AAGA,EAAA,MAAM,SACJ,cAAA,EAAgB,UAAA,EAAY,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC/C,IAAA,MAAM,OAAA,GAAU,oBAAoB,IAAA,CAAK,CAACD,aAAYA,QAAAA,CAAQ,MAAA,KAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC5F,IAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAClC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,GACpD,MAAA;AACJ,IAAA,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,OAAA,EAAS,OAAO,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,EAAA,EAAI,OAAA,EAAS,EAAA,GAAK,GAAA,GAAM,KAAA;AAAA,MACxB,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,IAAA,EAAO,OAAA,EAAiB,IAAA,IAAS,OAAA,EAAiB,KAAA,IAAS,EAAA;AAAA,MAC3D,QAAA,EAAU,CAAA;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,IAAA,EAAM,SAAS,MAAA,IAAU,EAAA;AAAA,MACzB,OAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,gBAAgB,IAAIC,yBAAA;AAAA,QAClB,OAAO,SAAS,KAAA,KAAU,QAAA,GAAW,SAAS,KAAA,EAAO,MAAA,IAAU,CAAA,GAAI,OAAA,EAAS,KAAA,IAAS;AAAA,QACrF,QAAA,EAAS;AAAA,MACX,SAAS,EAAC;AAAA,MACV,qBAAqB,EAAC;AAAA,MACtB,OAAA;AAAA,MACA,kBAAkB,IAAA,CAAK,UAAA;AAAA,MACvB,eAAA,EAAiB,MAAA;AAAA,MACjB,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA,EAAW,CAAC,OAAA,EAAS;AAAA,KACvB;AAAA,EACF,CAAC,KAAK,EAAC;AAGT,EAAA,+BAAA,GAAkC;AAAA,IAChC,GAAA,EAAK,QAAA;AAAA,IACL;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AC9TO,IAAM,mBAAA,GAAsB,CACjC,IAAA,EACA,kBAAA,EACA,UACA,KAAA,KACuB;AACvB,EAAA,MAAM,IAAA,GAAOP,aAAAA,CAAQ,MAAM,QAAA,EAAU,IAAA,IAAQ,EAAC,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,iBAAA,GAAoBA,cAAQ,MAAO,CAAC,WAAW,IAAA,GAAO,KAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAoB,EAAA;AAC1B,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AAGtC,EAAA,MAAM,iBAAA,GAAoBQ,aAGhB,IAAI,CAAA;AAGd,EAAA,MAAM,aAAA,GAAgBR,cAAQ,MAAM;AAIlC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAGhB,EAAA,MAAM,EAAE,cAAA,EAAgB,QAAA,EAAS,GAAIA,cAAQ,MAAM;AAEjD,IAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,MAAA,MAAM,EAAE,eAAA,GAAkB,EAAC,EAAG,aAAY,GAAI,QAAA;AAC9C,MAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,WAAA,IAAe,EAAC;AAG7C,MAAA,MAAM,gBAAA,GAAmB,SAAS,eAAA,EAAiB,IAAA,EAAgC,EAAE,CAAA;AAErF,MAAA,IAAI,oBAAoB,gBAAA,EAAkB;AAExC,QAAA,MAAM,eAAA,GAAkB,6BAAA;AAAA,UACtB,aAAA;AAAA,UACA,gBAAA,CAAiB,cAAc,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,UAAU,CAAA,IAAK,EAAC;AAAA,UAC/E;AAAA,YACE,gBAAA,EAAkB,gBAAA,CAAiB,YAAA,EAAc,gBAAA,IAAoB,CAAA;AAAA,YACrE,eAAA,EACE,gBAAA,CAAiB,YAAA,EAAc,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,UAAU,CAAA,IAAK,EAAC;AAAA,YACjF,iBAAA,EAAmB,gBAAA,CAAiB,YAAA,EAAc,iBAAA,IAAqB;AAAA;AACzE,SACF;AAGA,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAU,eAAA,EAAgB;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,EAC7C,GAAG,CAAC,kBAAA,EAAoB,aAAA,EAAe,IAAA,EAAM,SAAS,CAAC,CAAA;AAGvD,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAA,EAAa,GAAIA,cAAQ,MAAM;AACrD,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,cAAA,CAAe,WAAA,EAAa,kBAAkB,YAAA,EAAc;AAClF,MAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,YAAA,EAAc,IAAA,EAAK;AAAA,IACpD;AAEA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,WAAA,CAAY,gBAAA,CAAiB,YAAA;AAG9D,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,SAAS,CAAA,CACjC,KAAK,CAAC,CAAA,EAAQ,CAAA,KAAW,MAAA,CAAO,CAAA,CAAE,eAAe,IAAI,MAAA,CAAO,CAAA,CAAE,eAAe,CAAC,CAAA,CAC9E,IAAA,CAAK,CAAC,IAAA,KAAc,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA;AAG/D,IAAA,MAAM,QAAA,GAAW,UAAU,IAAA,CAAK,CAAC,SAAS,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA;AAEjF,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,YAAA,EAAc,YAAY,IAAA,EAAK;AAAA,IAChE;AAGA,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,cAAA;AAAA,MACN,UAAA,EAAY,cAAA,CAAe,WAAA,EACvB,GAAA,CAAI,CAAC,MAAA,KAAgB;AACrB,QAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,YAAA,GAAe,CAAC,CAAA;AAC5C,QAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAAA,YACjC,QAAQ,WAAA,CAAY,MAAA;AAAA,YACpB,KAAK,WAAA,CAAY;AAAA,WACnB;AAAA,UACA,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,UAC9B,UAAA,EAAY;AAAA,YACV;AAAA,cACE,GAAA,EAAK,sBAAA;AAAA,cACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,gBACpB,OAAA,EAAS,IAAA;AAAA,gBACT,SAAS,cAAA,CAAe,OAAA;AAAA,gBACxB,iBAAiB,cAAA,CAAe;AAAA,eACjC;AAAA;AACH;AACF,SACF;AAAA,MACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAqC,SAAS,IAAI;AAAA,KAC/D;AAEA,IAAA,OAAO,EAAE,cAAA,EAAgB,aAAA,EAAe,YAAA,EAAc,YAAY,IAAA,EAAK;AAAA,EACzE,CAAA,EAAG,CAAC,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAcA,cAAQ,MAAM;AAChC,IAAA,MAAM,cAAc,kBAAA,CACjB,GAAA;AAAA,MAAI,CAAC,IAAA,KACJ,IAAA,CAAK,WAAA,EAAa,kBAAkB,YAAA,EAChC,GAAA;AAAA,QAAI,CAAC,CAAA,KACL,CAAA,CAAE,WAAA,CAAY,IAAI,CAAC,MAAA,KAAW,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,QAEnF,IAAA;AAAK,MAET,IAAA,EAAK;AACR,IAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAA,MAAM,WAAA,GAAcA,cAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,KAAA;AAGhC,IAAA,IACE,iBAAA,CAAkB,OAAA,IAClB,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,OAAA,CAAQ,WAAW,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EACpF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,EAAE,MAAM,kBAAA,EAAmB,GAAIS,wBAAO,WAAA,GAAc,WAAA,GAAc,MAAM,YAAY;AACxF,IAAA,MAAM,GAAA,GAAM,MAAMC,+BAAA,CAAqB,MAAA,EAAQ;AAAA,MAC7C,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACD,CAAA;AACD,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAM,EAAC;AAG3C,IAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,MAC1B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,CAAC,GAAG,WAAW;AAAA,KAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AAID,EAAA,MAAM,uBAAA,GAA0BV,cAAQ,MAAM;AAC5C,IAAA,IAAI,iBAAA,CAAkB,OAAA,IAAW,CAAC,WAAA,EAAa;AAC7C,MAAA,OAAO,iBAAA,CAAkB,QAAQ,IAAA,IAAQ,MAAA;AAAA,IAC3C;AACA,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,kBAAA,EAAoB;AAAA,GACtB;AACF,CAAA;ACpJO,IAAM,wBAAwB,CAAC;AAAA,EACpC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR;AACF,CAAA,KAMmC;AACjC,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,aAAA,KAAkB,UAAA,EAAW;AACrD,EAAA,MAAM,SAAS,cAAA,IAAkB,aAAA;AAGjC,EAAA,MAAM,CAAC,gBAAA,EAAkB,oBAAoB,CAAA,GAAIW,eAAkB,KAAK,CAAA;AAGxE,EAAA,MAAM,iBAAA,GAAoBH,aAGhB,IAAI,CAAA;AAGd,EAAA,MAAM,aAAA,GAAgBR,cAAQ,MAAM;AAClC,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,OAAO,uBAAA,CAAwB,OAAO,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAEhB,EAAAY,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,iBAAA,GAAoBb,yBAAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACxD,MAAA,oBAAA,CAAqB,CAAC,CAAC,iBAAiB,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAKX,EAAA,MAAM,mBAAA,GAAsBC,cAAQ,MAAM;AACxC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,WAAA,GAAcD,yBAAAA,CAAQ,GAAA,CAAI,cAAc,KAAM,KAAA,EAAe,YAAA;AACnE,IAAA,IAAI,SAAS,sBAAA,IAA0B,CAAC,WAAA,EAAa,QAAA,CAAS,SAAS,sBAAsB,CAAA;AAC3F,MAAA,OAAO,KAAA;AACT,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAKb,EAAA,MAAM,CAAC,gBAAA,EAAkB,aAAa,CAAA,GAAIC,cAAQ,MAAwB;AACxE,IAAA,IAAIa,iBAAAA,GAAmB,CAAA;AACvB,IAAA,IAAIC,cAAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAAD,iBAAAA,GAAmB,GAAA;AACnB,MAAAC,cAAAA,GAAgB,EAAA;AAAA,IAClB;AACA,IAAA,aAAA,EAAe,SAAA,EAAW,OAAA,CAAQ,CAAC,EAAE,kBAAgB,KAA8D;AACjH,MAAA,gBAAA,EAAkB,OAAA,CAAQ,CAAC,EAAE,GAAA,EAAK,OAAM,KAAsC;AAC5E,QAAA,IAAI,QAAQ,0BAAA,EAA4BD,iBAAAA,GAAmB,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAC5E,QAAA,IAAI,QAAQ,uBAAA,EAAyBC,cAAAA,GAAgB,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAAA,MACxE,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,CAACD,mBAAkBC,cAAa,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,aAAA,EAAe,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAE/C,EAAA,MAAM,WAAA,GAAcd,cAAQ,MAAoB;AAC9C,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,EAAC;AAClC,IAAA,OAAA,CAAQ,UAAU,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAClD,UAAA,EAAY,IAAIO,yBAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CACpC,KAAA,CAAM,IAAIA,yBAAAA,CAAQ,aAAa,CAAC,CAAA,CAChC,SAAA,CAAU,IAAIA,yBAAAA,CAAQ,gBAAgB,CAAC,CAAA,CACvC,OAAA,CAAQ,CAAA,EAAGA,yBAAAA,CAAQ,UAAU,CAAA;AAAA,MAChC,gBAAA,EAAkB,IAAA,CAAK,gBAAA,IAAoB;AAAC,KAC9C,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAA,EAAkB,aAAa,CAAC,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAcP,aAAAA;AAAA,IAClB;AAAA;AAAA,MAEE;AAAA,QACE,GAAG,IAAI,GAAA;AAAA,UACL,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,OAAO,OAAO;AAAA;AACpF;AACF,KAAA;AAAA,IACF,CAAC,WAAW;AAAA,GACd;AAGA,EAAA,MAAM,WAAA,GAAcA,cAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,KAAA;AAGhC,IAAA,IACE,iBAAA,CAAkB,OAAA,IAClB,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,OAAA,CAAQ,WAAW,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EACpF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,aAAA,GAAgBA,cAAQ,MAA4B;AACxD,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,EAAC;AAClC,IAAA,OAAA,CAAQ,eAAe,SAAA,IAAa,EAAC,EAAG,MAAA,CAAO,CAAC,IAAA,KAA6B;AAC3E,MAAA,MAAM,SAAA,GACJ,MAAM,WAAA,IACN,MAAA,CAAO,KAAK,WAAW,CAAA,GAAI,CAAA,IAC3B,IAAA,CAAK,gBAAA,EAAkB,KAAA;AAAA,QACrB,CAAC,IAAA,KAAyC,IAAA,CAAK,GAAA,KAAQ;AAAA,OACzD;AACF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA;AAAA,QACzC,CAAC,GAAA,KACC,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,IAAI,IAAA,EAAM,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS;AAAA,OACjE;AACA,MAAA,OAAO,SAAA,IAAa,cAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,aAAA,EAAe,SAAA,EAAW,mBAAA,EAAqB,SAAS,CAAC,CAAA;AAE7D,EAAA,MAAM,gBAAA,GAAmBA,cAAQ,MAAe;AAC9C,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,IAAIO,0BAAQ,CAAC,CAAA;AAC9C,IAAA,OAAO,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,EAAM,IAAA,KAAS;AAC1C,MAAA,MAAM,MAAA,GAAS,QAAA,EAAU,cAAA,GAAiB,IAAA,CAAK,cAAc,IAAA,CAAK,cAAA;AAClE,MAAA,OAAO,IAAIA,0BAAQ,IAAI,CAAA,CAAE,KAAK,IAAIA,yBAAAA,CAAQ,MAAA,IAAU,CAAC,CAAC,CAAA;AAAA,IACxD,CAAA,EAAG,IAAIA,yBAAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,aAAA,EAAe,mBAAmB,CAAC,CAAA;AAEvC,EAAA,MAAM,CAAC,aAAA,EAAe,iBAAiB,CAAA,GAAIP,cAAQ,MAA8C;AAC/F,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,CAAC,MAAM,IAAI,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA;AAAA,MACpC,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,EAAE,UAAU,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,UAAU;AAAA,KACtD;AACA,IAAA,MAAM,aAAa,YAAA,CAAa,SAAA;AAAA,MAC9B,CAAC,KAAA,KAAU,gBAAA,CAAiB,GAAA,CAAI,IAAIO,yBAAAA,CAAQ,KAAA,CAAM,UAAU,CAAC,CAAA,IAAK,aAAA,CAAc,MAAA,GAAS;AAAA,KAC3F;AAEA,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,YAAA,CAAa,SAAS,CAAA,GAAK,YAAA,CAAa,aAAa,MAAA,GAAS,CAAC,KAAK,IAAA,GAAQ;AAAA,OAC9E;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,UAAU,CAAA,IAAK,IAAA;AACjD,IAAA,MAAM,YAAY,UAAA,GAAa,CAAA,GAAK,aAAa,UAAA,GAAa,CAAC,KAAK,IAAA,GAAQ,IAAA;AAC5E,IAAA,OAAO,CAAC,cAAc,SAAS,CAAA;AAAA,EACjC,GAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,aAAA,CAAc,MAAM,CAAC,CAAA;AAGxD,EAAA,MAAM,EAAE,MAAM,kBAAA,EAAmB,GAAIE,wBAAO,WAAA,GAAc,WAAA,GAAc,MAAM,YAAY;AACxF,IAAA,MAAM,GAAA,GAAM,MAAMC,+BAAAA,CAAqB,MAAA,EAAQ;AAAA,MAC7C,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACD,CAAA;AACD,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAM,EAAC;AAG3C,IAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,MAC1B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,CAAC,GAAG,WAAW;AAAA,KAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,uBAAA,GAA0BV,cAAQ,MAAM;AAC5C,IAAA,IAAI,iBAAA,CAAkB,OAAA,IAAW,CAAC,WAAA,EAAa;AAC7C,MAAA,OAAO,iBAAA,CAAkB,QAAQ,IAAA,IAAQ,MAAA;AAAA,IAC3C;AACA,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAIpC,EAAA,MAAM,OAAA,GAAUe,iBAAA;AAAA,IACd,CAAC,GAAuB,CAAA,KAAkC;AACxD,MAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAqC;AAExD,QAAA,IACE,KAAK,gBAAA,EAAkB,IAAA;AAAA,UACrB,CAAC,SAAA,KAA8C,SAAA,CAAU,GAAA,KAAQ;AAAA,SACnE;AAEA,UAAA,OAAO,CAAA;AAET,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,CAAC,QAAgB,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,GAAG,CAAC,CAAA;AAChF,UAAA,OAAO,CAAA;AAET,QAAA,OAAO,CAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,WAAA,CAAY,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,WAAA,EAAa,SAAS;AAAA,GACnC;AAEA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,OAAA;AAAA,IACA,iBAAA,EAAmB,cAAc,MAAA,GAAS,CAAA;AAAA,IAC1C,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA,EAAoB;AAAA,GACtB;AACF,CAAA;AClOO,SAAS,uBAAA,CACd,MAAA,EACA,oBAAA,EAIA,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AAEzD,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACvB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAA0C;AACnE,MAAA,MAAM,WAAA,GAAc,MAAMC,+BAAA,CAAqB,MAAA,EAAQ;AAAA,QACrD,GAAG,GAAA;AAAA,QACH,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,OAAA,CAAQ,GAAA,CAAI,uCAAuC,WAAW,CAAA;AAC9D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAA,CAAO,WAAW,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,MAAM;AAAA,GAC5C;AAEA,EAAA,OAAOC,gCAAAA,CAAe,wBAAA,EAA0B,gBAAA,EAAkB,OAAO,CAAA;AAC3E;ACJO,SAAS,sBAAA,CAAuB;AAAA,EACrC,aAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,MAAM,EAAE,oBAAA,EAAsB,mBAAA,EAAoB,GAAI,iBAAiB,EAAC;AAExE,EAAA,OAAOjB,cAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,cAAA,EAAgB,KAAA;AAAA,QAChB,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,KAAK,SAAA,CAAU,IAAA;AAAA,MACrC,CAAC,IAAA,KACC,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,sBAAsB,MAAA,IAC/C,IAAA,CAAK,OAAA,EAAS,GAAA,KAAQ,oBAAA,EAAsB;AAAA,KAChD;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAK,SAAA,CAAU,IAAA;AAAA,MACpC,CAAC,IAAA,KACC,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,qBAAqB,MAAA,IAC9C,IAAA,CAAK,OAAA,EAAS,GAAA,KAAQ,mBAAA,EAAqB;AAAA,KAC/C;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,eAAA;AACzB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,cAAA;AACxB,IAAA,MAAM,gBAAgB,cAAA,IAAkB,aAAA;AAExC,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,SAAA,EAAW,oBAAA,EAAsB,mBAAmB,CAAC,CAAA;AACjE;;;AChGO,IAAM,wBAAwB,MAAM;AACzC,EAAA,MAAM,UAAA,GAAaD,yBAAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaA,yBAAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQA,yBAAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAClC,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,OAAO,KAAA,GACH;AAAA,MACE,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA,EAAG;AAAA,MAC3D,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA,EAAG;AAAA,MAC5D,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,KAAA;AAAM,KAChC,GACA;AAAA,MACE,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA,EAAG;AAAA,MAC3D,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA;AAAG,KAC9D;AAAA,EACN;AACA,EAAA,OAAO,EAAC;AACV,CAAA;AAEO,IAAM,oBAAoB,CAAC;AAAA,EAChC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAK0D;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIY,eAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,sBAAA,CAAuB;AAAA,IAC/C,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAC,gBAAU,MAAM;AACd,IAAA,aAAA,CAAc,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWZ,cAAQ,MAAM;AAC7B,IAAA,IAAI,QAAA,GAAgBD,yBAAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,GAAW,IAAA,CAAK,MAAM,QAAQ,CAAA;AAC9B,MAAA,IAAI,GAAA,GAAM,OAAO,QAAA,EAAU,EAAA,IAAM,YAAY,QAAA,EAAU,EAAA,CAAG,MAAM,GAAG,CAAA;AACnE,MAAA,QAAA,CAAS,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,eAAe,QAAA,IAAY,QAAA;AACjC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,kBAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAE,MAAA,GAAS,EAAC,EAAE,GAAI,QAAA;AACxB,MAAA,IAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,KAAW,CAAA,EAAG;AAC/B,QAAA,OAAO,sBAAA;AAAA,MACT,CAAA,MAAA,IAAW,MAAA,EAAQ,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG;AACpC,QAAA,OAAO,uBAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,gBAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,gBAAA,GAAmBC,cAAQ,MAAM;AACrC,IAAA,MAAM,UAAA,GAA+C;AAAA,MACnD;AAAA,QACE,GAAA,EAAK,QAAA;AAAA,QACL,OAAO,OAAA,EAAS;AAAA;AAAA,OAClB;AAAA,MACA;AAAA,QACE,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO,aAAA,GAAgB,GAAA,GAAM,OAAA,EAAS;AAAA;AAAA,OACxC;AAAA,MACA;AAAA,QACE,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,MACA;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,MAAA,GAAS;AAAA,OACnC;AAAA,MACA;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EACE,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAA,GAAW;AAAA;AACxF,KACF;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,SAAS,KAAA,EAAO,QAAA,EAAU,aAAa,CAAC,CAAA;AAEjE,EAAA,MAAM,kBAAA,GAAqBA,cAAQ,MAAM;AACvC,IAAA,MAAM,uBAAA,GAA0B,MAAM,SAAA,CAAU,IAAA;AAAA,MAAK,CAAC,SACpD,IAAA,CAAK,gBAAA,EAAkB,KAAK,CAAC,IAAA,KAAc,IAAA,CAAK,GAAA,KAAQ,sBAAsB;AAAA,KAChF;AACA,IAAA,MAAM,aAAA,GAAgB,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAI,KAAK,EAAC;AAC9F,IAAA,OAAO,uBAAA,GACH;AAAA,MACE;AAAA,QACE,GAAA,EAAK,yBAAA;AAAA,QACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,UACpB,aAAA,EAAe,aAAA;AAAA,UACf,SAAA,EAAW,QAAA,EAAU,IAAA,IAAQ;AAAC,SAC/B;AAAA;AACH,QAEF,EAAC;AAAA,EACP,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAIT,EAAA,MAAM,iBAAA,GAAoBA,cAAQ,MAAM;AACtC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,CAAC,SAAS,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,OAAA,KAAY,SAAS;AAAA;AACxF,KACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,gBAAA,GAAmBA,cAAQ,MAAM;AACrC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,OAAO,IAAA,EAAM,SAAA,CACV,MAAA,CAAe,CAAC,KAAK,IAAA,KAAS;AAC7B,UAAA,OAAO,IAAIO,yBAAAA,CAAQ,GAAG,CAAA,CAAE,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,IAAU,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QAClE,CAAA,EAAG,CAAC,CAAA,CACH,QAAA;AAAS,OACd;AAAA,MACA;AAAA,QACE,GAAA,EAAK,kBAAA;AAAA,QACL,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,kBAAA,GAAqBP,cAAQ,MAAM;AACvC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAOA,aAAAA;AAAA,IACL,OAAO;AAAA,MACL,UAAA,EAAY;AAAA,QACV,GAAG,gBAAA;AAAA,QACH,GAAG,kBAAA;AAAA,QACH,GAAG,iBAAA;AAAA,QACH,GAAG,gBAAA;AAAA,QACH,GAAG,kBAAA;AAAA,QACH,GAAG,qBAAA;AAAsB,OAC3B,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,MAAM,KAAK;AAAA,KAChC,CAAA;AAAA,IACA,CAAC,gBAAA,EAAkB,kBAAA,EAAoB,iBAAA,EAAmB,kBAAkB,kBAAkB;AAAA,GAChG;AACF,CAAA;AChKO,IAAM,oCAAoC,CAAC;AAAA,EAChD,IAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KASM;AACJ,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAkB,GAAI,UAAA,EAAW;AAEjD,EAAA,MAAM,wBAAA,GAA2BA,aAAAA;AAAA,IAC/B,MACE,MAAM,aAAA,CACH,MAAA;AAAA,MACC,CAAC,EAAE,IAAA,EAAM,UAAA,EAAW,KAClB,UAAA,IAAc,iBAAA,CAAkB,IAAA,CAAK,CAAC,UAAA,KAAe,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC;AAAA,MAEnF,GAAA,CAAI,CAAC,EAAE,IAAA,OAAW,IAAI,CAAA;AAAA,IAC3B,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,eAAA,GAAkBA,aAAAA;AAAA,IACtB,MACE,IAAA,EAAM,SAAA,CACH,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,iBAAwD,EAAC;AAC/D,MAAA,MAAM,iBAAiB,EAAC;AAExB,MAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAqB,IAAA;AAAA,QAAK,CAAC,UAAA,KACnD,wBAAA,EAA0B,QAAA,CAAS,WAAW,IAAI;AAAA,OACpD;AAGA,MAAA,MAAM,uBAAA,GAA0B,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACrD,CAAC,IAAA,KAAyC,IAAA,CAAK,GAAA,KAAQ;AAAA,OACzD;AACA,MAAA,MAAM,gBAAA,GAAmB,4BAAA,CAA6B,IAAA,CAAK,gBAAgB,CAAA;AAE3E,MAAA,MAAM,8BACJ,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,CAAA,KAAM,MAAA,CAAO,KAAK,WAAW,CAAA;AAExE,MAAA,IAAI,CAAC,+BAA+B,uBAAA,EAAyB;AAC3D,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,GAAA,EAAK,sBAAA;AAAA,UACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,YACpB,GAAG,gBAAA;AAAA,YACH,iBAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,WAAW;AAAA,WAC3C;AAAA,SACF,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,kBAAA,GAAqB,cAAc,MAAA,IAAU,CAAA;AAEnD,MAAA,MAAM,sBAAA,GAAyB,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACpD,CAAC,IAAA,KACC,IAAA,CAAK,GAAA,KAAQ,eAAA,IAAmB,KAAK,GAAA,KAAQ;AAAA,OACjD;AAEA,MAAA,MAAM,0BAAA,GACJ,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACrB,CAAC,SACC,IAAA,CAAK,GAAA,KAAQ,mBAAmB,IAAA,CAAK,KAAA,KAAU,OAAO,kBAAkB;AAAA,OAC5E,IACA,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACrB,CAAC,SACC,IAAA,CAAK,GAAA,KAAQ,0BAA0B,IAAA,CAAK,KAAA,KAAU,OAAO,kBAAkB;AAAA,OACnF;AAEF,MAAA,IAAI,YAAA,IAAgB,CAAC,0BAAA,EAA4B;AAC/C,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,GAAA,EAAK,eAAA;AAAA,UACL,KAAA,EAAO,OAAO,kBAAkB;AAAA,SACjC,CAAA;AACD,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,GAAA,EAAK,sBAAA;AAAA,UACL,KAAA,EAAO,OAAO,kBAAkB;AAAA,SACjC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,CAAC,YAAA,IAAgB,sBAAA,EAAwB;AAElD,QAAA,cAAA,CAAe,KAAK,eAAe,CAAA;AACnC,QAAA,cAAA,CAAe,KAAK,sBAAsB,CAAA;AAAA,MAC5C;AAEA,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA,CACA,MAAA;AAAA,MACC,CAAC,EAAE,cAAA,EAAgB,gBAAe,KAAM,cAAA,CAAe,UAAU,cAAA,CAAe;AAAA,MAEjF,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,cAAA,EAAgB,gBAAe,KAAM;AACjD,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,UAAA,EAAY;AAAA,YACV,GAAI,KAAK,gBAAA,EAAkB,MAAA;AAAA,cACzB,CAAC,IAAA,KACC,CAAC,cAAA,CAAe,IAAA,CAAK,CAAC,UAAA,KAAe,UAAA,CAAW,GAAA,KAAQ,IAAA,CAAK,GAAG;AAAA,iBAC/D,EAAC;AAAA,YACN,GAAG;AAAA;AACL,SACF;AAAA,MACF,CAAA,MAAA,IAAW,eAAe,MAAA,EAAQ;AAChC,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,UAAA,EACE,KAAK,gBAAA,EAAkB,MAAA;AAAA,YACrB,CAAC,IAAA,KAAyC,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,GAAG;AAAA,eACxE;AAAC,SACV;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,UAAA,EAAY,IAAA,CAAK,gBAAA,IAAoB;AAAC,SACxC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IACL,CAAC,IAAA,EAAM,SAAA,EAAW,wBAAwB;AAAA,GAC5C;AAEA,EAAA,MAAM,EAAE,SAAQ,GAAIkB,iBAAA;AAAA,IAClB,YAAY;AACV,MAAA,IAAI,eAAA,EAAiB,MAAA,IAAU,CAAC,aAAA,EAAe;AAC7C,QAAA,MAAM,MAAA,GAAS,MAAMC,0BAAAA,CAAgB,MAAA,EAAQ;AAAA,UAC3C,MAAA,EAAQ,MAAM,EAAA,IAAM,EAAA;AAAA,UACpB,KAAA,EAAO,eAAA;AAAA,UACP,oBAAA;AAAA,UACA,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,UAAA,CAAW,MAAM,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAc,GAAA;AAAA;AAAA,MACd,gBAAA,EAAkB,IAAA;AAAA,MAClB,WAAA,EAAa,CAAC,eAAA,EAAiB,aAAa;AAAA;AAC9C,GACF;AAEA,EAAAP,gBAAU,MAAM;AACd,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAc;AAC7B,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,yBAAA,EAA2B;AAAA,OAC7B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAC/B,CAAA;ACxFA,IAAM,qBAAqB,OAImC;AAAA,EAC5D,OAAA,EAAS,EAAA;AAAA,EACT,sBAAsB,EAAC;AAAA,EACvB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,oBAAA,EAAsB,KAAA;AAAA,EACtB,yBAAyB,MAAM;AAAA,EAAC,CAAA;AAAA,EAChC,qBAAA,EAAuB,KAAA;AAAA,EACvB,0BAA0B,MAAM;AAAA,EAAC,CAAA;AAAA,EACjC,sBAAA,EAAwB,MAAA;AAAA,EACxB,2BAA2B,MAAM;AAAA,EAAC,CAAA;AAAA,EAClC,kBAAA,EAAoB,KAAA;AAAA,EACpB,uBAAuB,MAAM;AAAA,EAAC,CAAA;AAAA,EAC9B,sBAAA,EAAwB,MAAA;AAAA,EACxB,2BAA2B,MAAM;AAAA,EAAC,CAAA;AAAA,EAClC,OAAA,EAAS,KAAA;AAAA,EACT,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,sBAAA,EAAwB,KAAA;AAAA,EACxB,2BAA2B,MAAM;AAAA,EAAC,CAAA;AAAA,EAClC,SAAS,EAAC;AAAA,EACV,SAAS,EAAC;AAAA,EACV,sBAAA,EAAwB;AAAA,IACtB,qBAAqB,EAAC;AAAA,IACtB,wBAAwB,EAAC;AAAA,IACzB,aAAA,EAAe,KAAA;AAAA,IACf,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,yBAAA,EAA2B,IAAA;AAAA,EAC3B,oBAAoB,EAAC;AAAA,EACrB,qBAAA,EAAuB,KAAA;AAAA,EACvB,0BAA0B,MAAM;AAAA,EAAC,CAAA;AAAA,EACjC,kBAAA,EAAoB,KAAA;AAAA,EACpB,uBAAuB,MAAM;AAAA,EAAC,CAAA;AAAA,EAC9B,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA,CAAA;AAEiCd,mBAAAA,CAAsC,kBAAA,EAAoB;AChC3F,IAAM,WAAA,GAAcA,oBAAuC,IAAI,CAAA;AA8CxD,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA;AAAA,EAEA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAkB,GAAI,UAAA,EAAW;AAGjD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIa,cAAAA,CAA2B,EAAE,CAAA;AAC7E,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAAIA,cAAAA;AAAA,IAClE;AAAC,GACH;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,cAAAA,CAAuB;AAAA,IAC7D,uBAAA,EAAyB,KAAA;AAAA,IACzB,yBAAA,EAA2B,KAAA;AAAA,IAC3B,uBAAA,EAAyB,KAAA;AAAA,IACzB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,cAAAA,CAAgB,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,cAAAA,CAAgB,EAAE,CAAA;AAE1E,EAAA,MAAM;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV,GAAIO,iBAAAA;AAAA,IACF,YAAY;AACV,MAAA,OAAOE,mBAAQ,MAAA,EAAQ;AAAA,QACrB,aAAA,EAAe,iBAAA;AAAA,QACf;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,CAAC,MAAM;AAAA;AACtB,GACF;AAGA,EAAA,MAAM,EAAE,OAAA,EAAS,gBAAA,EAAiB,GAAI,uBAAA,CAAwB,YAAY,oBAAoB,CAAA;AAE9F,EAAA,MAAM,EAAE,YAAW,GAAI,iBAAA,CAAkB,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,CAAA;AAEnF,EAAAF,iBAAAA;AAAA,IACE,MAAM;AAEJ,MAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,UAAA,EAAY,GAAG,gBAAgB,CAAA;AAEzD,MAAA,MAAM,UAAA,GACJ,QACA,CAAC,2BAAA;AAAA,QACC,IAAA,CAAK,gBAAA;AAAA,QACL,aAAA;AAAA,QACA;AAAA,OACF;AAGF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,OAAO,gBAAA,CAAiB,EAAE,UAAA,EAAY,aAAA,EAAe,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAc,GAAA;AAAA;AAAA,MACd,gBAAA,EAAkB,IAAA;AAAA,MAClB,eAAA,EAAiB,KAAA;AAAA,MACjB,WAAA,EAAa,CAAC,UAAA,EAAY,gBAAgB;AAAA;AAC5C,GACF;AAGA,EAAA,iCAAA,CAAkC;AAAA,IAChC,IAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAe,aAAA,IAAiB,cAAA;AAAA,IAChC;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,sBAAA,GAAyBH,iBAAAA;AAAA,IAC7B,CAACM,WAAAA,KAAkC;AACjC,MAAA,6BAAA,CAA8BA,WAAU,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,6BAA6B;AAAA,GAChC;AAEA,EAAA,MAAM,mBAAA,GAAsBN,iBAAAA;AAAA,IAC1B,CAACM,WAAAA,KAAiC;AAChC,MAAA,MAAM,iBAAiBA,WAAAA,CAAW,MAAA;AAAA,QAAO,CAAC,SACxC,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAG;AAAA,OACjD;AAEA,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,UAAA,MAAM,oBAAoB,IAAA,CAAK,MAAA;AAAA,YAC7B,CAAC,IAAA,KAAS,CAAC,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAG;AAAA,WAC1D;AACA,UAAA,OAAO,CAAC,GAAG,iBAAA,EAAmB,GAAGA,WAAU,CAAA;AAAA,QAC7C,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAGA,WAAU,CAAC,CAAA;AAAA,MACxD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,6BAA6B,mBAAA,CAAoB,IAAA,EAAM,kBAAA,IAAsB,IAAI,QAAQ,CAAA;AAC/F,EAAA,MAAM,2BAA2B,qBAAA,CAAsB;AAAA,IACrD,UAAU,mBAAA,IAAuB,IAAA;AAAA,IACjC,SAAA,EAAW,wBAAA;AAAA,IACX;AAAA,GACD,CAAA;AAED,EAAA,MAAM,oBAAA,GAAuBrB,cAAQ,MAAM;AACzC,IAAA,OAAO,wBAAA,CAAyB;AAAA,MAC9B,wBAAA;AAAA,MACA,cAAA,EAAgB,mBAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,wBAAA,EAA0B,mBAAA,EAAqB,MAAM,CAAC,CAAA;AAE1D,EAAA,MAAM,sBAAA,GAAyBA,cAAQ,MAAM;AAC3C,IAAA,OAAO,0BAAA,CAA2B;AAAA,MAChC,cAAA,EAAgB,4BAA4B,cAAA,IAAkB,IAAA;AAAA,MAC9D,kBAAA,EAAqB,0BAAA,EAA4B,kBAAA,IAAgC,EAAC;AAAA,MAClF;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,0BAAA,EAA4B,MAAM,CAAC,CAAA;AAGvC,EAAAY,gBAAU,MAAM;AACd,IAAA,IACE,aAAa,gBAAA,IACb,YAAA,CAAa,2BACb,YAAA,CAAa,yBAAA,IACb,aAAa,uBAAA,EACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,qBAAA,CAAsB,oBAAoB,CAAA;AAC1C,IAAA,uBAAA,CAAwB,sBAAsB,CAAA;AAAA,EAChD,CAAA,EAAG;AAAA,IACD,oBAAA;AAAA,IACA,sBAAA;AAAA,IACA,YAAA,CAAa,gBAAA;AAAA,IACb,YAAA,CAAa,uBAAA;AAAA,IACb,YAAA,CAAa,yBAAA;AAAA,IACb,YAAA,CAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,sBAAA,GAAyBZ,cAAQ,MAAM;AAC3C,IAAA,MAAM,iBAAA,GAAoB,MAAM,SAAA,CAAU,MAAA;AAAA,MAAO,CAAC,IAAA,KAChD,IAAA,CAAK,gBAAA,EAAkB,IAAA;AAAA,QAAK,CAAC,SAC3B,CAAC,sBAAA,EAAwB,wBAAwB,CAAA,CAAE,QAAA,CAAS,KAAK,GAAG;AAAA;AACtE,KACF;AACA,IAAA,MAAM,SAAS,CAAC,GAAG,kBAAA,EAAoB,GAAG,oBAAoB,CAAA,CAAE,MAAA;AAAA,MAC9D,CAAC,IAAA;AAAA;AAAA,QAEC,CAAC,iBAAA,EAAmB,IAAA,CAAK,CAAC,IAAA,KAAS;AACjC,UAAA,OACE,IAAA,CAAK,cAAc,IAAA,CAAK,IAAA,CAAK,aAC7B,IAAA,CAAK,gBAAA,EAAkB,IAAA,CAAK,CAAC,IAAA,KAAc;AACzC,YAAA,IAAI,IAAA,CAAK,QAAQ,yBAAA,EAA2B;AAC1C,cAAA,OAAO,4BAAA,CAA6B,IAAA,CAAK,gBAAgB,CAAA,CAAE,OAAA;AAAA,YAC7D;AAEA,YAAA,OAAO,KAAA;AAAA,UACT,CAAC,CAAA;AAAA,QAEL,CAAC;AAAA;AAAA,KACL;AACA,IAAA,OAAO,MAAA;AAAA,EACT,GAAG,CAAC,IAAA,EAAM,SAAA,EAAW,kBAAA,EAAoB,oBAAoB,CAAC,CAAA;AAE9D,EAAA,MAAM,KAAA,GAAQA,aAAAA;AAAA,IACZ,OAAO;AAAA,MACL,IAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA,EAAc,SAAA;AAAA,MACd,UAAA;AAAA,MACA,mBAAA;AAAA,MACA,sBAAA;AAAA,MACA,mBAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA;AAAA,MAEA,oBAAA;AAAA,MACA,0BAAA;AAAA,MACA,uBAAA;AAAA;AAAA,MAEA,kBAAA;AAAA,MACA,wBAAA;AAAA,MACA,qBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,MACA,sBAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA;AAAA,MAEA,oBAAA;AAAA,MACA,0BAAA;AAAA,MACA,uBAAA;AAAA;AAAA,MAEA,kBAAA;AAAA,MACA,wBAAA;AAAA,MACA,qBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBAAOE,cAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAaO,SAAS,cAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAUC,iBAAW,WAAW,CAAA;AAEtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,OAAA;AACT","file":"index.js","sourcesContent":["import { createContext } from 'react'\nimport type { ShopifyClient, ShopifyConfig } from '@anker-in/shopify-sdk'\nimport type {\n CookieAdapter,\n RouterAdapter,\n UserContextAdapter,\n CartCookieAdapter,\n} from '../adapters'\n\nexport interface ShopifyContextValue {\n client: ShopifyClient\n config: ShopifyConfig\n locale: string\n locales?: string[]\n cookieAdapter: CookieAdapter\n cartCookieAdapter: CartCookieAdapter\n routerAdapter?: RouterAdapter\n userAdapter?: UserContextAdapter\n}\n\nexport const ShopifyContext = createContext<ShopifyContextValue | null>(null)\n","import Cookies from 'js-cookie'\nimport type { CookieAdapter, CookieOptions } from './types'\n\n/**\n * Browser cookie adapter using js-cookie\n */\nexport const browserCookieAdapter: CookieAdapter = {\n get(key: string): string | undefined {\n return Cookies.get(key)\n },\n\n set(key: string, value: string, options?: CookieOptions): void {\n Cookies.set(key, value, {\n domain: options?.domain,\n path: options?.path || '/',\n expires: options?.expires,\n secure: options?.secure,\n sameSite: options?.sameSite,\n })\n },\n\n remove(key: string): void {\n Cookies.remove(key)\n },\n}\n","import Cookies from 'js-cookie'\nimport type { CartCookieAdapter } from '@anker-in/shopify-sdk'\n\n/**\n * Cookie name mapping for cart IDs by locale\n * Format: {locale}-shopify-cart-id\n */\nfunction getCartCookieName(locale: string): string {\n return `${locale}-shopify-cart-id`\n}\n\n/**\n * Browser cart cookie adapter using js-cookie\n * Manages cart ID storage across different locales\n */\nexport const browserCartCookieAdapter: CartCookieAdapter = {\n getCartId(locale: string): string | undefined {\n return Cookies.get(getCartCookieName(locale))\n },\n\n setCartId(locale: string, cartId: string): void {\n Cookies.set(getCartCookieName(locale), cartId, {\n path: '/',\n expires: 30, // 30 days\n })\n },\n\n removeCartId(locale: string): void {\n Cookies.remove(getCartCookieName(locale))\n },\n}\n","import React, { PropsWithChildren, useMemo } from 'react'\nimport { createShopifyClient, type CartCookieAdapter, ShopifyConfig } from '@anker-in/shopify-sdk'\nimport { ShopifyContext } from './context'\nimport { browserCookieAdapter, browserCartCookieAdapter } from '../adapters'\nimport type { CookieAdapter, RouterAdapter, UserContextAdapter } from '../adapters'\n\nexport interface ShopifyProviderProps {\n config: ShopifyConfig\n locale: string\n locales?: string[]\n cookieAdapter?: CookieAdapter\n cartCookieAdapter?: CartCookieAdapter\n routerAdapter?: RouterAdapter\n userAdapter?: UserContextAdapter\n children: React.ReactNode\n}\n\n/**\n * Shopify Provider Component\n * Provides Shopify context to all child components\n */\nexport function ShopifyProvider({\n config,\n locale,\n locales,\n cookieAdapter = browserCookieAdapter,\n cartCookieAdapter = browserCartCookieAdapter,\n routerAdapter,\n userAdapter,\n children,\n}: ShopifyProviderProps) {\n const client = useMemo(() => {\n return createShopifyClient(config, locale)\n }, [config, locale])\n\n const value = useMemo(() => {\n return {\n client,\n config,\n locale,\n locales: locales || config.getLocales(),\n cookieAdapter,\n cartCookieAdapter,\n routerAdapter,\n userAdapter,\n }\n }, [\n client,\n config,\n locale,\n locales,\n cookieAdapter,\n cartCookieAdapter,\n routerAdapter,\n userAdapter,\n ])\n\n return <ShopifyContext.Provider value={value}>{children}</ShopifyContext.Provider>\n}\n","import { useContext } from 'react'\nimport { ShopifyContext } from './context'\n\n/**\n * Hook to access Shopify context\n * @throws Error if used outside ShopifyProvider\n */\nexport function useShopify() {\n const context = useContext(ShopifyContext)\n\n if (!context) {\n throw new Error('useShopify must be used within a ShopifyProvider')\n }\n\n return context\n}\n","import { SWRMutationConfiguration } from 'swr/mutation'\n\nexport const currencyCodeMapping = {\n us: 'USD',\n ca: 'CAD',\n gb: 'GBP',\n eu: 'EUR',\n au: 'AUD',\n nz: 'NZD',\n de: 'EUR',\n fr: 'EUR',\n es: 'EUR',\n it: 'EUR',\n nl: 'EUR',\n pl: 'EUR',\n ro: 'EUR',\n} as Record<string, string>\n\nexport const defaultSWRMutationConfiguration: SWRMutationConfiguration<any, any, any, any, any> & {\n throwOnError?: boolean\n} = {\n throwOnError: false,\n}\n\n// Shopify 常量定义\nexport const CUSTOMER_ATTRIBUTE_KEY = '_discounts_function_env'\nexport const CUSTOMER_SCRIPT_GIFT_KEY = '_giveaway_gradient_gifts'\n\nexport const CODE_AMOUNT_KEY = '_sku_code_money'\nexport const SCRIPT_CODE_AMOUNT_KEY = '_code_money'\n\n// 主产品公开 code\nexport const MAIN_PRODUCT_CODE = ['WS24', 'WSTD', 'WS7D', 'WSCP', 'WSPE', 'WSPD']\n","import type { NormalizedLineItem } from '@anker-in/shopify-sdk'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\n\n/**\n * Normalize AddToCartLineItem[] to NormalizedLineItem[] format\n * This is used to calculate gifts from lines before they are added to cart\n */\nexport function normalizeAddToCartLines(lines: AddToCartLineItem[]): NormalizedLineItem[] {\n return lines\n .filter((line) => line.variant?.id)\n .map((line, index) => {\n const variant = line.variant!\n const product = variant.product\n const quantity = line.quantity || 1\n\n // Calculate prices\n const price = variant.finalPrice?.amount\n ? Number(variant.finalPrice.amount)\n : variant.compareAtPrice?.amount\n ? Number(variant.compareAtPrice.amount)\n : variant.price?.amount\n ? Number(variant.price.amount)\n : 0\n\n const subtotalAmount = price * quantity\n const totalAmount = subtotalAmount // No discounts before adding to cart\n\n return {\n id: `temp-line-${index}-${variant.id}`, // Temporary ID for pre-cart lines\n name: product?.title || variant.title || '',\n quantity,\n variantId: variant.id,\n productId: product?.id || variant.id.split('/').slice(0, -2).join('/'),\n totalAmount,\n subtotalAmount,\n discountAllocations: [],\n customAttributes: line.attributes || [],\n variant: {\n id: variant.id,\n price,\n listPrice: variant.compareAtPrice?.amount ? Number(variant.compareAtPrice.amount) : 0,\n sku: variant.sku || '',\n name: variant.title || '',\n image: variant.image\n ? {\n url: variant.image.url,\n altText: variant.image.altText || undefined,\n }\n : undefined,\n requiresShipping: false, // Default value, not available in NormalizedProductVariant\n availableForSale: variant.availableForSale ?? true,\n quantityAvailable: variant.quantityAvailable ?? 0,\n currentlyNotInStock: false, // Default value, will be updated when added to cart\n weight: variant.weight,\n metafields: variant.metafields,\n },\n product: product,\n path: product?.handle ? `/products/${product.handle}` : '',\n discounts: [],\n options: variant.selectedOptions?.map((opt: any) => ({\n name: opt.name,\n value: opt.value,\n })),\n }\n })\n}\n\n/**\n * Create a mock cart structure from AddToCartLineItem[]\n * This is useful for calculating gifts before actual cart operations\n */\nexport function createMockCartFromLines(lines: AddToCartLineItem[], existingCart?: any): any {\n const normalizedLines = normalizeAddToCartLines(lines)\n\n const subtotalPrice = normalizedLines.reduce((sum, line) => sum + line.subtotalAmount, 0)\n\n const totalPrice = normalizedLines.reduce((sum, line) => sum + line.totalAmount, 0)\n\n return {\n id: existingCart?.id || 'temp-cart-id',\n customerId: existingCart?.customerId,\n email: existingCart?.email,\n createdAt: existingCart?.createdAt || new Date().toISOString(),\n currency: existingCart?.currency || { code: 'USD' },\n taxesIncluded: existingCart?.taxesIncluded,\n lineItems: normalizedLines,\n totalLineItemsDiscount: 0,\n orderDiscounts: 0,\n lineItemsSubtotalPrice: subtotalPrice,\n subtotalPrice,\n totalPrice,\n totalTaxAmount: 0,\n discountCodes: existingCart?.discountCodes || [],\n discountAllocations: [],\n url: existingCart?.url || '',\n ready: true,\n customAttributes: existingCart?.customAttributes,\n }\n}\n","export const getQuery = (): Record<string, string> => {\n const url = typeof window !== 'undefined' ? window.location.search : ''\n const theRequest: Record<string, string> = {}\n if (url.indexOf('?') != -1) {\n const str = url.substr(1),\n strs = str.split('&')\n for (let i = 0; i < strs.length; i++) {\n const parts = strs[i]?.split('=')\n const key = parts?.[0]\n const value = parts?.[1]\n if (key && value) {\n theRequest[key] = decodeURIComponent(value)\n }\n }\n }\n return theRequest\n}\n\nexport function atobID(id: string) {\n if (id && typeof id === 'string' && id.includes('/')) {\n return id.split('/').pop()?.split('?')?.shift()\n } else {\n return id\n }\n}\n\nexport function btoaID(id: string, type: 'ProductVariant' | 'Product' = 'ProductVariant') {\n return `gid://shopify/${type}/${id}`\n}\n\n// Export normalize utilities\nexport * from './normalize-add-to-cart-lines'\n","import {\n AutoFreeGiftMainProduct,\n SpendMoneyType,\n RuleCondition,\n FormattedGift,\n} from '../types/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { atobID } from './index'\nimport type { UseScriptAutoFreeGiftResult } from '../feature/use-script-auto-free-gift'\nimport Cookies from 'js-cookie'\nimport Decimal from 'decimal.js'\nimport { getQuery } from './index'\nimport { Attribute, NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport const getMatchedMainProductSubTotal = (\n cartData: any,\n variant_list: AutoFreeGiftMainProduct['variant_id_list'],\n main_product: AutoFreeGiftMainProduct\n) => {\n const isAllStoreVariant = main_product?.all_store_variant ?? false\n const matchedList = cartData?.lineItems?.filter((line: any) => {\n // 包含在主商品列表中\n const { is_gift } = getDiscountEnvAttributeValue(line.customAttributes) // 获取折扣环境属性值\n return isAllStoreVariant\n ? !is_gift\n : variant_list?.find((item: any) => {\n return !is_gift && atobID(line.variantId) === item\n })\n })\n return (\n matchedList?.reduce((acc: number, line: any) => {\n return (\n acc +\n (main_product?.spend_money_type === SpendMoneyType.ORIGIN_PRICE\n ? Number(line.subtotalAmount) || 0\n : Number(line.totalAmount) || 0)\n )\n }, 0) || 0 // 计算总金额\n )\n}\n\nexport const safeParse = (str: string) => {\n try {\n return JSON.parse(str)\n } catch (err) {\n return {}\n }\n}\n\nexport const getDiscountEnvAttributeValue = (\n // 函数接受一个名为 attributes 的参数,其类型为包含 key 和 value 字符串属性的对象数组,默认值为空数组\n attributes: { key: string; value: string }[] = []\n) => {\n // 在 attributes 数组中查找 key 值等于 CUSTOMER_ATTRIBUTE_KEY 的对象,并将其赋值给 attr 变量\n const attr = attributes.find((attr) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n // 尝试解析 attr 对象的 value 属性为 JSON,如果解析失败或 attr 不存在,则返回一个空对象\n return safeParse(attr?.value ?? '') ?? {}\n}\n\nexport const checkAttributesUpdateNeeded = (\n oldAttributes: Attribute[],\n newAttributes: Attribute[],\n customAttributesNeedRemove: { key: string }[]\n) => {\n // 判断是否需要更新 attributes,需要更新的场景有:\n // 1. 有新的 attribute\n // 2. 有旧的 attribute 的 value 发生变化\n // 3. 有需要删除的 attribute, 且旧 attributes 中存在该 key\n return (\n oldAttributes.some((attr) => {\n const newAttr = newAttributes.find((newAttr) => newAttr.key === attr.key)\n return newAttr ? newAttr.value !== attr.value : true\n }) ||\n newAttributes.some((attr) => !oldAttributes.some((oldAttr) => oldAttr.key === attr.key)) ||\n customAttributesNeedRemove.some((removeAttr) =>\n oldAttributes.some((oldAttr) => oldAttr.key === removeAttr.key)\n )\n )\n}\n\n/**\n * 检查 source 数组是否包含 requiredItems 数组中的所有元素。\n * @param source - 源数据数组,例如用户的标签列表。\n * @param requiredItems - 必须包含的项的数组。\n * @returns boolean\n */\nconst containsAll = (source: string[], requiredItems: string[] = []): boolean => {\n // 如果没有必须包含的项,则条件默认满足。\n if (!requiredItems?.length) return true\n\n const sourceSet = new Set(source)\n // 检查每一个 requiredItem 是否都存在于 sourceSet 中。\n return requiredItems.every((item) => sourceSet.has(item))\n}\n\n/**\n * 检查 source 数组是否不包含 forbiddenItems 数组中的任何元素。\n * @param source - 源数据数组。\n * @param forbiddenItems - 禁止包含的项的数组。\n * @returns boolean\n */\nconst containsNone = (source: string[], forbiddenItems: string[] = []): boolean => {\n // 如果没有禁止的项,则条件默认满足。\n if (!forbiddenItems?.length) return true\n\n const sourceSet = new Set(source)\n // 只要在 sourceSet 中找到任何一个 forbiddenItem,条件就不满足。\n return !forbiddenItems.some((item) => sourceSet.has(item))\n}\n\nexport function preCheck(\n rule_conditions: RuleCondition[],\n userTags: string[],\n currentDealsTypes: string[]\n): boolean {\n // 1. 处理边界情况 (Guard Clauses),保持不变\n if (!Array.isArray(rule_conditions)) return false\n if (rule_conditions.length === 0) return true\n\n // 2. 使用 .some() 替代 for...of 循环和 break\n // .some() 会在找到第一个满足条件的元素后立即返回 true,并停止遍历,\n // 这完美地复刻了 for + break 的行为。\n return rule_conditions.some((rule) => {\n // 检查标签条件是否满足\n const tagsAreValid =\n containsAll(userTags, rule.with_user_tags) && containsNone(userTags, rule.without_user_tags)\n\n // 检查URL参数条件是否满足\n const paramsAreValid =\n containsAll(currentDealsTypes, rule.with_special_url_params) &&\n containsNone(currentDealsTypes, rule.without_special_url_params)\n\n // 只有当两个条件都满足时,此规则才算匹配\n return tagsAreValid && paramsAreValid\n })\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatScriptAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatScriptAutoFreeGift = ({\n scriptAutoFreeGiftResult,\n gradient_gifts,\n locale,\n}: {\n scriptAutoFreeGiftResult: UseScriptAutoFreeGiftResult\n gradient_gifts: any\n locale: string\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n freeGiftLevel: scriptAutoFreeGiftResult?.freeGiftLevel\n ? {\n items:\n scriptAutoFreeGiftResult.freeGiftLevel.giveawayProducts?.map((item) => ({\n handle: item.handle,\n sku: item.sku,\n quantity: 1,\n })) || [],\n }\n : null,\n giftProductsLength: scriptAutoFreeGiftResult?.giftProductsResult?.length || 0,\n giftProductsIds: scriptAutoFreeGiftResult?.giftProductsResult?.map((p) => p.id).sort() || [],\n gradientGiftsId: gradient_gifts?.id || gradient_gifts?.name || '',\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatScriptAutoFreeGiftCache && formatScriptAutoFreeGiftCache.key === cacheKey) {\n return formatScriptAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n scriptAutoFreeGiftResult?.freeGiftLevel?.giveawayProducts\n ?.filter((item) =>\n scriptAutoFreeGiftResult?.giftProductsResult?.some(\n (product) => product.handle === item.handle\n )\n )\n .map((item, index) => {\n const product = scriptAutoFreeGiftResult?.giftProductsResult?.find(\n (product) => product.handle === item.handle\n )\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.sku)\n : undefined\n\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n const addUTMFreeItem =\n gradient_gifts.activityAvailableQuery &&\n utmCampaign?.includes(gradient_gifts.activityAvailableQuery)\n\n let points_subscribe = false\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n points_subscribe = !!isPointsSubscribe\n }\n\n const customAttributes: { key: string; value: string }[] = [\n {\n key: '_giveaway_gradient_gifts',\n value: '_giveaway_gradient_gifts',\n },\n ...(points_subscribe\n ? [\n { key: '_amount_upgrade_multiple', value: '1.2' },\n { key: '_amount_upgrade_value', value: '40' },\n ]\n : []),\n ...(addUTMFreeItem && gradient_gifts?.activityQroperty\n ? [\n {\n key: gradient_gifts.activityQroperty,\n value: gradient_gifts.activityQroperty,\n },\n ]\n : []),\n ]\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatScriptAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatFunctionAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatFunctionAutoFreeGift = ({\n qualifyingGift,\n giftProductsResult,\n locale,\n}: {\n locale: string\n qualifyingGift?: FormattedGift | null\n giftProductsResult?: NormalizedProduct[] | []\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n qualifyingGift: qualifyingGift\n ? {\n spend: qualifyingGift.tier?.spend_sum_money,\n items:\n qualifyingGift.itemsToAdd?.map((item) => ({\n variantId: item.variant.id,\n handle: item.variant.handle,\n sku: item.variant.sku,\n quantity: item.quantity ?? 1,\n attributes: item.attributes,\n })) || [],\n }\n : null,\n giftProductsLength: giftProductsResult?.length || 0,\n giftProductsIds: giftProductsResult?.map((p) => p.id).sort() || [],\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatFunctionAutoFreeGiftCache && formatFunctionAutoFreeGiftCache.key === cacheKey) {\n return formatFunctionAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n qualifyingGift?.itemsToAdd?.map((item, index) => {\n const product = giftProductsResult?.find((product) => product.handle === item.variant.handle)\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.variant.sku)\n : undefined\n console.log('qualifyingGift variant', product, variant)\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes: item.attributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatFunctionAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n","import { useMemo, useRef } from 'react'\nimport {\n FunctionGiftResult,\n FormattedGift,\n CartLineInput,\n AutoFreeGiftConfig,\n} from '../types/auto-free-gift'\nimport { preCheck, getMatchedMainProductSubTotal } from '../utils/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { btoaID } from '../utils'\nimport { getProductsByHandles } from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n/**\n * [计算型 Hook]\n * 根据购物车、活动配置和用户信息,计算出应得的赠品和下一个目标。\n * 此 Hook 不产生任何副作用。\n * 使用示例:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig);\n *\n * 也可以传入 lines 参数来计算加购前的赠品:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig, customer, lines);\n */\nexport const useCalcAutoFreeGift = (\n cart: any,\n autoFreeGiftConfig: AutoFreeGiftConfig,\n customer: any,\n lines?: AddToCartLineItem[]\n): FunctionGiftResult => {\n const tags = useMemo(() => customer?.tags || [], [customer?.tags])\n const isCustomerLoading = useMemo(() => (!customer ? true : false), [customer])\n const dealsType: string = '' // 可从URL或Context获取\n const { client, locale } = useShopify()\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n // 1. 找到当前生效的活动和用于计算的子总价\n const { activeCampaign, subtotal } = useMemo(() => {\n // 遍历所有活动配置\n for (const campaign of autoFreeGiftConfig) {\n const { rule_conditions = [], rule_result } = campaign\n const { spend_get_reward } = rule_result || {}\n\n // 前置检查,判断用户和环境是否满足活动条件\n const isPreCheckPassed = preCheck(rule_conditions, tags, dealsType ? [dealsType] : [])\n\n if (isPreCheckPassed && spend_get_reward) {\n // 计算参与活动的主商品的总价\n const matchedSubtotal = getMatchedMainProductSubTotal(\n effectiveCart,\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n {\n spend_money_type: spend_get_reward.main_product?.spend_money_type || 1,\n variant_id_list:\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n all_store_variant: spend_get_reward.main_product?.all_store_variant || false,\n }\n )\n\n // 如果有主商品在购物车中,则此活动为当前生效的活动\n if (matchedSubtotal > 0) {\n return { activeCampaign: campaign, subtotal: matchedSubtotal }\n }\n }\n }\n // 没有找到生效的活动\n return { activeCampaign: null, subtotal: 0 }\n }, [autoFreeGiftConfig, effectiveCart, tags, dealsType])\n\n // 2. 根据子总价,计算应得赠品和下一个目标\n const { qualifyingGift, nextTierGoal } = useMemo(() => {\n if (!activeCampaign || !activeCampaign.rule_result?.spend_get_reward?.gift_product) {\n return { qualifyingGift: null, nextTierGoal: null }\n }\n\n const giftTiers = activeCampaign.rule_result.spend_get_reward.gift_product\n\n // a. 找到当前满足条件的最高阶梯(按金额从高到低排序后查找)\n const qualifyingTier = [...giftTiers]\n .sort((a: any, b: any) => Number(b.spend_sum_money) - Number(a.spend_sum_money))\n .find((tier: any) => subtotal >= Number(tier.spend_sum_money))\n\n // b. 找到下一个目标阶梯 (第一个门槛比当前subtotal高的)\n const nextGoal = giftTiers.find((tier) => subtotal < Number(tier.spend_sum_money))\n\n if (!qualifyingTier) {\n return { qualifyingGift: null, nextTierGoal: nextGoal || null }\n }\n\n // c. 将应得的赠品阶梯格式化为待添加购物车的结构\n const formattedGift: FormattedGift = {\n tier: qualifyingTier,\n itemsToAdd: qualifyingTier.reward_list\n ?.map((reward: any) => {\n const giftProduct = reward?.variant_list?.[0]\n if (!giftProduct) return null\n return {\n variant: {\n id: btoaID(giftProduct.variant_id),\n handle: giftProduct.handle,\n sku: giftProduct.sku,\n },\n quantity: reward?.get_unit || 1,\n attributes: [\n {\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n is_gift: true,\n rule_id: activeCampaign.rule_id,\n spend_sum_money: qualifyingTier.spend_sum_money,\n }),\n },\n ],\n }\n })\n .filter((item: any): item is CartLineInput => item !== null),\n }\n\n return { qualifyingGift: formattedGift, nextTierGoal: nextGoal || null }\n }, [activeCampaign, subtotal])\n\n const giftHandles = useMemo(() => {\n const giftVariant = autoFreeGiftConfig\n .map((item) =>\n item.rule_result?.spend_get_reward?.gift_product\n ?.map((v) =>\n v.reward_list.map((reward) => reward.variant_list.map((variant) => variant.handle))\n )\n .flat()\n )\n .flat()\n return giftVariant.flat(2).filter(Boolean)\n }, [autoFreeGiftConfig])\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n\n // 使用缓存的数据或新获取的数据 \n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n \n return {\n qualifyingGift,\n nextTierGoal,\n activeCampaign,\n isLoading: isCustomerLoading,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","import { useEffect, useMemo, useCallback, useState, useRef } from 'react'\nimport Decimal from 'decimal.js'\nimport Cookies from 'js-cookie'\nimport {\n NormalizedCart,\n NormalizedLineItem,\n NormalizedProduct,\n getProductsByHandles,\n} from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { getQuery } from '../utils'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n// 兼容老script满赠 ----- 待拆解优化\ninterface GiveawayProduct {\n handle: string\n sku: string\n}\n\ninterface Breakpoint {\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n}\n\ninterface Campaign {\n activityAvailableQuery?: string\n activityQroperty?: string\n breakpoints?: Array<{\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n }>\n includeTags?: string[]\n useTotalAmount?: boolean\n}\n\nexport interface UseScriptAutoFreeGiftResult {\n involvedLines: NormalizedLineItem[]\n reorder: (a: NormalizedLineItem, b: NormalizedLineItem) => number\n disableCodeRemove: boolean\n nextFreeGiftLevel: Breakpoint | null\n freeGiftLevel: Breakpoint | null\n involvedSubTotal: Decimal\n giftProductsResult?: NormalizedProduct[]\n}\n\n// --- 3. 优化后的 Hook 主体 ---\nexport const useScriptAutoFreeGift = ({\n campaign,\n _giveaway,\n cart,\n locale: providedLocale,\n lines,\n}: {\n campaign: Campaign | null\n _giveaway: string\n cart: NormalizedCart | undefined\n locale?: string\n lines?: AddToCartLineItem[]\n}): UseScriptAutoFreeGiftResult => {\n const { client, locale: contextLocale } = useShopify()\n const locale = providedLocale || contextLocale\n\n // --- 状态管理 ---\n const [points_subscribe, set_points_subscribe] = useState<boolean>(false)\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n useEffect(() => {\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n set_points_subscribe(!!isPointsSubscribe)\n }\n }, [locale])\n\n // 检查活动是否可用:\n // 1. campaign 不存在\n // 2. 配置了 activityAvailableQuery 但utmCampaign不包含activityAvailableQuery\n const isActivityAvailable = useMemo(() => {\n if (!campaign) return false\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n if (campaign.activityAvailableQuery && !utmCampaign?.includes(campaign.activityAvailableQuery))\n return false\n return true\n }, [campaign])\n\n // --- 计算层 ---\n // 使用 useMemo 进行性能优化,处理所有纯计算逻辑。\n\n const [upgrade_multiple, upgrade_value] = useMemo((): [number, number] => {\n let upgrade_multiple = 1\n let upgrade_value = 0\n if (points_subscribe) {\n upgrade_multiple = 1.2\n upgrade_value = 40\n }\n effectiveCart?.lineItems?.forEach(({ customAttributes}: { customAttributes: { key: string; value: string }[] }) => {\n customAttributes?.forEach(({ key, value }: { key: string; value: string }) => {\n if (key === '_amount_upgrade_multiple') upgrade_multiple = Number(value) || 1\n if (key === '_amount_upgrade_value') upgrade_value = Number(value) || 0\n })\n })\n return [upgrade_multiple, upgrade_value]\n }, [effectiveCart?.lineItems, points_subscribe])\n\n const breakpoints = useMemo((): Breakpoint[] => {\n if (!isActivityAvailable) return []\n return (campaign?.breakpoints || []).map((item) => ({\n breakpoint: new Decimal(item.breakpoint)\n .minus(new Decimal(upgrade_value))\n .dividedBy(new Decimal(upgrade_multiple))\n .toFixed(2, Decimal.ROUND_DOWN),\n giveawayProducts: item.giveawayProducts || [],\n }))\n }, [campaign, upgrade_multiple, upgrade_value])\n\n const giftHandles = useMemo(\n (): string[] =>\n // 使用 Set 去重,然后拼接字符串\n [\n ...new Set(\n breakpoints.flatMap((b) => b.giveawayProducts.map((p) => p.handle)).filter(Boolean)\n ),\n ],\n [breakpoints]\n )\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const involvedLines = useMemo((): NormalizedLineItem[] => {\n if (!isActivityAvailable) return []\n return (effectiveCart?.lineItems || []).filter((line: NormalizedLineItem) => {\n const isNotGift =\n line?.totalAmount &&\n Number(line.totalAmount) > 0 &&\n line.customAttributes?.every(\n (item: { key: string; value: string }) => item.key !== _giveaway\n )\n const hasCampaignTag = line.product?.tags?.some(\n (tag: string) =>\n campaign?.includeTags?.includes(tag.trim()) && line.variant?.availableForSale\n )\n return isNotGift && hasCampaignTag\n })\n }, [effectiveCart?.lineItems, isActivityAvailable, _giveaway])\n\n const involvedSubTotal = useMemo((): Decimal => {\n if (!isActivityAvailable) return new Decimal(0)\n return involvedLines.reduce((prev, item) => {\n const amount = campaign?.useTotalAmount ? item.totalAmount : item.subtotalAmount\n return new Decimal(prev).plus(new Decimal(amount || 0))\n }, new Decimal(0))\n }, [involvedLines, isActivityAvailable])\n\n const [freeGiftLevel, nextFreeGiftLevel] = useMemo((): [Breakpoint | null, Breakpoint | null] => {\n if (!isActivityAvailable) return [null, null]\n const sortedLevels = [...breakpoints].sort(\n (a, b) => Number(b.breakpoint) - Number(a.breakpoint)\n )\n const levelIndex = sortedLevels.findIndex(\n (level) => involvedSubTotal.gte(new Decimal(level.breakpoint)) && involvedLines.length > 0\n )\n\n if (levelIndex === -1) {\n return [\n null,\n sortedLevels.length > 0 ? (sortedLevels[sortedLevels.length - 1] ?? null) : null,\n ]\n }\n\n const currentLevel = sortedLevels[levelIndex] ?? null\n const nextLevel = levelIndex > 0 ? (sortedLevels[levelIndex - 1] ?? null) : null\n return [currentLevel, nextLevel]\n }, [breakpoints, involvedSubTotal, involvedLines.length])\n\n // --- 数据获取层 ---\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n // 使用缓存的数据或新获取的数据\n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n\n // 使用 useCallback 创建一个稳定的排序函数,用于优化渲染。\n // 它会根据商品类型(赠品、活动商品、普通商品)进行排序。\n const reorder = useCallback(\n (a: NormalizedLineItem, b: NormalizedLineItem): number => {\n const getPriority = (item: NormalizedLineItem): number => {\n // 优先级 0: 赠品 (排在最后)\n if (\n item.customAttributes?.some(\n (attribute: { key: string; value: string }) => attribute.key === _giveaway\n )\n )\n return 0\n // 优先级 1: 参与活动的商品 (BUG修复:应检查 product.tags)\n if (item.product?.tags?.some((tag: string) => campaign?.includeTags?.includes(tag)))\n return 1\n // 优先级 2: 其他普通商品 (排在最前)\n return 2\n }\n // b 的优先级减 a 的优先级,实现降序排列\n return getPriority(b) - getPriority(a)\n },\n [campaign?.includeTags, _giveaway]\n )\n\n return {\n involvedLines,\n reorder,\n disableCodeRemove: involvedLines.length > 0,\n nextFreeGiftLevel,\n freeGiftLevel,\n involvedSubTotal,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n updateCartAttributes,\n type NormalizedCart,\n type HasMetafieldsIdentifier,\n} from '@anker-in/shopify-sdk'\n\nexport interface UpdateCartAttributesInput {\n /** Cart ID (optional, will use cookie) */\n cartId?: string\n /** Custom attributes to set on cart */\n attributes: Array<{ key: string; value: string }>\n}\n\n/**\n * Hook for updating cart attributes (custom key-value pairs)\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useUpdateCartAttributes()\n *\n * await trigger({\n * attributes: [\n * { key: 'gift_message', value: 'Happy Birthday!' },\n * { key: 'gift_wrap', value: 'true' }\n * ]\n * })\n * ```\n */\nexport function useUpdateCartAttributes(\n mutate: (cart: NormalizedCart | undefined) => void,\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n },\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'update-cart-attributes',\n UpdateCartAttributesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n\n const updateAttributes = useCallback(\n async (_key: string, { arg }: { arg: UpdateCartAttributesInput }) => {\n const updatedCart = await updateCartAttributes(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n console.log('useUpdateCartAttributes updatedCart', updatedCart)\n if (updatedCart) {\n mutate(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutate]\n )\n\n return useSWRMutation('update-cart-attributes', updateAttributes, options)\n}\n","/**\n * useHasPlusMemberInCart Hook\n * 判断购物车中是否包含年费会员或月费会员产品\n */\n\nimport { useMemo } from 'react'\nimport type { PlusMemberSettingsMetafields } from './types'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\n\nexport interface UseHasPlusMemberInCartProps {\n /** Plus Member 配置 */\n memberSetting?: PlusMemberSettingsMetafields\n /** 购物车数据 */\n cart?: NormalizedCart\n}\n\nexport interface HasPlusMemberInCartResult {\n /** 购物车中是否有任何会员产品 */\n hasPlusMember: boolean\n /** 购物车中是否有月费会员产品 */\n hasMonthlyPlus: boolean\n /** 购物车中是否有年费会员产品 */\n hasAnnualPlus: boolean\n /** 月费会员产品的 line item */\n monthlyPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n /** 年费会员产品的 line item */\n annualPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n}\n\n/**\n * 判断购物车中是否包含年费会员或月费会员产品\n *\n * @param props - Hook 参数\n * @param props.metafields - Plus Member 配置\n * @returns 会员产品信息\n *\n * @example\n * ```tsx\n * const {\n * hasPlusMember,\n * hasMonthlyPlus,\n * hasAnnualPlus,\n * monthlyPlusItem,\n * annualPlusItem,\n * } = useHasPlusMemberInCart({\n * memberSetting: plusMemberSettings,\n * })\n *\n * if (hasPlusMember) {\n * console.log('购物车中有会员产品')\n * }\n * ```\n */\nexport function useHasPlusMemberInCart({\n memberSetting,\n cart,\n}: UseHasPlusMemberInCartProps): HasPlusMemberInCartResult {\n const { plus_monthly_product, plus_annual_product } = memberSetting || {}\n\n return useMemo(() => {\n if (!cart?.lineItems) {\n return {\n hasPlusMember: false,\n hasMonthlyPlus: false,\n hasAnnualPlus: false,\n }\n }\n\n // 查找月费会员产品\n const monthlyPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_monthly_product?.handle &&\n item.variant?.sku === plus_monthly_product?.sku\n )\n\n // 查找年费会员产品\n const annualPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_annual_product?.handle &&\n item.variant?.sku === plus_annual_product?.sku\n )\n\n const hasMonthlyPlus = !!monthlyPlusItem\n const hasAnnualPlus = !!annualPlusItem\n const hasPlusMember = hasMonthlyPlus || hasAnnualPlus\n\n return {\n hasPlusMember,\n hasMonthlyPlus,\n hasAnnualPlus,\n monthlyPlusItem: monthlyPlusItem,\n annualPlusItem: annualPlusItem,\n }\n }, [cart?.lineItems, plus_monthly_product, plus_annual_product])\n}\n","import Cookies from 'js-cookie'\nimport { useEffect, useMemo, useState } from 'react'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\nimport Decimal from 'decimal.js'\nimport { PlusMemberSettingsMetafields } from '../../member'\nimport { useHasPlusMemberInCart } from '../../member/plus/use-has-plus-member-in-cart'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\n\nexport const getReferralAttributes = () => {\n const inviteCode = Cookies.get('invite_code')\n const playModeId = Cookies.get('playModeId')\n const popup = Cookies.get('_popup')\n if (inviteCode && playModeId) {\n return popup\n ? [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n { key: '_popup', value: popup },\n ]\n : [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n ]\n }\n return []\n}\n\nexport const useCartAttributes = ({\n profile,\n customer,\n cart,\n memberSetting,\n}: {\n profile: any\n customer: any\n cart?: NormalizedCart\n memberSetting?: PlusMemberSettingsMetafields\n}): { attributes: Array<{ key: string; value: any }> } => {\n const [currentUrl, setCurrentUrl] = useState('')\n const { hasPlusMember } = useHasPlusMemberInCart({\n memberSetting,\n cart,\n })\n\n useEffect(() => {\n setCurrentUrl(window.location.href)\n }, [])\n\n const userType = useMemo(() => {\n let userInfo: any = Cookies.get('userInfo')\n if (userInfo) {\n userInfo = JSON.parse(userInfo)\n let arr = typeof userInfo?.id == 'string' && userInfo?.id.split('/')\n userInfo.setId = arr[arr.length - 1]\n }\n const customerInfo = userInfo || customer\n if (!customerInfo) {\n return 'new_user_unlogin'\n }\n if (customer) {\n const { orders = {} } = customer\n if (orders?.edges?.length === 1) {\n return 'old_user_orders_once'\n } else if (orders?.edges?.length > 1) {\n return 'old_user_orders_twice'\n }\n }\n return 'new_user_login'\n }, [customer])\n\n // 用户相关\n const memberAttributes = useMemo(() => {\n const attributes: { key: string; value: string }[] = [\n {\n key: '_token',\n value: profile?.token, //是否登录\n },\n {\n key: '_member_type',\n value: hasPlusMember ? '2' : profile?.memberType, //:0(游客),1(普通会员),2(付费会员)\n },\n {\n key: '_user_type',\n value: userType, // n\n },\n {\n key: '_is_login',\n value: profile?.token ? 'true' : 'false',\n },\n {\n key: '_last_url',\n value:\n typeof window !== 'undefined' ? window.location.origin + window.location.pathname : '',\n },\n ]\n if (profile?.token) {\n attributes.push({\n key: '_login_user',\n value: '1',\n })\n }\n\n return attributes\n }, [profile?.memberType, profile?.token, userType, hasPlusMember])\n\n const functionAttributes = useMemo(() => {\n const hasFunctionEnvAttribute = cart?.lineItems.some((item) =>\n item.customAttributes?.some((attr: any) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n )\n const discountCodes = cart?.discountCodes.map((item) => item.code).filter((code) => code) || []\n return hasFunctionEnvAttribute\n ? [\n {\n key: '_discounts_function_env',\n value: JSON.stringify({\n discount_code: discountCodes,\n user_tags: customer?.tags || [],\n }),\n },\n ]\n : []\n }, [cart])\n\n // console.log('functionAttributes', cart, functionAttributes)\n\n const presellAttributes = useMemo(() => {\n return [\n {\n key: '_presale',\n value: cart?.lineItems.some((item) => item?.variant?.metafields?.presell === 'presell'),\n },\n ]\n }, [cart])\n\n const weightAttributes = useMemo(() => {\n return [\n {\n key: '_weight',\n value: cart?.lineItems\n .reduce<number>((acc, item) => {\n return new Decimal(acc).plus(item.variant.weight ?? 0).toNumber()\n }, 0)\n .toString(),\n },\n {\n key: '_app_source_name',\n value: 'dtc',\n },\n ]\n }, [cart])\n\n const trackingAttributes = useMemo(() => {\n return [\n {\n key: 'utm_params',\n value: currentUrl,\n },\n ]\n }, [currentUrl])\n\n return useMemo(\n () => ({\n attributes: [\n ...memberAttributes,\n ...functionAttributes,\n ...presellAttributes,\n ...weightAttributes,\n ...trackingAttributes,\n ...getReferralAttributes(),\n ].filter((item) => item?.value) as Array<{ key: string; value: any }>,\n }),\n [memberAttributes, functionAttributes, presellAttributes, weightAttributes, trackingAttributes]\n )\n}\n","import { useEffect, useMemo } from 'react'\nimport {\n CODE_AMOUNT_KEY,\n CUSTOMER_ATTRIBUTE_KEY,\n MAIN_PRODUCT_CODE,\n SCRIPT_CODE_AMOUNT_KEY,\n} from '../const'\nimport { updateCartLines } from '@anker-in/shopify-sdk'\nimport type { NormalizedCart, HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\nimport { useRequest } from 'ahooks'\nimport { getDiscountEnvAttributeValue } from '../utils/auto-free-gift'\nimport { useShopify } from '../../../provider'\n\nexport const useUpdateLineCodeAmountAttributes = ({\n cart,\n mutateCart,\n isCartLoading,\n setLoadingState,\n metafieldIdentifiers,\n}: {\n cart?: NormalizedCart\n mutateCart: (cart: NormalizedCart | undefined) => void\n isCartLoading: boolean\n setLoadingState: React.Dispatch<React.SetStateAction<any>>\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}) => {\n const { client, cartCookieAdapter } = useShopify()\n\n const mainProductDiscountCodes = useMemo(\n () =>\n cart?.discountCodes\n .filter(\n ({ code, applicable }) =>\n applicable && MAIN_PRODUCT_CODE.some((codePrefix) => code.startsWith(codePrefix))\n )\n .map(({ code }) => code),\n [cart]\n )\n\n const linesNeedUpdate = useMemo(\n () =>\n cart?.lineItems\n .map((line) => {\n const attrNeedUpdate: Array<{ key: string; value: string }> = []\n const attrNeedDelete = []\n\n const codeDiscount = line.discountAllocations?.find((allocation) =>\n mainProductDiscountCodes?.includes(allocation.code)\n )\n\n // 是否有 _discounts_function_env 属性\n const hasFunctionEnvAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) => attr.key === CUSTOMER_ATTRIBUTE_KEY\n )\n const functionEnvValue = getDiscountEnvAttributeValue(line.customAttributes)\n // lineItem 折后总价与attr中的不一致的情况\n const hasSameFunctionEnvAttribute =\n Number(functionEnvValue.discounted_amount) === Number(line.totalAmount)\n\n if (!hasSameFunctionEnvAttribute && hasFunctionEnvAttribute) {\n attrNeedUpdate.push({\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n ...functionEnvValue,\n discounted_amount: Number(line.totalAmount),\n }),\n })\n }\n\n const codeDiscountAmount = codeDiscount?.amount || 0\n // 是否有 code_money 属性\n const hasCodeAmountAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY || attr.key === SCRIPT_CODE_AMOUNT_KEY\n )\n // 两个属性都存在且值相同,则不更新\n const hasSameCodeAmountAttribute =\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n ) &&\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === SCRIPT_CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n )\n\n if (codeDiscount && !hasSameCodeAmountAttribute) {\n attrNeedUpdate.push({\n key: CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n attrNeedUpdate.push({\n key: SCRIPT_CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n } else if (!codeDiscount && hasCodeAmountAttribute) {\n // 没有 code 需要删除的情况\n attrNeedDelete.push(CODE_AMOUNT_KEY)\n attrNeedDelete.push(SCRIPT_CODE_AMOUNT_KEY)\n }\n\n return {\n line,\n attrNeedUpdate,\n attrNeedDelete,\n }\n })\n .filter(\n ({ attrNeedUpdate, attrNeedDelete }) => attrNeedUpdate.length || attrNeedDelete.length\n )\n .map(({ line, attrNeedUpdate, attrNeedDelete }) => {\n if (attrNeedUpdate.length) {\n return {\n id: line.id,\n attributes: [\n ...(line.customAttributes?.filter(\n (attr: { key: string; value: string }) =>\n !attrNeedUpdate.some((updateAttr) => updateAttr.key === attr.key)\n ) || []),\n ...attrNeedUpdate,\n ],\n }\n } else if (attrNeedDelete.length) {\n return {\n id: line.id,\n attributes:\n line.customAttributes?.filter(\n (attr: { key: string; value: string }) => !attrNeedDelete.includes(attr.key)\n ) || [],\n }\n } else {\n return {\n id: line.id,\n attributes: line.customAttributes || [],\n }\n }\n }),\n [cart?.lineItems, mainProductDiscountCodes]\n )\n\n const { loading } = useRequest(\n async () => {\n if (linesNeedUpdate?.length && !isCartLoading) {\n const result = await updateCartLines(client, {\n cartId: cart?.id || '',\n lines: linesNeedUpdate,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n if (result) {\n mutateCart(result)\n }\n }\n },\n {\n throttleWait: 3000, // 3 秒内只触发最后一次更新\n throttleTrailing: true,\n refreshDeps: [linesNeedUpdate, isCartLoading],\n }\n )\n\n useEffect(() => {\n setLoadingState((prev: any) => {\n return {\n ...prev,\n editLineCodeAmountLoading: loading,\n }\n })\n }, [loading, setLoadingState])\n}\n","/**\n * Plus Member Context\n * Provides Plus Member state management\n */\n\nimport { createContext } from 'react'\nimport type {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n SelectedPlusMemberProduct,\n DeliveryPlusType,\n} from './types'\nimport { NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport interface ShippingMethodsContext {\n freeShippingMethods: PlusMemberShippingMethodConfig[]\n paymentShippingMethods: PlusMemberShippingMethodConfig[]\n nddOverweight: boolean\n tddOverweight: boolean\n}\n\nexport interface PlusMemberContextValue<TProduct = any, TVariant = any, TProfile = any> {\n // Metafields configuration\n plusMemberMetafields: PlusMemberSettingsMetafields\n shopCommon?: Record<string, any>\n\n // Zip code state\n zipCode: string\n setZipCode: (value: string) => void\n\n // Delivery availability\n allowNextDayDelivery: boolean\n setAllowNextDayDelivery: (value: boolean) => void\n allowThirdDayDelivery: boolean\n setAllowThirdDayDelivery: (value: boolean) => void\n\n // Plus member mode selection\n selectedPlusMemberMode: DeliveryPlusType\n setSelectedPlusMemberMode: (value: DeliveryPlusType) => void\n\n // Area check modal\n showAreaCheckModal: boolean\n setShowAreaCheckModal: (value: boolean) => void\n\n // Shipping method selection\n selectedShippingMethod?: PlusMemberShippingMethodConfig\n setSelectedShippingMethod: (value: PlusMemberShippingMethodConfig) => void\n\n // Tip display\n showTip: boolean\n setShowTip: (value: boolean) => void\n\n // More shipping methods display\n showMoreShippingMethod: boolean\n setShowMoreShippingMethod: (value: boolean) => void\n\n // Product and variant (generic types)\n variant: TVariant\n product: TProduct\n\n // Shipping methods context\n shippingMethodsContext: ShippingMethodsContext\n\n // Selected plus member product\n selectedPlusMemberProduct: SelectedPlusMemberProduct\n\n // Plus member products list\n plusMemberProducts: NormalizedProduct[]\n\n // Plus member benefit modal\n showPlusMemberBenefit: boolean\n setShowPlusMemberBenefit: (value: boolean) => void\n\n // Margin bottom control\n deleteMarginBottom: boolean\n setDeleteMarginBottom: (value: boolean) => void\n\n // Profile (user profile information)\n profile?: TProfile\n\n // Locale (language/region code)\n locale?: string\n}\n\nconst createInitialValue = <\n TProduct = any,\n TVariant = any,\n TProfile = any,\n>(): PlusMemberContextValue<TProduct, TVariant, TProfile> => ({\n zipCode: '',\n plusMemberMetafields: {} as PlusMemberSettingsMetafields,\n setZipCode: () => {},\n allowNextDayDelivery: false,\n setAllowNextDayDelivery: () => {},\n allowThirdDayDelivery: false,\n setAllowThirdDayDelivery: () => {},\n selectedPlusMemberMode: 'free' as DeliveryPlusType,\n setSelectedPlusMemberMode: () => {},\n showAreaCheckModal: false,\n setShowAreaCheckModal: () => {},\n selectedShippingMethod: undefined,\n setSelectedShippingMethod: () => {},\n showTip: false,\n setShowTip: () => {},\n showMoreShippingMethod: false,\n setShowMoreShippingMethod: () => {},\n variant: {} as TVariant,\n product: {} as TProduct,\n shippingMethodsContext: {\n freeShippingMethods: [],\n paymentShippingMethods: [],\n nddOverweight: false,\n tddOverweight: false,\n },\n selectedPlusMemberProduct: null,\n plusMemberProducts: [],\n showPlusMemberBenefit: false,\n setShowPlusMemberBenefit: () => {},\n deleteMarginBottom: false,\n setDeleteMarginBottom: () => {},\n profile: undefined,\n locale: undefined,\n})\n\nexport const PlusMemberContext = createContext<PlusMemberContextValue>(createInitialValue())\n","/**\n * Cart Context\n * Provides cart state and mutation methods with business logic\n */\n\nimport React, { createContext, useContext, useCallback, useMemo, useState, useEffect } from 'react'\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCart, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useShopify } from './use-shopify'\nimport { useCalcAutoFreeGift } from '../hooks/cart/feature/use-calc-auto-free-gift'\nimport { CUSTOMER_SCRIPT_GIFT_KEY, CUSTOMER_ATTRIBUTE_KEY } from '../hooks/cart/const'\nimport { useScriptAutoFreeGift } from '../hooks/cart/feature/use-script-auto-free-gift'\nimport {\n getDiscountEnvAttributeValue,\n formatScriptAutoFreeGift,\n formatFunctionAutoFreeGift,\n checkAttributesUpdateNeeded,\n} from '../hooks/cart/utils/auto-free-gift'\nimport {\n PlusMemberSettingsMetafields,\n useCartAttributes,\n useUpdateCartAttributes,\n useUpdateLineCodeAmountAttributes,\n} from '../hooks'\nimport { useRequest } from 'ahooks'\nimport type { HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\n\n// Simple types defined locally to avoid import issues\nexport type AttributeInput = {\n key: string\n value: string\n}\n\nexport type LoadingState = {\n editLineQuantityLoading: boolean\n editLineCodeAmountLoading: boolean\n listingAutoCodeApplying: boolean\n userCodeApplying: boolean\n}\n\nexport interface CartContextValue {\n /** Current cart data */\n cart: NormalizedCart | undefined\n /** Whether cart is loading */\n isCartLoading: boolean\n /** Manually trigger cart fetch */\n triggerFetch: () => void\n /** Mutate cart data */\n mutateCart: (cart: NormalizedCart | undefined) => void\n /** Add custom attributes */\n addCustomAttributes: (attributes: AttributeInput[]) => void\n /** Remove custom attributes */\n removeCustomAttributes: (attributes: { key: string }[]) => void\n /** Set custom attributes */\n setCustomAttributes: (attributes: AttributeInput[]) => void\n /** Current locale */\n locale: string\n /** Whether discount code is changing */\n isCodeChanging: boolean\n /** Set discount code changing state */\n setIsCodeChanging: (isCodeChanging: boolean) => void\n /** Set loading state */\n setLoadingState: React.Dispatch<React.SetStateAction<LoadingState>>\n /** Loading state */\n loadingState: LoadingState\n /** Script auto free gift items */\n scriptAutoFreeGift?: any[]\n /** Function auto free gift items */\n functionAutoFreeGift?: any[]\n /** Set function auto free gift */\n setFunctionAutoFreeGift: (functionAutoFreeGift: any[]) => void\n /** Set script auto free gift */\n setScriptAutoFreeGift: (scriptAutoFreeGift: any[]) => void\n /** Script auto free gift result */\n scriptAutoFreeGiftResult?: any\n /** Function auto free gift result */\n functionAutoFreeGiftResult?: any\n /** Calculated auto free gift result */\n calculatedAutoFreeGift?: any\n /** Gifts that need to be added to cart */\n giftNeedAddToCartLines: any[]\n /** Auto free gift config */\n autoFreeGiftConfig?: any\n /** Gradient gifts config */\n gradientGiftsConfig?: any\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}\n\nconst CartContext = createContext<CartContextValue | null>(null)\n\nexport interface CartProviderProps {\n children: React.ReactNode\n /** SWR configuration options */\n swrOptions?: SWRConfiguration<NormalizedCart | undefined, Error>\n /** Auto free gift configuration */\n autoFreeGiftConfig?: any\n /** Gradient gifts configuration (for script gifts) */\n gradientGiftsConfig?: any\n /** Function gift configuration */\n fnGiftConf?: any\n /** User profile */\n profile?: any\n /** Customer data */\n customer?: any\n /** Current locale */\n locale: string\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n /** Plus member settings */\n memberSetting?: PlusMemberSettingsMetafields\n}\n\n/**\n * Cart Provider Component\n *\n * Provides cart state management with business logic\n *\n * @example\n * ```tsx\n * <ShopifyProvider {...config}>\n * <CartProvider\n * locale=\"us\"\n * autoFreeGiftConfig={config}\n * profile={profile}\n * customer={customer}\n * >\n * <App />\n * </CartProvider>\n * </ShopifyProvider>\n * ```\n */\nexport function CartProvider({\n children,\n // swrOptions,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n profile,\n customer,\n locale,\n metafieldIdentifiers,\n memberSetting,\n}: CartProviderProps) {\n const { client, cartCookieAdapter } = useShopify()\n\n // Local state\n const [customAttributes, setCustomAttributes] = useState<AttributeInput[]>([])\n const [customAttributesNeedDelete, setCustomAttributesNeedDelete] = useState<{ key: string }[]>(\n []\n )\n const [isCodeChanging, setIsCodeChanging] = useState(false)\n const [loadingState, setLoadingState] = useState<LoadingState>({\n editLineQuantityLoading: false,\n editLineCodeAmountLoading: false,\n listingAutoCodeApplying: false,\n userCodeApplying: false,\n })\n const [scriptAutoFreeGift, setScriptAutoFreeGift] = useState<any[]>([])\n const [functionAutoFreeGift, setFunctionAutoFreeGift] = useState<any[]>([])\n\n const {\n run: fetchCart,\n data: cart,\n loading: isCartLoading,\n mutate: mutateCart,\n } = useRequest<NormalizedCart | undefined, any>(\n async () => {\n return getCart(client, {\n cookieAdapter: cartCookieAdapter,\n metafieldIdentifiers,\n })\n },\n {\n refreshDeps: [locale],\n }\n )\n\n // 更新 attributes\n const { trigger: updateAttributes } = useUpdateCartAttributes(mutateCart, metafieldIdentifiers)\n // 公共 attributes\n const { attributes } = useCartAttributes({ profile, customer, cart, memberSetting })\n\n useRequest(\n () => {\n // 去重逻辑\n const newAttributes = [...attributes, ...customAttributes]\n\n const needUpdate =\n cart &&\n !checkAttributesUpdateNeeded(\n cart.customAttributes,\n newAttributes,\n customAttributesNeedDelete\n )\n\n // 如果 attributes 没有变化,不更新\n if (needUpdate) {\n return updateAttributes({ attributes: newAttributes })\n } else {\n return Promise.resolve(cart)\n }\n },\n {\n throttleWait: 1000, // 1 秒内只触发最后一次更新\n throttleTrailing: true,\n throttleLeading: false,\n refreshDeps: [attributes, customAttributes],\n }\n )\n\n // 更新 code 时,同步更新 line item 中的 code amount attribute\n useUpdateLineCodeAmountAttributes({\n cart,\n mutateCart,\n isCartLoading: isCartLoading || isCodeChanging,\n setLoadingState,\n })\n\n // Custom attribute management\n const removeCustomAttributes = useCallback(\n (attributes: { key: string }[]) => {\n setCustomAttributesNeedDelete(attributes)\n },\n [setCustomAttributesNeedDelete]\n )\n\n const addCustomAttributes = useCallback(\n (attributes: AttributeInput[]) => {\n const sameAttributes = attributes.filter((attr) =>\n customAttributes.some((a) => a.key === attr.key)\n )\n\n if (sameAttributes.length) {\n setCustomAttributes((prev) => {\n const removedAttributes = prev.filter(\n (attr) => !sameAttributes.some((a) => a.key === attr.key)\n )\n return [...removedAttributes, ...attributes]\n })\n } else {\n setCustomAttributes((prev) => [...prev, ...attributes])\n }\n },\n [customAttributes]\n )\n\n const functionAutoFreeGiftResult = useCalcAutoFreeGift(cart, autoFreeGiftConfig || [], customer)\n const scriptAutoFreeGiftResult = useScriptAutoFreeGift({\n campaign: gradientGiftsConfig || null,\n _giveaway: CUSTOMER_SCRIPT_GIFT_KEY,\n cart,\n })\n\n const formattedScriptGifts = useMemo(() => {\n return formatScriptAutoFreeGift({\n scriptAutoFreeGiftResult,\n gradient_gifts: gradientGiftsConfig,\n locale,\n })\n }, [scriptAutoFreeGiftResult, gradientGiftsConfig, locale])\n\n const formattedFunctionGifts = useMemo(() => {\n return formatFunctionAutoFreeGift({\n qualifyingGift: functionAutoFreeGiftResult?.qualifyingGift || null,\n giftProductsResult: (functionAutoFreeGiftResult?.giftProductsResult as any[]) || [],\n locale,\n })\n }, [functionAutoFreeGiftResult, locale])\n\n // 当格式化结果变化时更新状态\n useEffect(() => {\n if (\n loadingState.userCodeApplying ||\n loadingState.editLineQuantityLoading ||\n loadingState.editLineCodeAmountLoading ||\n loadingState.listingAutoCodeApplying\n ) {\n return\n }\n\n setScriptAutoFreeGift(formattedScriptGifts)\n setFunctionAutoFreeGift(formattedFunctionGifts)\n }, [\n formattedScriptGifts,\n formattedFunctionGifts,\n loadingState.userCodeApplying,\n loadingState.editLineQuantityLoading,\n loadingState.editLineCodeAmountLoading,\n loadingState.listingAutoCodeApplying,\n ])\n\n const giftNeedAddToCartLines = useMemo(() => {\n const cartGiftLineItems = cart?.lineItems.filter((line) =>\n line.customAttributes?.some((attr: any) =>\n [CUSTOMER_ATTRIBUTE_KEY, CUSTOMER_SCRIPT_GIFT_KEY].includes(attr.key)\n )\n )\n const result = [...scriptAutoFreeGift, ...functionAutoFreeGift].filter(\n (item) =>\n // 如果购物车中已经存在对应赠品,且标记了 function 满赠的属性,则不添加\n !cartGiftLineItems?.find((line) => {\n return (\n line.variantId === item.line.variantId &&\n line.customAttributes?.some((attr: any) => {\n if (attr.key === '_discounts_function_env') {\n return getDiscountEnvAttributeValue(line.customAttributes).is_gift\n }\n\n return false\n })\n )\n })\n )\n return result\n }, [cart?.lineItems, scriptAutoFreeGift, functionAutoFreeGift])\n\n const value = useMemo(\n () => ({\n cart,\n isCartLoading,\n triggerFetch: fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n setCustomAttributes,\n locale,\n isCodeChanging,\n setIsCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n setLoadingState,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n }),\n [\n cart,\n isCartLoading,\n fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n locale,\n isCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n ]\n )\n\n return <CartContext.Provider value={value}>{children}</CartContext.Provider>\n}\n\n/**\n * Hook to access cart context\n *\n * @throws Error if used outside CartProvider\n * @returns Cart context value\n *\n * @example\n * ```tsx\n * const { cart, mutateCart, isCartLoading, loadingState } = useCartContext()\n * ```\n */\nexport function useCartContext(): CartContextValue {\n const context = useContext(CartContext)\n\n if (!context) {\n throw new Error('useCartContext must be used within a CartProvider')\n }\n\n return context\n}\n"]}
|
package/dist/provider/index.mjs
CHANGED
|
@@ -758,7 +758,7 @@ var useCartAttributes = ({
|
|
|
758
758
|
return "new_user_login";
|
|
759
759
|
}, [customer]);
|
|
760
760
|
const memberAttributes = useMemo(() => {
|
|
761
|
-
|
|
761
|
+
const attributes = [
|
|
762
762
|
{
|
|
763
763
|
key: "_token",
|
|
764
764
|
value: profile?.token
|
|
@@ -777,8 +777,19 @@ var useCartAttributes = ({
|
|
|
777
777
|
{
|
|
778
778
|
key: "_is_login",
|
|
779
779
|
value: profile?.token ? "true" : "false"
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
key: "_last_url",
|
|
783
|
+
value: typeof window !== "undefined" ? window.location.origin + window.location.pathname : ""
|
|
780
784
|
}
|
|
781
785
|
];
|
|
786
|
+
if (profile?.token) {
|
|
787
|
+
attributes.push({
|
|
788
|
+
key: "_login_user",
|
|
789
|
+
value: "1"
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
return attributes;
|
|
782
793
|
}, [profile?.memberType, profile?.token, userType, hasPlusMember]);
|
|
783
794
|
const functionAttributes = useMemo(() => {
|
|
784
795
|
const hasFunctionEnvAttribute = cart?.lineItems.some(
|