@anker-in/campaign-ui 0.2.1 → 0.2.2-beta.2

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 (270) hide show
  1. package/dist/cjs/components/credits/context/hooks/useActivities.js +1 -1
  2. package/dist/cjs/components/credits/context/hooks/useActivities.js.map +3 -3
  3. package/dist/cjs/components/credits/context/hooks/useAlpcFetch.js +1 -1
  4. package/dist/cjs/components/credits/context/hooks/useAlpcFetch.js.map +3 -3
  5. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +7 -0
  6. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +2 -0
  7. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +7 -0
  8. package/dist/cjs/components/credits/context/hooks/useMyRewards.js +1 -1
  9. package/dist/cjs/components/credits/context/hooks/useMyRewards.js.map +3 -3
  10. package/dist/cjs/components/credits/context/hooks/useRedeemCoupon.js +1 -1
  11. package/dist/cjs/components/credits/context/hooks/useRedeemCoupon.js.map +3 -3
  12. package/dist/cjs/components/credits/context/hooks/useRedeemProduct.js +1 -1
  13. package/dist/cjs/components/credits/context/hooks/useRedeemProduct.js.map +3 -3
  14. package/dist/cjs/components/credits/context/hooks/useRedeemableList.js +1 -1
  15. package/dist/cjs/components/credits/context/hooks/useRedeemableList.js.map +3 -3
  16. package/dist/cjs/components/credits/context/memberPriceConst.d.ts +10 -0
  17. package/dist/cjs/components/credits/context/memberPriceConst.js +2 -0
  18. package/dist/cjs/components/credits/context/memberPriceConst.js.map +7 -0
  19. package/dist/cjs/components/credits/context/memberPriceTypes.d.ts +46 -0
  20. package/dist/cjs/components/credits/context/memberPriceTypes.js +2 -0
  21. package/dist/cjs/components/credits/context/memberPriceTypes.js.map +7 -0
  22. package/dist/cjs/components/credits/context/provider.d.ts +4 -1
  23. package/dist/cjs/components/credits/context/provider.js +1 -1
  24. package/dist/cjs/components/credits/context/provider.js.map +3 -3
  25. package/dist/cjs/components/credits/context/utils/atobID.d.ts +1 -0
  26. package/dist/cjs/components/credits/context/utils/atobID.js +2 -0
  27. package/dist/cjs/components/credits/context/utils/atobID.js.map +7 -0
  28. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.d.ts +5 -0
  29. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js +2 -0
  30. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js.map +7 -0
  31. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +8 -0
  32. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +2 -0
  33. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +7 -0
  34. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +9 -0
  35. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +2 -0
  36. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +7 -0
  37. package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +6 -0
  38. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +2 -0
  39. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +7 -0
  40. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.d.ts +4 -0
  41. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +2 -0
  42. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +7 -0
  43. package/dist/cjs/components/credits/creditsAnkersolixTask/index.d.ts +2 -0
  44. package/dist/cjs/components/credits/creditsAnkersolixTask/index.js +2 -0
  45. package/dist/cjs/components/credits/creditsAnkersolixTask/index.js.map +7 -0
  46. package/dist/cjs/components/credits/creditsAnkersolixTask/type.d.ts +1 -0
  47. package/dist/cjs/components/credits/creditsAnkersolixTask/type.js +2 -0
  48. package/dist/cjs/components/credits/creditsAnkersolixTask/type.js.map +7 -0
  49. package/dist/cjs/components/credits/creditsBanner/index.d.ts +2 -1
  50. package/dist/cjs/components/credits/creditsBanner/index.js +1 -1
  51. package/dist/cjs/components/credits/creditsBanner/index.js.map +3 -3
  52. package/dist/{esm/components/credits/creditsBenefits/benefitItem.d.ts → cjs/components/credits/creditsBenefits/BenefitItem.d.ts} +4 -1
  53. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js +2 -0
  54. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js.map +7 -0
  55. package/dist/cjs/components/credits/creditsBenefits/{iconInfo.js → IconInfo.js} +1 -1
  56. package/dist/cjs/components/credits/creditsBenefits/{iconInfo.js.map → IconInfo.js.map} +2 -2
  57. package/dist/cjs/components/credits/creditsBenefits/index.d.ts +6 -2
  58. package/dist/cjs/components/credits/creditsBenefits/index.js +3 -3
  59. package/dist/cjs/components/credits/creditsBenefits/index.js.map +3 -3
  60. package/dist/cjs/components/credits/creditsCash/CreditsCash.d.ts +2 -1
  61. package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
  62. package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
  63. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js +1 -1
  64. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +2 -2
  65. package/dist/cjs/components/credits/creditsFaq/index.d.ts +2 -1
  66. package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
  67. package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
  68. package/dist/cjs/components/credits/creditsInfoCard/index.d.ts +2 -1
  69. package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
  70. package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
  71. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.d.ts +5 -0
  72. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +2 -0
  73. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +7 -0
  74. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.d.ts +7 -0
  75. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js +2 -0
  76. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js.map +7 -0
  77. package/dist/cjs/components/credits/creditsMemberPrice/index.d.ts +2 -0
  78. package/dist/cjs/components/credits/creditsMemberPrice/index.js +2 -0
  79. package/dist/cjs/components/credits/creditsMemberPrice/index.js.map +7 -0
  80. package/dist/cjs/components/credits/creditsMemberPrice/type.d.ts +64 -0
  81. package/dist/cjs/components/credits/creditsMemberPrice/type.js +2 -0
  82. package/dist/cjs/components/credits/creditsMemberPrice/type.js.map +7 -0
  83. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.d.ts +4 -0
  84. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js +2 -0
  85. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js.map +7 -0
  86. package/dist/cjs/components/credits/creditsNavigation/index.d.ts +2 -0
  87. package/dist/cjs/components/credits/creditsNavigation/index.js +2 -0
  88. package/dist/cjs/components/credits/creditsNavigation/index.js.map +7 -0
  89. package/dist/cjs/components/credits/creditsNavigation/type.d.ts +7 -0
  90. package/dist/cjs/components/credits/creditsNavigation/type.js +2 -0
  91. package/dist/cjs/components/credits/creditsNavigation/type.js.map +7 -0
  92. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.d.ts +2 -1
  93. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  94. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  95. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Error.js +1 -1
  96. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Error.js.map +2 -2
  97. package/dist/cjs/components/credits/creditsRedeemList/type.d.ts +1 -0
  98. package/dist/cjs/components/credits/creditsRedeemList/type.js +1 -1
  99. package/dist/cjs/components/credits/creditsRedeemList/type.js.map +1 -1
  100. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.d.ts +3 -1
  101. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  102. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  103. package/dist/cjs/templates/{credits.d.ts → Credits.d.ts} +15 -1
  104. package/dist/cjs/templates/Credits.js +2 -0
  105. package/dist/cjs/templates/Credits.js.map +7 -0
  106. package/dist/cjs/templates/index.d.ts +1 -1
  107. package/dist/cjs/templates/index.js +1 -1
  108. package/dist/cjs/templates/index.js.map +1 -1
  109. package/dist/esm/components/credits/context/hooks/useActivities.js +1 -1
  110. package/dist/esm/components/credits/context/hooks/useActivities.js.map +3 -3
  111. package/dist/esm/components/credits/context/hooks/useAlpcFetch.js +1 -1
  112. package/dist/esm/components/credits/context/hooks/useAlpcFetch.js.map +3 -3
  113. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +7 -0
  114. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +2 -0
  115. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +7 -0
  116. package/dist/esm/components/credits/context/hooks/useMyRewards.js +1 -1
  117. package/dist/esm/components/credits/context/hooks/useMyRewards.js.map +3 -3
  118. package/dist/esm/components/credits/context/hooks/useRedeemCoupon.js +1 -1
  119. package/dist/esm/components/credits/context/hooks/useRedeemCoupon.js.map +3 -3
  120. package/dist/esm/components/credits/context/hooks/useRedeemProduct.js +1 -1
  121. package/dist/esm/components/credits/context/hooks/useRedeemProduct.js.map +3 -3
  122. package/dist/esm/components/credits/context/hooks/useRedeemableList.js +1 -1
  123. package/dist/esm/components/credits/context/hooks/useRedeemableList.js.map +3 -3
  124. package/dist/esm/components/credits/context/memberPriceConst.d.ts +10 -0
  125. package/dist/esm/components/credits/context/memberPriceConst.js +2 -0
  126. package/dist/esm/components/credits/context/memberPriceConst.js.map +7 -0
  127. package/dist/esm/components/credits/context/memberPriceTypes.d.ts +46 -0
  128. package/dist/esm/components/credits/context/memberPriceTypes.js +1 -0
  129. package/dist/esm/components/credits/context/memberPriceTypes.js.map +7 -0
  130. package/dist/esm/components/credits/context/provider.d.ts +4 -1
  131. package/dist/esm/components/credits/context/provider.js +1 -1
  132. package/dist/esm/components/credits/context/provider.js.map +3 -3
  133. package/dist/esm/components/credits/context/utils/atobID.d.ts +1 -0
  134. package/dist/esm/components/credits/context/utils/atobID.js +2 -0
  135. package/dist/esm/components/credits/context/utils/atobID.js.map +7 -0
  136. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.d.ts +5 -0
  137. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js +2 -0
  138. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js.map +7 -0
  139. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +8 -0
  140. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +2 -0
  141. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +7 -0
  142. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +9 -0
  143. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +2 -0
  144. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +7 -0
  145. package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +6 -0
  146. package/dist/esm/components/credits/context/utils/variantGetCoupon.js +2 -0
  147. package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +7 -0
  148. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.d.ts +4 -0
  149. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +2 -0
  150. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +7 -0
  151. package/dist/esm/components/credits/creditsAnkersolixTask/index.d.ts +2 -0
  152. package/dist/esm/components/credits/creditsAnkersolixTask/index.js +2 -0
  153. package/dist/esm/components/credits/creditsAnkersolixTask/index.js.map +7 -0
  154. package/dist/esm/components/credits/creditsAnkersolixTask/type.d.ts +1 -0
  155. package/dist/esm/components/credits/creditsAnkersolixTask/type.js +2 -0
  156. package/dist/esm/components/credits/creditsAnkersolixTask/type.js.map +7 -0
  157. package/dist/esm/components/credits/creditsBanner/index.d.ts +2 -1
  158. package/dist/esm/components/credits/creditsBanner/index.js +1 -1
  159. package/dist/esm/components/credits/creditsBanner/index.js.map +3 -3
  160. package/dist/{cjs/components/credits/creditsBenefits/benefitItem.d.ts → esm/components/credits/creditsBenefits/BenefitItem.d.ts} +4 -1
  161. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js +2 -0
  162. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js.map +7 -0
  163. package/dist/esm/components/credits/creditsBenefits/{iconInfo.js → IconInfo.js} +1 -1
  164. package/dist/esm/components/credits/creditsBenefits/{iconInfo.js.map → IconInfo.js.map} +2 -2
  165. package/dist/esm/components/credits/creditsBenefits/index.d.ts +6 -2
  166. package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
  167. package/dist/esm/components/credits/creditsBenefits/index.js.map +3 -3
  168. package/dist/esm/components/credits/creditsCash/CreditsCash.d.ts +2 -1
  169. package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
  170. package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
  171. package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
  172. package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +2 -2
  173. package/dist/esm/components/credits/creditsFaq/index.d.ts +2 -1
  174. package/dist/esm/components/credits/creditsFaq/index.js +1 -1
  175. package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
  176. package/dist/esm/components/credits/creditsInfoCard/index.d.ts +2 -1
  177. package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
  178. package/dist/esm/components/credits/creditsInfoCard/index.js.map +3 -3
  179. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.d.ts +5 -0
  180. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +2 -0
  181. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +7 -0
  182. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.d.ts +7 -0
  183. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js +2 -0
  184. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js.map +7 -0
  185. package/dist/esm/components/credits/creditsMemberPrice/index.d.ts +2 -0
  186. package/dist/esm/components/credits/creditsMemberPrice/index.js +2 -0
  187. package/dist/esm/components/credits/creditsMemberPrice/index.js.map +7 -0
  188. package/dist/esm/components/credits/creditsMemberPrice/type.d.ts +64 -0
  189. package/dist/esm/components/credits/creditsMemberPrice/type.js +1 -0
  190. package/dist/esm/components/credits/creditsMemberPrice/type.js.map +7 -0
  191. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.d.ts +4 -0
  192. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js +2 -0
  193. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js.map +7 -0
  194. package/dist/esm/components/credits/creditsNavigation/index.d.ts +2 -0
  195. package/dist/esm/components/credits/creditsNavigation/index.js +2 -0
  196. package/dist/esm/components/credits/creditsNavigation/index.js.map +7 -0
  197. package/dist/esm/components/credits/creditsNavigation/type.d.ts +7 -0
  198. package/dist/esm/components/credits/creditsNavigation/type.js +1 -0
  199. package/dist/esm/components/credits/creditsNavigation/type.js.map +7 -0
  200. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.d.ts +2 -1
  201. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  202. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  203. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Error.js +1 -1
  204. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Error.js.map +2 -2
  205. package/dist/esm/components/credits/creditsRedeemList/type.d.ts +1 -0
  206. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.d.ts +3 -1
  207. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  208. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  209. package/dist/esm/templates/{credits.d.ts → Credits.d.ts} +15 -1
  210. package/dist/esm/templates/Credits.js +2 -0
  211. package/dist/esm/templates/Credits.js.map +7 -0
  212. package/dist/esm/templates/index.d.ts +1 -1
  213. package/dist/esm/templates/index.js +1 -1
  214. package/dist/esm/templates/index.js.map +1 -1
  215. package/package.json +4 -3
  216. package/src/components/credits/context/hooks/useActivities.ts +3 -2
  217. package/src/components/credits/context/hooks/useAlpcFetch.ts +8 -4
  218. package/src/components/credits/context/hooks/useFunctionMemberPrice.ts +33 -0
  219. package/src/components/credits/context/hooks/useMyRewards.ts +3 -2
  220. package/src/components/credits/context/hooks/useRedeemCoupon.ts +4 -1
  221. package/src/components/credits/context/hooks/useRedeemProduct.ts +4 -1
  222. package/src/components/credits/context/hooks/useRedeemableList.ts +3 -3
  223. package/src/components/credits/context/memberPriceConst.ts +13 -0
  224. package/src/components/credits/context/memberPriceTypes.ts +54 -0
  225. package/src/components/credits/context/provider.tsx +9 -0
  226. package/src/components/credits/context/utils/atobID.ts +8 -0
  227. package/src/components/credits/context/utils/functionDiscountCalculate.ts +57 -0
  228. package/src/components/credits/context/utils/getFunctionMemberPrice.ts +135 -0
  229. package/src/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.ts +51 -0
  230. package/src/components/credits/context/utils/variantGetCoupon.ts +34 -0
  231. package/src/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.tsx +270 -0
  232. package/src/components/credits/creditsAnkersolixTask/index.ts +2 -0
  233. package/src/components/credits/creditsAnkersolixTask/type.ts +7 -0
  234. package/src/components/credits/creditsBanner/index.tsx +2 -2
  235. package/src/components/credits/creditsBenefits/{benefitItem.tsx → BenefitItem.tsx} +28 -9
  236. package/src/components/credits/creditsBenefits/index.tsx +12 -3
  237. package/src/components/credits/creditsCash/CreditsCash.tsx +5 -3
  238. package/src/components/credits/creditsCash/RedeemableItem.tsx +19 -15
  239. package/src/components/credits/creditsFaq/index.tsx +2 -2
  240. package/src/components/credits/creditsInfoCard/index.tsx +2 -2
  241. package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +389 -0
  242. package/src/components/credits/creditsMemberPrice/MemberPriceItem.tsx +158 -0
  243. package/src/components/credits/creditsMemberPrice/index.ts +2 -0
  244. package/src/components/credits/creditsMemberPrice/type.ts +75 -0
  245. package/src/components/credits/creditsNavigation/CreditsNavigation.tsx +123 -0
  246. package/src/components/credits/creditsNavigation/index.ts +2 -0
  247. package/src/components/credits/creditsNavigation/type.ts +10 -0
  248. package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +17 -3
  249. package/src/components/credits/creditsRedeemList/RedeemProductModal/Error.tsx +1 -1
  250. package/src/components/credits/creditsRedeemList/type.ts +1 -0
  251. package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +2 -2
  252. package/src/templates/{credits.tsx → Credits.tsx} +38 -7
  253. package/src/templates/index.ts +1 -1
  254. package/dist/cjs/components/credits/const.d.ts +0 -1
  255. package/dist/cjs/components/credits/const.js +0 -2
  256. package/dist/cjs/components/credits/const.js.map +0 -7
  257. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js +0 -2
  258. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js.map +0 -7
  259. package/dist/cjs/templates/credits.js +0 -2
  260. package/dist/cjs/templates/credits.js.map +0 -7
  261. package/dist/esm/components/credits/const.d.ts +0 -1
  262. package/dist/esm/components/credits/const.js +0 -2
  263. package/dist/esm/components/credits/const.js.map +0 -7
  264. package/dist/esm/components/credits/creditsBenefits/benefitItem.js +0 -2
  265. package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +0 -7
  266. package/dist/esm/templates/credits.js +0 -2
  267. package/dist/esm/templates/credits.js.map +0 -7
  268. /package/dist/cjs/components/credits/creditsBenefits/{iconInfo.d.ts → IconInfo.d.ts} +0 -0
  269. /package/dist/esm/components/credits/creditsBenefits/{iconInfo.d.ts → IconInfo.d.ts} +0 -0
  270. /package/src/components/credits/creditsBenefits/{iconInfo.tsx → IconInfo.tsx} +0 -0
