@anker-in/campaign-ui 0.2.11-beta.3 → 0.2.11-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +2 -2
  2. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +1 -1
  3. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +2 -2
  4. package/dist/cjs/components/credits/context/memberPriceConst.d.ts +0 -5
  5. package/dist/cjs/components/credits/context/memberPriceConst.js +1 -1
  6. package/dist/cjs/components/credits/context/memberPriceConst.js.map +3 -3
  7. package/dist/cjs/components/credits/context/memberPriceTypes.d.ts +1 -22
  8. package/dist/cjs/components/credits/context/memberPriceTypes.js +1 -1
  9. package/dist/cjs/components/credits/context/memberPriceTypes.js.map +1 -1
  10. package/dist/cjs/components/credits/context/provider.d.ts +15 -1
  11. package/dist/cjs/components/credits/context/provider.js +1 -1
  12. package/dist/cjs/components/credits/context/provider.js.map +3 -3
  13. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +2 -2
  14. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +1 -1
  15. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +1 -1
  16. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +2 -2
  17. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +1 -1
  18. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +1 -1
  19. package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +2 -2
  20. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +1 -1
  21. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +1 -1
  22. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
  23. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
  24. package/dist/cjs/components/credits/creditsBanner/index.d.ts +2 -0
  25. package/dist/cjs/components/credits/creditsBanner/index.js +12 -1
  26. package/dist/cjs/components/credits/creditsBanner/index.js.map +3 -3
  27. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js +2 -0
  28. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js.map +7 -0
  29. package/dist/cjs/components/credits/creditsBenefits/{iconInfo.js → IconInfo.js} +1 -1
  30. package/dist/cjs/components/credits/creditsBenefits/{iconInfo.js.map → IconInfo.js.map} +1 -1
  31. package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
  32. package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +2 -2
  33. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js +1 -1
  34. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +2 -2
  35. package/dist/cjs/components/credits/creditsCash/type.d.ts +1 -0
  36. package/dist/cjs/components/credits/creditsCash/type.js +1 -1
  37. package/dist/cjs/components/credits/creditsCash/type.js.map +1 -1
  38. package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
  39. package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
  40. package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
  41. package/dist/cjs/components/credits/creditsInfoCard/index.js.map +2 -2
  42. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
  43. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
  44. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
  45. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
  46. package/dist/cjs/components/credits/creditsMemberPrice/type.d.ts +3 -5
  47. package/dist/cjs/components/credits/creditsMemberPrice/type.js +1 -1
  48. package/dist/cjs/components/credits/creditsMemberPrice/type.js.map +1 -1
  49. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
  50. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
  51. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  52. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  53. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  54. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +2 -2
  55. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  56. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  57. package/dist/cjs/templates/{credits.d.ts → Credits.d.ts} +15 -1
  58. package/dist/cjs/templates/Credits.js +2 -0
  59. package/dist/cjs/templates/Credits.js.map +7 -0
  60. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +2 -2
  61. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +1 -1
  62. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +2 -2
  63. package/dist/esm/components/credits/context/memberPriceConst.d.ts +0 -5
  64. package/dist/esm/components/credits/context/memberPriceConst.js +1 -1
  65. package/dist/esm/components/credits/context/memberPriceConst.js.map +3 -3
  66. package/dist/esm/components/credits/context/memberPriceTypes.d.ts +1 -22
  67. package/dist/esm/components/credits/context/provider.d.ts +15 -1
  68. package/dist/esm/components/credits/context/provider.js +1 -1
  69. package/dist/esm/components/credits/context/provider.js.map +3 -3
  70. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +2 -2
  71. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +1 -1
  72. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +1 -1
  73. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +2 -2
  74. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +1 -1
  75. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +1 -1
  76. package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +2 -2
  77. package/dist/esm/components/credits/context/utils/variantGetCoupon.js +1 -1
  78. package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +1 -1
  79. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
  80. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
  81. package/dist/esm/components/credits/creditsBanner/index.d.ts +2 -0
  82. package/dist/esm/components/credits/creditsBanner/index.js +12 -1
  83. package/dist/esm/components/credits/creditsBanner/index.js.map +3 -3
  84. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js +2 -0
  85. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js.map +7 -0
  86. package/dist/esm/components/credits/creditsBenefits/{iconInfo.js → IconInfo.js} +1 -1
  87. package/dist/esm/components/credits/creditsBenefits/{iconInfo.js.map → IconInfo.js.map} +1 -1
  88. package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
  89. package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +2 -2
  90. package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
  91. package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  92. package/dist/esm/components/credits/creditsCash/type.d.ts +1 -0
  93. package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
  94. package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
  95. package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
  96. package/dist/esm/components/credits/creditsInfoCard/index.js.map +2 -2
  97. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
  98. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
  99. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
  100. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
  101. package/dist/esm/components/credits/creditsMemberPrice/type.d.ts +3 -5
  102. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
  103. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
  104. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  105. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  106. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  107. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +2 -2
  108. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  109. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  110. package/dist/esm/templates/{credits.d.ts → Credits.d.ts} +15 -1
  111. package/dist/esm/templates/Credits.js +2 -0
  112. package/dist/esm/templates/Credits.js.map +7 -0
  113. package/package.json +1 -1
  114. package/src/components/credits/context/memberPriceConst.ts +0 -7
  115. package/src/components/credits/context/memberPriceTypes.ts +1 -26
  116. package/src/components/credits/context/provider.tsx +14 -0
  117. package/src/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.tsx +25 -25
  118. package/src/components/credits/creditsBanner/index.tsx +31 -2
  119. package/src/components/credits/creditsBenefits/BenefitItem.tsx +11 -4
  120. package/src/components/credits/creditsBenefits/IconInfo.tsx +1 -1
  121. package/src/components/credits/creditsCash/CreditsCash.tsx +1 -1
  122. package/src/components/credits/creditsCash/RedeemableItem.tsx +17 -4
  123. package/src/components/credits/creditsCash/type.ts +1 -0
  124. package/src/components/credits/creditsFaq/faqItem/FaqItem.tsx +25 -23
  125. package/src/components/credits/creditsInfoCard/index.tsx +1 -1
  126. package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +57 -5
  127. package/src/components/credits/creditsMemberPrice/MemberPriceItem.tsx +102 -25
  128. package/src/components/credits/creditsMemberPrice/type.ts +3 -5
  129. package/src/components/credits/creditsNavigation/CreditsNavigation.tsx +3 -3
  130. package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +26 -13
  131. package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +1 -1
  132. package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +20 -17
  133. package/src/templates/Credits.tsx +26 -9
  134. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.d.ts +0 -1
  135. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.js +0 -2
  136. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.js.map +0 -7
  137. package/dist/cjs/components/credits/context/hooks/useSubscriptions.d.ts +0 -9
  138. package/dist/cjs/components/credits/context/hooks/useSubscriptions.js +0 -2
  139. package/dist/cjs/components/credits/context/hooks/useSubscriptions.js.map +0 -7
  140. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js +0 -2
  141. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js.map +0 -7
  142. package/dist/cjs/helpers/fetchResponse.d.ts +0 -14
  143. package/dist/cjs/helpers/fetchResponse.js +0 -2
  144. package/dist/cjs/helpers/fetchResponse.js.map +0 -7
  145. package/dist/cjs/helpers/fetcher.d.ts +0 -2
  146. package/dist/cjs/helpers/fetcher.js +0 -2
  147. package/dist/cjs/helpers/fetcher.js.map +0 -7
  148. package/dist/cjs/helpers/index.d.ts +0 -2
  149. package/dist/cjs/helpers/index.js +0 -2
  150. package/dist/cjs/helpers/index.js.map +0 -7
  151. package/dist/cjs/helpers/track.d.ts +0 -19
  152. package/dist/cjs/helpers/track.js +0 -2
  153. package/dist/cjs/helpers/track.js.map +0 -7
  154. package/dist/cjs/helpers/utils.d.ts +0 -3
  155. package/dist/cjs/helpers/utils.js +0 -2
  156. package/dist/cjs/helpers/utils.js.map +0 -7
  157. package/dist/cjs/templates/credits.js +0 -2
  158. package/dist/cjs/templates/credits.js.map +0 -7
  159. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.d.ts +0 -1
  160. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.js +0 -2
  161. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.js.map +0 -7
  162. package/dist/esm/components/credits/context/hooks/useSubscriptions.d.ts +0 -9
  163. package/dist/esm/components/credits/context/hooks/useSubscriptions.js +0 -2
  164. package/dist/esm/components/credits/context/hooks/useSubscriptions.js.map +0 -7
  165. package/dist/esm/components/credits/creditsBenefits/benefitItem.js +0 -2
  166. package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +0 -7
  167. package/dist/esm/helpers/fetchResponse.d.ts +0 -14
  168. package/dist/esm/helpers/fetchResponse.js +0 -2
  169. package/dist/esm/helpers/fetchResponse.js.map +0 -7
  170. package/dist/esm/helpers/fetcher.d.ts +0 -2
  171. package/dist/esm/helpers/fetcher.js +0 -2
  172. package/dist/esm/helpers/fetcher.js.map +0 -7
  173. package/dist/esm/helpers/index.d.ts +0 -2
  174. package/dist/esm/helpers/index.js +0 -2
  175. package/dist/esm/helpers/index.js.map +0 -7
  176. package/dist/esm/helpers/track.d.ts +0 -19
  177. package/dist/esm/helpers/track.js +0 -2
  178. package/dist/esm/helpers/track.js.map +0 -7
  179. package/dist/esm/helpers/utils.d.ts +0 -3
  180. package/dist/esm/helpers/utils.js +0 -2
  181. package/dist/esm/helpers/utils.js.map +0 -7
  182. package/dist/esm/templates/credits.js +0 -2
  183. package/dist/esm/templates/credits.js.map +0 -7
  184. package/src/components/credits/context/hooks/useFunctionMemberPrice.ts +0 -33
  185. package/src/components/credits/context/utils/atobID.ts +0 -8
  186. package/src/components/credits/context/utils/functionDiscountCalculate.ts +0 -57
  187. package/src/components/credits/context/utils/getFunctionMemberPrice.ts +0 -135
  188. package/src/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.ts +0 -51
  189. package/src/components/credits/context/utils/variantGetCoupon.ts +0 -34
  190. /package/dist/cjs/components/credits/creditsBenefits/{benefitItem.d.ts → BenefitItem.d.ts} +0 -0
  191. /package/dist/cjs/components/credits/creditsBenefits/{iconInfo.d.ts → IconInfo.d.ts} +0 -0
  192. /package/dist/esm/components/credits/creditsBenefits/{benefitItem.d.ts → BenefitItem.d.ts} +0 -0
  193. /package/dist/esm/components/credits/creditsBenefits/{iconInfo.d.ts → IconInfo.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
- import { Button, Text, Picture } from '@anker-in/headless-ui'
2
- import { useMemo } from 'react'
1
+ import { Button, Text, Picture, Badge } from '@anker-in/headless-ui'
2
+ import { useMemo, useState } from 'react'
3
3
 
4
4
  import { CreditsMemberPriceCopy, MemberPriceProduct } from './type'
5
5
  import { formatPrice, extractVariantId } from '../context/utils'
@@ -17,12 +17,15 @@ function MemberPriceItem({
17
17
  className?: string
18
18
  }) {
19
19
  const { brand, locale } = useHeadlessContext()
20
- const { profile, openSignUpPopup } = useCreditsContext()
20
+ const { profile, openSignUpPopup, cartConfig } = useCreditsContext()
21
21
  const rounded = ROUNDED_BRANDS.includes(brand)
22
22
 
23
23
  // 使用 buyNow hook 来处理结算
24
24
  const { trigger: buyNow, isMutating: isBuying } = useBuyNow({}, { throwOnError: true })
25
25
 
26
+ // 本地 loading 状态,避免全局 loading 影响所有卡片
27
+ const [isAddingToCart, setIsAddingToCart] = useState(false)
28
+
26
29
  const isAvailable = useMemo(() => {
27
30
  return itemData.productVariant?.availableForSale
28
31
  }, [itemData.productVariant?.availableForSale])
@@ -31,13 +34,73 @@ function MemberPriceItem({
31
34
  return !!profile
32
35
  }, [profile])
33
36
 
34
- // Learn More 按钮点击 - 跳转到产品详情页
35
- const handleLearnMore = () => {
36
- const variantId = extractVariantId(itemData.productVariant?.id)
37
- const url = variantId
38
- ? `/products/${itemData.product.handle}?variant=${variantId}`
39
- : `/products/${itemData.product.handle}`
40
- window.location.href = url
37
+ // variant metafields 中获取 coupon code
38
+ const getCouponCode = useMemo(() => {
39
+ try {
40
+ const discountData = itemData.productVariant?.metafields?.__discountCodeApp?.data
41
+ if (!discountData) return undefined
42
+
43
+ // discountData 已经是对象,不需要 JSON.parse
44
+ const discounts = discountData
45
+ if (!Array.isArray(discounts) || discounts.length === 0) return undefined
46
+
47
+ // 获取第一个有效的 coupon(检查时间范围)
48
+ const now = new Date()
49
+ const validDiscount = discounts.find((discount: any) => {
50
+ const startsAt = discount.starts_at ? new Date(discount.starts_at) : null
51
+ const endsAt = discount.ends_at ? new Date(discount.ends_at) : null
52
+
53
+ // 检查 coupon 是否在有效期内
54
+ if (startsAt && startsAt > now) return false
55
+ if (endsAt && endsAt < now) return false
56
+
57
+ return true
58
+ })
59
+
60
+ return validDiscount?.title
61
+ } catch (error) {
62
+ console.error('Failed to get discount code:', error)
63
+ return undefined
64
+ }
65
+ }, [itemData.productVariant?.metafields])
66
+
67
+ // Add to Cart 按钮点击 - 调用加购方法
68
+ const handleAddToCart = async () => {
69
+ if (!cartConfig?.addToCart) {
70
+ console.warn('cartConfig.addToCart is required')
71
+ return
72
+ }
73
+
74
+ try {
75
+ setIsAddingToCart(true)
76
+
77
+ // 构建 lineItem attributes
78
+ const lineItemAttributes: Array<{ key: string; value: string }> = []
79
+ if (getCouponCode) {
80
+ lineItemAttributes.push({
81
+ key: '_member_price',
82
+ value: JSON.stringify({ code: getCouponCode }),
83
+ })
84
+ }
85
+
86
+ await cartConfig.addToCart({
87
+ variantList: [
88
+ {
89
+ variant: itemData.productVariant,
90
+ quantity: 1,
91
+ attributes: lineItemAttributes.length > 0 ? lineItemAttributes : undefined,
92
+ },
93
+ ],
94
+ cartAttributes: {
95
+ _member_type: String(profile?.memberType || 0),
96
+ },
97
+ discountCodes: getCouponCode ? [getCouponCode] : undefined,
98
+ })
99
+ } catch (error) {
100
+ console.error('Add to cart failed:', error)
101
+ } finally {
102
+ setIsAddingToCart(false)
103
+ }
41
104
  }
42
105
 
43
106
  // Shop Now 按钮点击 - 检查登录状态后使用 buyNow 进行结算
@@ -48,6 +111,15 @@ function MemberPriceItem({
48
111
  return
49
112
  }
50
113
 
114
+ // 构建 lineItem attributes
115
+ const lineItemAttributes: Array<{ key: string; value: string }> = []
116
+ if (getCouponCode) {
117
+ lineItemAttributes.push({
118
+ key: '_member_price',
119
+ value: JSON.stringify({ code: getCouponCode }),
120
+ })
121
+ }
122
+
51
123
  // 已登录,执行购买
52
124
  buyNow({
53
125
  customAttributes: [
@@ -60,6 +132,7 @@ function MemberPriceItem({
60
132
  {
61
133
  variant: itemData.productVariant,
62
134
  quantity: 1,
135
+ attributes: lineItemAttributes.length > 0 ? lineItemAttributes : undefined,
63
136
  },
64
137
  ],
65
138
  })
@@ -70,17 +143,20 @@ function MemberPriceItem({
70
143
  className={cn(
71
144
  'relative flex flex-col items-center bg-[#EAEAEC] p-[24px] l:p-[8px] rounded-[16px] md-xl:p-[16px] md:rounded-[12px]',
72
145
  !rounded && 'rounded-none md:rounded-none',
146
+ copy.badgeLabel && 'pt-[48px] l:pt-[44px]',
73
147
  className
74
148
  )}
75
149
  >
76
- {/* Member 标签图片 */}
77
- {copy.memberPriceImg && (
78
- <Picture
79
- className="absolute left-[24px] top-[16px] h-[24px] w-auto"
80
- imgClassName="!h-full object-contain"
81
- source={copy.memberPriceImg.url}
82
- alt={copy.memberPriceImg.alt || 'Member Price'}
83
- />
150
+ {/* Member 标签 Badge */}
151
+ {copy.badgeLabel && (
152
+ <Badge
153
+ className="absolute left-[24px] !bg-gradient-brand l:left-[16px] top-[16px] z-10"
154
+ size="lg"
155
+ variant="promotional"
156
+ promotionalType="regular-member"
157
+ >
158
+ {copy.badgeLabel}
159
+ </Badge>
84
160
  )}
85
161
 
86
162
  {/* 产品图片 - 优先使用产品的 metafields 透明图 */}
@@ -109,11 +185,11 @@ function MemberPriceItem({
109
185
  <Text
110
186
  html={itemData?.product?.title}
111
187
  title={itemData?.product?.title}
112
- className="line-clamp-2 text-[24px] l-xxl:text-[20px] l:text-[16px] font-bold leading-[1.2] tracking-[-0.8px] text-[#080A0F]"
188
+ className="line-clamp-2 text-[24px] min-h-[58px] l-xxl:min-h-[48px] l:min-h-[38px] l-xxl:text-[20px] l:text-[16px] font-bold leading-[1.2] tracking-[-0.8px] text-[#080A0F]"
113
189
  />
114
190
 
115
191
  {/* 价格信息 */}
116
- <div className="mt-[16px] flex flex-col gap-[8px]">
192
+ <div className="mt-[24px] l:mt-[12px] flex flex-col gap-[8px] l:gap-0">
117
193
  {/* Member Price 标签 - 使用 text-brand-color-1 */}
118
194
  <Text
119
195
  html={copy.memberPriceLabel}
@@ -148,16 +224,17 @@ function MemberPriceItem({
148
224
  </div>
149
225
 
150
226
  {/* 按钮组 */}
151
- <div className="flex w-full gap-[8px] l:flex-col">
152
- {/* Learn More 按钮 */}
227
+ <div className="flex w-full mt-[8px] gap-[8px] l:flex-col">
228
+ {/* Add to Cart 按钮 */}
153
229
  <Button
154
230
  variant="secondary"
155
231
  className="flex-1 md:w-full"
156
232
  size="lg"
157
- onClick={handleLearnMore}
158
- disabled={!isAvailable}
233
+ onClick={handleAddToCart}
234
+ disabled={!isAvailable || !cartConfig?.addToCart || isAddingToCart}
235
+ loading={isAddingToCart}
159
236
  >
160
- {copy.learnMoreText}
237
+ {copy.addToCart}
161
238
  </Button>
162
239
 
163
240
  {/* Shop Now 按钮 */}
@@ -45,13 +45,10 @@ export type CreditsMemberPriceCopy = {
45
45
  // 会员价 tab 配置(产品列表和价格完全从 memberPriceDiscount 获取)
46
46
  memberPriceTab: {
47
47
  memberPriceRuleId: string // 指定使用哪个会员价规则
48
- learnMoreText: string
48
+ addToCart: string
49
49
  shopNowText: string
50
50
  memberPriceLabel: string
51
- memberPriceImg?: {
52
- url: string
53
- alt?: string
54
- }
51
+ badgeLabel?: string
55
52
  }
56
53
  // 积分兑换 tab 配置(复用 creditsCash 的配置)
57
54
  redeemTab: {
@@ -62,6 +59,7 @@ export type CreditsMemberPriceCopy = {
62
59
  unlockRewards: string
63
60
  btnRedeem: string
64
61
  off: string
62
+ badgeLabel?: string
65
63
  }
66
64
  }
67
65
 
@@ -87,7 +87,7 @@ export const CreditsNavigation = ({ copy }: { copy: CreditsNavigationCopy }) =>
87
87
  }, [setupObserver])
88
88
 
89
89
  return (
90
- <nav className={cn('sticky top-0 z-50 bg-white')}>
90
+ <nav id="creditsNavigation" className={cn('sticky top-0 z-50 bg-white')}>
91
91
  <Container asChild>
92
92
  <div
93
93
  className={cn(
@@ -95,7 +95,7 @@ export const CreditsNavigation = ({ copy }: { copy: CreditsNavigationCopy }) =>
95
95
  'md:scrollbar-hide md:[&::-webkit-scrollbar]:hidden md:[-ms-overflow-style:none] md:[scrollbar-width:none]'
96
96
  )}
97
97
  >
98
- <ul className={cn('flex items-end gap-[24px] pt-[16px] md:gap-[16px] md:pr-[16px]')}>
98
+ <ul className={cn('flex items-end gap-[24px] pt-[16px] md:pt-[12px] md:gap-[16px] md:pr-[16px]')}>
99
99
  {copy.items.map((item, index) => {
100
100
  const isActive = activeId === item.targetId
101
101
  return (
@@ -103,7 +103,7 @@ export const CreditsNavigation = ({ copy }: { copy: CreditsNavigationCopy }) =>
103
103
  <button
104
104
  onClick={() => scrollToSection(item.targetId)}
105
105
  className={cn(
106
- 'pb-[16px] text-[14px] font-bold tracking-[-0.28px] leading-[1.4]',
106
+ 'pb-[16px] md:pb-[12px] text-[14px] font-bold tracking-[-0.28px] leading-[1.4]',
107
107
  'transition-all duration-200 relative border-b-4 whitespace-nowrap',
108
108
  isActive
109
109
  ? 'text-[#080a0f] border-brand-1'
@@ -1,4 +1,4 @@
1
- import { Container, Heading, Tabs, TabsList, TabsTrigger, Text } from '@anker-in/headless-ui'
1
+ import { Container, Heading, Tabs, TabsList, TabsTrigger } from '@anker-in/headless-ui'
2
2
  import classNames from 'classnames'
3
3
  import { useCallback, useMemo, useState } from 'react'
4
4
 
@@ -7,7 +7,7 @@ import RedeemProductModal from './RedeemProductModal'
7
7
  import { useCreditsContext } from '../context/provider'
8
8
  import useRedeemableList from '../context/hooks/useRedeemableList'
9
9
  import { AlpcConsumeType, AlpcErrorCode } from '../context/const'
10
- import { useHeadlessContext, useProductsByHandles, gaTrack } from '@anker-in/lib'
10
+ import { useHeadlessContext, useProductsByHandles, gaTrack, classNames as cn } from '@anker-in/lib'
11
11
  import type { RedeemableItem as RedeemableItemType } from '../type'
12
12
  import { RedeemableItem } from './RedeemableItem'
13
13
  import { ROUNDED_BRANDS } from '../../../constants'
@@ -29,9 +29,8 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
29
29
  const rounded = ROUNDED_BRANDS.includes(brand)
30
30
 
31
31
  const isLogin = Object.keys(profile || {}).length > 0
32
- const isActivated = profile?.activated
33
32
 
34
- const [activeTab, setActiveTab] = useState<string>(copy.list[0].label)
33
+ const [activeTab, setActiveTab] = useState<string>(copy.list?.[0]?.label || '')
35
34
 
36
35
  const [popRedeemData, setPopRedeemData] = useState<RedeemableItemType | undefined>(undefined)
37
36
 
@@ -59,8 +58,8 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
59
58
  const { data: products } = useProductsByHandles({ handles })
60
59
 
61
60
  const list = useMemo(() => {
62
- const currentList = copy.list.find(item => item.label === activeTab)
63
- return currentList?.list
61
+ const currentList = copy.list?.find(item => item.label === activeTab)
62
+ return (currentList?.list || [])
64
63
  .filter(item => alpcList.some(alpcItem => alpcItem.id === item.id))
65
64
  .map(item => {
66
65
  const alpcItem = alpcList.find(alpcItem => alpcItem.id === item.id)
@@ -93,12 +92,26 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
93
92
  <Heading as="h2" size="4" html={copy.title} />
94
93
 
95
94
  {/* 可用积分展示 */}
96
- {isLogin && isActivated && (
97
- <Text
98
- html={copy.availableCredits?.replace('$credits', numberFormat(creditInfo?.available_credit || 0).toString())}
99
- className="mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]"
100
- as="p"
101
- />
95
+ {isLogin && copy.availableCredits && (
96
+ <p className="mt-[12px] text-[20px] l-xxl:text-[18px] l:text-[16px] font-bold text-[#4A4C56]">
97
+ {copy.availableCredits.includes('$credits') ? (
98
+ <>
99
+ {copy.availableCredits.split('$credits')[0]}
100
+ <span
101
+ className={cn(
102
+ 'text-brand-color-0',
103
+ brand === 'ankersolix' &&
104
+ 'bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent'
105
+ )}
106
+ >
107
+ {numberFormat(creditInfo?.available_credit || 0).toString()}
108
+ </span>
109
+ {copy.availableCredits.split('$credits')[1] || ''}
110
+ </>
111
+ ) : (
112
+ copy.availableCredits
113
+ )}
114
+ </p>
102
115
  )}
103
116
 
104
117
  <Tabs
@@ -119,7 +132,7 @@ export const CreditsRedeemList = ({ copy, id }: { copy: CreditsRedeemListCopy; i
119
132
  }}
120
133
  >
121
134
  <TabsList>
122
- {copy.list.map(item => (
135
+ {(copy.list || []).map(item => (
123
136
  <TabsTrigger key={item.label} value={item.label}>
124
137
  {item.label}
125
138
  </TabsTrigger>
@@ -150,7 +150,7 @@ export function RedeemableItem({
150
150
  html={`${numberFormat(item.alpc?.consumeCredits)}`}
151
151
  size={2}
152
152
  as="p"
153
- className="ml-[4px] text-[28px] font-bold mt-[4px] leading-none md:text-[18px] l-xxl:text-[24px] md-l:text-[20px] "
153
+ className="ml-[4px] text-[24px] font-bold mt-[4px] leading-none l-xxl:text-[20px] l:text-[16px] "
154
154
  />
155
155
  </div>
156
156
 
@@ -1,7 +1,6 @@
1
1
  import { Button, Container, Heading, Picture, Text } from '@anker-in/headless-ui'
2
2
  import { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/24/outline'
3
- import { motion } from 'framer-motion'
4
- import { useMemo, useState } from 'react'
3
+ import { useEffect, useMemo, useRef, useState } from 'react'
5
4
 
6
5
  import { TaskType, type CreditsWaysToGetCreditsProps } from './type'
7
6
  import { useActions } from './useActions'
@@ -14,6 +13,7 @@ import { ROUNDED_BRANDS } from '../../../constants'
14
13
 
15
14
  export const CreditsWaysToGetCredits = ({ copy, classNames, id }: CreditsWaysToGetCreditsProps & { id?: string }) => {
16
15
  const [showMore, setShowMore] = useState(false)
16
+ const containerRef = useRef<HTMLDivElement>(null)
17
17
  const { profile } = useCreditsContext()
18
18
  const { authCodeActivate } = useRegistration()
19
19
  const { brand } = useHeadlessContext()
@@ -37,7 +37,7 @@ export const CreditsWaysToGetCredits = ({ copy, classNames, id }: CreditsWaysToG
37
37
  },
38
38
  })
39
39
  const list = useMemo(() => {
40
- const list = copy.list
40
+ const list = (copy.list || [])
41
41
  .map(item => {
42
42
  if (!actions[item.id as keyof typeof actions]) {
43
43
  return undefined
@@ -91,6 +91,18 @@ export const CreditsWaysToGetCredits = ({ copy, classNames, id }: CreditsWaysToG
91
91
  }
92
92
  }, [actions, copy.list, isLogin])
93
93
 
94
+ useEffect(() => {
95
+ if (!showMore && window.innerWidth < 768) {
96
+ const section = document.getElementById('ways-to-get-credits')
97
+ if (section) {
98
+ const timer = setTimeout(() => {
99
+ section.scrollIntoView({ behavior: 'smooth', block: 'end' })
100
+ }, 300)
101
+ return () => clearTimeout(timer)
102
+ }
103
+ }
104
+ }, [showMore])
105
+
94
106
  return (
95
107
  <Container id={id} className=" bg-[#F5F5F7] [&>div]:l:!px-0">
96
108
  <div
@@ -123,21 +135,12 @@ export const CreditsWaysToGetCredits = ({ copy, classNames, id }: CreditsWaysToG
123
135
  </div>
124
136
 
125
137
  <div className="relative">
126
- <motion.div
138
+ <div
139
+ ref={containerRef}
127
140
  className={cn(
128
- 'relative mt-[64px] grid grid-cols-3 gap-[16px] overflow-hidden md:mt-[16px] md:grid-cols-1 l:gap-[12px] min-md:!h-auto md-l:mt-[32px] md-l:grid-cols-2'
141
+ 'relative mt-[64px] grid grid-cols-3 gap-[16px] overflow-hidden transition-all duration-300 md:mt-[16px] md:grid-cols-1 l:gap-[12px] md-l:mt-[32px] md-l:grid-cols-2',
142
+ showMore ? 'min-md:!h-auto md:h-auto' : 'md:h-[512px] min-md:!h-auto'
129
143
  )}
130
- initial={{ height: 512 }}
131
- animate={{ height: showMore ? 'auto' : 512 }}
132
- transition={{ duration: 0.3 }}
133
- onAnimationComplete={() => {
134
- if (!showMore && window.screen.width < 768) {
135
- const section = document.getElementById('ways-to-get-credits')
136
- if (section) {
137
- section.scrollIntoView({ behavior: 'smooth', block: 'end' })
138
- }
139
- }
140
- }}
141
144
  >
142
145
  {list.map(item => (
143
146
  <div
@@ -195,7 +198,7 @@ export const CreditsWaysToGetCredits = ({ copy, classNames, id }: CreditsWaysToG
195
198
  style={{ background: 'linear-gradient(180deg, rgba(29, 29, 31, 0) 66.37%, #1D1D1F 100%)' }}
196
199
  ></div>
197
200
  )}
198
- </motion.div>
201
+ </div>
199
202
  {showMore ? (
200
203
  <button
201
204
  className="mx-auto mt-[12px] block w-fit min-md:hidden"
@@ -74,6 +74,17 @@ export type CreditsTemplateProps = {
74
74
  gtm: {
75
75
  pageGroup: string
76
76
  }
77
+ cartConfig?: {
78
+ addToCart: (params: {
79
+ variantList: Array<{
80
+ variant: any
81
+ quantity: number
82
+ attributes?: Array<{ key: string; value: string }>
83
+ }>
84
+ cartAttributes?: Record<string, string>
85
+ discountCodes?: string[]
86
+ }) => void | Promise<any>
87
+ }
77
88
  }
78
89
 
79
90
  export const CreditsTemplate = ({
@@ -84,8 +95,8 @@ export const CreditsTemplate = ({
84
95
  pageConfig,
85
96
  registrationContext,
86
97
  gtm,
98
+ cartConfig,
87
99
  }: CreditsTemplateProps) => {
88
-
89
100
  console.log('siteConfig', siteConfig)
90
101
  return (
91
102
  <HeadlessProvider headlessConfig={headlessConfig}>
@@ -105,6 +116,7 @@ export const CreditsTemplate = ({
105
116
  pageCommon={pageConfig.common}
106
117
  memberPriceDiscount={siteConfig.memberPriceDiscount}
107
118
  alpcBrand={creditsConfig?.alpcBrand}
119
+ cartConfig={cartConfig}
108
120
  >
109
121
  {/* 导航组件 - 固定位置,不参与 order 排序 */}
110
122
  {pageConfig.components[ComponentKey.Navigation] && (
@@ -122,7 +134,9 @@ export const CreditsTemplate = ({
122
134
  {key === ComponentKey.InfoCard && userContext?.profile && (
123
135
  <CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} id={key} />
124
136
  )}
125
- {key === ComponentKey.Benefits && <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} id={key} />}
137
+ {key === ComponentKey.Benefits && (
138
+ <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} id={key} />
139
+ )}
126
140
  {key === ComponentKey.WaysToGetCredits && (
127
141
  <CreditsWaysToGetCredits
128
142
  copy={componentCopy as CreditsWaysToGetCreditsCopy}
@@ -142,14 +156,17 @@ export const CreditsTemplate = ({
142
156
  />
143
157
  )}
144
158
  {key === ComponentKey.AnkersolixTask && (
145
- <CreditsAnkersolixTask
146
- copy={componentCopy as CreditsAnkersolixTaskCopy}
147
- id={key}
148
- />
159
+ <CreditsAnkersolixTask copy={componentCopy as CreditsAnkersolixTaskCopy} id={key} />
160
+ )}
161
+ {key === ComponentKey.RedeemList && (
162
+ <CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} id={key} />
163
+ )}
164
+ {key === ComponentKey.SpendCreditsLikeCash && (
165
+ <CreditsCash copy={componentCopy as CreditsCashCopy} id={key} />
166
+ )}
167
+ {key === ComponentKey.MemberPrice && (
168
+ <CreditsMemberPrice copy={componentCopy as CreditsMemberPriceCopy} id={key} />
149
169
  )}
150
- {key === ComponentKey.RedeemList && <CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} id={key} />}
151
- {key === ComponentKey.SpendCreditsLikeCash && <CreditsCash copy={componentCopy as CreditsCashCopy} id={key} />}
152
- {key === ComponentKey.MemberPrice && <CreditsMemberPrice copy={componentCopy as CreditsMemberPriceCopy} id={key} />}
153
170
  {key === ComponentKey.Faqs && <CreditsFaq copy={componentCopy as CreditsFaqCopy} id={key} />}
154
171
  {key !== ComponentKey.Banner && (
155
172
  <div className="laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16" />
@@ -1 +0,0 @@
1
- export declare function useSendEmailValidation(): import("swr/mutation").SWRMutationResponse<any, any, "send-email-validation", never>;
@@ -1,2 +0,0 @@
1
- "use strict";var c=Object.create;var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var x=(e,t)=>{for(var o in t)i(e,o,{get:t[o],enumerable:!0})},r=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of f(t))!v.call(e,a)&&a!==o&&i(e,a,{get:()=>t[a],enumerable:!(n=d(t,a))||n.enumerable});return e};var m=(e,t,o)=>(o=e!=null?c(h(e)):{},r(t||!e||!e.__esModule?i(o,"default",{value:e,enumerable:!0}):o,e)),C=e=>r(i({},"__esModule",{value:!0}),e);var y={};x(y,{useSendEmailValidation:()=>S});module.exports=C(y);var s=m(require("../../../../helpers/fetcher")),l=m(require("swr/mutation")),p=require("../provider"),u=require("@anker-in/lib");function S(){const{profile:e}=(0,p.useCreditsContext)(),{appName:t,locale:o}=(0,u.useHeadlessContext)();return(0,l.default)("send-email-validation",()=>(0,s.default)({locale:o,url:"/api/multipass/account/users/send_validation_email",method:"POST",body:{email:e?.email,app:t},needRecaptcha:!0,action:"verifyAccount"}))}
2
- //# sourceMappingURL=useSendEmailValidation.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/components/credits/context/hooks/useSendEmailValidation.ts"],
4
- "sourcesContent": ["import fetcher from '../../../../helpers/fetcher'\nimport useSWRMutation from 'swr/mutation'\nimport { useCreditsContext } from '../provider'\nimport { useHeadlessContext } from '@anker-in/lib'\n\nexport function useSendEmailValidation() {\n const { profile } = useCreditsContext()\n const { appName, locale } = useHeadlessContext()\n\n return useSWRMutation('send-email-validation', () =>\n fetcher({\n locale,\n url: '/api/multipass/account/users/send_validation_email',\n method: 'POST',\n body: { email: profile?.email, app: appName },\n needRecaptcha: true,\n action: 'verifyAccount',\n })\n )\n}\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAoB,0CACpBC,EAA2B,2BAC3BC,EAAkC,uBAClCC,EAAmC,yBAE5B,SAASL,GAAyB,CACvC,KAAM,CAAE,QAAAM,CAAQ,KAAI,qBAAkB,EAChC,CAAE,QAAAC,EAAS,OAAAC,CAAO,KAAI,sBAAmB,EAE/C,SAAO,EAAAC,SAAe,wBAAyB,OAC7C,EAAAC,SAAQ,CACN,OAAAF,EACA,IAAK,qDACL,OAAQ,OACR,KAAM,CAAE,MAAOF,GAAS,MAAO,IAAKC,CAAQ,EAC5C,cAAe,GACf,OAAQ,eACV,CAAC,CACH,CACF",
6
- "names": ["useSendEmailValidation_exports", "__export", "useSendEmailValidation", "__toCommonJS", "import_fetcher", "import_mutation", "import_provider", "import_lib", "profile", "appName", "locale", "useSWRMutation", "fetcher"]
7
- }
@@ -1,9 +0,0 @@
1
- import { SWRResponse } from 'swr';
2
- import type { Subscription } from '../../type';
3
- export type SubscriptionApiResponse = {
4
- data: Subscription;
5
- };
6
- export type FetchSubscriptionResponse = SWRResponse<Subscription>;
7
- export declare function useSubscriptions({ email }: {
8
- email?: string;
9
- }): FetchSubscriptionResponse;
@@ -1,2 +0,0 @@
1
- "use strict";var b=Object.create;var i=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty;var y=(s,t)=>{for(var e in t)i(s,e,{get:t[e],enumerable:!0})},n=(s,t,e,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of R(t))!l.call(s,o)&&o!==e&&i(s,o,{get:()=>t[o],enumerable:!(p=m(t,o))||p.enumerable});return s};var r=(s,t,e)=>(e=s!=null?b(d(s)):{},n(t||!s||!s.__esModule?i(e,"default",{value:s,enumerable:!0}):e,s)),f=s=>n(i({},"__esModule",{value:!0}),s);var x={};y(x,{useSubscriptions:()=>h});module.exports=f(x);var c=r(require("swr")),u=r(require("../../../../helpers/fetcher")),a=require("@anker-in/lib");function h({email:s}){const{locale:t}=(0,a.useHeadlessContext)(),{data:e,...p}=(0,c.default)(s?["/api/multipass/account/subscriptions",s]:null,async([o,S])=>(0,u.default)({method:"GET",url:o,body:{email:S},action:"login",locale:t,headers:{},type:""}));return{data:e?.data,...p}}
2
- //# sourceMappingURL=useSubscriptions.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/components/credits/context/hooks/useSubscriptions.ts"],
4
- "sourcesContent": ["import useSWR, { SWRResponse } from 'swr'\nimport type { Subscription } from '../../type'\nimport fetcher from '../../../../helpers/fetcher'\nimport { useHeadlessContext } from '@anker-in/lib'\n\nexport type SubscriptionApiResponse = { data: Subscription }\nexport type FetchSubscriptionResponse = SWRResponse<Subscription>\n\nexport function useSubscriptions({ email }: { email?: string }): FetchSubscriptionResponse {\n const { locale } = useHeadlessContext()\n\n const { data, ...rest } = useSWR<SubscriptionApiResponse>(\n email ? ['/api/multipass/account/subscriptions', email] : null,\n async ([url, email]) =>\n fetcher({\n method: 'GET',\n url,\n body: {\n email,\n },\n action: 'login',\n locale,\n headers: {},\n type: '',\n })\n )\n\n return { data: data?.data, ...rest } as unknown as FetchSubscriptionResponse\n}\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAoC,kBAEpCC,EAAoB,0CACpBC,EAAmC,yBAK5B,SAASJ,EAAiB,CAAE,MAAAK,CAAM,EAAkD,CACzF,KAAM,CAAE,OAAAC,CAAO,KAAI,sBAAmB,EAEhC,CAAE,KAAAC,EAAM,GAAGC,CAAK,KAAI,EAAAC,SACxBJ,EAAQ,CAAC,uCAAwCA,CAAK,EAAI,KAC1D,MAAO,CAACK,EAAKL,CAAK,OAChB,EAAAM,SAAQ,CACN,OAAQ,MACR,IAAAD,EACA,KAAM,CACJ,MAAAL,CACF,EACA,OAAQ,QACR,OAAAC,EACA,QAAS,CAAC,EACV,KAAM,EACR,CAAC,CACL,EAEA,MAAO,CAAE,KAAMC,GAAM,KAAM,GAAGC,CAAK,CACrC",
6
- "names": ["useSubscriptions_exports", "__export", "useSubscriptions", "__toCommonJS", "import_swr", "import_fetcher", "import_lib", "email", "locale", "data", "rest", "useSWR", "url", "fetcher"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var F=Object.create;var r=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var k=(e,o)=>{for(var n in o)r(e,n,{get:o[n],enumerable:!0})},b=(e,o,n,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of h(o))!C.call(e,i)&&i!==n&&r(e,i,{get:()=>o[i],enumerable:!(a=N(o,i))||a.enumerable});return e};var y=(e,o,n)=>(n=e!=null?F(D(e)):{},b(o||!e||!e.__esModule?r(n,"default",{value:e,enumerable:!0}):n,e)),z=e=>b(r({},"__esModule",{value:!0}),e);var B={};k(B,{default:()=>w});module.exports=z(B);var t=require("react/jsx-runtime"),s=require("@anker-in/headless-ui"),l=require("@anker-in/lib"),f=y(require("./IconInfo")),u=require("../../../constants");const I=({item:e,handleClick:o,isNoteActive:n,index:a,bigIcon:i,cardBgColor:x,cardBorderColor:c})=>{const{brand:g}=(0,l.useHeadlessContext)(),m=u.ROUNDED_BRANDS.includes(g),v=i?"mb-[16px] size-[64px] xl-xxl:size-[54px] xl:size-[48px] md:absolute md:bottom-[16px] md:right-[16px] md:mb-0":"mb-[16px] size-[31px] md:absolute md:bottom-[16px] md:right-[16px] md:mb-0";console.log("cardBgColor in BenefitItem",x);const d={};return x?d.background=x:d.background="linear-gradient(119.61deg, #FAFAFA 38.58%, #FFFFFF 63.73%, #F9FCFF 89.37%)",c&&(d.borderColor=c),(0,t.jsx)("div",{className:(0,l.classNames)("relative flex-1 flex flex-col rounded-[16px] border border-white px-[24px] pb-[26px] pt-[24px] md:min-h-[180px] md:p-[16px]",!m&&"rounded-none"),style:d,children:(0,t.jsxs)("div",{className:"flex flex-col",children:[(0,t.jsx)(s.Picture,{className:v,alt:e.icon?.alt,source:e.icon?.url}),(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(s.Heading,{html:e.text,size:"2",className:"break-all md-l:line-clamp-3"}),e.note&&(0,t.jsxs)("div",{role:"button",tabIndex:0,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&p.preventDefault()},className:"relative mb-1 ml-[4px]",onClick:()=>o({item:e,index:a}),children:[(0,t.jsx)(f.default,{}),(0,t.jsx)("div",{className:(0,l.classNames)("absolute -bottom-[12px] left-[32px] z-10 w-[356px] -translate-x-full translate-y-full md:w-[276px]",n?"block":"hidden"),children:(0,t.jsxs)("div",{className:(0,l.classNames)("relative rounded-[10px] bg-[#6D6D6F] p-[16px] text-[14px] font-medium text-white shadow",!m&&"rounded-none"),children:[(0,t.jsx)(s.Text,{as:"p",size:"2",html:e.note,className:"desktop:text-[18px]"}),(0,t.jsx)("div",{className:(0,l.classNames)("absolute -top-[10px] right-[9px] mb-2 size-[16px] origin-top-left rotate-45 transform rounded-[2px] bg-[#6D6D6F]",!m&&"rounded-none")})]})})]})]}),e.tag&&(0,t.jsx)(s.Text,{as:"div",html:e.tag,className:"mt-[2px] text-[16px] font-bold text-[#6D6D6F]"})]})})};var w=I;
2
- //# sourceMappingURL=BenefitItem.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/components/credits/creditsBenefits/BenefitItem.tsx"],
4
- "sourcesContent": ["import { Heading, Picture, Text } from '@anker-in/headless-ui'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport IconInfo from './IconInfo'\nimport { ROUNDED_BRANDS } from '../../../constants'\n\nexport interface BenefitItemCopy {\n icon: {\n alt: string\n url: string\n }\n text: string\n note?: string\n tag?: string\n}\nconst BenefitItem = ({\n item,\n handleClick,\n isNoteActive,\n index,\n bigIcon,\n cardBgColor,\n cardBorderColor,\n}: {\n item: BenefitItemCopy\n handleClick: ({ item, index }: { item: BenefitItemCopy; index: number }) => void\n isNoteActive: boolean\n index: number\n bigIcon?: boolean\n cardBgColor?: string\n cardBorderColor?: string\n}) => {\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n // \u6839\u636E bigIcon \u8BBE\u7F6E\u4E0D\u540C\u5C4F\u5E55\u4E0B\u7684\u56FE\u6807\u5927\u5C0F\n // \u5C3A\u5BF8\uFF1A\u22651921px=64px, 1441-1920px=54px, \u22641440px=48px\n const iconSizeClass = bigIcon\n ? 'mb-[16px] size-[64px] xl-xxl:size-[54px] xl:size-[48px] md:absolute md:bottom-[16px] md:right-[16px] md:mb-0'\n : 'mb-[16px] size-[31px] md:absolute md:bottom-[16px] md:right-[16px] md:mb-0'\n\n console.log('cardBgColor in BenefitItem', cardBgColor)\n // \u80CC\u666F\u8272\u548C\u8FB9\u6846\u8272\u5904\u7406\n const cardStyle: React.CSSProperties = {}\n if (cardBgColor) {\n cardStyle.background = cardBgColor\n } else {\n cardStyle.background = 'linear-gradient(119.61deg, #FAFAFA 38.58%, #FFFFFF 63.73%, #F9FCFF 89.37%)'\n }\n if (cardBorderColor) {\n cardStyle.borderColor = cardBorderColor\n }\n\n return (\n <div\n className={cn(\n 'relative flex-1 flex flex-col rounded-[16px] border border-white px-[24px] pb-[26px] pt-[24px] md:min-h-[180px] md:p-[16px]',\n !rounded && 'rounded-none'\n )}\n style={cardStyle}\n >\n <div className=\"flex flex-col\">\n <Picture className={iconSizeClass} alt={item.icon?.alt} source={item.icon?.url} />\n <div className=\"flex items-center\">\n <Heading html={item.text} size=\"2\" className=\"break-all md-l:line-clamp-3\" />\n {item.note && (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }}\n className=\"relative mb-1 ml-[4px]\"\n onClick={() => handleClick({ item, index })}\n >\n <IconInfo />\n <div\n className={cn(\n 'absolute -bottom-[12px] left-[32px] z-10 w-[356px] -translate-x-full translate-y-full md:w-[276px]',\n isNoteActive ? 'block' : 'hidden'\n )}\n >\n <div\n className={cn(\n 'relative rounded-[10px] bg-[#6D6D6F] p-[16px] text-[14px] font-medium text-white shadow',\n !rounded && 'rounded-none'\n )}\n >\n <Text as=\"p\" size=\"2\" html={item.note} className=\"desktop:text-[18px]\" />\n <div\n className={cn(\n 'absolute -top-[10px] right-[9px] mb-2 size-[16px] origin-top-left rotate-45 transform rounded-[2px] bg-[#6D6D6F]',\n !rounded && 'rounded-none'\n )}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n {item.tag && <Text as=\"div\" html={item.tag} className=\"mt-[2px] text-[16px] font-bold text-[#6D6D6F]\" />}\n </div>\n </div>\n )\n}\n\nexport default BenefitItem\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GA6DQ,IAAAI,EAAA,6BA7DRC,EAAuC,iCACvCC,EAAqD,yBACrDC,EAAqB,yBACrBC,EAA+B,8BAW/B,MAAMC,EAAc,CAAC,CACnB,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,MAAAC,EACA,QAAAC,EACA,YAAAC,EACA,gBAAAC,CACF,IAQM,CACJ,KAAM,CAAE,MAAAC,CAAM,KAAI,sBAAmB,EAC/BC,EAAU,iBAAe,SAASD,CAAK,EAIvCE,EAAgBL,EAClB,+GACA,6EAEJ,QAAQ,IAAI,6BAA8BC,CAAW,EAErD,MAAMK,EAAiC,CAAC,EACxC,OAAIL,EACFK,EAAU,WAAaL,EAEvBK,EAAU,WAAa,6EAErBJ,IACFI,EAAU,YAAcJ,MAIxB,OAAC,OACC,aAAW,EAAAK,YACT,8HACA,CAACH,GAAW,cACd,EACA,MAAOE,EAEP,oBAAC,OAAI,UAAU,gBACb,oBAAC,WAAQ,UAAWD,EAAe,IAAKT,EAAK,MAAM,IAAK,OAAQA,EAAK,MAAM,IAAK,KAChF,QAAC,OAAI,UAAU,oBACb,oBAAC,WAAQ,KAAMA,EAAK,KAAM,KAAK,IAAI,UAAU,8BAA8B,EAC1EA,EAAK,SACJ,QAAC,OACC,KAAK,SACL,SAAU,EACV,UAAWY,GAAK,EACVA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MACjCA,EAAE,eAAe,CAErB,EACA,UAAU,yBACV,QAAS,IAAMX,EAAY,CAAE,KAAAD,EAAM,MAAAG,CAAM,CAAC,EAE1C,oBAAC,EAAAU,QAAA,EAAS,KACV,OAAC,OACC,aAAW,EAAAF,YACT,qGACAT,EAAe,QAAU,QAC3B,EAEA,oBAAC,OACC,aAAW,EAAAS,YACT,0FACA,CAACH,GAAW,cACd,EAEA,oBAAC,QAAK,GAAG,IAAI,KAAK,IAAI,KAAMR,EAAK,KAAM,UAAU,sBAAsB,KACvE,OAAC,OACC,aAAW,EAAAW,YACT,mHACA,CAACH,GAAW,cACd,EACF,GACF,EACF,GACF,GAEJ,EACCR,EAAK,QAAO,OAAC,QAAK,GAAG,MAAM,KAAMA,EAAK,IAAK,UAAU,gDAAgD,GACxG,EACF,CAEJ,EAEA,IAAOR,EAAQO",
6
- "names": ["BenefitItem_exports", "__export", "BenefitItem_default", "__toCommonJS", "import_jsx_runtime", "import_headless_ui", "import_lib", "import_IconInfo", "import_constants", "BenefitItem", "item", "handleClick", "isNoteActive", "index", "bigIcon", "cardBgColor", "cardBorderColor", "brand", "rounded", "iconSizeClass", "cardStyle", "cn", "e", "IconInfo"]
7
- }
@@ -1,14 +0,0 @@
1
- export declare function getAsyncError(res: {
2
- json: () => any;
3
- status: any;
4
- statusText: any;
5
- }): Promise<{
6
- status: any;
7
- statusText: any;
8
- errors: any;
9
- type: any;
10
- data: any;
11
- message: any;
12
- } | undefined>;
13
- declare const handleFetchResponse: (res: Response) => Promise<any>;
14
- export default handleFetchResponse;
@@ -1,2 +0,0 @@
1
- "use strict";var o=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var d=(a,t)=>{for(var s in t)o(a,s,{get:t[s],enumerable:!0})},l=(a,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of c(t))!y.call(a,e)&&e!==s&&o(a,e,{get:()=>t[e],enumerable:!(n=u(t,e))||n.enumerable});return a};var g=a=>l(o({},"__esModule",{value:!0}),a);var x={};d(x,{default:()=>p,getAsyncError:()=>r});module.exports=g(x);async function r(a){try{const t=await a.json();return{status:a.status,statusText:a.statusText,errors:t?.data?.error||t?.data?.code||a.statusText||a.status,type:t?.data?.type,data:t?.data,message:t?.data?.message}}catch(t){console.log(t)}}const i=async a=>{if(a.ok)try{const t=await a.json(),{errors:s}=t;return s&&s.length?{errors:s,status:a.status}:t}catch(t){console.log(t)}return await r(a)};var p=i;
2
- //# sourceMappingURL=fetchResponse.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/helpers/fetchResponse.ts"],
4
- "sourcesContent": ["export async function getAsyncError(res: { json: () => any; status: any; statusText: any }) {\n try {\n const result = await res.json()\n return {\n status: res.status,\n statusText: res.statusText,\n errors: result?.data?.error || result?.data?.code || res.statusText || res.status,\n type: result?.data?.type,\n data: result?.data,\n message: result?.data?.message,\n }\n } catch (error) {\n console.log(error)\n }\n}\n\nconst handleFetchResponse = async (res: Response) => {\n if (res.ok) {\n try {\n const result = await res.json()\n const { errors } = result\n if (errors && errors.length) {\n return { errors, status: res.status }\n }\n\n return result\n } catch (error) {\n console.log(error)\n }\n }\n\n return await getAsyncError(res)\n}\n\nexport default handleFetchResponse\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,kBAAAC,IAAA,eAAAC,EAAAJ,GAAA,eAAsBG,EAAcE,EAAwD,CAC1F,GAAI,CACF,MAAMC,EAAS,MAAMD,EAAI,KAAK,EAC9B,MAAO,CACL,OAAQA,EAAI,OACZ,WAAYA,EAAI,WAChB,OAAQC,GAAQ,MAAM,OAASA,GAAQ,MAAM,MAAQD,EAAI,YAAcA,EAAI,OAC3E,KAAMC,GAAQ,MAAM,KACpB,KAAMA,GAAQ,KACd,QAASA,GAAQ,MAAM,OACzB,CACF,OAASC,EAAO,CACd,QAAQ,IAAIA,CAAK,CACnB,CACF,CAEA,MAAMC,EAAsB,MAAOH,GAAkB,CACnD,GAAIA,EAAI,GACN,GAAI,CACF,MAAMC,EAAS,MAAMD,EAAI,KAAK,EACxB,CAAE,OAAAI,CAAO,EAAIH,EACnB,OAAIG,GAAUA,EAAO,OACZ,CAAE,OAAAA,EAAQ,OAAQJ,EAAI,MAAO,EAG/BC,CACT,OAASC,EAAO,CACd,QAAQ,IAAIA,CAAK,CACnB,CAGF,OAAO,MAAMJ,EAAcE,CAAG,CAChC,EAEA,IAAOH,EAAQM",
6
- "names": ["fetchResponse_exports", "__export", "fetchResponse_default", "getAsyncError", "__toCommonJS", "res", "result", "error", "handleFetchResponse", "errors"]
7
- }
@@ -1,2 +0,0 @@
1
- declare const fetcher: ({ locale, url, method, headers, body, type, timeout }: any) => Promise<any>;
2
- export default fetcher;
@@ -1,2 +0,0 @@
1
- "use strict";var h=Object.create;var o=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var b=(e,a)=>{for(var n in a)o(e,n,{get:a[n],enumerable:!0})},i=(e,a,n,t)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of u(a))!T.call(e,r)&&r!==n&&o(e,r,{get:()=>a[r],enumerable:!(t=p(a,r))||t.enumerable});return e};var w=(e,a,n)=>(n=e!=null?h(y(e)):{},i(a||!e||!e.__esModule?o(n,"default",{value:e,enumerable:!0}):n,e)),F=e=>i(o({},"__esModule",{value:!0}),e);var m={};b(m,{default:()=>S});module.exports=F(m);var f=w(require("./fetchResponse.js"));const O=async({locale:e="en",url:a,method:n="POST",headers:t={},body:r,type:d,timeout:l=9e4})=>{let s="";d==="uploadFile"?s=r:s=r?JSON.stringify(r):"";const c=new AbortController;l&&setTimeout(()=>c.abort(),l);const g=await fetch(a,{method:n,mode:"cors",headers:{"current-language":e,...t},...l&&{signal:c.signal},...n!=="GET"&&{body:s}});return(0,f.default)(g)};var S=O;
2
- //# sourceMappingURL=fetcher.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/helpers/fetcher.ts"],
4
- "sourcesContent": ["import handleFetchResponse from './fetchResponse.js'\n\nconst fetcher = async ({ locale = 'en', url, method = 'POST', headers = {}, body, type, timeout = 90000 }: any) => {\n // \u6DFB\u52A0\u8C37\u6B4C\u9A8C\u8BC1\n let bodyData = ''\n if (type === 'uploadFile') {\n bodyData = body\n } else {\n bodyData = body ? JSON.stringify(body) : ''\n }\n\n const controller = new AbortController()\n if (timeout) {\n // \u8D85\u65F6\u62A5\u9519\n setTimeout(() => controller.abort(), timeout)\n }\n\n const data = await fetch(url, {\n method,\n mode: 'cors',\n headers: {\n 'current-language': locale,\n ...headers,\n },\n ...(timeout && { signal: controller.signal }),\n ...(method !== 'GET' && { body: bodyData }),\n })\n return handleFetchResponse(data)\n}\n\nexport default fetcher\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,iCAEhC,MAAMC,EAAU,MAAO,CAAE,OAAAC,EAAS,KAAM,IAAAC,EAAK,OAAAC,EAAS,OAAQ,QAAAC,EAAU,CAAC,EAAG,KAAAC,EAAM,KAAAC,EAAM,QAAAC,EAAU,GAAM,IAAW,CAEjH,IAAIC,EAAW,GACXF,IAAS,aACXE,EAAWH,EAEXG,EAAWH,EAAO,KAAK,UAAUA,CAAI,EAAI,GAG3C,MAAMI,EAAa,IAAI,gBACnBF,GAEF,WAAW,IAAME,EAAW,MAAM,EAAGF,CAAO,EAG9C,MAAMG,EAAO,MAAM,MAAMR,EAAK,CAC5B,OAAAC,EACA,KAAM,OACN,QAAS,CACP,mBAAoBF,EACpB,GAAGG,CACL,EACA,GAAIG,GAAW,CAAE,OAAQE,EAAW,MAAO,EAC3C,GAAIN,IAAW,OAAS,CAAE,KAAMK,CAAS,CAC3C,CAAC,EACD,SAAO,EAAAG,SAAoBD,CAAI,CACjC,EAEA,IAAOb,EAAQG",
6
- "names": ["fetcher_exports", "__export", "fetcher_default", "__toCommonJS", "import_fetchResponse", "fetcher", "locale", "url", "method", "headers", "body", "type", "timeout", "bodyData", "controller", "data", "handleFetchResponse"]
7
- }
@@ -1,2 +0,0 @@
1
- export { cn } from './utils.js';
2
- export { noop } from './utils.js';
@@ -1,2 +0,0 @@
1
- "use strict";var f=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var b=(r,o)=>{for(var e in o)f(r,e,{get:o[e],enumerable:!0})},d=(r,o,e,m)=>{if(o&&typeof o=="object"||typeof o=="function")for(let p of c(o))!a.call(r,p)&&p!==e&&f(r,p,{get:()=>o[p],enumerable:!(m=x(o,p))||m.enumerable});return r};var g=r=>d(f({},"__esModule",{value:!0}),r);var h={};b(h,{cn:()=>n.cn,noop:()=>t.noop});module.exports=g(h);var n=require("./utils.js"),t=require("./utils.js");
2
- //# sourceMappingURL=index.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/helpers/index.ts"],
4
- "sourcesContent": ["export { cn } from './utils.js'\nexport { noop } from './utils.js'\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8CAAAE,EAAAF,GAAA,IAAAG,EAAmB,sBACnBA,EAAqB",
6
- "names": ["helpers_exports", "__export", "__toCommonJS", "import_utils"]
7
- }