@@ -0,0 +1,389 @@
1
+ import { Container, Heading, Tabs, TabsList, TabsTrigger } from '@anker-in/headless-ui'
2
+ import { useMemo, useState, useEffect, useCallback } from 'react'
3
+ import Decimal from 'decimal.js'
4
+
5
+ import MemberPriceItem from './MemberPriceItem'
6
+ import RedeemableItem from '../creditsCash/RedeemableItem'
7
+ import useRedeemableList from '../context/hooks/useRedeemableList'
8
+ import RulesModal from '../modal/rulesModal'
9
+ import { useProductsByHandles } from '@anker-in/lib'
10
+ import { CreditsMemberPriceCopy, MemberPriceProduct } from './type'
11
+ import { Product, classNames as cn } from '@anker-in/lib'
12
+ import { useCreditsContext } from '../context/provider'
13
+ import { RedeemItem } from '../creditsCash/type'
14
+ import { FunctionDiscountType } from '../context/memberPriceConst'
15
+
16
+ export const CreditsMemberPrice = ({ copy, id }: { copy: CreditsMemberPriceCopy; id?: string }) => {
17
+ const [activeTab, setActiveTab] = useState<'memberPrice' | 'redeem'>(copy.tabs[0]?.type || 'memberPrice')
18
+ const [rules, setRules] = useState<string | string[]>()
19
+ const [currentPage, setCurrentPage] = useState(1)
20
+ const [itemsPerPage, setItemsPerPage] = useState(9) // 默认 1024px 以上:3列 × 3行 = 9
21
+ const { redeemableList } = useRedeemableList()
22
+ const { pageCommon, memberPriceDiscount } = useCreditsContext()
23
+
24
+ console.log('copy in CreditsMemberPrice', copy)
25
+
26
+ // 定义需要获取的 metafield,包括透明图
27
+ const variantMetafieldIdentifiers: any[] = [
28
+ {
29
+ namespace: 'global',
30
+ key: 'transparentImg',
31
+ },
32
+ ]
33
+
34
+ // 根据屏幕尺寸动态调整每页显示的商品数量
35
+ useEffect(() => {
36
+ const updateItemsPerPage = () => {
37
+ const width = window.innerWidth
38
+ if (width >= 1024) {
39
+ // 1024px 以上:3列 × 3行 = 9个
40
+ setItemsPerPage(9)
41
+ } else {
42
+ // 1024px 以下:2列 × 4行 = 8个
43
+ setItemsPerPage(8)
44
+ }
45
+ }
46
+
47
+ updateItemsPerPage()
48
+ window.addEventListener('resize', updateItemsPerPage)
49
+ return () => window.removeEventListener('resize', updateItemsPerPage)
50
+ }, [])
51
+
52
+ // 当切换 tab 或每页数量变化时重置页码
53
+ useEffect(() => {
54
+ setCurrentPage(1)
55
+ }, [activeTab, itemsPerPage])
56
+
57
+ // 根据配置的 ruleId 查找对应的会员价规则
58
+ const targetRule = useMemo(() => {
59
+ if (!memberPriceDiscount || !copy.memberPriceTab.memberPriceRuleId) return null
60
+ return memberPriceDiscount
61
+ .find(rule => String(rule.rule_id) === String(copy.memberPriceTab.memberPriceRuleId))
62
+ ?.result_detail?.member_discounts?.find(discount => discount.user_identity === 1)
63
+ }, [memberPriceDiscount, copy.memberPriceTab.memberPriceRuleId])
64
+
65
+ console.log('targetRule in CreditsMemberPrice', targetRule)
66
+
67
+ const memberPriceHandles = useMemo(() => {
68
+ if (!targetRule) return []
69
+
70
+ return targetRule.main_products?.variants?.map(variant => variant.handle) || []
71
+ }, [targetRule?.main_products.variants])
72
+
73
+ // 获取会员价产品数据(通过从 memberPriceDiscount 提取的 handles 获取产品)
74
+ const { data: memberPriceProducts } = useProductsByHandles({
75
+ handles: memberPriceHandles,
76
+ metafieldIdentifiers: {
77
+ variant: variantMetafieldIdentifiers,
78
+ },
79
+ })
80
+
81
+ // 获取积分兑换产品数据
82
+ const { data: redeemProducts } = useProductsByHandles({
83
+ handles: copy?.redeemTab?.list?.map(item => item.products?.[0]?.handle) || [],
84
+ metafieldIdentifiers: {
85
+ variant: variantMetafieldIdentifiers,
86
+ },
87
+ })
88
+
89
+ // 计算会员价的辅助函数(仅使用普通会员 user_identity = 1 的折扣)
90
+ const calculateMemberPrice = useCallback(
91
+ (price: number) => {
92
+ if (!targetRule) return null
93
+
94
+ const discountConfig = targetRule?.discount_conf
95
+ if (!discountConfig) return null
96
+
97
+ // 根据折扣类型计算会员价
98
+ let salePrice = new Decimal(price)
99
+ switch (discountConfig.discount_type) {
100
+ case FunctionDiscountType.Percentage:
101
+ salePrice = salePrice.mul(100 - discountConfig.discount_value).div(100)
102
+ break
103
+ case FunctionDiscountType.FixedAmount:
104
+ salePrice = salePrice.sub(discountConfig.discount_value)
105
+ break
106
+ case FunctionDiscountType.FixedPrice:
107
+ salePrice = new Decimal(discountConfig.discount_value)
108
+ break
109
+ }
110
+
111
+ return {
112
+ memberPrice: salePrice.toNumber(),
113
+ originalPrice: price,
114
+ }
115
+ },
116
+ [targetRule]
117
+ )
118
+
119
+ // 处理会员价产品列表(仅普通会员 user_identity = 1 的折扣)
120
+ const memberPriceList = useMemo(() => {
121
+ if (!targetRule || !memberPriceProducts) return []
122
+
123
+ return (
124
+ (targetRule.main_products.variants
125
+ .map(variant => {
126
+ const product = memberPriceProducts.find(p => p.handle === variant.handle)
127
+ if (!product) return null
128
+
129
+ const productVariant = product.variants?.find(v => v.sku === variant.sku) || product.variants?.[0]
130
+ if (!productVariant || !productVariant.availableForSale) return null
131
+
132
+ const priceResult = calculateMemberPrice(productVariant.price.amount)
133
+ if (!priceResult) return null
134
+
135
+ return {
136
+ product,
137
+ productVariant,
138
+ memberPrice: priceResult.memberPrice,
139
+ originalPrice: priceResult.originalPrice,
140
+ }
141
+ })
142
+ ?.filter(Boolean) as unknown as MemberPriceProduct[]) || []
143
+ )
144
+ }, [targetRule, memberPriceProducts, calculateMemberPrice])
145
+
146
+ // 处理积分兑换产品列表(复用 creditsCash 的逻辑,过滤缺货商品)
147
+ const redeemList = useMemo(() => {
148
+ return redeemProducts
149
+ ?.map((product: Product) => {
150
+ const config = copy.redeemTab.list.find(item => item.products?.[0]?.handle === product.handle)
151
+ const alpcData = redeemableList.find(item => item.id?.toString() === config?.redeemId?.toString())
152
+ const productVariant =
153
+ product.variants?.find((variant: any) => variant.sku === config?.products?.[0]?.sku) || product.variants?.[0]
154
+
155
+ // 过滤条件:
156
+ // 1. 必须有 alpcData 和 productVariant
157
+ // 2. 商品不能缺货
158
+ // 3. 如果有库存限制,则库存必须大于 0
159
+ if (!alpcData || !productVariant) return null
160
+ if (!productVariant.availableForSale) return null
161
+ if (alpcData.is_limited && alpcData.remaining_inventory <= 0) return null
162
+
163
+ return {
164
+ product,
165
+ productVariant,
166
+ alpcData: {
167
+ id: alpcData?.id,
168
+ consumeCredits: alpcData?.consume_credits,
169
+ remainingInventory: alpcData?.remaining_inventory,
170
+ isLimited: alpcData?.is_limited,
171
+ consumeType: alpcData?.consume_type,
172
+ title: alpcData?.name,
173
+ desc: alpcData?.note,
174
+ },
175
+ config,
176
+ }
177
+ })
178
+ .filter(Boolean) as unknown as RedeemItem[]
179
+ }, [redeemProducts, copy.redeemTab.list, redeemableList])
180
+
181
+ // 计算会员价分页
182
+ const memberPricePagination = useMemo(() => {
183
+ const totalItems = memberPriceList?.length || 0
184
+ const totalPages = Math.ceil(totalItems / itemsPerPage)
185
+ const startIndex = (currentPage - 1) * itemsPerPage
186
+ const endIndex = startIndex + itemsPerPage
187
+ const currentItems = memberPriceList?.slice(startIndex, endIndex) || []
188
+
189
+ return {
190
+ totalPages,
191
+ currentItems,
192
+ showPagination: totalPages > 1,
193
+ }
194
+ }, [memberPriceList, currentPage, itemsPerPage])
195
+
196
+ // 计算积分兑换分页
197
+ const redeemPagination = useMemo(() => {
198
+ const totalItems = redeemList?.length || 0
199
+ const totalPages = Math.ceil(totalItems / itemsPerPage)
200
+ const startIndex = (currentPage - 1) * itemsPerPage
201
+ const endIndex = startIndex + itemsPerPage
202
+ const currentItems = redeemList?.slice(startIndex, endIndex) || []
203
+
204
+ return {
205
+ totalPages,
206
+ currentItems,
207
+ showPagination: totalPages > 1,
208
+ }
209
+ }, [redeemList, currentPage, itemsPerPage])
210
+
211
+ // 分页导航组件 - 按照 Figma 设计
212
+ const renderPagination = (totalPages: number) => {
213
+ if (totalPages <= 1) return null
214
+
215
+ // 计算要显示的页码
216
+ const getPageNumbers = () => {
217
+ const delta = 2 // 当前页前后显示的页码数量
218
+ const range = []
219
+ const rangeWithDots = []
220
+
221
+ for (let i = 1; i <= totalPages; i++) {
222
+ if (i === 1 || i === totalPages || (i >= currentPage - delta && i <= currentPage + delta)) {
223
+ range.push(i)
224
+ }
225
+ }
226
+
227
+ let prev = 0
228
+ for (const i of range) {
229
+ if (prev && i - prev > 1) {
230
+ rangeWithDots.push('...')
231
+ }
232
+ rangeWithDots.push(i)
233
+ prev = i
234
+ }
235
+
236
+ return rangeWithDots
237
+ }
238
+
239
+ const pages = getPageNumbers()
240
+
241
+ return (
242
+ <div className="mt-[32px] flex items-center justify-center gap-[8px]">
243
+ {/* 上一页按钮 */}
244
+ <button
245
+ onClick={() => setCurrentPage(prev => Math.max(1, prev - 1))}
246
+ disabled={currentPage === 1}
247
+ className={cn(
248
+ 'flex size-[32px] xl:size-[24px] items-center justify-center overflow-hidden bg-white',
249
+ currentPage === 1 && 'cursor-not-allowed opacity-50'
250
+ )}
251
+ >
252
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
253
+ <path
254
+ d="M10 12L6 8L10 4"
255
+ stroke={currentPage === 1 ? '#767880' : '#080A0F'}
256
+ strokeWidth="1.5"
257
+ strokeLinecap="round"
258
+ strokeLinejoin="round"
259
+ />
260
+ </svg>
261
+ </button>
262
+
263
+ {/* 页码按钮 */}
264
+ {pages.map((page, index) => {
265
+ if (page === '...') {
266
+ return (
267
+ <div
268
+ key={`ellipsis-${index}`}
269
+ className="flex size-[32px] xl:size-[24px] items-center justify-center overflow-hidden bg-white"
270
+ >
271
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
272
+ <circle cx="4.5" cy="10" r="1.25" fill="#2A2C32" />
273
+ <circle cx="10" cy="10" r="1.25" fill="#2A2C32" />
274
+ <circle cx="15.5" cy="10" r="1.25" fill="#2A2C32" />
275
+ </svg>
276
+ </div>
277
+ )
278
+ }
279
+
280
+ const isActive = currentPage === page
281
+ return (
282
+ <button
283
+ key={page}
284
+ onClick={() => setCurrentPage(page as number)}
285
+ className={cn(
286
+ 'flex size-[32px] xl:size-[24px] pt-[4px] items-center justify-center overflow-hidden text-[16px] xl:text-[14px] font-bold leading-[1.4] tracking-[-0.28px]',
287
+ isActive ? 'bg-[#080a0f] text-white' : 'bg-white text-[#080a0f]'
288
+ )}
289
+ >
290
+ {page}
291
+ </button>
292
+ )
293
+ })}
294
+
295
+ {/* 下一页按钮 */}
296
+ <button
297
+ onClick={() => setCurrentPage(prev => Math.min(totalPages, prev + 1))}
298
+ disabled={currentPage === totalPages}
299
+ className={cn(
300
+ 'flex size-[32px] xl:size-[24px] items-center justify-center overflow-hidden bg-white',
301
+ currentPage === totalPages && 'cursor-not-allowed opacity-50'
302
+ )}
303
+ >
304
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
305
+ <path
306
+ d="M6 4L10 8L6 12"
307
+ stroke={currentPage === totalPages ? '#767880' : '#080A0F'}
308
+ strokeWidth="1.5"
309
+ strokeLinecap="round"
310
+ strokeLinejoin="round"
311
+ />
312
+ </svg>
313
+ </button>
314
+ </div>
315
+ )
316
+ }
317
+
318
+ return (
319
+ <Container id={id} className={cn('bg-[#F5F5F5]')}>
320
+ <Heading as="h2" size="4" html={copy.title} className="mx:px-[16px]" />
321
+
322
+ <Tabs
323
+ align="left"
324
+ className="mt-[24px]"
325
+ value={activeTab}
326
+ onValueChange={value => setActiveTab(value as 'memberPrice' | 'redeem')}
327
+ >
328
+ <TabsList>
329
+ {copy.tabs.map((tab, index) => (
330
+ <TabsTrigger key={index} value={tab.type}>
331
+ {tab.label}
332
+ </TabsTrigger>
333
+ ))}
334
+ </TabsList>
335
+ </Tabs>
336
+
337
+ {/* Tab 内容 */}
338
+ <div className="relative mt-[24px]">
339
+ {/* 会员价 Tab */}
340
+ {activeTab === 'memberPrice' && (
341
+ <>
342
+ <div className="grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]">
343
+ {memberPricePagination.currentItems?.map((item, index: number) => (
344
+ <MemberPriceItem key={index} itemData={item} copy={copy.memberPriceTab} />
345
+ ))}
346
+ </div>
347
+ {renderPagination(memberPricePagination.totalPages)}
348
+ </>
349
+ )}
350
+
351
+ {/* 积分兑换 Tab */}
352
+ {activeTab === 'redeem' && (
353
+ <>
354
+ <div className="grid md:grid-cols-2 gap-[12px] grid-cols-4 md-xl:grid-cols-3 lg:gap-[16px]">
355
+ {redeemPagination.currentItems?.map((item, index: number) => (
356
+ <RedeemableItem
357
+ key={index}
358
+ copy={{
359
+ title: copy.title,
360
+ ...copy.redeemTab,
361
+ }}
362
+ itemData={item}
363
+ setRules={setRules}
364
+ currencyCode={redeemProducts?.[0]?.price.currencyCode || 'USD'}
365
+ />
366
+ ))}
367
+ </div>
368
+ {renderPagination(redeemPagination.totalPages)}
369
+ </>
370
+ )}
371
+ </div>
372
+
373
+ {/* Rules Modal */}
374
+ {rules && (
375
+ <RulesModal
376
+ overlayClassName="md:px-[16px] md:items-center"
377
+ className="md:h-fit md:rounded-b-[16px]"
378
+ isOpen={rules.length > 0}
379
+ onClose={() => setRules([])}
380
+ titleClassName="border-b-transparent h-[56px]"
381
+ rules={rules}
382
+ scrollClassName="md:mt-[8px] md:mb-[24px] md:pt-0"
383
+ title={pageCommon?.ruleLabel}
384
+ ruleClassName="text-[#1d1d1f] font-bold"
385
+ />
386
+ )}
387
+ </Container>
388
+ )
389
+ }
@@ -0,0 +1,158 @@
1
+ import { Button, Text, Picture } from '@anker-in/headless-ui'
2
+ import { useMemo } from 'react'
3
+
4
+ import { CreditsMemberPriceCopy, MemberPriceProduct } from './type'
5
+ import { formatPrice } from '../context/utils'
6
+ import { classNames as cn, ROUNDED_BRANDS, useHeadlessContext, useBuyNow } from '@anker-in/lib'
7
+ import { useCreditsContext } from '../context/provider'
8
+
9
+ function MemberPriceItem({
10
+ itemData,
11
+ copy,
12
+ className,
13
+ }: {
14
+ itemData: MemberPriceProduct
15
+ copy: CreditsMemberPriceCopy['memberPriceTab']
16
+ className?: string
17
+ }) {
18
+ const { brand, locale } = useHeadlessContext()
19
+ const { profile } = useCreditsContext()
20
+ const rounded = ROUNDED_BRANDS.includes(brand)
21
+
22
+ // 使用 buyNow hook 来处理结算
23
+ const { trigger: buyNow, isMutating: isBuying } = useBuyNow({}, { throwOnError: true })
24
+
25
+ const isAvailable = useMemo(() => {
26
+ return itemData.productVariant?.availableForSale
27
+ }, [itemData.productVariant?.availableForSale])
28
+
29
+ // Learn More 按钮点击 - 跳转到产品详情页
30
+ const handleLearnMore = () => {
31
+ window.location.href = `/products/${itemData.product.handle}`
32
+ }
33
+
34
+ // Shop Now 按钮点击 - 使用 buyNow 进行结算
35
+ const handleShopNow = () => {
36
+ buyNow({
37
+ customAttributes: [
38
+ {
39
+ key: '_member_type',
40
+ value: String(profile?.memberType || 0),
41
+ },
42
+ ],
43
+ lineItems: [
44
+ {
45
+ variant: itemData.productVariant,
46
+ quantity: 1,
47
+ },
48
+ ],
49
+ })
50
+ }
51
+
52
+ return (
53
+ <div
54
+ className={cn(
55
+ 'relative flex flex-col items-center bg-[#EAEAEC] p-[16px] md:rounded-[12px]',
56
+ !rounded && 'rounded-none md:rounded-none',
57
+ className
58
+ )}
59
+ >
60
+ {/* Member 标签图片 */}
61
+ {copy.memberPriceImg && (
62
+ <Picture
63
+ className="absolute left-[24px] top-[16px] h-[24px] w-auto"
64
+ imgClassName="!h-full object-contain"
65
+ source={copy.memberPriceImg.url}
66
+ alt={copy.memberPriceImg.alt || 'Member Price'}
67
+ />
68
+ )}
69
+
70
+ {/* 产品图片 - 优先使用产品的 metafields 透明图 */}
71
+ <a href={`/products/${itemData.product.handle}`} className={cn('relative mx-auto size-[138px]')}>
72
+ <Picture
73
+ className="mx-auto size-full"
74
+ imgClassName="object-contain"
75
+ source={
76
+ itemData?.productVariant?.metafields?.global?.transparentImg ||
77
+ itemData?.config?.image?.url ||
78
+ itemData?.productVariant?.image?.url
79
+ }
80
+ ></Picture>
81
+ </a>
82
+
83
+ {/* 产品信息 */}
84
+ <div className={cn('mt-[4px] w-full')}>
85
+ {/* 产品标题 - 使用产品的真实标题 */}
86
+ <Text
87
+ html={itemData?.product?.title}
88
+ title={itemData?.product?.title}
89
+ className="line-clamp-2 text-[24px] l-xxl:text-[20px] l:text-[16px] font-bold leading-[1.2] tracking-[-0.8px] text-[#080A0F]"
90
+ />
91
+
92
+ {/* 价格信息 */}
93
+ <div className="mt-[16px] flex flex-col gap-[8px]">
94
+ {/* Member Price 标签 - 使用 text-brand-color-1 */}
95
+ <Text
96
+ html={copy.memberPriceLabel}
97
+ className={cn(
98
+ 'text-brand-color-0 text-[16px] l-xl:text-[14px] l:text-[12px] w-fit font-bold leading-[1.4] tracking-[-0.28px]',
99
+ brand === 'ankersolix' &&
100
+ 'leading-none bg-gradient-to-r from-[#2c7ed0] via-[#00a9e1] via-[43%] to-[#00db84] bg-clip-text text-transparent'
101
+ )}
102
+ as="p"
103
+ />
104
+
105
+ {/* 会员价和原价在同一行 */}
106
+ <div className="flex items-center gap-[4px]">
107
+ <Text
108
+ html={formatPrice({
109
+ amount: itemData.memberPrice,
110
+ currencyCode: itemData?.productVariant?.price.currencyCode || 'USD',
111
+ locale: locale,
112
+ })}
113
+ className="text-[24px] l-xxl:text-[20px] l:text-[16px] font-bold leading-[1.2] tracking-[-0.8px] text-[#080A0F]"
114
+ as="span"
115
+ />
116
+ <Text
117
+ html={formatPrice({
118
+ amount: itemData.originalPrice,
119
+ currencyCode: itemData?.productVariant?.price.currencyCode || 'USD',
120
+ locale: locale,
121
+ })}
122
+ className="text-[24px] l-xxl:text-[20px] l:text-[16px] font-bold leading-[1.2] tracking-[-0.8px] text-[#4A4C56] line-through"
123
+ as="span"
124
+ />
125
+ </div>
126
+
127
+ {/* 按钮组 */}
128
+ <div className="flex w-full gap-[8px] md:flex-col">
129
+ {/* Learn More 按钮 */}
130
+ <Button
131
+ variant="secondary"
132
+ className="flex-1 md:w-full"
133
+ size="lg"
134
+ onClick={handleLearnMore}
135
+ disabled={!isAvailable}
136
+ >
137
+ {copy.learnMoreText}
138
+ </Button>
139
+
140
+ {/* Shop Now 按钮 */}
141
+ <Button
142
+ variant="primary"
143
+ className="flex-1 md:w-full"
144
+ size="lg"
145
+ onClick={handleShopNow}
146
+ disabled={!isAvailable || isBuying}
147
+ loading={isBuying}
148
+ >
149
+ {copy.shopNowText}
150
+ </Button>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ )
156
+ }
157
+
158
+ export default MemberPriceItem
@@ -0,0 +1,2 @@
1
+ export { CreditsMemberPrice } from './CreditsMemberPrice'
2
+ export * from './type'
@@ -0,0 +1,75 @@
1
+ import { Product, ProductVariant } from '@anker-in/lib'
2
+
3
+ // 会员价产品配置
4
+ type MemberPriceItemConfig = {
5
+ title: string
6
+ image: {
7
+ url: string
8
+ }
9
+ mobileImage: {
10
+ url: string
11
+ }
12
+ // 会员价规则 ID,用于查找折扣配置
13
+ memberPriceRuleId: string
14
+ // 预留:会员价计算逻辑相关字段
15
+ memberPrice?: number
16
+ // 预留:其他配置字段
17
+ }
18
+
19
+ // 积分兑换产品配置(复用 creditsCash 的配置)
20
+ type RedeemableItemConfig = {
21
+ title: string
22
+ desc: string
23
+ price: number
24
+ credit: string
25
+ rules: string
26
+ image: {
27
+ url: string
28
+ }
29
+ mobileImage: {
30
+ url: string
31
+ }
32
+ redeemId: number
33
+ }
34
+
35
+ // Tab 配置
36
+ export type TabConfig = {
37
+ label: string
38
+ type: 'memberPrice' | 'redeem'
39
+ }
40
+
41
+ // 会员价模块整体配置
42
+ export type CreditsMemberPriceCopy = {
43
+ title: string
44
+ tabs: TabConfig[]
45
+ // 会员价 tab 配置(产品列表和价格完全从 memberPriceDiscount 获取)
46
+ memberPriceTab: {
47
+ memberPriceRuleId: string // 指定使用哪个会员价规则
48
+ learnMoreText: string
49
+ shopNowText: string
50
+ memberPriceLabel: string
51
+ memberPriceImg?: {
52
+ url: string
53
+ alt?: string
54
+ }
55
+ }
56
+ // 积分兑换 tab 配置(复用 creditsCash 的配置)
57
+ redeemTab: {
58
+ list: (RedeemableItemConfig & {
59
+ products: { handle: string; sku: string }[]
60
+ })[]
61
+ soldOut: string
62
+ unlockRewards: string
63
+ btnRedeem: string
64
+ off: string
65
+ }
66
+ }
67
+
68
+ // 会员价产品项
69
+ export type MemberPriceProduct = {
70
+ product: Product
71
+ productVariant: ProductVariant
72
+ config?: MemberPriceItemConfig
73
+ memberPrice: number
74
+ originalPrice: number
75
+ }