@anker-in/campaign-ui 0.2.11-beta.2 → 0.2.11-beta.21

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 (510) hide show
  1. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.d.ts +43 -0
  2. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js +2 -0
  3. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js.map +7 -0
  4. package/dist/cjs/components/LiveChatWidget/api/chat.d.ts +25 -0
  5. package/dist/cjs/components/LiveChatWidget/api/chat.js +3 -0
  6. package/dist/cjs/components/LiveChatWidget/api/chat.js.map +7 -0
  7. package/dist/cjs/components/LiveChatWidget/components/ChatBubble.d.ts +68 -0
  8. package/dist/cjs/components/LiveChatWidget/components/ChatBubble.js +2 -0
  9. package/dist/cjs/components/LiveChatWidget/components/ChatBubble.js.map +7 -0
  10. package/dist/cjs/components/LiveChatWidget/components/ChatHeader.d.ts +57 -0
  11. package/dist/cjs/components/LiveChatWidget/components/ChatHeader.js +2 -0
  12. package/dist/cjs/components/LiveChatWidget/components/ChatHeader.js.map +7 -0
  13. package/dist/cjs/components/LiveChatWidget/components/ChatInput.d.ts +70 -0
  14. package/dist/cjs/components/LiveChatWidget/components/ChatInput.js +2 -0
  15. package/dist/cjs/components/LiveChatWidget/components/ChatInput.js.map +7 -0
  16. package/dist/cjs/components/LiveChatWidget/components/ChatMessage.d.ts +59 -0
  17. package/dist/cjs/components/LiveChatWidget/components/ChatMessage.js +5 -0
  18. package/dist/cjs/components/LiveChatWidget/components/ChatMessage.js.map +7 -0
  19. package/dist/cjs/components/LiveChatWidget/components/ChatWindow.d.ts +127 -0
  20. package/dist/cjs/components/LiveChatWidget/components/ChatWindow.js +2 -0
  21. package/dist/cjs/components/LiveChatWidget/components/ChatWindow.js.map +7 -0
  22. package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.d.ts +54 -0
  23. package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.js +2 -0
  24. package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.js.map +7 -0
  25. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.d.ts +33 -0
  26. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +2 -0
  27. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +7 -0
  28. package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.d.ts +16 -0
  29. package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.js +2 -0
  30. package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.js.map +7 -0
  31. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.d.ts +45 -0
  32. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +5 -0
  33. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +7 -0
  34. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +48 -0
  35. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js +5 -0
  36. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +7 -0
  37. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +70 -0
  38. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.js +2 -0
  39. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +7 -0
  40. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.d.ts +47 -0
  41. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.js +2 -0
  42. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.js.map +7 -0
  43. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +78 -0
  44. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.js +2 -0
  45. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +7 -0
  46. package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.d.ts +54 -0
  47. package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.js +2 -0
  48. package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +7 -0
  49. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.d.ts +31 -0
  50. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js +2 -0
  51. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +7 -0
  52. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ThinkingBlock.d.ts +31 -0
  53. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js +2 -0
  54. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js.map +7 -0
  55. package/dist/cjs/components/LiveChatWidget/components/MessageContent/index.d.ts +15 -0
  56. package/dist/cjs/components/LiveChatWidget/components/MessageContent/index.js +2 -0
  57. package/dist/cjs/components/LiveChatWidget/components/MessageContent/index.js.map +7 -0
  58. package/dist/cjs/components/LiveChatWidget/components/MessageContent.d.ts +63 -0
  59. package/dist/cjs/components/LiveChatWidget/components/MessageContent.js +2 -0
  60. package/dist/cjs/components/LiveChatWidget/components/MessageContent.js.map +7 -0
  61. package/dist/cjs/components/LiveChatWidget/components/MessageList.d.ts +74 -0
  62. package/dist/cjs/components/LiveChatWidget/components/MessageList.js +5 -0
  63. package/dist/cjs/components/LiveChatWidget/components/MessageList.js.map +7 -0
  64. package/dist/cjs/components/LiveChatWidget/components/ScrollAnchor.d.ts +44 -0
  65. package/dist/cjs/components/LiveChatWidget/components/ScrollAnchor.js +2 -0
  66. package/dist/cjs/components/LiveChatWidget/components/ScrollAnchor.js.map +7 -0
  67. package/dist/cjs/components/LiveChatWidget/constants.d.ts +8 -0
  68. package/dist/cjs/components/LiveChatWidget/constants.js +2 -0
  69. package/dist/cjs/components/LiveChatWidget/constants.js.map +7 -0
  70. package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.d.ts +51 -0
  71. package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.js +2 -0
  72. package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.js.map +7 -0
  73. package/dist/cjs/components/LiveChatWidget/hooks/useChatState.d.ts +120 -0
  74. package/dist/cjs/components/LiveChatWidget/hooks/useChatState.js +2 -0
  75. package/dist/cjs/components/LiveChatWidget/hooks/useChatState.js.map +7 -0
  76. package/dist/cjs/components/LiveChatWidget/hooks/useSession.d.ts +37 -0
  77. package/dist/cjs/components/LiveChatWidget/hooks/useSession.js +2 -0
  78. package/dist/cjs/components/LiveChatWidget/hooks/useSession.js.map +7 -0
  79. package/dist/cjs/components/LiveChatWidget/index.d.ts +12 -0
  80. package/dist/cjs/components/LiveChatWidget/index.js +2 -0
  81. package/dist/cjs/components/LiveChatWidget/index.js.map +7 -0
  82. package/dist/cjs/components/LiveChatWidget/types.d.ts +609 -0
  83. package/dist/cjs/components/LiveChatWidget/types.js +2 -0
  84. package/dist/cjs/components/LiveChatWidget/types.js.map +7 -0
  85. package/dist/cjs/components/LiveChatWidget/utils/cartTransformers.d.ts +25 -0
  86. package/dist/cjs/components/LiveChatWidget/utils/cartTransformers.js +2 -0
  87. package/dist/cjs/components/LiveChatWidget/utils/cartTransformers.js.map +7 -0
  88. package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.d.ts +64 -0
  89. package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.js +2 -0
  90. package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.js.map +7 -0
  91. package/dist/cjs/components/LiveChatWidget/utils/productTransformers.d.ts +43 -0
  92. package/dist/cjs/components/LiveChatWidget/utils/productTransformers.js +2 -0
  93. package/dist/cjs/components/LiveChatWidget/utils/productTransformers.js.map +7 -0
  94. package/dist/cjs/components/LiveChatWidget/utils/userId.d.ts +18 -0
  95. package/dist/cjs/components/LiveChatWidget/utils/userId.js +2 -0
  96. package/dist/cjs/components/LiveChatWidget/utils/userId.js.map +7 -0
  97. package/dist/cjs/components/LiveChatWidget/utils/validation.d.ts +37 -0
  98. package/dist/cjs/components/LiveChatWidget/utils/validation.js +2 -0
  99. package/dist/cjs/components/LiveChatWidget/utils/validation.js.map +7 -0
  100. package/dist/cjs/components/chat/markdown.js +1 -1
  101. package/dist/cjs/components/chat/markdown.js.map +2 -2
  102. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +2 -2
  103. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +1 -1
  104. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +2 -2
  105. package/dist/cjs/components/credits/context/hooks/useRedeemableList.js +1 -1
  106. package/dist/cjs/components/credits/context/hooks/useRedeemableList.js.map +2 -2
  107. package/dist/cjs/components/credits/context/memberPriceConst.d.ts +0 -5
  108. package/dist/cjs/components/credits/context/memberPriceConst.js +1 -1
  109. package/dist/cjs/components/credits/context/memberPriceConst.js.map +3 -3
  110. package/dist/cjs/components/credits/context/memberPriceTypes.d.ts +1 -22
  111. package/dist/cjs/components/credits/context/memberPriceTypes.js +1 -1
  112. package/dist/cjs/components/credits/context/memberPriceTypes.js.map +1 -1
  113. package/dist/cjs/components/credits/context/provider.d.ts +16 -1
  114. package/dist/cjs/components/credits/context/provider.js +1 -1
  115. package/dist/cjs/components/credits/context/provider.js.map +3 -3
  116. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +2 -2
  117. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +1 -1
  118. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +1 -1
  119. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +2 -2
  120. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +1 -1
  121. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +1 -1
  122. package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +2 -2
  123. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +1 -1
  124. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +1 -1
  125. package/dist/cjs/components/credits/context/utils.d.ts +4 -0
  126. package/dist/cjs/components/credits/context/utils.js +1 -1
  127. package/dist/cjs/components/credits/context/utils.js.map +3 -3
  128. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
  129. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
  130. package/dist/cjs/components/credits/creditsBanner/index.d.ts +2 -0
  131. package/dist/cjs/components/credits/creditsBanner/index.js +12 -1
  132. package/dist/cjs/components/credits/creditsBanner/index.js.map +3 -3
  133. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js +1 -1
  134. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js.map +3 -3
  135. package/dist/cjs/components/credits/creditsBenefits/IconInfo.js +1 -1
  136. package/dist/cjs/components/credits/creditsBenefits/IconInfo.js.map +1 -1
  137. package/dist/cjs/components/credits/creditsBenefits/index.js +3 -3
  138. package/dist/cjs/components/credits/creditsBenefits/index.js.map +2 -2
  139. package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
  140. package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
  141. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js +1 -1
  142. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  143. package/dist/cjs/components/credits/creditsCash/type.d.ts +1 -0
  144. package/dist/cjs/components/credits/creditsCash/type.js +1 -1
  145. package/dist/cjs/components/credits/creditsCash/type.js.map +1 -1
  146. package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
  147. package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
  148. package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
  149. package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
  150. package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
  151. package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
  152. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
  153. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
  154. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
  155. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
  156. package/dist/cjs/components/credits/creditsMemberPrice/Pagination.d.ts +7 -0
  157. package/dist/cjs/components/credits/creditsMemberPrice/Pagination.js +2 -0
  158. package/dist/cjs/components/credits/creditsMemberPrice/Pagination.js.map +7 -0
  159. package/dist/cjs/components/credits/creditsMemberPrice/type.d.ts +3 -5
  160. package/dist/cjs/components/credits/creditsMemberPrice/type.js +1 -1
  161. package/dist/cjs/components/credits/creditsMemberPrice/type.js.map +1 -1
  162. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
  163. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
  164. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
  165. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
  166. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
  167. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
  168. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
  169. package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js.map +3 -3
  170. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  171. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  172. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  173. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  174. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  175. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
  176. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
  177. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
  178. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  179. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
  180. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  181. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  182. package/dist/cjs/components/credits/modal/MyRewardsModal.js +1 -1
  183. package/dist/cjs/components/credits/modal/MyRewardsModal.js.map +3 -3
  184. package/dist/cjs/components/credits/modal/activitiesModal.js +1 -1
  185. package/dist/cjs/components/credits/modal/activitiesModal.js.map +3 -3
  186. package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js +1 -1
  187. package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
  188. package/dist/cjs/components/credits/modal/modalContainer.js +1 -1
  189. package/dist/cjs/components/credits/modal/modalContainer.js.map +3 -3
  190. package/dist/cjs/components/credits/modal/subscribeModal.js +1 -1
  191. package/dist/cjs/components/credits/modal/subscribeModal.js.map +3 -3
  192. package/dist/cjs/components/credits/modal/tip.js +1 -1
  193. package/dist/cjs/components/credits/modal/tip.js.map +3 -3
  194. package/dist/cjs/components/index.d.ts +3 -1
  195. package/dist/cjs/components/index.js +1 -1
  196. package/dist/cjs/components/index.js.map +3 -3
  197. package/dist/cjs/components/registration/authCodeActivate/index.js +1 -1
  198. package/dist/cjs/components/registration/authCodeActivate/index.js.map +3 -3
  199. package/dist/cjs/components/registration/modalContainer.js +1 -1
  200. package/dist/cjs/components/registration/modalContainer.js.map +3 -3
  201. package/dist/cjs/constants.d.ts +1 -0
  202. package/dist/cjs/constants.js +2 -0
  203. package/dist/cjs/constants.js.map +7 -0
  204. package/dist/cjs/index.d.ts +3 -2
  205. package/dist/cjs/index.js +1 -1
  206. package/dist/cjs/index.js.map +2 -2
  207. package/dist/cjs/stories/CartCard.stories.d.ts +33 -0
  208. package/dist/cjs/stories/CartCard.stories.js +21 -0
  209. package/dist/cjs/stories/CartCard.stories.js.map +7 -0
  210. package/dist/cjs/stories/LiveChatWidget.stories.d.ts +92 -0
  211. package/dist/cjs/stories/LiveChatWidget.stories.js +98 -0
  212. package/dist/cjs/stories/LiveChatWidget.stories.js.map +7 -0
  213. package/dist/cjs/templates/Credits.d.ts +15 -1
  214. package/dist/cjs/templates/Credits.js +1 -1
  215. package/dist/cjs/templates/Credits.js.map +3 -3
  216. package/dist/esm/components/LiveChatWidget/LiveChatWidget.d.ts +43 -0
  217. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js +2 -0
  218. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js.map +7 -0
  219. package/dist/esm/components/LiveChatWidget/api/chat.d.ts +25 -0
  220. package/dist/esm/components/LiveChatWidget/api/chat.js +3 -0
  221. package/dist/esm/components/LiveChatWidget/api/chat.js.map +7 -0
  222. package/dist/esm/components/LiveChatWidget/components/ChatBubble.d.ts +68 -0
  223. package/dist/esm/components/LiveChatWidget/components/ChatBubble.js +2 -0
  224. package/dist/esm/components/LiveChatWidget/components/ChatBubble.js.map +7 -0
  225. package/dist/esm/components/LiveChatWidget/components/ChatHeader.d.ts +57 -0
  226. package/dist/esm/components/LiveChatWidget/components/ChatHeader.js +2 -0
  227. package/dist/esm/components/LiveChatWidget/components/ChatHeader.js.map +7 -0
  228. package/dist/esm/components/LiveChatWidget/components/ChatInput.d.ts +70 -0
  229. package/dist/esm/components/LiveChatWidget/components/ChatInput.js +2 -0
  230. package/dist/esm/components/LiveChatWidget/components/ChatInput.js.map +7 -0
  231. package/dist/esm/components/LiveChatWidget/components/ChatMessage.d.ts +59 -0
  232. package/dist/esm/components/LiveChatWidget/components/ChatMessage.js +5 -0
  233. package/dist/esm/components/LiveChatWidget/components/ChatMessage.js.map +7 -0
  234. package/dist/esm/components/LiveChatWidget/components/ChatWindow.d.ts +127 -0
  235. package/dist/esm/components/LiveChatWidget/components/ChatWindow.js +2 -0
  236. package/dist/esm/components/LiveChatWidget/components/ChatWindow.js.map +7 -0
  237. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.d.ts +54 -0
  238. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js +2 -0
  239. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js.map +7 -0
  240. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.d.ts +33 -0
  241. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +2 -0
  242. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +7 -0
  243. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.d.ts +16 -0
  244. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js +2 -0
  245. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js.map +7 -0
  246. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.d.ts +45 -0
  247. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +5 -0
  248. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +7 -0
  249. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +48 -0
  250. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js +5 -0
  251. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +7 -0
  252. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +70 -0
  253. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js +2 -0
  254. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +7 -0
  255. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.d.ts +47 -0
  256. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js +2 -0
  257. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js.map +7 -0
  258. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +78 -0
  259. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js +2 -0
  260. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +7 -0
  261. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.d.ts +54 -0
  262. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js +2 -0
  263. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +7 -0
  264. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.d.ts +31 -0
  265. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +2 -0
  266. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +7 -0
  267. package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.d.ts +31 -0
  268. package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js +2 -0
  269. package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js.map +7 -0
  270. package/dist/esm/components/LiveChatWidget/components/MessageContent/index.d.ts +15 -0
  271. package/dist/esm/components/LiveChatWidget/components/MessageContent/index.js +2 -0
  272. package/dist/esm/components/LiveChatWidget/components/MessageContent/index.js.map +7 -0
  273. package/dist/esm/components/LiveChatWidget/components/MessageContent.d.ts +63 -0
  274. package/dist/esm/components/LiveChatWidget/components/MessageContent.js +2 -0
  275. package/dist/esm/components/LiveChatWidget/components/MessageContent.js.map +7 -0
  276. package/dist/esm/components/LiveChatWidget/components/MessageList.d.ts +74 -0
  277. package/dist/esm/components/LiveChatWidget/components/MessageList.js +5 -0
  278. package/dist/esm/components/LiveChatWidget/components/MessageList.js.map +7 -0
  279. package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.d.ts +44 -0
  280. package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.js +2 -0
  281. package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.js.map +7 -0
  282. package/dist/esm/components/LiveChatWidget/constants.d.ts +8 -0
  283. package/dist/esm/components/LiveChatWidget/constants.js +2 -0
  284. package/dist/esm/components/LiveChatWidget/constants.js.map +7 -0
  285. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.d.ts +51 -0
  286. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js +2 -0
  287. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js.map +7 -0
  288. package/dist/esm/components/LiveChatWidget/hooks/useChatState.d.ts +120 -0
  289. package/dist/esm/components/LiveChatWidget/hooks/useChatState.js +2 -0
  290. package/dist/esm/components/LiveChatWidget/hooks/useChatState.js.map +7 -0
  291. package/dist/esm/components/LiveChatWidget/hooks/useSession.d.ts +37 -0
  292. package/dist/esm/components/LiveChatWidget/hooks/useSession.js +2 -0
  293. package/dist/esm/components/LiveChatWidget/hooks/useSession.js.map +7 -0
  294. package/dist/esm/components/LiveChatWidget/index.d.ts +12 -0
  295. package/dist/esm/components/LiveChatWidget/index.js +2 -0
  296. package/dist/esm/components/LiveChatWidget/index.js.map +7 -0
  297. package/dist/esm/components/LiveChatWidget/types.d.ts +609 -0
  298. package/dist/esm/components/LiveChatWidget/types.js +1 -0
  299. package/dist/esm/components/LiveChatWidget/types.js.map +7 -0
  300. package/dist/esm/components/LiveChatWidget/utils/cartTransformers.d.ts +25 -0
  301. package/dist/esm/components/LiveChatWidget/utils/cartTransformers.js +2 -0
  302. package/dist/esm/components/LiveChatWidget/utils/cartTransformers.js.map +7 -0
  303. package/dist/esm/components/LiveChatWidget/utils/messageRenderers.d.ts +64 -0
  304. package/dist/esm/components/LiveChatWidget/utils/messageRenderers.js +2 -0
  305. package/dist/esm/components/LiveChatWidget/utils/messageRenderers.js.map +7 -0
  306. package/dist/esm/components/LiveChatWidget/utils/productTransformers.d.ts +43 -0
  307. package/dist/esm/components/LiveChatWidget/utils/productTransformers.js +2 -0
  308. package/dist/esm/components/LiveChatWidget/utils/productTransformers.js.map +7 -0
  309. package/dist/esm/components/LiveChatWidget/utils/userId.d.ts +18 -0
  310. package/dist/esm/components/LiveChatWidget/utils/userId.js +2 -0
  311. package/dist/esm/components/LiveChatWidget/utils/userId.js.map +7 -0
  312. package/dist/esm/components/LiveChatWidget/utils/validation.d.ts +37 -0
  313. package/dist/esm/components/LiveChatWidget/utils/validation.js +2 -0
  314. package/dist/esm/components/LiveChatWidget/utils/validation.js.map +7 -0
  315. package/dist/esm/components/chat/markdown.js +1 -1
  316. package/dist/esm/components/chat/markdown.js.map +2 -2
  317. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +2 -2
  318. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +1 -1
  319. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +2 -2
  320. package/dist/esm/components/credits/context/hooks/useRedeemableList.js +1 -1
  321. package/dist/esm/components/credits/context/hooks/useRedeemableList.js.map +2 -2
  322. package/dist/esm/components/credits/context/memberPriceConst.d.ts +0 -5
  323. package/dist/esm/components/credits/context/memberPriceConst.js +1 -1
  324. package/dist/esm/components/credits/context/memberPriceConst.js.map +3 -3
  325. package/dist/esm/components/credits/context/memberPriceTypes.d.ts +1 -22
  326. package/dist/esm/components/credits/context/provider.d.ts +16 -1
  327. package/dist/esm/components/credits/context/provider.js +1 -1
  328. package/dist/esm/components/credits/context/provider.js.map +3 -3
  329. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +2 -2
  330. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +1 -1
  331. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +1 -1
  332. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +2 -2
  333. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +1 -1
  334. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +1 -1
  335. package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +2 -2
  336. package/dist/esm/components/credits/context/utils/variantGetCoupon.js +1 -1
  337. package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +1 -1
  338. package/dist/esm/components/credits/context/utils.d.ts +4 -0
  339. package/dist/esm/components/credits/context/utils.js +1 -1
  340. package/dist/esm/components/credits/context/utils.js.map +3 -3
  341. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
  342. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
  343. package/dist/esm/components/credits/creditsBanner/index.d.ts +2 -0
  344. package/dist/esm/components/credits/creditsBanner/index.js +12 -1
  345. package/dist/esm/components/credits/creditsBanner/index.js.map +3 -3
  346. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js +1 -1
  347. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js.map +3 -3
  348. package/dist/esm/components/credits/creditsBenefits/IconInfo.js +1 -1
  349. package/dist/esm/components/credits/creditsBenefits/IconInfo.js.map +1 -1
  350. package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
  351. package/dist/esm/components/credits/creditsBenefits/index.js.map +2 -2
  352. package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
  353. package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
  354. package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
  355. package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  356. package/dist/esm/components/credits/creditsCash/type.d.ts +1 -0
  357. package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
  358. package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
  359. package/dist/esm/components/credits/creditsFaq/index.js +1 -1
  360. package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
  361. package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
  362. package/dist/esm/components/credits/creditsInfoCard/index.js.map +2 -2
  363. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
  364. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
  365. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
  366. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
  367. package/dist/esm/components/credits/creditsMemberPrice/Pagination.d.ts +7 -0
  368. package/dist/esm/components/credits/creditsMemberPrice/Pagination.js +2 -0
  369. package/dist/esm/components/credits/creditsMemberPrice/Pagination.js.map +7 -0
  370. package/dist/esm/components/credits/creditsMemberPrice/type.d.ts +3 -5
  371. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
  372. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
  373. package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
  374. package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +2 -2
  375. package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
  376. package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +2 -2
  377. package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
  378. package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js.map +2 -2
  379. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  380. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  381. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
  382. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
  383. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  384. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
  385. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
  386. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +2 -2
  387. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  388. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
  389. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  390. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  391. package/dist/esm/components/credits/modal/MyRewardsModal.js +1 -1
  392. package/dist/esm/components/credits/modal/MyRewardsModal.js.map +2 -2
  393. package/dist/esm/components/credits/modal/activitiesModal.js +1 -1
  394. package/dist/esm/components/credits/modal/activitiesModal.js.map +3 -3
  395. package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js +1 -1
  396. package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
  397. package/dist/esm/components/credits/modal/modalContainer.js +1 -1
  398. package/dist/esm/components/credits/modal/modalContainer.js.map +3 -3
  399. package/dist/esm/components/credits/modal/subscribeModal.js +1 -1
  400. package/dist/esm/components/credits/modal/subscribeModal.js.map +3 -3
  401. package/dist/esm/components/credits/modal/tip.js +1 -1
  402. package/dist/esm/components/credits/modal/tip.js.map +3 -3
  403. package/dist/esm/components/index.d.ts +3 -1
  404. package/dist/esm/components/index.js +1 -1
  405. package/dist/esm/components/index.js.map +3 -3
  406. package/dist/esm/components/registration/authCodeActivate/index.js +1 -1
  407. package/dist/esm/components/registration/authCodeActivate/index.js.map +3 -3
  408. package/dist/esm/components/registration/modalContainer.js +1 -1
  409. package/dist/esm/components/registration/modalContainer.js.map +3 -3
  410. package/dist/esm/constants.d.ts +1 -0
  411. package/dist/esm/constants.js +2 -0
  412. package/dist/esm/constants.js.map +7 -0
  413. package/dist/esm/index.d.ts +3 -2
  414. package/dist/esm/index.js +1 -1
  415. package/dist/esm/index.js.map +2 -2
  416. package/dist/esm/stories/CartCard.stories.d.ts +33 -0
  417. package/dist/esm/stories/CartCard.stories.js +21 -0
  418. package/dist/esm/stories/CartCard.stories.js.map +7 -0
  419. package/dist/esm/stories/LiveChatWidget.stories.d.ts +92 -0
  420. package/dist/esm/stories/LiveChatWidget.stories.js +98 -0
  421. package/dist/esm/stories/LiveChatWidget.stories.js.map +7 -0
  422. package/dist/esm/templates/Credits.d.ts +15 -1
  423. package/dist/esm/templates/Credits.js +1 -1
  424. package/dist/esm/templates/Credits.js.map +3 -3
  425. package/package.json +7 -3
  426. package/src/components/LiveChatWidget/LiveChatWidget.tsx +599 -0
  427. package/src/components/LiveChatWidget/api/chat.ts +136 -0
  428. package/src/components/LiveChatWidget/components/ChatBubble.tsx +152 -0
  429. package/src/components/LiveChatWidget/components/ChatHeader.tsx +151 -0
  430. package/src/components/LiveChatWidget/components/ChatInput.tsx +216 -0
  431. package/src/components/LiveChatWidget/components/ChatMessage.tsx +182 -0
  432. package/src/components/LiveChatWidget/components/ChatWindow.tsx +304 -0
  433. package/src/components/LiveChatWidget/components/MessageContent/CartCard.tsx +198 -0
  434. package/src/components/LiveChatWidget/components/MessageContent/ErrorBlock.tsx +75 -0
  435. package/src/components/LiveChatWidget/components/MessageContent/FAQList.tsx +127 -0
  436. package/src/components/LiveChatWidget/components/MessageContent/PolicyBlock.tsx +150 -0
  437. package/src/components/LiveChatWidget/components/MessageContent/ProductCard.tsx +139 -0
  438. package/src/components/LiveChatWidget/components/MessageContent/ProductComparison.tsx +348 -0
  439. package/src/components/LiveChatWidget/components/MessageContent/ProductList.tsx +275 -0
  440. package/src/components/LiveChatWidget/components/MessageContent/PromotionList.tsx +207 -0
  441. package/src/components/LiveChatWidget/components/MessageContent/QuickReplies.tsx +91 -0
  442. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +89 -0
  443. package/src/components/LiveChatWidget/components/MessageContent/ThinkingBlock.tsx +53 -0
  444. package/src/components/LiveChatWidget/components/MessageContent/index.ts +16 -0
  445. package/src/components/LiveChatWidget/components/MessageContent.tsx +110 -0
  446. package/src/components/LiveChatWidget/components/MessageList.tsx +261 -0
  447. package/src/components/LiveChatWidget/components/ScrollAnchor.tsx +75 -0
  448. package/src/components/LiveChatWidget/constants.ts +15 -0
  449. package/src/components/LiveChatWidget/hooks/useChatAPI.ts +136 -0
  450. package/src/components/LiveChatWidget/hooks/useChatState.ts +542 -0
  451. package/src/components/LiveChatWidget/hooks/useSession.ts +123 -0
  452. package/src/components/LiveChatWidget/index.tsx +62 -0
  453. package/src/components/LiveChatWidget/types.ts +769 -0
  454. package/src/components/LiveChatWidget/utils/cartTransformers.ts +72 -0
  455. package/src/components/LiveChatWidget/utils/messageRenderers.ts +120 -0
  456. package/src/components/LiveChatWidget/utils/productTransformers.ts +149 -0
  457. package/src/components/LiveChatWidget/utils/userId.ts +140 -0
  458. package/src/components/LiveChatWidget/utils/validation.ts +99 -0
  459. package/src/components/chat/markdown.tsx +1 -1
  460. package/src/components/credits/context/hooks/useRedeemableList.ts +1 -1
  461. package/src/components/credits/context/memberPriceConst.ts +0 -7
  462. package/src/components/credits/context/memberPriceTypes.ts +1 -26
  463. package/src/components/credits/context/provider.tsx +16 -0
  464. package/src/components/credits/context/utils.ts +9 -0
  465. package/src/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.tsx +44 -41
  466. package/src/components/credits/creditsBanner/index.tsx +31 -3
  467. package/src/components/credits/creditsBenefits/BenefitItem.tsx +13 -5
  468. package/src/components/credits/creditsBenefits/IconInfo.tsx +1 -1
  469. package/src/components/credits/creditsBenefits/index.tsx +1 -1
  470. package/src/components/credits/creditsCash/CreditsCash.tsx +6 -3
  471. package/src/components/credits/creditsCash/RedeemableItem.tsx +29 -11
  472. package/src/components/credits/creditsCash/type.ts +1 -0
  473. package/src/components/credits/creditsFaq/faqItem/FaqItem.tsx +25 -23
  474. package/src/components/credits/creditsFaq/index.tsx +2 -1
  475. package/src/components/credits/creditsInfoCard/index.tsx +10 -3
  476. package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +160 -136
  477. package/src/components/credits/creditsMemberPrice/MemberPriceItem.tsx +134 -29
  478. package/src/components/credits/creditsMemberPrice/Pagination.tsx +113 -0
  479. package/src/components/credits/creditsMemberPrice/type.ts +3 -5
  480. package/src/components/credits/creditsNavigation/CreditsNavigation.tsx +3 -3
  481. package/src/components/credits/creditsRedeemList/AddressForm/CountrySelect.tsx +2 -1
  482. package/src/components/credits/creditsRedeemList/AddressForm/StateSelect.tsx +2 -1
  483. package/src/components/credits/creditsRedeemList/AddressForm/index.tsx +2 -1
  484. package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +32 -18
  485. package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -1
  486. package/src/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.tsx +6 -4
  487. package/src/components/credits/creditsRedeemList/RedeemProductModal/Success.tsx +2 -1
  488. package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +21 -7
  489. package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +34 -20
  490. package/src/components/credits/modal/MyRewardsModal.tsx +2 -1
  491. package/src/components/credits/modal/activitiesModal.tsx +2 -1
  492. package/src/components/credits/modal/creditsUploadReceiptModal.tsx +2 -1
  493. package/src/components/credits/modal/modalContainer.tsx +2 -1
  494. package/src/components/credits/modal/subscribeModal.tsx +2 -1
  495. package/src/components/credits/modal/tip.tsx +2 -1
  496. package/src/components/index.ts +23 -1
  497. package/src/components/registration/authCodeActivate/index.tsx +3 -1
  498. package/src/components/registration/modalContainer.tsx +2 -1
  499. package/src/constants.ts +1 -0
  500. package/src/index.ts +3 -2
  501. package/src/stories/CartCard.stories.tsx +459 -0
  502. package/src/stories/LiveChatWidget.stories.tsx +461 -0
  503. package/src/styles/livechat.css +263 -0
  504. package/src/templates/Credits.tsx +26 -9
  505. package/src/components/credits/context/hooks/useFunctionMemberPrice.ts +0 -33
  506. package/src/components/credits/context/utils/atobID.ts +0 -8
  507. package/src/components/credits/context/utils/functionDiscountCalculate.ts +0 -57
  508. package/src/components/credits/context/utils/getFunctionMemberPrice.ts +0 -135
  509. package/src/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.ts +0 -51
  510. package/src/components/credits/context/utils/variantGetCoupon.ts +0 -34
@@ -0,0 +1,98 @@
1
+ "use strict";var l=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var r in e)l(t,r,{get:e[r],enumerable:!0})},m=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of c(e))!d.call(t,s)&&s!==r&&l(t,s,{get:()=>e[s],enumerable:!(a=n(e,s))||a.enumerable});return t};var p=t=>m(l({},"__esModule",{value:!0}),t);var A={};g(A,{CustomBranding:()=>C,CustomImageGalleryRenderer:()=>x,CustomPosition:()=>v,CustomVideoRenderer:()=>w,CustomWelcomeMessage:()=>b,Default:()=>f,DefaultPositionDemo:()=>I,FAQListMessage:()=>k,MobileView:()=>M,ProductComparisonMessage:()=>R,TabletView:()=>U,WithEventCallbacks:()=>S,WithQuickReplies:()=>h,default:()=>y});module.exports=p(A);var o=require("react/jsx-runtime"),i=require("../components/LiveChatWidget"),N=require("../styles/livechat.css");const u={title:"Campaign/LiveChatWidget",component:i.LiveChatWidget,parameters:{layout:"fullscreen",docs:{story:{inline:!1,iframeHeight:500},description:{component:`
2
+ # LiveChat \u804A\u5929\u7EC4\u4EF6
3
+
4
+ \u53EF\u590D\u7528\u7684\u6C14\u6CE1\u5F39\u7A97\u804A\u5929\u7EC4\u4EF6\uFF0C\u652F\u6301 SSE \u6D41\u5F0F\u6D88\u606F\u3001\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u548C\u591A\u79CD\u6D88\u606F\u7C7B\u578B\u3002
5
+
6
+ ## \u529F\u80FD\u7279\u6027
7
+
8
+ - \u{1F388} **\u6C14\u6CE1\u5F39\u7A97**: \u53EF\u81EA\u5B9A\u4E49\u4F4D\u7F6E\u7684\u60AC\u6D6E\u6C14\u6CE1\u6309\u94AE
9
+ - \u{1F4AC} **\u6D41\u5F0F\u6D88\u606F**: \u57FA\u4E8E SSE \u7684\u5B9E\u65F6\u6D41\u5F0F\u54CD\u5E94
10
+ - \u{1F4E6} **\u591A\u79CD\u6D88\u606F\u7C7B\u578B**: \u6587\u672C\u3001\u5546\u54C1\u5361\u7247\u3001\u5546\u54C1\u5217\u8868\u3001\u653F\u7B56\u3001\u5FEB\u6377\u56DE\u590D\u7B49
11
+ - \u{1F3A8} **\u53EF\u5B9A\u5236**: \u652F\u6301\u81EA\u5B9A\u4E49\u54C1\u724C\u989C\u8272\u3001Logo\u3001\u6E32\u67D3\u5668
12
+ - \u{1F4F1} **\u54CD\u5E94\u5F0F**: \u79FB\u52A8\u7AEF\u5168\u5C4F\uFF0C\u684C\u9762\u7AEF\u56FA\u5B9A\u5C3A\u5BF8
13
+ - \u{1F4BE} **\u4F1A\u8BDD\u7BA1\u7406**: \u81EA\u52A8\u7BA1\u7406 userId \u548C sessionId
14
+ - \u{1F512} **\u5B89\u5168\u9632\u62A4**: \u5185\u7F6E XSS \u9632\u62A4\u548C\u8F93\u5165\u9A8C\u8BC1
15
+
16
+ ## \u57FA\u7840\u7528\u6CD5
17
+
18
+ \`\`\`tsx
19
+ import { LiveChatWidget } from '@anker-in/campaign-ui'
20
+ import '@anker-in/campaign-ui/livechat.css'
21
+
22
+ function App() {
23
+ return (
24
+ <LiveChatWidget
25
+ apiBaseUrl="https://beta-api-livechat.anker.com"
26
+ site="www.eufy.com"
27
+ welcomeMessage="\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B"
28
+ />
29
+ )
30
+ }
31
+ \`\`\`
32
+
33
+ ## \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668
34
+
35
+ \`\`\`tsx
36
+ const customRenderers = {
37
+ video: {
38
+ render: (content) => (
39
+ <video src={content.url} controls className="w-full rounded" />
40
+ )
41
+ }
42
+ }
43
+
44
+ <LiveChatWidget
45
+ apiBaseUrl="..."
46
+ site="..."
47
+ customRenderers={customRenderers}
48
+ />
49
+ \`\`\`
50
+ `}}},tags:["autodocs"],argTypes:{apiBaseUrl:{control:"text",description:"API \u57FA\u7840 URL"},site:{control:"text",description:"Shopify \u5E97\u94FA URL"},welcomeMessage:{control:"text",description:"\u6B22\u8FCE\u6D88\u606F",table:{defaultValue:{summary:"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u52A9\u4F60\u7684\u5417\uFF1F"}}},logoUrl:{control:"text",description:"Logo URL"},position:{control:"object",description:"\u6C14\u6CE1\u6309\u94AE\u4F4D\u7F6E\u5BF9\u8C61",table:{defaultValue:{summary:'{ bottom: "1.5rem", right: "1.5rem" }'}}}},args:{apiBaseUrl:"http://172.16.38.183:3003",site:"www.eufy.com",loginUserId:"test_test",welcomeMessage:"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u52A9\u4F60\u7684\u5417\uFF1F"}};var y=u;const f={args:{loginUserId:"test_test",apiBaseUrl:"http://172.16.38.183:3003",cartId:"gid://shopify/Cart/hWN7oFnMh7jKxbO1CYSzWVue?key=68f4cf2c4c772b9aed2fab2902e6dab3",accessToken:"92301d516a0a38a0a483bc230e5bfaad",title:"eufy"}},v={args:{position:{bottom:"1.5rem",left:"1.5rem"}}},C={args:{logoUrl:"https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=100&h=100&fit=crop",welcomeMessage:"\u6B22\u8FCE\u6765\u5230 Soundcore\uFF01\u6211\u662F\u60A8\u7684\u4E13\u5C5E AI \u52A9\u624B \u{1F3A7}"}},h={args:{quickReplies:[{id:"1",label:"\u67E5\u8BE2\u4EF7\u683C",value:"\u6211\u60F3\u4E86\u89E3\u4EA7\u54C1\u4EF7\u683C",icon:"\u{1F4B0}"},{id:"2",label:"\u67E5\u8BE2\u7269\u6D41",value:"\u6211\u60F3\u67E5\u8BE2\u8BA2\u5355\u7269\u6D41",icon:"\u{1F4E6}"},{id:"3",label:"\u552E\u540E\u670D\u52A1",value:"\u6211\u9700\u8981\u552E\u540E\u5E2E\u52A9",icon:"\u{1F527}"},{id:"4",label:"\u4EA7\u54C1\u63A8\u8350",value:"\u8BF7\u63A8\u8350\u9002\u5408\u6211\u7684\u4EA7\u54C1",icon:"\u2B50"}]}},b={args:{welcomeMessage:`
51
+ \u{1F44B} \u60A8\u597D\uFF01\u6B22\u8FCE\u6765\u5230 Soundcore \u5B98\u65B9\u5546\u57CE\u3002
52
+
53
+ \u6211\u662F\u60A8\u7684 AI \u8D2D\u7269\u52A9\u624B\uFF0C\u53EF\u4EE5\u5E2E\u60A8\uFF1A
54
+ - \u{1F50D} \u67E5\u627E\u4EA7\u54C1
55
+ - \u{1F4B0} \u6BD4\u8F83\u4EF7\u683C
56
+ - \u{1F4E6} \u8DDF\u8E2A\u8BA2\u5355
57
+ - \u{1F4AC} \u89E3\u7B54\u7591\u95EE
58
+
59
+ \u6709\u4EC0\u4E48\u6211\u53EF\u4EE5\u5E2E\u52A9\u60A8\u7684\u5417\uFF1F
60
+ `.trim()}},S={args:{title:"",showNewSessionButton:!1,position:{bottom:"24px",right:"30px"},chatBubbleIcon:"https://cdn.shopify.com/s/files/1/0504/7094/4954/files/Rectangle_400770314.png?v=1768894153"},render:t=>(0,o.jsx)(i.LiveChatWidget,{...t,onOpen:()=>{console.log("[Story] Chat opened")},onClose:()=>{console.log("[Story] Chat closed")},onMessageSend:e=>{console.log("[Story] Message sent:",e)},onError:e=>{console.error("[Story] Error occurred:",e)},onAddToCart:e=>{console.log("\u{1F6D2} [Story] Add to Cart clicked!"),console.log("\u{1F4E6} Product Info:",{id:e.shopifyId,title:e.title,price:e.price,imageUrl:e.imageUrl,productUrl:e.productUrl}),console.log("\u{1F4CB} Full Product Object:",e),alert(`\u2705 "${e.title}" \u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\uFF01
61
+
62
+ \u4EF7\u683C: ${e.price.currency} ${e.price.amount}`)},onCart:(e,r)=>{console.log("\u{1F6D2} [Story] Cart button clicked!"),console.log("\u{1F4CB} Cart ID:",e),console.log("\u{1F517} Checkout URL:",r),alert(`\u8D2D\u7269\u8F66\u6309\u94AE\u88AB\u70B9\u51FB\uFF01
63
+
64
+ Cart ID: ${e}
65
+ Checkout URL: ${r||"\u65E0"}`)}})},w={args:{customRenderers:{video:{render:t=>{const e=t;return(0,o.jsxs)("div",{className:"w-full",children:[(0,o.jsx)("video",{src:e.url,controls:!0,className:"w-full rounded-lg",poster:e.poster,children:"\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u89C6\u9891\u64AD\u653E"}),e.title&&(0,o.jsx)("p",{className:"mt-2 text-sm text-gray-600",children:e.title})]})}}}}},x={args:{customRenderers:{image_gallery:{render:t=>{const r=t.images||[];return(0,o.jsx)("div",{className:"grid grid-cols-2 gap-2",children:r.map((a,s)=>(0,o.jsx)("div",{className:"relative aspect-square",children:(0,o.jsx)("img",{src:a.url,alt:a.alt||`Image ${s+1}`,className:"size-full rounded-lg object-cover"})},s))})}}}}},M={parameters:{viewport:{defaultViewport:"mobile1"}},args:{}},U={parameters:{viewport:{defaultViewport:"tablet"}},args:{}},I={render:()=>(0,o.jsxs)("div",{className:"relative h-screen w-full bg-gray-50",children:[(0,o.jsx)("div",{className:"absolute inset-0 flex items-center justify-center",children:(0,o.jsx)("p",{className:"text-gray-500",children:"\u9875\u9762\u5185\u5BB9\u533A\u57DF"})}),(0,o.jsx)("div",{className:"absolute bottom-4 right-4 text-xs text-gray-400",children:"\u9ED8\u8BA4\u4F4D\u7F6E (\u53F3\u4E0B\u89D2)"}),(0,o.jsx)(i.LiveChatWidget,{apiBaseUrl:"https://beta-api-livechat.anker.com",site:"www.eufy.com"})]})},R={render:t=>(0,o.jsx)(i.LiveChatWidget,{...t,onAddToCart:e=>{console.log("\u{1F6D2} [ProductComparison Story] Add to Cart clicked!"),console.log("\u{1F4E6} Product Info:",{id:e.shopifyId,title:e.title,price:e.price,imageUrl:e.imageUrl,productUrl:e.productUrl}),console.log("\u{1F4CB} Full Product Object:",e),alert(`\u2705 "${e.title}" \u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\uFF01
66
+
67
+ \u4EF7\u683C: ${e.price.currency} ${e.price.amount}`)}}),args:{welcomeMessage:"\u4EE5\u4E0B\u662F\u60A8\u5173\u6CE8\u7684\u4EA7\u54C1\u5BF9\u6BD4\u4FE1\u606F\uFF1A"},parameters:{docs:{description:{story:`
68
+ \u4EA7\u54C1\u5BF9\u6BD4\u6D88\u606F\u652F\u6301\u4EE5\u4E0B\u7EF4\u5EA6\uFF1A
69
+
70
+ - **\u4EF7\u683C\u5BF9\u6BD4**: \u663E\u793A\u4EA7\u54C1\u7684\u4EF7\u683C\u533A\u95F4\u548C\u4FC3\u9500\u6807\u7B7E
71
+ - **\u4F1A\u5458\u4EF7\u5BF9\u6BD4**: \u663E\u793A\u4F1A\u5458\u4E13\u4EAB\u4EF7\u683C\uFF08\u5982\u679C\u53EF\u7528\uFF09
72
+ - **\u53D8\u4F53\u6570\u91CF\u5BF9\u6BD4**: \u663E\u793A\u4EA7\u54C1\u7684\u53EF\u9009\u53D8\u4F53\u6570\u91CF
73
+ - **\u6298\u6263\u5BF9\u6BD4**: \u663E\u793A\u4EA7\u54C1\u662F\u5426\u6709\u6298\u6263\u6D3B\u52A8
74
+
75
+ \u7EC4\u4EF6\u4F1A\u81EA\u52A8\u5904\u7406\u4ECE\u540E\u7AEF\u8FD4\u56DE\u7684\u4EA7\u54C1\u5BF9\u6BD4\u6570\u636E\uFF0C\u5305\u62EC\uFF1A
76
+ - \u4EA7\u54C1\u57FA\u672C\u4FE1\u606F\uFF08\u56FE\u7247\u3001\u6807\u9898\u3001\u4EF7\u683C\u7B49\uFF09
77
+ - \u591A\u7EF4\u5EA6\u5BF9\u6BD4\u6570\u636E\uFF08\u4EF7\u683C\u3001\u4F1A\u5458\u4EF7\u3001\u53D8\u4F53\u3001\u6298\u6263\uFF09
78
+ - \u54CD\u5E94\u5F0F\u5E03\u5C40\uFF08\u79FB\u52A8\u7AEF\u53EF\u6A2A\u5411\u6EDA\u52A8\uFF09
79
+
80
+ **\u6D4B\u8BD5 Add to Cart \u529F\u80FD\uFF1A**
81
+ - \u70B9\u51FB\u4EA7\u54C1\u5BF9\u6BD4\u5361\u7247\u4E2D\u7684 "Add to Cart" \u6309\u94AE
82
+ - \u67E5\u770B\u63A7\u5236\u53F0\u8F93\u51FA\u7684\u4EA7\u54C1\u4FE1\u606F
83
+ - \u4F1A\u5F39\u51FA\u786E\u8BA4\u63D0\u793A\u6846\u663E\u793A\u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66
84
+ `}}}},k={args:{welcomeMessage:"\u4EE5\u4E0B\u662F\u4E0E\u60A8\u7684\u95EE\u9898\u76F8\u5173\u7684\u5E38\u89C1\u89E3\u7B54\uFF1A"},parameters:{docs:{description:{story:`
85
+ FAQ \u5217\u8868\u6D88\u606F\u652F\u6301\uFF1A
86
+
87
+ - **\u53EF\u6298\u53E0\u95EE\u9898**: \u70B9\u51FB\u95EE\u9898\u6807\u9898\u5C55\u5F00/\u6298\u53E0\u7B54\u6848
88
+ - **Markdown \u7B54\u6848**: \u7B54\u6848\u652F\u6301 Markdown \u683C\u5F0F\uFF0C\u53EF\u663E\u793A\u5BCC\u6587\u672C
89
+ - **\u76F8\u5173\u95EE\u9898**: \u5C55\u5F00\u7B54\u6848\u540E\u663E\u793A\u76F8\u5173\u95EE\u9898\uFF0C\u70B9\u51FB\u53EF\u89E6\u53D1\u65B0\u641C\u7D22
90
+ - **\u5206\u7C7B\u6807\u8BB0**: \u6839\u636E\u95EE\u9898\u5206\u7C7B\u663E\u793A\uFF08\u914D\u9001\u3001\u9000\u8D27\u3001\u4EA7\u54C1\u3001\u652F\u4ED8\u3001\u901A\u7528\uFF09
91
+ - **\u641C\u7D22\u7ED3\u679C\u7EDF\u8BA1**: \u663E\u793A\u627E\u5230\u7684\u95EE\u9898\u6570\u91CF
92
+
93
+ \u4F7F\u7528\u573A\u666F\uFF1A
94
+ - \u7528\u6237\u8BE2\u95EE\u5E38\u89C1\u95EE\u9898\u65F6\u8FD4\u56DE FAQ \u5217\u8868
95
+ - \u4EA7\u54C1\u4E13\u5C5E\u95EE\u9898\u67E5\u8BE2
96
+ - \u6309\u5206\u7C7B\u67E5\u8BE2 FAQ
97
+ `}}}};
98
+ //# sourceMappingURL=LiveChatWidget.stories.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/stories/LiveChatWidget.stories.tsx"],
4
+ "sourcesContent": ["/**\n * LiveChatWidget Storybook Stories\n * \u5C55\u793A LiveChat \u7EC4\u4EF6\u7684\u5404\u79CD\u4F7F\u7528\u573A\u666F\u548C\u914D\u7F6E\n */\n\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { LiveChatWidget } from '../components/LiveChatWidget'\nimport type { MessageRenderer, MessageContent } from '../components/LiveChatWidget'\nimport '../styles/livechat.css'\n\nconst meta: Meta<typeof LiveChatWidget> = {\n title: 'Campaign/LiveChatWidget',\n component: LiveChatWidget,\n parameters: {\n layout: 'fullscreen',\n docs: {\n story: {\n inline: false,\n iframeHeight: 500,\n },\n description: {\n component: `\n# LiveChat \u804A\u5929\u7EC4\u4EF6\n\n\u53EF\u590D\u7528\u7684\u6C14\u6CE1\u5F39\u7A97\u804A\u5929\u7EC4\u4EF6\uFF0C\u652F\u6301 SSE \u6D41\u5F0F\u6D88\u606F\u3001\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u548C\u591A\u79CD\u6D88\u606F\u7C7B\u578B\u3002\n\n## \u529F\u80FD\u7279\u6027\n\n- \uD83C\uDF88 **\u6C14\u6CE1\u5F39\u7A97**: \u53EF\u81EA\u5B9A\u4E49\u4F4D\u7F6E\u7684\u60AC\u6D6E\u6C14\u6CE1\u6309\u94AE\n- \uD83D\uDCAC **\u6D41\u5F0F\u6D88\u606F**: \u57FA\u4E8E SSE \u7684\u5B9E\u65F6\u6D41\u5F0F\u54CD\u5E94\n- \uD83D\uDCE6 **\u591A\u79CD\u6D88\u606F\u7C7B\u578B**: \u6587\u672C\u3001\u5546\u54C1\u5361\u7247\u3001\u5546\u54C1\u5217\u8868\u3001\u653F\u7B56\u3001\u5FEB\u6377\u56DE\u590D\u7B49\n- \uD83C\uDFA8 **\u53EF\u5B9A\u5236**: \u652F\u6301\u81EA\u5B9A\u4E49\u54C1\u724C\u989C\u8272\u3001Logo\u3001\u6E32\u67D3\u5668\n- \uD83D\uDCF1 **\u54CD\u5E94\u5F0F**: \u79FB\u52A8\u7AEF\u5168\u5C4F\uFF0C\u684C\u9762\u7AEF\u56FA\u5B9A\u5C3A\u5BF8\n- \uD83D\uDCBE **\u4F1A\u8BDD\u7BA1\u7406**: \u81EA\u52A8\u7BA1\u7406 userId \u548C sessionId\n- \uD83D\uDD12 **\u5B89\u5168\u9632\u62A4**: \u5185\u7F6E XSS \u9632\u62A4\u548C\u8F93\u5165\u9A8C\u8BC1\n\n## \u57FA\u7840\u7528\u6CD5\n\n\\`\\`\\`tsx\nimport { LiveChatWidget } from '@anker-in/campaign-ui'\nimport '@anker-in/campaign-ui/livechat.css'\n\nfunction App() {\n return (\n <LiveChatWidget\n apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n site=\"www.eufy.com\"\n welcomeMessage=\"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\"\n />\n )\n}\n\\`\\`\\`\n\n## \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n\n\\`\\`\\`tsx\nconst customRenderers = {\n video: {\n render: (content) => (\n <video src={content.url} controls className=\"w-full rounded\" />\n )\n }\n}\n\n<LiveChatWidget\n apiBaseUrl=\"...\"\n site=\"...\"\n customRenderers={customRenderers}\n/>\n\\`\\`\\`\n `,\n },\n },\n },\n tags: ['autodocs'],\n argTypes: {\n apiBaseUrl: {\n control: 'text',\n description: 'API \u57FA\u7840 URL',\n },\n site: {\n control: 'text',\n description: 'Shopify \u5E97\u94FA URL',\n },\n welcomeMessage: {\n control: 'text',\n description: '\u6B22\u8FCE\u6D88\u606F',\n table: {\n defaultValue: { summary: '\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u52A9\u4F60\u7684\u5417\uFF1F' },\n },\n },\n logoUrl: {\n control: 'text',\n description: 'Logo URL',\n },\n position: {\n control: 'object',\n description: '\u6C14\u6CE1\u6309\u94AE\u4F4D\u7F6E\u5BF9\u8C61',\n table: {\n defaultValue: { summary: '{ bottom: \"1.5rem\", right: \"1.5rem\" }' },\n },\n },\n },\n args: {\n apiBaseUrl: 'http://172.16.38.183:3003',\n site: 'www.eufy.com',\n loginUserId: 'test_test',\n welcomeMessage: '\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u52A9\u4F60\u7684\u5417\uFF1F',\n },\n}\n\nexport default meta\ntype Story = StoryObj<typeof LiveChatWidget>\n\n/**\n * \u9ED8\u8BA4\u914D\u7F6E\n *\n * \u6700\u7B80\u5355\u7684\u4F7F\u7528\u65B9\u5F0F\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\u3002\n */\nexport const Default: Story = {\n args: {\n loginUserId: 'test_test',\n apiBaseUrl: 'http://172.16.38.183:3003',\n cartId: 'gid://shopify/Cart/hWN7oFnMh7jKxbO1CYSzWVue?key=68f4cf2c4c772b9aed2fab2902e6dab3',\n accessToken: '92301d516a0a38a0a483bc230e5bfaad',\n title: 'eufy',\n },\n}\n\n/**\n * \u81EA\u5B9A\u4E49\u4F4D\u7F6E\n *\n * \u4F7F\u7528\u81EA\u5B9A\u4E49\u4F4D\u7F6E\u5BF9\u8C61\u6765\u63A7\u5236\u6C14\u6CE1\u6309\u94AE\u7684\u4F4D\u7F6E\u3002\n */\nexport const CustomPosition: Story = {\n args: {\n position: { bottom: '1.5rem', left: '1.5rem' },\n },\n}\n\n/**\n * \u81EA\u5B9A\u4E49\u54C1\u724C\u6837\u5F0F\n *\n * \u81EA\u5B9A\u4E49 Logo \u548C\u6B22\u8FCE\u6D88\u606F\u3002\n */\nexport const CustomBranding: Story = {\n args: {\n logoUrl: 'https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=100&h=100&fit=crop',\n welcomeMessage: '\u6B22\u8FCE\u6765\u5230 Soundcore\uFF01\u6211\u662F\u60A8\u7684\u4E13\u5C5E AI \u52A9\u624B \uD83C\uDFA7',\n },\n}\n\n/**\n * \u5E26\u5FEB\u6377\u56DE\u590D\n *\n * \u5728\u6B22\u8FCE\u6D88\u606F\u540E\u663E\u793A\u5FEB\u6377\u56DE\u590D\u6309\u94AE\u3002\n */\nexport const WithQuickReplies: Story = {\n args: {\n quickReplies: [\n {\n id: '1',\n label: '\u67E5\u8BE2\u4EF7\u683C',\n value: '\u6211\u60F3\u4E86\u89E3\u4EA7\u54C1\u4EF7\u683C',\n icon: '\uD83D\uDCB0',\n },\n {\n id: '2',\n label: '\u67E5\u8BE2\u7269\u6D41',\n value: '\u6211\u60F3\u67E5\u8BE2\u8BA2\u5355\u7269\u6D41',\n icon: '\uD83D\uDCE6',\n },\n {\n id: '3',\n label: '\u552E\u540E\u670D\u52A1',\n value: '\u6211\u9700\u8981\u552E\u540E\u5E2E\u52A9',\n icon: '\uD83D\uDD27',\n },\n {\n id: '4',\n label: '\u4EA7\u54C1\u63A8\u8350',\n value: '\u8BF7\u63A8\u8350\u9002\u5408\u6211\u7684\u4EA7\u54C1',\n icon: '\u2B50',\n },\n ],\n },\n}\n\n/**\n * \u81EA\u5B9A\u4E49\u6B22\u8FCE\u6D88\u606F\n *\n * \u81EA\u5B9A\u4E49\u9996\u6B21\u6253\u5F00\u804A\u5929\u7A97\u53E3\u65F6\u7684\u6B22\u8FCE\u6D88\u606F\u3002\n */\nexport const CustomWelcomeMessage: Story = {\n args: {\n welcomeMessage: `\n\uD83D\uDC4B \u60A8\u597D\uFF01\u6B22\u8FCE\u6765\u5230 Soundcore \u5B98\u65B9\u5546\u57CE\u3002\n\n\u6211\u662F\u60A8\u7684 AI \u8D2D\u7269\u52A9\u624B\uFF0C\u53EF\u4EE5\u5E2E\u60A8\uFF1A\n- \uD83D\uDD0D \u67E5\u627E\u4EA7\u54C1\n- \uD83D\uDCB0 \u6BD4\u8F83\u4EF7\u683C\n- \uD83D\uDCE6 \u8DDF\u8E2A\u8BA2\u5355\n- \uD83D\uDCAC \u89E3\u7B54\u7591\u95EE\n\n\u6709\u4EC0\u4E48\u6211\u53EF\u4EE5\u5E2E\u52A9\u60A8\u7684\u5417\uFF1F\n `.trim(),\n },\n}\n\n/**\n * \u4E8B\u4EF6\u56DE\u8C03\n *\n * \u76D1\u542C\u7EC4\u4EF6\u4E8B\u4EF6\u8FDB\u884C\u81EA\u5B9A\u4E49\u5904\u7406\u3002\n */\nexport const WithEventCallbacks: Story = {\n args: {\n title: '',\n showNewSessionButton: false,\n\n position: {\n bottom: '24px',\n right: '30px',\n },\n\n chatBubbleIcon: 'https://cdn.shopify.com/s/files/1/0504/7094/4954/files/Rectangle_400770314.png?v=1768894153',\n },\n\n render: args => (\n <LiveChatWidget\n {...args}\n onOpen={() => {\n console.log('[Story] Chat opened')\n }}\n onClose={() => {\n console.log('[Story] Chat closed')\n }}\n onMessageSend={(message: string) => {\n console.log('[Story] Message sent:', message)\n }}\n onError={(error: Error) => {\n console.error('[Story] Error occurred:', error)\n }}\n onAddToCart={(product: any) => {\n console.log('\uD83D\uDED2 [Story] Add to Cart clicked!')\n console.log('\uD83D\uDCE6 Product Info:', {\n id: product.shopifyId,\n title: product.title,\n price: product.price,\n imageUrl: product.imageUrl,\n productUrl: product.productUrl,\n })\n console.log('\uD83D\uDCCB Full Product Object:', product)\n\n // \u6A21\u62DF\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6210\u529F\n alert(`\u2705 \"${product.title}\" \u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\uFF01\\n\\n\u4EF7\u683C: ${product.price.currency} ${product.price.amount}`)\n }}\n onCart={(cartId: string, checkoutUrl?: string) => {\n console.log('\uD83D\uDED2 [Story] Cart button clicked!')\n console.log('\uD83D\uDCCB Cart ID:', cartId)\n console.log('\uD83D\uDD17 Checkout URL:', checkoutUrl)\n\n // \u6A21\u62DF\u8D2D\u7269\u8F66\u6309\u94AE\u70B9\u51FB\u6210\u529F\n alert(`\u8D2D\u7269\u8F66\u6309\u94AE\u88AB\u70B9\u51FB\uFF01\\n\\nCart ID: ${cartId}\\nCheckout URL: ${checkoutUrl || '\u65E0'}`)\n }}\n />\n ),\n}\n\n/**\n * \u81EA\u5B9A\u4E49\u89C6\u9891\u6D88\u606F\u6E32\u67D3\u5668\n *\n * \u6269\u5C55\u6D88\u606F\u7C7B\u578B\uFF0C\u6DFB\u52A0\u89C6\u9891\u6D88\u606F\u652F\u6301\u3002\n */\nexport const CustomVideoRenderer: Story = {\n args: {\n customRenderers: {\n video: {\n render: (content: MessageContent) => {\n const videoContent = content as any\n return (\n <div className=\"w-full\">\n <video src={videoContent.url} controls className=\"w-full rounded-lg\" poster={videoContent.poster}>\n \u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u89C6\u9891\u64AD\u653E\n </video>\n {videoContent.title && <p className=\"mt-2 text-sm text-gray-600\">{videoContent.title}</p>}\n </div>\n )\n },\n } as MessageRenderer,\n },\n },\n}\n\n/**\n * \u81EA\u5B9A\u4E49\u56FE\u7247\u753B\u5ECA\u6E32\u67D3\u5668\n *\n * \u6269\u5C55\u6D88\u606F\u7C7B\u578B\uFF0C\u6DFB\u52A0\u56FE\u7247\u753B\u5ECA\u652F\u6301\u3002\n */\nexport const CustomImageGalleryRenderer: Story = {\n args: {\n customRenderers: {\n image_gallery: {\n render: (content: MessageContent) => {\n const galleryContent = content as any\n const images = galleryContent.images || []\n\n return (\n <div className=\"grid grid-cols-2 gap-2\">\n {images.map((image: any, index: number) => (\n <div key={index} className=\"relative aspect-square\">\n <img\n src={image.url}\n alt={image.alt || `Image ${index + 1}`}\n className=\"size-full rounded-lg object-cover\"\n />\n </div>\n ))}\n </div>\n )\n },\n } as MessageRenderer,\n },\n },\n}\n\n/**\n * \u79FB\u52A8\u7AEF\u9884\u89C8\n *\n * \u5728\u79FB\u52A8\u7AEF\u5C3A\u5BF8\u4E0B\u67E5\u770B\u6548\u679C\uFF08\u5168\u5C4F\u663E\u793A\uFF09\u3002\n */\nexport const MobileView: Story = {\n parameters: {\n viewport: {\n defaultViewport: 'mobile1',\n },\n },\n args: {},\n}\n\n/**\n * \u5E73\u677F\u7AEF\u9884\u89C8\n *\n * \u5728\u5E73\u677F\u7AEF\u5C3A\u5BF8\u4E0B\u67E5\u770B\u6548\u679C\u3002\n */\nexport const TabletView: Story = {\n parameters: {\n viewport: {\n defaultViewport: 'tablet',\n },\n },\n args: {},\n}\n\n/**\n * \u9ED8\u8BA4\u4F4D\u7F6E\u5C55\u793A\n *\n * \u5C55\u793A\u6C14\u6CE1\u6309\u94AE\u7684\u9ED8\u8BA4\u4F4D\u7F6E\uFF08\u53F3\u4E0B\u89D2\uFF09\u3002\n */\nexport const DefaultPositionDemo: Story = {\n render: () => (\n <div className=\"relative h-screen w-full bg-gray-50\">\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <p className=\"text-gray-500\">\u9875\u9762\u5185\u5BB9\u533A\u57DF</p>\n </div>\n\n {/* \u6F14\u793A\u9ED8\u8BA4\u4F4D\u7F6E */}\n <div className=\"absolute bottom-4 right-4 text-xs text-gray-400\">\u9ED8\u8BA4\u4F4D\u7F6E (\u53F3\u4E0B\u89D2)</div>\n\n <LiveChatWidget apiBaseUrl=\"https://beta-api-livechat.anker.com\" site=\"www.eufy.com\" />\n </div>\n ),\n}\n\n/**\n * \u4EA7\u54C1\u5BF9\u6BD4\u6D88\u606F\n *\n * \u5C55\u793A\u4EA7\u54C1\u5BF9\u6BD4\u7C7B\u578B\u7684\u6D88\u606F\u6E32\u67D3\u6548\u679C\uFF0C\u5305\u62EC\u4EF7\u683C\u3001\u4F1A\u5458\u4EF7\u3001\u53D8\u4F53\u6570\u91CF\u3001\u6298\u6263\u7B49\u591A\u4E2A\u7EF4\u5EA6\u7684\u5BF9\u6BD4\u3002\n *\n * \u4EA7\u54C1\u5BF9\u6BD4\u7EC4\u4EF6\u4F1A\u4EE5\u7F51\u683C\u5E03\u5C40\u5C55\u793A\u591A\u4E2A\u4EA7\u54C1\u7684\u57FA\u672C\u4FE1\u606F\uFF0C\u5E76\u5728\u4E0B\u65B9\u663E\u793A\u5404\u7EF4\u5EA6\u7684\u5BF9\u6BD4\u6570\u636E\u3002\n */\nexport const ProductComparisonMessage: Story = {\n render: args => (\n <LiveChatWidget\n {...args}\n onAddToCart={(product: any) => {\n console.log('\uD83D\uDED2 [ProductComparison Story] Add to Cart clicked!')\n console.log('\uD83D\uDCE6 Product Info:', {\n id: product.shopifyId,\n title: product.title,\n price: product.price,\n imageUrl: product.imageUrl,\n productUrl: product.productUrl,\n })\n console.log('\uD83D\uDCCB Full Product Object:', product)\n\n // \u6A21\u62DF\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6210\u529F\n alert(`\u2705 \"${product.title}\" \u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\uFF01\\n\\n\u4EF7\u683C: ${product.price.currency} ${product.price.amount}`)\n }}\n />\n ),\n args: {\n welcomeMessage: '\u4EE5\u4E0B\u662F\u60A8\u5173\u6CE8\u7684\u4EA7\u54C1\u5BF9\u6BD4\u4FE1\u606F\uFF1A',\n },\n parameters: {\n docs: {\n description: {\n story: `\n\u4EA7\u54C1\u5BF9\u6BD4\u6D88\u606F\u652F\u6301\u4EE5\u4E0B\u7EF4\u5EA6\uFF1A\n\n- **\u4EF7\u683C\u5BF9\u6BD4**: \u663E\u793A\u4EA7\u54C1\u7684\u4EF7\u683C\u533A\u95F4\u548C\u4FC3\u9500\u6807\u7B7E\n- **\u4F1A\u5458\u4EF7\u5BF9\u6BD4**: \u663E\u793A\u4F1A\u5458\u4E13\u4EAB\u4EF7\u683C\uFF08\u5982\u679C\u53EF\u7528\uFF09\n- **\u53D8\u4F53\u6570\u91CF\u5BF9\u6BD4**: \u663E\u793A\u4EA7\u54C1\u7684\u53EF\u9009\u53D8\u4F53\u6570\u91CF\n- **\u6298\u6263\u5BF9\u6BD4**: \u663E\u793A\u4EA7\u54C1\u662F\u5426\u6709\u6298\u6263\u6D3B\u52A8\n\n\u7EC4\u4EF6\u4F1A\u81EA\u52A8\u5904\u7406\u4ECE\u540E\u7AEF\u8FD4\u56DE\u7684\u4EA7\u54C1\u5BF9\u6BD4\u6570\u636E\uFF0C\u5305\u62EC\uFF1A\n- \u4EA7\u54C1\u57FA\u672C\u4FE1\u606F\uFF08\u56FE\u7247\u3001\u6807\u9898\u3001\u4EF7\u683C\u7B49\uFF09\n- \u591A\u7EF4\u5EA6\u5BF9\u6BD4\u6570\u636E\uFF08\u4EF7\u683C\u3001\u4F1A\u5458\u4EF7\u3001\u53D8\u4F53\u3001\u6298\u6263\uFF09\n- \u54CD\u5E94\u5F0F\u5E03\u5C40\uFF08\u79FB\u52A8\u7AEF\u53EF\u6A2A\u5411\u6EDA\u52A8\uFF09\n\n**\u6D4B\u8BD5 Add to Cart \u529F\u80FD\uFF1A**\n- \u70B9\u51FB\u4EA7\u54C1\u5BF9\u6BD4\u5361\u7247\u4E2D\u7684 \"Add to Cart\" \u6309\u94AE\n- \u67E5\u770B\u63A7\u5236\u53F0\u8F93\u51FA\u7684\u4EA7\u54C1\u4FE1\u606F\n- \u4F1A\u5F39\u51FA\u786E\u8BA4\u63D0\u793A\u6846\u663E\u793A\u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\n `,\n },\n },\n },\n}\n\n/**\n * FAQ \u5217\u8868\u6D88\u606F\n *\n * \u5C55\u793A\u5E38\u89C1\u95EE\u9898\u5217\u8868\uFF0C\u652F\u6301\u6298\u53E0/\u5C55\u5F00\u3002\n *\n * FAQ \u7EC4\u4EF6\u4F1A\u663E\u793A\u641C\u7D22\u7ED3\u679C\u7684\u5E38\u89C1\u95EE\u9898\uFF0C\u6BCF\u4E2A\u95EE\u9898\u53EF\u4EE5\u70B9\u51FB\u5C55\u5F00\u67E5\u770B\u7B54\u6848\u3002\n */\nexport const FAQListMessage: Story = {\n args: {\n welcomeMessage: '\u4EE5\u4E0B\u662F\u4E0E\u60A8\u7684\u95EE\u9898\u76F8\u5173\u7684\u5E38\u89C1\u89E3\u7B54\uFF1A',\n },\n parameters: {\n docs: {\n description: {\n story: `\nFAQ \u5217\u8868\u6D88\u606F\u652F\u6301\uFF1A\n\n- **\u53EF\u6298\u53E0\u95EE\u9898**: \u70B9\u51FB\u95EE\u9898\u6807\u9898\u5C55\u5F00/\u6298\u53E0\u7B54\u6848\n- **Markdown \u7B54\u6848**: \u7B54\u6848\u652F\u6301 Markdown \u683C\u5F0F\uFF0C\u53EF\u663E\u793A\u5BCC\u6587\u672C\n- **\u76F8\u5173\u95EE\u9898**: \u5C55\u5F00\u7B54\u6848\u540E\u663E\u793A\u76F8\u5173\u95EE\u9898\uFF0C\u70B9\u51FB\u53EF\u89E6\u53D1\u65B0\u641C\u7D22\n- **\u5206\u7C7B\u6807\u8BB0**: \u6839\u636E\u95EE\u9898\u5206\u7C7B\u663E\u793A\uFF08\u914D\u9001\u3001\u9000\u8D27\u3001\u4EA7\u54C1\u3001\u652F\u4ED8\u3001\u901A\u7528\uFF09\n- **\u641C\u7D22\u7ED3\u679C\u7EDF\u8BA1**: \u663E\u793A\u627E\u5230\u7684\u95EE\u9898\u6570\u91CF\n\n\u4F7F\u7528\u573A\u666F\uFF1A\n- \u7528\u6237\u8BE2\u95EE\u5E38\u89C1\u95EE\u9898\u65F6\u8FD4\u56DE FAQ \u5217\u8868\n- \u4EA7\u54C1\u4E13\u5C5E\u95EE\u9898\u67E5\u8BE2\n- \u6309\u5206\u7C7B\u67E5\u8BE2 FAQ\n `,\n },\n },\n },\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["LiveChatWidget_stories_exports", "__export", "CustomBranding", "CustomImageGalleryRenderer", "CustomPosition", "CustomVideoRenderer", "CustomWelcomeMessage", "Default", "DefaultPositionDemo", "FAQListMessage", "MobileView", "ProductComparisonMessage", "TabletView", "WithEventCallbacks", "WithQuickReplies", "LiveChatWidget_stories_default", "__toCommonJS", "import_jsx_runtime", "import_LiveChatWidget", "import_livechat", "meta", "args", "message", "error", "product", "cartId", "checkoutUrl", "content", "videoContent", "images", "image", "index"]
7
+ }
@@ -69,5 +69,19 @@ export type CreditsTemplateProps = {
69
69
  gtm: {
70
70
  pageGroup: string;
71
71
  };
72
+ cartConfig?: {
73
+ addToCart: (params: {
74
+ variantList: Array<{
75
+ variant: any;
76
+ quantity: number;
77
+ attributes?: Array<{
78
+ key: string;
79
+ value: string;
80
+ }>;
81
+ }>;
82
+ cartAttributes?: Record<string, string>;
83
+ discountCodes?: string[];
84
+ }) => void | Promise<any>;
85
+ };
72
86
  };
73
- export declare const CreditsTemplate: ({ headlessConfig, siteConfig, creditsConfig, userContext, pageConfig, registrationContext, gtm, }: CreditsTemplateProps) => import("react/jsx-runtime").JSX.Element;
87
+ export declare const CreditsTemplate: ({ headlessConfig, siteConfig, creditsConfig, userContext, pageConfig, registrationContext, gtm, cartConfig, }: CreditsTemplateProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
- "use strict";var C=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var M=(s,i)=>{for(var p in i)C(s,p,{get:i[p],enumerable:!0})},N=(s,i,p,r)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of K(i))!F.call(s,t)&&t!==p&&C(s,t,{get:()=>i[t],enumerable:!(r=L(i,t))||r.enumerable});return s};var S=s=>N(C({},"__esModule",{value:!0}),s);var D={};M(D,{ComponentKey:()=>I,CreditsTemplate:()=>x});module.exports=S(D);var o=require("react/jsx-runtime"),a=require("@anker-in/lib"),c=require("../components/registration/context/provider"),f=require("../components/credits/context/provider"),l=require("../components/credits/creditsBanner"),y=require("../components/credits/creditsInfoCard"),g=require("../components/credits/creditsBenefits"),P=require("../components/credits/creditsWaysToGetCredits"),T=require("../components/credits/creditsAnkersolixTask"),v=require("../components/credits/creditsRedeemList"),u=require("../components/credits/creditsCash"),b=require("../components/credits/creditsMemberPrice"),h=require("../components/credits/creditsFaq"),B=require("../components/credits/creditsNavigation"),I=(d=>(d.Navigation="creditsNavigation",d.Banner="creditsBanner",d.InfoCard="creditsInfoCard",d.Benefits="creditsBenefits",d.WaysToGetCredits="creditsWaysToGetCredits",d.AnkersolixTask="creditsAnkersolixTask",d.RedeemList="creditsRedeemList",d.SpendCreditsLikeCash="creditsCash",d.MemberPrice="creditsMemberPrice",d.Faqs="creditsFaq",d))(I||{});const x=({headlessConfig:s,siteConfig:i,creditsConfig:p,userContext:r,pageConfig:t,registrationContext:m,gtm:A})=>(console.log("siteConfig",i),(0,o.jsx)(a.HeadlessProvider,{headlessConfig:s,children:(0,o.jsx)(c.RegistrationProvider,{copy:i.registrationsSettings,email:r?.profile?.email,children:(0,o.jsxs)(f.CreditsProvider,{profile:r?.profile,removeProfile:r?.removeProfile,isLoadingProfile:r?.isLoadingProfile,openSignInPopup:m.openSignInPopup,openSignUpPopup:m.openSignUpPopup,creditInfo:r?.creditInfo,taskIdToTypeMapping:i.taskIdToTypeMapping,customer:r?.customer,fetchCreditInfo:r?.fetchCreditInfo,customerLoading:r?.customerLoading,gtm:A,pageCommon:t.common,memberPriceDiscount:i.memberPriceDiscount,alpcBrand:p?.alpcBrand,children:[t.components.creditsNavigation&&(0,o.jsx)(B.CreditsNavigation,{copy:t.components.creditsNavigation}),(0,o.jsx)("div",{className:(0,a.classNames)("bg-[#f5f5f7] leading-[1.2]"),children:t.order.map(e=>{if(e==="creditsNavigation")return null;const n=t.components?.[e];return n?(0,o.jsxs)(o.Fragment,{children:[e==="creditsBanner"&&(0,o.jsx)(l.CreditsBanner,{copy:n,id:e}),e==="creditsInfoCard"&&r?.profile&&(0,o.jsx)(y.CreditsInfoCard,{copy:n,id:e}),e==="creditsBenefits"&&(0,o.jsx)(g.CreditsBenefits,{copy:n,id:e}),e==="creditsWaysToGetCredits"&&(0,o.jsx)(P.CreditsWaysToGetCredits,{copy:n,id:e,classNames:s.brand==="anker"?{subtitle:"text-white",equalCreditsText:"bg-gradient-to-r from-[#3AD1FF] to-[#008CD6] bg-clip-text text-transparent"}:{subtitle:"text-[#D1D1D1]",equalCreditsText:"text-[#F6EAD0]"}}),e==="creditsAnkersolixTask"&&(0,o.jsx)(T.CreditsAnkersolixTask,{copy:n,id:e}),e==="creditsRedeemList"&&(0,o.jsx)(v.CreditsRedeemList,{copy:n,id:e}),e==="creditsCash"&&(0,o.jsx)(u.CreditsCash,{copy:n,id:e}),e==="creditsMemberPrice"&&(0,o.jsx)(b.CreditsMemberPrice,{copy:n,id:e}),e==="creditsFaq"&&(0,o.jsx)(h.CreditsFaq,{copy:n,id:e}),e!=="creditsBanner"&&(0,o.jsx)("div",{className:"laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16"})]}):null})})]})})}));
1
+ "use strict";var C=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var N=(s,i)=>{for(var d in i)C(s,d,{get:i[d],enumerable:!0})},S=(s,i,d,r)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of F(i))!M.call(s,t)&&t!==d&&C(s,t,{get:()=>i[t],enumerable:!(r=K(i,t))||r.enumerable});return s};var x=s=>S(C({},"__esModule",{value:!0}),s);var q={};N(q,{ComponentKey:()=>B,CreditsTemplate:()=>R});module.exports=x(q);var o=require("react/jsx-runtime"),p=require("@anker-in/lib"),c=require("../components/registration/context/provider"),f=require("../components/credits/context/provider"),y=require("../components/credits/creditsBanner"),l=require("../components/credits/creditsInfoCard"),g=require("../components/credits/creditsBenefits"),P=require("../components/credits/creditsWaysToGetCredits"),T=require("../components/credits/creditsAnkersolixTask"),v=require("../components/credits/creditsRedeemList"),u=require("../components/credits/creditsCash"),b=require("../components/credits/creditsMemberPrice"),h=require("../components/credits/creditsFaq"),A=require("../components/credits/creditsNavigation"),B=(a=>(a.Navigation="creditsNavigation",a.Banner="creditsBanner",a.InfoCard="creditsInfoCard",a.Benefits="creditsBenefits",a.WaysToGetCredits="creditsWaysToGetCredits",a.AnkersolixTask="creditsAnkersolixTask",a.RedeemList="creditsRedeemList",a.SpendCreditsLikeCash="creditsCash",a.MemberPrice="creditsMemberPrice",a.Faqs="creditsFaq",a))(B||{});const R=({headlessConfig:s,siteConfig:i,creditsConfig:d,userContext:r,pageConfig:t,registrationContext:m,gtm:I,cartConfig:L})=>(console.log("siteConfig",i),(0,o.jsx)(p.HeadlessProvider,{headlessConfig:s,children:(0,o.jsx)(c.RegistrationProvider,{copy:i.registrationsSettings,email:r?.profile?.email,children:(0,o.jsxs)(f.CreditsProvider,{profile:r?.profile,removeProfile:r?.removeProfile,isLoadingProfile:r?.isLoadingProfile,openSignInPopup:m.openSignInPopup,openSignUpPopup:m.openSignUpPopup,creditInfo:r?.creditInfo,taskIdToTypeMapping:i.taskIdToTypeMapping,customer:r?.customer,fetchCreditInfo:r?.fetchCreditInfo,customerLoading:r?.customerLoading,gtm:I,pageCommon:t.common,memberPriceDiscount:i.memberPriceDiscount,alpcBrand:d?.alpcBrand,cartConfig:L,children:[t.components.creditsNavigation&&(0,o.jsx)(A.CreditsNavigation,{copy:t.components.creditsNavigation}),(0,o.jsx)("div",{className:(0,p.classNames)("bg-[#f5f5f7] leading-[1.2]"),children:t.order.map(e=>{if(e==="creditsNavigation")return null;const n=t.components?.[e];return n?(0,o.jsxs)(o.Fragment,{children:[e==="creditsBanner"&&(0,o.jsx)(y.CreditsBanner,{copy:n,id:e}),e==="creditsInfoCard"&&r?.profile&&(0,o.jsx)(l.CreditsInfoCard,{copy:n,id:e}),e==="creditsBenefits"&&(0,o.jsx)(g.CreditsBenefits,{copy:n,id:e}),e==="creditsWaysToGetCredits"&&(0,o.jsx)(P.CreditsWaysToGetCredits,{copy:n,id:e,classNames:s.brand==="anker"?{subtitle:"text-white",equalCreditsText:"bg-gradient-to-r from-[#3AD1FF] to-[#008CD6] bg-clip-text text-transparent"}:{subtitle:"text-[#D1D1D1]",equalCreditsText:"text-[#F6EAD0]"}}),e==="creditsAnkersolixTask"&&(0,o.jsx)(T.CreditsAnkersolixTask,{copy:n,id:e}),e==="creditsRedeemList"&&(0,o.jsx)(v.CreditsRedeemList,{copy:n,id:e}),e==="creditsCash"&&(0,o.jsx)(u.CreditsCash,{copy:n,id:e}),e==="creditsMemberPrice"&&(0,o.jsx)(b.CreditsMemberPrice,{copy:n,id:e}),e==="creditsFaq"&&(0,o.jsx)(h.CreditsFaq,{copy:n,id:e}),e!=="creditsBanner"&&(0,o.jsx)("div",{className:"laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16"})]}):null})})]})})}));
2
2
  //# sourceMappingURL=Credits.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/templates/Credits.tsx"],
4
- "sourcesContent": ["import { classNames, HeadlessConfig, HeadlessProvider } from '@anker-in/lib'\nimport { RegistrationProvider } from '../components/registration/context/provider'\n\nimport { DTC_TASK_TYPE } from '../components/credits/context/const'\nimport { CreditsProvider } from '../components/credits/context/provider'\nimport { CreditsPageCommon } from '../components/credits/type'\nimport { FunctionMemberPriceConfig } from '../components/credits/context/memberPriceTypes'\n\nimport { CreditsBanner, CreditsBannerCopy } from '../components/credits/creditsBanner'\nimport { CreditsInfoCard, CreditsInfoCardCopy } from '../components/credits/creditsInfoCard'\nimport { CreditsBenefits, CreditsBenefitsCopy } from '../components/credits/creditsBenefits'\nimport { CreditsWaysToGetCredits, CreditsWaysToGetCreditsCopy } from '../components/credits/creditsWaysToGetCredits'\nimport { CreditsAnkersolixTask, CreditsAnkersolixTaskCopy } from '../components/credits/creditsAnkersolixTask'\nimport { CreditsRedeemList, CreditsRedeemListCopy } from '../components/credits/creditsRedeemList'\nimport { CreditsCash, CreditsCashCopy } from '../components/credits/creditsCash'\nimport { CreditsMemberPrice, CreditsMemberPriceCopy } from '../components/credits/creditsMemberPrice'\nimport { CreditsFaq, CreditsFaqCopy } from '../components/credits/creditsFaq'\nimport { CreditsNavigation, CreditsNavigationCopy } from '../components/credits/creditsNavigation'\nimport { AuthCodeActivateCopy } from 'src/components/registration/authCodeActivate/type'\n\nexport enum ComponentKey {\n Navigation = 'creditsNavigation',\n Banner = 'creditsBanner',\n InfoCard = 'creditsInfoCard',\n Benefits = 'creditsBenefits',\n WaysToGetCredits = 'creditsWaysToGetCredits',\n AnkersolixTask = 'creditsAnkersolixTask',\n RedeemList = 'creditsRedeemList',\n SpendCreditsLikeCash = 'creditsCash',\n MemberPrice = 'creditsMemberPrice',\n Faqs = 'creditsFaq',\n}\nexport type CreditsTemplateProps = {\n headlessConfig: HeadlessConfig\n siteConfig: {\n registrationsSettings: {\n authCodeActivate: AuthCodeActivateCopy\n }\n taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>\n memberPriceDiscount?: FunctionMemberPriceConfig[]\n }\n creditsConfig?: {\n alpcBrand?: string\n }\n pageConfig: {\n order: ComponentKey[]\n common: CreditsPageCommon\n components: {\n [ComponentKey.Navigation]?: CreditsNavigationCopy\n [ComponentKey.Banner]?: CreditsBannerCopy\n [ComponentKey.InfoCard]?: CreditsInfoCardCopy\n [ComponentKey.Benefits]?: CreditsBenefitsCopy\n [ComponentKey.WaysToGetCredits]?: CreditsWaysToGetCreditsCopy\n [ComponentKey.AnkersolixTask]?: CreditsAnkersolixTaskCopy\n [ComponentKey.RedeemList]?: CreditsRedeemListCopy\n [ComponentKey.SpendCreditsLikeCash]?: CreditsCashCopy\n [ComponentKey.MemberPrice]?: CreditsMemberPriceCopy\n [ComponentKey.Faqs]?: CreditsFaqCopy\n }\n }\n userContext: {\n profile: any\n removeProfile: () => void\n isLoadingProfile: boolean\n creditInfo: any\n customer: any\n customerLoading: boolean\n fetchCreditInfo: () => void\n }\n registrationContext: {\n openSignUpPopup: () => void\n openSignInPopup: () => void\n }\n gtm: {\n pageGroup: string\n }\n}\n\nexport const CreditsTemplate = ({\n headlessConfig,\n siteConfig,\n creditsConfig,\n userContext,\n pageConfig,\n registrationContext,\n gtm,\n}: CreditsTemplateProps) => {\n\n console.log('siteConfig', siteConfig)\n return (\n <HeadlessProvider headlessConfig={headlessConfig}>\n <RegistrationProvider copy={siteConfig.registrationsSettings} email={userContext?.profile?.email}>\n <CreditsProvider\n profile={userContext?.profile}\n removeProfile={userContext?.removeProfile}\n isLoadingProfile={userContext?.isLoadingProfile}\n openSignInPopup={registrationContext.openSignInPopup}\n openSignUpPopup={registrationContext.openSignUpPopup}\n creditInfo={userContext?.creditInfo}\n taskIdToTypeMapping={siteConfig.taskIdToTypeMapping}\n customer={userContext?.customer}\n fetchCreditInfo={userContext?.fetchCreditInfo}\n customerLoading={userContext?.customerLoading}\n gtm={gtm}\n pageCommon={pageConfig.common}\n memberPriceDiscount={siteConfig.memberPriceDiscount}\n alpcBrand={creditsConfig?.alpcBrand}\n >\n {/* \u5BFC\u822A\u7EC4\u4EF6 - \u56FA\u5B9A\u4F4D\u7F6E\uFF0C\u4E0D\u53C2\u4E0E order \u6392\u5E8F */}\n {pageConfig.components[ComponentKey.Navigation] && (\n <CreditsNavigation copy={pageConfig.components[ComponentKey.Navigation]} />\n )}\n <div className={classNames('bg-[#f5f5f7] leading-[1.2]')}>\n {pageConfig.order.map(key => {\n // \u8DF3\u8FC7\u5BFC\u822A\u7EC4\u4EF6\uFF0C\u56E0\u4E3A\u5B83\u5DF2\u7ECF\u56FA\u5B9A\u6E32\u67D3\u5728\u4E0A\u65B9\n if (key === ComponentKey.Navigation) return null\n const componentCopy = pageConfig.components?.[key]\n if (!componentCopy) return null\n return (\n <>\n {key === ComponentKey.Banner && <CreditsBanner copy={componentCopy as CreditsBannerCopy} id={key} />}\n {key === ComponentKey.InfoCard && userContext?.profile && (\n <CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} id={key} />\n )}\n {key === ComponentKey.Benefits && <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} id={key} />}\n {key === ComponentKey.WaysToGetCredits && (\n <CreditsWaysToGetCredits\n copy={componentCopy as CreditsWaysToGetCreditsCopy}\n id={key}\n classNames={\n headlessConfig.brand === 'anker'\n ? {\n subtitle: 'text-white',\n equalCreditsText:\n 'bg-gradient-to-r from-[#3AD1FF] to-[#008CD6] bg-clip-text text-transparent',\n }\n : {\n subtitle: 'text-[#D1D1D1]',\n equalCreditsText: 'text-[#F6EAD0]',\n }\n }\n />\n )}\n {key === ComponentKey.AnkersolixTask && (\n <CreditsAnkersolixTask\n copy={componentCopy as CreditsAnkersolixTaskCopy}\n id={key}\n />\n )}\n {key === ComponentKey.RedeemList && <CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} id={key} />}\n {key === ComponentKey.SpendCreditsLikeCash && <CreditsCash copy={componentCopy as CreditsCashCopy} id={key} />}\n {key === ComponentKey.MemberPrice && <CreditsMemberPrice copy={componentCopy as CreditsMemberPriceCopy} id={key} />}\n {key === ComponentKey.Faqs && <CreditsFaq copy={componentCopy as CreditsFaqCopy} id={key} />}\n {key !== ComponentKey.Banner && (\n <div className=\"laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16\" />\n )}\n </>\n )\n })}\n </div>\n </CreditsProvider>\n </RegistrationProvider>\n </HeadlessProvider>\n )\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,oBAAAC,IAAA,eAAAC,EAAAJ,GA8GY,IAAAK,EAAA,6BA9GZC,EAA6D,yBAC7DC,EAAqC,uDAGrCA,EAAgC,kDAIhCC,EAAiD,+CACjDC,EAAqD,iDACrDC,EAAqD,iDACrDC,EAAqE,yDACrEC,EAAiE,uDACjEC,EAAyD,mDACzDC,EAA6C,6CAC7CC,EAA2D,oDAC3DC,EAA2C,4CAC3CC,EAAyD,mDAG7Cf,OACVA,EAAA,WAAa,oBACbA,EAAA,OAAS,gBACTA,EAAA,SAAW,kBACXA,EAAA,SAAW,kBACXA,EAAA,iBAAmB,0BACnBA,EAAA,eAAiB,wBACjBA,EAAA,WAAa,oBACbA,EAAA,qBAAuB,cACvBA,EAAA,YAAc,qBACdA,EAAA,KAAO,aAVGA,OAAA,IA0DL,MAAMC,EAAkB,CAAC,CAC9B,eAAAe,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,IAAAC,CACF,KAEE,QAAQ,IAAI,aAAcL,CAAU,KAElC,OAAC,oBAAiB,eAAgBD,EAChC,mBAAC,wBAAqB,KAAMC,EAAW,sBAAuB,MAAOE,GAAa,SAAS,MACzF,oBAAC,mBACC,QAASA,GAAa,QACtB,cAAeA,GAAa,cAC5B,iBAAkBA,GAAa,iBAC/B,gBAAiBE,EAAoB,gBACrC,gBAAiBA,EAAoB,gBACrC,WAAYF,GAAa,WACzB,oBAAqBF,EAAW,oBAChC,SAAUE,GAAa,SACvB,gBAAiBA,GAAa,gBAC9B,gBAAiBA,GAAa,gBAC9B,IAAKG,EACL,WAAYF,EAAW,OACvB,oBAAqBH,EAAW,oBAChC,UAAWC,GAAe,UAGzB,UAAAE,EAAW,WAAW,sBACrB,OAAC,qBAAkB,KAAMA,EAAW,WAAW,kBAA0B,KAE3E,OAAC,OAAI,aAAW,cAAW,4BAA4B,EACpD,SAAAA,EAAW,MAAM,IAAIG,GAAO,CAE3B,GAAIA,IAAQ,oBAAyB,OAAO,KAC5C,MAAMC,EAAgBJ,EAAW,aAAaG,CAAG,EACjD,OAAKC,KAEH,oBACG,UAAAD,IAAQ,oBAAuB,OAAC,iBAAc,KAAMC,EAAoC,GAAID,EAAK,EACjGA,IAAQ,mBAAyBJ,GAAa,YAC7C,OAAC,mBAAgB,KAAMK,EAAsC,GAAID,EAAK,EAEvEA,IAAQ,sBAAyB,OAAC,mBAAgB,KAAMC,EAAsC,GAAID,EAAK,EACvGA,IAAQ,8BACP,OAAC,2BACC,KAAMC,EACN,GAAID,EACJ,WACEP,EAAe,QAAU,QACrB,CACE,SAAU,aACV,iBACE,4EACJ,EACA,CACE,SAAU,iBACV,iBAAkB,gBACpB,EAER,EAEDO,IAAQ,4BACP,OAAC,yBACC,KAAMC,EACN,GAAID,EACN,EAEDA,IAAQ,wBAA2B,OAAC,qBAAkB,KAAMC,EAAwC,GAAID,EAAK,EAC7GA,IAAQ,kBAAqC,OAAC,eAAY,KAAMC,EAAkC,GAAID,EAAK,EAC3GA,IAAQ,yBAA4B,OAAC,sBAAmB,KAAMC,EAAyC,GAAID,EAAK,EAChHA,IAAQ,iBAAqB,OAAC,cAAW,KAAMC,EAAiC,GAAID,EAAK,EACzFA,IAAQ,oBACP,OAAC,OAAI,UAAU,qEAAqE,GAExF,EAvCyB,IAyC7B,CAAC,EACH,GACF,EACF,EACF",
6
- "names": ["Credits_exports", "__export", "ComponentKey", "CreditsTemplate", "__toCommonJS", "import_jsx_runtime", "import_lib", "import_provider", "import_creditsBanner", "import_creditsInfoCard", "import_creditsBenefits", "import_creditsWaysToGetCredits", "import_creditsAnkersolixTask", "import_creditsRedeemList", "import_creditsCash", "import_creditsMemberPrice", "import_creditsFaq", "import_creditsNavigation", "headlessConfig", "siteConfig", "creditsConfig", "userContext", "pageConfig", "registrationContext", "gtm", "key", "componentCopy"]
4
+ "sourcesContent": ["import { classNames, HeadlessConfig, HeadlessProvider } from '@anker-in/lib'\nimport { RegistrationProvider } from '../components/registration/context/provider'\n\nimport { DTC_TASK_TYPE } from '../components/credits/context/const'\nimport { CreditsProvider } from '../components/credits/context/provider'\nimport { CreditsPageCommon } from '../components/credits/type'\nimport { FunctionMemberPriceConfig } from '../components/credits/context/memberPriceTypes'\n\nimport { CreditsBanner, CreditsBannerCopy } from '../components/credits/creditsBanner'\nimport { CreditsInfoCard, CreditsInfoCardCopy } from '../components/credits/creditsInfoCard'\nimport { CreditsBenefits, CreditsBenefitsCopy } from '../components/credits/creditsBenefits'\nimport { CreditsWaysToGetCredits, CreditsWaysToGetCreditsCopy } from '../components/credits/creditsWaysToGetCredits'\nimport { CreditsAnkersolixTask, CreditsAnkersolixTaskCopy } from '../components/credits/creditsAnkersolixTask'\nimport { CreditsRedeemList, CreditsRedeemListCopy } from '../components/credits/creditsRedeemList'\nimport { CreditsCash, CreditsCashCopy } from '../components/credits/creditsCash'\nimport { CreditsMemberPrice, CreditsMemberPriceCopy } from '../components/credits/creditsMemberPrice'\nimport { CreditsFaq, CreditsFaqCopy } from '../components/credits/creditsFaq'\nimport { CreditsNavigation, CreditsNavigationCopy } from '../components/credits/creditsNavigation'\nimport { AuthCodeActivateCopy } from 'src/components/registration/authCodeActivate/type'\n\nexport enum ComponentKey {\n Navigation = 'creditsNavigation',\n Banner = 'creditsBanner',\n InfoCard = 'creditsInfoCard',\n Benefits = 'creditsBenefits',\n WaysToGetCredits = 'creditsWaysToGetCredits',\n AnkersolixTask = 'creditsAnkersolixTask',\n RedeemList = 'creditsRedeemList',\n SpendCreditsLikeCash = 'creditsCash',\n MemberPrice = 'creditsMemberPrice',\n Faqs = 'creditsFaq',\n}\nexport type CreditsTemplateProps = {\n headlessConfig: HeadlessConfig\n siteConfig: {\n registrationsSettings: {\n authCodeActivate: AuthCodeActivateCopy\n }\n taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>\n memberPriceDiscount?: FunctionMemberPriceConfig[]\n }\n creditsConfig?: {\n alpcBrand?: string\n }\n pageConfig: {\n order: ComponentKey[]\n common: CreditsPageCommon\n components: {\n [ComponentKey.Navigation]?: CreditsNavigationCopy\n [ComponentKey.Banner]?: CreditsBannerCopy\n [ComponentKey.InfoCard]?: CreditsInfoCardCopy\n [ComponentKey.Benefits]?: CreditsBenefitsCopy\n [ComponentKey.WaysToGetCredits]?: CreditsWaysToGetCreditsCopy\n [ComponentKey.AnkersolixTask]?: CreditsAnkersolixTaskCopy\n [ComponentKey.RedeemList]?: CreditsRedeemListCopy\n [ComponentKey.SpendCreditsLikeCash]?: CreditsCashCopy\n [ComponentKey.MemberPrice]?: CreditsMemberPriceCopy\n [ComponentKey.Faqs]?: CreditsFaqCopy\n }\n }\n userContext: {\n profile: any\n removeProfile: () => void\n isLoadingProfile: boolean\n creditInfo: any\n customer: any\n customerLoading: boolean\n fetchCreditInfo: () => void\n }\n registrationContext: {\n openSignUpPopup: () => void\n openSignInPopup: () => void\n }\n gtm: {\n pageGroup: string\n }\n cartConfig?: {\n addToCart: (params: {\n variantList: Array<{\n variant: any\n quantity: number\n attributes?: Array<{ key: string; value: string }>\n }>\n cartAttributes?: Record<string, string>\n discountCodes?: string[]\n }) => void | Promise<any>\n }\n}\n\nexport const CreditsTemplate = ({\n headlessConfig,\n siteConfig,\n creditsConfig,\n userContext,\n pageConfig,\n registrationContext,\n gtm,\n cartConfig,\n}: CreditsTemplateProps) => {\n console.log('siteConfig', siteConfig)\n return (\n <HeadlessProvider headlessConfig={headlessConfig}>\n <RegistrationProvider copy={siteConfig.registrationsSettings} email={userContext?.profile?.email}>\n <CreditsProvider\n profile={userContext?.profile}\n removeProfile={userContext?.removeProfile}\n isLoadingProfile={userContext?.isLoadingProfile}\n openSignInPopup={registrationContext.openSignInPopup}\n openSignUpPopup={registrationContext.openSignUpPopup}\n creditInfo={userContext?.creditInfo}\n taskIdToTypeMapping={siteConfig.taskIdToTypeMapping}\n customer={userContext?.customer}\n fetchCreditInfo={userContext?.fetchCreditInfo}\n customerLoading={userContext?.customerLoading}\n gtm={gtm}\n pageCommon={pageConfig.common}\n memberPriceDiscount={siteConfig.memberPriceDiscount}\n alpcBrand={creditsConfig?.alpcBrand}\n cartConfig={cartConfig}\n >\n {/* \u5BFC\u822A\u7EC4\u4EF6 - \u56FA\u5B9A\u4F4D\u7F6E\uFF0C\u4E0D\u53C2\u4E0E order \u6392\u5E8F */}\n {pageConfig.components[ComponentKey.Navigation] && (\n <CreditsNavigation copy={pageConfig.components[ComponentKey.Navigation]} />\n )}\n <div className={classNames('bg-[#f5f5f7] leading-[1.2]')}>\n {pageConfig.order.map(key => {\n // \u8DF3\u8FC7\u5BFC\u822A\u7EC4\u4EF6\uFF0C\u56E0\u4E3A\u5B83\u5DF2\u7ECF\u56FA\u5B9A\u6E32\u67D3\u5728\u4E0A\u65B9\n if (key === ComponentKey.Navigation) return null\n const componentCopy = pageConfig.components?.[key]\n if (!componentCopy) return null\n return (\n <>\n {key === ComponentKey.Banner && <CreditsBanner copy={componentCopy as CreditsBannerCopy} id={key} />}\n {key === ComponentKey.InfoCard && userContext?.profile && (\n <CreditsInfoCard copy={componentCopy as CreditsInfoCardCopy} id={key} />\n )}\n {key === ComponentKey.Benefits && (\n <CreditsBenefits copy={componentCopy as CreditsBenefitsCopy} id={key} />\n )}\n {key === ComponentKey.WaysToGetCredits && (\n <CreditsWaysToGetCredits\n copy={componentCopy as CreditsWaysToGetCreditsCopy}\n id={key}\n classNames={\n headlessConfig.brand === 'anker'\n ? {\n subtitle: 'text-white',\n equalCreditsText:\n 'bg-gradient-to-r from-[#3AD1FF] to-[#008CD6] bg-clip-text text-transparent',\n }\n : {\n subtitle: 'text-[#D1D1D1]',\n equalCreditsText: 'text-[#F6EAD0]',\n }\n }\n />\n )}\n {key === ComponentKey.AnkersolixTask && (\n <CreditsAnkersolixTask copy={componentCopy as CreditsAnkersolixTaskCopy} id={key} />\n )}\n {key === ComponentKey.RedeemList && (\n <CreditsRedeemList copy={componentCopy as CreditsRedeemListCopy} id={key} />\n )}\n {key === ComponentKey.SpendCreditsLikeCash && (\n <CreditsCash copy={componentCopy as CreditsCashCopy} id={key} />\n )}\n {key === ComponentKey.MemberPrice && (\n <CreditsMemberPrice copy={componentCopy as CreditsMemberPriceCopy} id={key} />\n )}\n {key === ComponentKey.Faqs && <CreditsFaq copy={componentCopy as CreditsFaqCopy} id={key} />}\n {key !== ComponentKey.Banner && (\n <div className=\"laptop:h-16 desktop:h-[96px] lg-desktop:h-[128px] tablet:h-16 h-16\" />\n )}\n </>\n )\n })}\n </div>\n </CreditsProvider>\n </RegistrationProvider>\n </HeadlessProvider>\n )\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,oBAAAC,IAAA,eAAAC,EAAAJ,GA0HY,IAAAK,EAAA,6BA1HZC,EAA6D,yBAC7DC,EAAqC,uDAGrCA,EAAgC,kDAIhCC,EAAiD,+CACjDC,EAAqD,iDACrDC,EAAqD,iDACrDC,EAAqE,yDACrEC,EAAiE,uDACjEC,EAAyD,mDACzDC,EAA6C,6CAC7CC,EAA2D,oDAC3DC,EAA2C,4CAC3CC,EAAyD,mDAG7Cf,OACVA,EAAA,WAAa,oBACbA,EAAA,OAAS,gBACTA,EAAA,SAAW,kBACXA,EAAA,SAAW,kBACXA,EAAA,iBAAmB,0BACnBA,EAAA,eAAiB,wBACjBA,EAAA,WAAa,oBACbA,EAAA,qBAAuB,cACvBA,EAAA,YAAc,qBACdA,EAAA,KAAO,aAVGA,OAAA,IAqEL,MAAMC,EAAkB,CAAC,CAC9B,eAAAe,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,IAAAC,EACA,WAAAC,CACF,KACE,QAAQ,IAAI,aAAcN,CAAU,KAElC,OAAC,oBAAiB,eAAgBD,EAChC,mBAAC,wBAAqB,KAAMC,EAAW,sBAAuB,MAAOE,GAAa,SAAS,MACzF,oBAAC,mBACC,QAASA,GAAa,QACtB,cAAeA,GAAa,cAC5B,iBAAkBA,GAAa,iBAC/B,gBAAiBE,EAAoB,gBACrC,gBAAiBA,EAAoB,gBACrC,WAAYF,GAAa,WACzB,oBAAqBF,EAAW,oBAChC,SAAUE,GAAa,SACvB,gBAAiBA,GAAa,gBAC9B,gBAAiBA,GAAa,gBAC9B,IAAKG,EACL,WAAYF,EAAW,OACvB,oBAAqBH,EAAW,oBAChC,UAAWC,GAAe,UAC1B,WAAYK,EAGX,UAAAH,EAAW,WAAW,sBACrB,OAAC,qBAAkB,KAAMA,EAAW,WAAW,kBAA0B,KAE3E,OAAC,OAAI,aAAW,cAAW,4BAA4B,EACpD,SAAAA,EAAW,MAAM,IAAII,GAAO,CAE3B,GAAIA,IAAQ,oBAAyB,OAAO,KAC5C,MAAMC,EAAgBL,EAAW,aAAaI,CAAG,EACjD,OAAKC,KAEH,oBACG,UAAAD,IAAQ,oBAAuB,OAAC,iBAAc,KAAMC,EAAoC,GAAID,EAAK,EACjGA,IAAQ,mBAAyBL,GAAa,YAC7C,OAAC,mBAAgB,KAAMM,EAAsC,GAAID,EAAK,EAEvEA,IAAQ,sBACP,OAAC,mBAAgB,KAAMC,EAAsC,GAAID,EAAK,EAEvEA,IAAQ,8BACP,OAAC,2BACC,KAAMC,EACN,GAAID,EACJ,WACER,EAAe,QAAU,QACrB,CACE,SAAU,aACV,iBACE,4EACJ,EACA,CACE,SAAU,iBACV,iBAAkB,gBACpB,EAER,EAEDQ,IAAQ,4BACP,OAAC,yBAAsB,KAAMC,EAA4C,GAAID,EAAK,EAEnFA,IAAQ,wBACP,OAAC,qBAAkB,KAAMC,EAAwC,GAAID,EAAK,EAE3EA,IAAQ,kBACP,OAAC,eAAY,KAAMC,EAAkC,GAAID,EAAK,EAE/DA,IAAQ,yBACP,OAAC,sBAAmB,KAAMC,EAAyC,GAAID,EAAK,EAE7EA,IAAQ,iBAAqB,OAAC,cAAW,KAAMC,EAAiC,GAAID,EAAK,EACzFA,IAAQ,oBACP,OAAC,OAAI,UAAU,qEAAqE,GAExF,EA5CyB,IA8C7B,CAAC,EACH,GACF,EACF,EACF",
6
+ "names": ["Credits_exports", "__export", "ComponentKey", "CreditsTemplate", "__toCommonJS", "import_jsx_runtime", "import_lib", "import_provider", "import_creditsBanner", "import_creditsInfoCard", "import_creditsBenefits", "import_creditsWaysToGetCredits", "import_creditsAnkersolixTask", "import_creditsRedeemList", "import_creditsCash", "import_creditsMemberPrice", "import_creditsFaq", "import_creditsNavigation", "headlessConfig", "siteConfig", "creditsConfig", "userContext", "pageConfig", "registrationContext", "gtm", "cartConfig", "key", "componentCopy"]
7
7
  }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * LiveChat 主组件
3
+ * 集成所有子组件,提供完整的聊天功能
4
+ * 基于 specs/livechat-widget/plan.md 的三层架构设计
5
+ */
6
+ import React from 'react';
7
+ import type { LiveChatWidgetProps } from './types';
8
+ /**
9
+ * LiveChat 聊天组件
10
+ *
11
+ * 功能:
12
+ * - 气泡弹窗聊天界面
13
+ * - SSE 流式消息接收
14
+ * - 会话管理(userId, sessionId)
15
+ * - 历史消息加载
16
+ * - 多种消息类型渲染
17
+ * - 自定义扩展机制
18
+ *
19
+ * 架构:
20
+ * - UI Layer: ChatBubble, ChatWindow, MessageList, etc.
21
+ * - Logic Layer: useChatState, useChatAPI, useSession
22
+ * - Core Layer: MessageRendererRegistry, 自定义渲染器
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * // 使用默认位置(右下角)
27
+ * <LiveChatWidget
28
+ * apiBaseUrl="https://beta-api-livechat.anker.com"
29
+ * site="www.eufy.com"
30
+ * welcomeMessage="你好!我是 AI 助手"
31
+ * onMessageSend={(msg) => console.log('Sent:', msg)}
32
+ * />
33
+ *
34
+ * // 使用自定义位置
35
+ * <LiveChatWidget
36
+ * apiBaseUrl="https://beta-api-livechat.anker.com"
37
+ * site="www.eufy.com"
38
+ * position={{ bottom: "20px", right: "30px" }}
39
+ * onMessageSend={(msg) => console.log('Sent:', msg)}
40
+ * />
41
+ * ```
42
+ */
43
+ export declare const LiveChatWidget: React.FC<LiveChatWidgetProps>;
@@ -0,0 +1,2 @@
1
+ import{Fragment as Se,jsx as h,jsxs as xe}from"react/jsx-runtime";import L,{useEffect as se,useCallback as x}from"react";import*as F from"@radix-ui/react-dialog";import{ChatBubble as re}from"./components/ChatBubble";import{ChatWindow as ae}from"./components/ChatWindow";import{useChatState as ie}from"./hooks/useChatState";import{useChatAPI as ne}from"./hooks/useChatAPI";import{MessageRendererRegistry as oe}from"./utils/messageRenderers";import{sanitizeInput as de}from"./utils/validation";import{transformProducts as V}from"./utils/productTransformers.js";import{transformCartData as ce}from"./utils/cartTransformers.js";import{TextBlock as pe,ProductCard as ue,ProductList as le,ProductComparisonRenderer as me,PolicyBlock as fe,createQuickRepliesRenderer as ge,ThinkingBlock as ye,ErrorBlock as he,FAQListRenderer as _e,PromotionListRenderer as Ce,CartCard as we}from"./components/MessageContent/index.js";const We=({apiBaseUrl:O,site:n,loginUserId:c,cartId:A,accessToken:W,position:G,welcomeMessage:m,quickReplies:d,customRenderers:M,logoUrl:H,title:J,chatBubbleIcon:K,onOpen:X,onClose:Y,onMessageSend:D,onError:p,onAddToCart:_,onCart:P,showNewSessionButton:Z})=>{const j=ie({welcomeMessage:m,site:n,onOpen:X,onClose:Y,onMessageSend:D,onError:p,onAddToCart:_,onCart:P}),{messages:k,isOpen:C,userId:o,sessionId:R,inputValue:q,isStreaming:U,openChat:I,closeChat:Q,setInputValue:v,addMessage:u,setMessages:z,clearMessages:w,handleSSEEvent:$,saveSession:S,clearSession:f}=j,{sendMessageStream:E,createSession:l}=ne({apiBaseUrl:O,onError:p}),N=L.useRef(async e=>{}),b=L.useMemo(()=>{const e=new oe;e.register("text",pe),e.register("product_card",ue),e.register("product_list",le),e.register("product_comparison",me),e.register("policy",fe),e.register("thinking",ye),e.register("error",he),e.register("faq_list",_e),e.register("promotion_list",Ce),e.register("cart",we);const s=ge(r=>{N.current(r.value)});return e.register("quick_replies",s),M&&e.registerMany(M),e},[M]);se(()=>{if(!C||!o)return;const e=R;e?ee(e):g()},[C,o]);const T=x(e=>{if(Array.isArray(e.content))return e;const s=[];typeof e.content=="string"&&e.content.trim()&&s.push({type:"text",text:e.content});const r=e.structuredContent||e.structured_content;return Array.isArray(r)&&r.forEach(t=>{if(t.type==="product_list"&&Array.isArray(t.data))s.push({type:"product_list",data:{products:V(t.data,n),title:void 0}});else if(t.type==="quick_replies"&&t.data?.replies)s.push({type:"quick_replies",data:{replies:t.data.replies}});else if(t.type==="policy"&&t.data?.title&&t.data?.content)s.push({type:"policy",data:{title:t.data.title,content:t.data.content}});else if(t.type==="product_comparison"&&t.data?.products&&t.data?.dimensions)s.push({type:"product_comparison",data:{products:V(t.data.products,n),dimensions:t.data.dimensions,onAddToCart:_}});else if(t.type==="faq_list"&&t.data?.found!==void 0)s.push({type:"faq_list",data:t.data});else if(t.type==="promotion_list"&&t.data?.found!==void 0)s.push({type:"promotion_list",data:t.data});else if(t.type==="cart"&&t.data?.id!==void 0){const a=ce(t.data);s.push({type:"cart",data:{...a,onCart:P}})}else s.push(t)}),s.length===0&&s.push({type:"text",text:""}),{...e,content:s}},[n,P,_]),g=x(async()=>{if(o)try{const e=await l({user_id:o,site:n,real_user_id:c});if(e.success){S(e.sessionId),w();const s=e.welcomeMessage||m;if(s){const r=[{type:"text",text:s}],t=e.quickQuestions;if(t&&t.length>0){const a=t.map((y,i)=>({id:`quick-${i}`,label:y,value:y}));r.push({type:"quick_replies",data:{replies:a}})}else d&&d.length>0&&r.push({type:"quick_replies",data:{replies:d}});u({id:`welcome-${Date.now()}`,role:"assistant",content:r,timestamp:Date.now()})}}}catch(e){console.error("[LiveChatWidget] Failed to create new session:",e),p?.(e)}},[o,n,c,l,S,w,m,d,u,p]),ee=x(async e=>{try{const s=await l({user_id:o,session_id:e,site:n,real_user_id:c});if(s.success&&s.resumed)if(s.messages&&s.messages.length>0){const r=s.messages.map(T);z(r)}else{w();const r=s.welcomeMessage||m;if(r){const t=[{type:"text",text:r}],a=s.quickQuestions;if(a&&a.length>0){const y=a.map((i,te)=>({id:`quick-${te}`,label:i,value:i}));t.push({type:"quick_replies",data:{replies:y}})}else d&&d.length>0&&t.push({type:"quick_replies",data:{replies:d}});u({id:`welcome-${Date.now()}`,role:"assistant",content:t,timestamp:Date.now()})}}else s.resumed||(f(),g())}catch(s){console.error("[LiveChatWidget] Failed to resume session:",s),f(),g()}},[o,n,c,l,z,f,w,T,g,m,d,u]),B=x(async e=>{const s=e||q.trim();if(!s)return;e||v("");const r=de(s);if(!r){p?.(new Error("\u65E0\u6548\u7684\u6D88\u606F\u5185\u5BB9"));return}const t={id:`user-${Date.now()}`,role:"user",content:[{type:"text",text:r}],timestamp:Date.now()};u(t),D?.(r);try{let a=R;if(!a){const i=await l({user_id:o,site:n,real_user_id:c});if(i.success)a=i.sessionId,S(a);else throw new Error("Failed to create session")}await E({message:r,user_id:o,session_id:a,context:{cartId:A,accessToken:W,real_user_id:c}},i=>{$(i),i.event==="status"&&i.data.type==="session_expired"&&f()})}catch(a){console.error("[LiveChatWidget] Failed to send message:",a),p?.(a)}},[q,o,R,n,c,A,W,v,u,l,E,$,S,f,D,p]);return L.useEffect(()=>{N.current=B},[B]),xe(Se,{children:[h(re,{position:G,onClick:I,visible:!C,iconImageUrl:K}),h(F.Root,{open:C,onOpenChange:e=>e?I():Q(),children:h(F.Portal,{children:h(F.Content,{className:"livechat-window-enter",style:{position:"fixed",zIndex:9998},children:h(ae,{messages:k,inputValue:q,onInputChange:v,onSend:()=>B(),onClose:Q,onNewSession:g,title:J,logoUrl:H,isSending:U,rendererRegistry:b,inputPlaceholder:"",onAddToCart:_,showNewSessionButton:Z})})})})]})};export{We as LiveChatWidget};
2
+ //# sourceMappingURL=LiveChatWidget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/LiveChatWidget/LiveChatWidget.tsx"],
4
+ "sourcesContent": ["/**\n * LiveChat \u4E3B\u7EC4\u4EF6\n * \u96C6\u6210\u6240\u6709\u5B50\u7EC4\u4EF6\uFF0C\u63D0\u4F9B\u5B8C\u6574\u7684\u804A\u5929\u529F\u80FD\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u4E09\u5C42\u67B6\u6784\u8BBE\u8BA1\n */\n\nimport React, { useEffect, useCallback } from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport type {\n LiveChatWidgetProps,\n QuickReply,\n Message,\n MessageContent,\n ChatStreamRequest,\n BackendCartData,\n} from './types'\nimport { ChatBubble } from './components/ChatBubble'\nimport { ChatWindow } from './components/ChatWindow'\nimport { useChatState } from './hooks/useChatState'\nimport { useChatAPI } from './hooks/useChatAPI'\nimport { MessageRendererRegistry } from './utils/messageRenderers'\nimport { sanitizeInput } from './utils/validation'\nimport { transformProducts } from './utils/productTransformers.js'\nimport { transformCartData } from './utils/cartTransformers.js'\nimport {\n TextBlock,\n ProductCard,\n ProductList,\n ProductComparisonRenderer,\n PolicyBlock,\n createQuickRepliesRenderer,\n ThinkingBlock,\n ErrorBlock,\n FAQListRenderer,\n PromotionListRenderer,\n CartCard,\n} from './components/MessageContent/index.js'\n\n/**\n * LiveChat \u804A\u5929\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u6C14\u6CE1\u5F39\u7A97\u804A\u5929\u754C\u9762\n * - SSE \u6D41\u5F0F\u6D88\u606F\u63A5\u6536\n * - \u4F1A\u8BDD\u7BA1\u7406\uFF08userId, sessionId\uFF09\n * - \u5386\u53F2\u6D88\u606F\u52A0\u8F7D\n * - \u591A\u79CD\u6D88\u606F\u7C7B\u578B\u6E32\u67D3\n * - \u81EA\u5B9A\u4E49\u6269\u5C55\u673A\u5236\n *\n * \u67B6\u6784\uFF1A\n * - UI Layer: ChatBubble, ChatWindow, MessageList, etc.\n * - Logic Layer: useChatState, useChatAPI, useSession\n * - Core Layer: MessageRendererRegistry, \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n *\n * @example\n * ```tsx\n * // \u4F7F\u7528\u9ED8\u8BA4\u4F4D\u7F6E\uFF08\u53F3\u4E0B\u89D2\uFF09\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * welcomeMessage=\"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\"\n * onMessageSend={(msg) => console.log('Sent:', msg)}\n * />\n *\n * // \u4F7F\u7528\u81EA\u5B9A\u4E49\u4F4D\u7F6E\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * position={{ bottom: \"20px\", right: \"30px\" }}\n * onMessageSend={(msg) => console.log('Sent:', msg)}\n * />\n * ```\n */\nexport const LiveChatWidget: React.FC<LiveChatWidgetProps> = ({\n apiBaseUrl,\n site,\n loginUserId,\n cartId,\n accessToken,\n position,\n welcomeMessage,\n quickReplies,\n customRenderers,\n logoUrl,\n title,\n chatBubbleIcon,\n onOpen,\n onClose,\n onMessageSend,\n onError,\n onAddToCart,\n onCart,\n showNewSessionButton,\n}) => {\n // \u72B6\u6001\u7BA1\u7406\n const chatState = useChatState({\n welcomeMessage,\n site,\n onOpen,\n onClose,\n onMessageSend,\n onError,\n onAddToCart,\n onCart,\n })\n\n const {\n messages,\n isOpen,\n userId,\n sessionId,\n inputValue,\n isStreaming,\n openChat,\n closeChat,\n setInputValue,\n addMessage,\n setMessages,\n clearMessages,\n handleSSEEvent,\n saveSession,\n clearSession,\n } = chatState\n\n // API \u8C03\u7528\n const { sendMessageStream, createSession } = useChatAPI({\n apiBaseUrl,\n onError,\n })\n\n // \u4F7F\u7528 ref \u5B58\u50A8\u6700\u65B0\u7684 handleSendMessage\uFF0C\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n const handleSendMessageRef = React.useRef<(_message?: string) => Promise<void>>(async (_message?: string) => {})\n\n // \u6D88\u606F\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n const rendererRegistry = React.useMemo(() => {\n const registry = new MessageRendererRegistry()\n\n // \u6CE8\u518C\u9ED8\u8BA4\u6E32\u67D3\u5668\n registry.register('text', TextBlock)\n registry.register('product_card', ProductCard)\n registry.register('product_list', ProductList)\n registry.register('product_comparison', ProductComparisonRenderer)\n registry.register('policy', PolicyBlock)\n registry.register('thinking', ThinkingBlock)\n registry.register('error', ErrorBlock)\n registry.register('faq_list', FAQListRenderer)\n registry.register('promotion_list', PromotionListRenderer)\n registry.register('cart', CartCard)\n\n // \u6CE8\u518C\u5FEB\u6377\u56DE\u590D\u6E32\u67D3\u5668\uFF08\u5E26\u56DE\u8C03\uFF09\n const quickRepliesRenderer = createQuickRepliesRenderer((reply: QuickReply) => {\n // \u4F7F\u7528 ref \u8C03\u7528\u6700\u65B0\u7684 handleSendMessage\n handleSendMessageRef.current(reply.value)\n })\n registry.register('quick_replies', quickRepliesRenderer)\n\n // \u6CE8\u518C\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n if (customRenderers) {\n registry.registerMany(customRenderers)\n }\n\n return registry\n }, [customRenderers])\n\n /**\n * T043: \u6253\u5F00\u804A\u5929\u7A97\u53E3\u65F6\u521D\u59CB\u5316\u4F1A\u8BDD\n * \u4F7F\u7528 API v2.0.0 \u7684\u7EDF\u4E00\u63A5\u53E3\uFF1A\n * - \u5982\u679C\u6CA1\u6709 sessionId\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n * - \u5982\u679C\u6709 sessionId\uFF0C\u6062\u590D\u4F1A\u8BDD\u5E76\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\n */\n useEffect(() => {\n if (!isOpen || !userId) return\n\n const currentSessionId = sessionId\n\n if (!currentSessionId) {\n // \u6CA1\u6709\u4F1A\u8BDD\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n handleCreateNewSession()\n } else {\n // \u6709\u4F1A\u8BDD\uFF0C\u5C1D\u8BD5\u6062\u590D\u4F1A\u8BDD\u548C\u5386\u53F2\u6D88\u606F\n handleResumeSession(currentSessionId)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, userId])\n\n /**\n * \u89C4\u8303\u5316\u6D88\u606F\u683C\u5F0F\uFF08\u786E\u4FDD content \u662F\u6570\u7EC4\uFF09\n * \u540E\u7AEF\u8FD4\u56DE\u683C\u5F0F\uFF1A\n * - content: \u5B57\u7B26\u4E32\uFF08\u6587\u672C\u5185\u5BB9\uFF09\n * - structuredContent: \u6570\u7EC4\uFF08\u7ED3\u6784\u5316\u5185\u5BB9\uFF0C\u5982\u4EA7\u54C1\u5217\u8868\u3001\u653F\u7B56\u7B49\uFF09\n * \u9700\u8981\u5408\u5E76\u4E3A\u7EDF\u4E00\u7684 content \u6570\u7EC4\u683C\u5F0F\n */\n const normalizeMessage = useCallback(\n (message: any): Message => {\n // \u5982\u679C content \u5DF2\u7ECF\u662F\u6570\u7EC4\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (Array.isArray(message.content)) {\n return message as Message\n }\n\n const contentBlocks: MessageContent[] = []\n\n // \u5904\u7406\u6587\u672C\u5185\u5BB9\n if (typeof message.content === 'string' && message.content.trim()) {\n contentBlocks.push({\n type: 'text',\n text: message.content,\n })\n }\n\n // \u5904\u7406\u7ED3\u6784\u5316\u5185\u5BB9\n // \u5386\u53F2\u6D88\u606F\u683C\u5F0F: structured_content: [{type, data}]\n const structuredData = message.structuredContent || message.structured_content\n\n if (Array.isArray(structuredData)) {\n structuredData.forEach((block: any) => {\n if (block.type === 'product_list' && Array.isArray(block.data)) {\n // \u8F6C\u6362\u4EA7\u54C1\u5217\u8868\u6570\u636E\u7ED3\u6784 - data \u76F4\u63A5\u662F\u4EA7\u54C1\u6570\u7EC4\n contentBlocks.push({\n type: 'product_list',\n data: {\n products: transformProducts(block.data, site),\n title: undefined, // \u5386\u53F2\u6D88\u606F\u4E0D\u5305\u542B title\n },\n })\n } else if (block.type === 'quick_replies' && block.data?.replies) {\n contentBlocks.push({\n type: 'quick_replies',\n data: {\n replies: block.data.replies,\n },\n })\n } else if (block.type === 'policy' && block.data?.title && block.data?.content) {\n contentBlocks.push({\n type: 'policy',\n data: {\n title: block.data.title,\n content: block.data.content,\n },\n })\n } else if (block.type === 'product_comparison' && block.data?.products && block.data?.dimensions) {\n // \u8F6C\u6362\u4EA7\u54C1\u5BF9\u6BD4\u6570\u636E\u7ED3\u6784\u5E76\u6CE8\u5165 onAddToCart \u56DE\u8C03\n contentBlocks.push({\n type: 'product_comparison',\n data: {\n products: transformProducts(block.data.products, site),\n dimensions: block.data.dimensions,\n onAddToCart: onAddToCart,\n },\n })\n } else if (block.type === 'faq_list' && block.data?.found !== undefined) {\n // FAQ \u5217\u8868\u5361\u7247 - \u76F4\u63A5\u4F7F\u7528\u540E\u7AEF\u6570\u636E\n contentBlocks.push({\n type: 'faq_list',\n data: block.data,\n })\n } else if (block.type === 'promotion_list' && block.data?.found !== undefined) {\n // \u4FC3\u9500\u6D3B\u52A8\u5217\u8868\u5361\u7247 - \u76F4\u63A5\u4F7F\u7528\u540E\u7AEF\u6570\u636E\n contentBlocks.push({\n type: 'promotion_list',\n data: block.data,\n })\n } else if (block.type === 'cart' && block.data?.id !== undefined) {\n // \u8D2D\u7269\u8F66\u5361\u7247 - \u8F6C\u6362\u540E\u7AEF\u6570\u636E\u683C\u5F0F\u5E76\u6CE8\u5165 onCart \u56DE\u8C03\n const transformedData = transformCartData(block.data as BackendCartData)\n contentBlocks.push({\n type: 'cart',\n data: {\n ...transformedData,\n onCart: onCart,\n },\n })\n } else {\n // \u5176\u4ED6\u7C7B\u578B\u76F4\u63A5\u6DFB\u52A0\n contentBlocks.push(block)\n }\n })\n }\n\n // \u5982\u679C\u6CA1\u6709\u4EFB\u4F55\u5185\u5BB9\u5757\uFF0C\u8FD4\u56DE\u7A7A\u6587\u672C\u5757\n if (contentBlocks.length === 0) {\n contentBlocks.push({\n type: 'text',\n text: '',\n })\n }\n\n return {\n ...message,\n content: contentBlocks,\n } as Message\n },\n [site, onCart, onAddToCart]\n )\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\n */\n const handleCreateNewSession = useCallback(async () => {\n if (!userId) return\n\n try {\n const response = await createSession({\n user_id: userId,\n site: site,\n real_user_id: loginUserId,\n })\n\n if (response.success) {\n // \u4FDD\u5B58\u65B0\u4F1A\u8BDD ID\n saveSession(response.sessionId)\n\n // \u6E05\u7A7A\u6D88\u606F\u5217\u8868\n clearMessages()\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u6B22\u8FCE\u6D88\u606F\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u9ED8\u8BA4\u503C\n const messageText = response.welcomeMessage || welcomeMessage\n\n if (messageText) {\n const welcomeContent: MessageContent[] = [{ type: 'text', text: messageText }]\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u5FEB\u6377\u95EE\u9898\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u5FEB\u6377\u56DE\u590D\n const questions = response.quickQuestions\n if (questions && questions.length > 0) {\n // \u5C06\u540E\u7AEF\u7684 quickQuestions (\u5B57\u7B26\u4E32\u6570\u7EC4) \u8F6C\u6362\u4E3A QuickReply \u683C\u5F0F\n const quickRepliesFromBackend = questions.map((question, index) => ({\n id: `quick-${index}`,\n label: question,\n value: question,\n }))\n\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickRepliesFromBackend,\n },\n })\n } else if (quickReplies && quickReplies.length > 0) {\n // \u5982\u679C\u540E\u7AEF\u6CA1\u6709\u8FD4\u56DE\uFF0C\u4F7F\u7528 props \u4E2D\u7684\u5FEB\u6377\u56DE\u590D\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickReplies,\n },\n })\n }\n\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n })\n }\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to create new session:', error)\n onError?.(error as Error)\n }\n }, [\n userId,\n site,\n loginUserId,\n createSession,\n saveSession,\n clearMessages,\n welcomeMessage,\n quickReplies,\n addMessage,\n onError,\n ])\n\n /**\n * \u6062\u590D\u4F1A\u8BDD\u548C\u5386\u53F2\u6D88\u606F\uFF08\u4F7F\u7528\u65B0\u7684 API v2.0.0\uFF09\n */\n const handleResumeSession = useCallback(\n async (existingSessionId: string) => {\n try {\n const response = await createSession({\n user_id: userId,\n session_id: existingSessionId,\n site: site,\n real_user_id: loginUserId,\n })\n\n if (response.success && response.resumed) {\n // \u4F1A\u8BDD\u6062\u590D\u6210\u529F\n if (response.messages && response.messages.length > 0) {\n // \u6709\u5386\u53F2\u6D88\u606F\uFF0C\u89C4\u8303\u5316\u5E76\u52A0\u8F7D\n const normalizedMessages = response.messages.map(normalizeMessage)\n setMessages(normalizedMessages)\n } else {\n // \u6CA1\u6709\u5386\u53F2\u6D88\u606F\uFF0C\u663E\u793A\u6B22\u8FCE\u6D88\u606F\n clearMessages()\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u6B22\u8FCE\u6D88\u606F\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u9ED8\u8BA4\u503C\n const messageText = response.welcomeMessage || welcomeMessage\n\n if (messageText) {\n const welcomeContent: MessageContent[] = [{ type: 'text', text: messageText }]\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u5FEB\u6377\u95EE\u9898\n const questions = response.quickQuestions\n if (questions && questions.length > 0) {\n const quickRepliesFromBackend = questions.map((question, index) => ({\n id: `quick-${index}`,\n label: question,\n value: question,\n }))\n\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickRepliesFromBackend,\n },\n })\n } else if (quickReplies && quickReplies.length > 0) {\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickReplies,\n },\n })\n }\n\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n })\n }\n }\n } else if (!response.resumed) {\n // \u4F1A\u8BDD\u65E0\u6548\u6216\u8FC7\u671F\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n clearSession()\n handleCreateNewSession()\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to resume session:', error)\n // \u6062\u590D\u5931\u8D25\uFF0C\u6E05\u7A7A\u4F1A\u8BDD\u5E76\u521B\u5EFA\u65B0\u7684\n clearSession()\n handleCreateNewSession()\n }\n },\n [\n userId,\n site,\n loginUserId,\n createSession,\n setMessages,\n clearSession,\n clearMessages,\n normalizeMessage,\n handleCreateNewSession,\n welcomeMessage,\n quickReplies,\n addMessage,\n ]\n )\n\n /**\n * \u53D1\u9001\u6D88\u606F\n */\n const handleSendMessage = useCallback(\n async (message?: string) => {\n const textToSend = message || inputValue.trim()\n\n if (!textToSend) return\n\n // \u6E05\u7A7A\u8F93\u5165\u6846\n if (!message) {\n setInputValue('')\n }\n\n // \u8F93\u5165\u9A8C\u8BC1\n const sanitized = sanitizeInput(textToSend)\n if (!sanitized) {\n onError?.(new Error('\u65E0\u6548\u7684\u6D88\u606F\u5185\u5BB9'))\n return\n }\n\n // \u6DFB\u52A0\u7528\u6237\u6D88\u606F\u5230\u754C\u9762\n const userMessage = {\n id: `user-${Date.now()}`,\n role: 'user' as const,\n content: [{ type: 'text' as const, text: sanitized }],\n timestamp: Date.now(),\n }\n addMessage(userMessage)\n\n // \u89E6\u53D1\u6D88\u606F\u53D1\u9001\u56DE\u8C03\n onMessageSend?.(sanitized)\n\n try {\n // \u786E\u4FDD\u6709 sessionId\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u5148\u521B\u5EFA\u4F1A\u8BDD\n let currentSessionId = sessionId\n if (!currentSessionId) {\n // \u6CA1\u6709\u4F1A\u8BDD\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n const response = await createSession({\n user_id: userId,\n site: site,\n real_user_id: loginUserId,\n })\n if (response.success) {\n currentSessionId = response.sessionId\n saveSession(currentSessionId)\n } else {\n throw new Error('Failed to create session')\n }\n }\n\n // \u6784\u5EFA\u8BF7\u6C42\u53C2\u6570\uFF08session_id \u73B0\u5728\u662F\u5FC5\u586B\u7684\uFF09\n const requestPayload: ChatStreamRequest = {\n message: sanitized,\n user_id: userId,\n session_id: currentSessionId,\n context: {\n cartId: cartId,\n accessToken: accessToken,\n real_user_id: loginUserId,\n },\n }\n\n // \u53D1\u9001\u6D88\u606F\u5230\u540E\u7AEF\n await sendMessageStream(requestPayload, event => {\n // \u5904\u7406 SSE \u4E8B\u4EF6\n handleSSEEvent(event)\n\n // \u7279\u6B8A\u5904\u7406\uFF1A\u4F1A\u8BDD\u8FC7\u671F\n if (event.event === 'status' && event.data.type === 'session_expired') {\n clearSession()\n }\n })\n } catch (error) {\n console.error('[LiveChatWidget] Failed to send message:', error)\n onError?.(error as Error)\n }\n },\n [\n inputValue,\n userId,\n sessionId,\n site,\n loginUserId,\n cartId,\n accessToken,\n setInputValue,\n addMessage,\n createSession,\n sendMessageStream,\n handleSSEEvent,\n saveSession,\n clearSession,\n onMessageSend,\n onError,\n ]\n )\n\n // \u66F4\u65B0 ref \u4EE5\u4FDD\u6301\u6700\u65B0\u7684 handleSendMessage\n React.useEffect(() => {\n handleSendMessageRef.current = handleSendMessage\n }, [handleSendMessage])\n\n return (\n <>\n {/* \u6C14\u6CE1\u6309\u94AE */}\n <ChatBubble position={position} onClick={openChat} visible={!isOpen} iconImageUrl={chatBubbleIcon} />\n\n {/* \u804A\u5929\u7A97\u53E3\uFF08\u4F7F\u7528 Radix UI Dialog\uFF09 */}\n <Dialog.Root open={isOpen} onOpenChange={open => (open ? openChat() : closeChat())}>\n <Dialog.Portal>\n <Dialog.Content\n className=\"livechat-window-enter\"\n style={{\n position: 'fixed',\n zIndex: 9998,\n }}\n >\n <ChatWindow\n messages={messages}\n inputValue={inputValue}\n onInputChange={setInputValue}\n onSend={() => handleSendMessage()}\n onClose={closeChat}\n onNewSession={handleCreateNewSession}\n title={title}\n logoUrl={logoUrl}\n isSending={isStreaming}\n rendererRegistry={rendererRegistry}\n inputPlaceholder=\"\"\n onAddToCart={onAddToCart}\n showNewSessionButton={showNewSessionButton}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Fragment", "jsx", "jsxs", "React", "useEffect", "useCallback", "Dialog", "ChatBubble", "ChatWindow", "useChatState", "useChatAPI", "MessageRendererRegistry", "sanitizeInput", "transformProducts", "transformCartData", "TextBlock", "ProductCard", "ProductList", "ProductComparisonRenderer", "PolicyBlock", "createQuickRepliesRenderer", "ThinkingBlock", "ErrorBlock", "FAQListRenderer", "PromotionListRenderer", "CartCard", "LiveChatWidget", "apiBaseUrl", "site", "loginUserId", "cartId", "accessToken", "position", "welcomeMessage", "quickReplies", "customRenderers", "logoUrl", "title", "chatBubbleIcon", "onOpen", "onClose", "onMessageSend", "onError", "onAddToCart", "onCart", "showNewSessionButton", "chatState", "messages", "isOpen", "userId", "sessionId", "inputValue", "isStreaming", "openChat", "closeChat", "setInputValue", "addMessage", "setMessages", "clearMessages", "handleSSEEvent", "saveSession", "clearSession", "sendMessageStream", "createSession", "handleSendMessageRef", "_message", "rendererRegistry", "registry", "quickRepliesRenderer", "reply", "currentSessionId", "handleResumeSession", "handleCreateNewSession", "normalizeMessage", "message", "contentBlocks", "structuredData", "block", "transformedData", "response", "messageText", "welcomeContent", "questions", "quickRepliesFromBackend", "question", "index", "error", "existingSessionId", "normalizedMessages", "handleSendMessage", "textToSend", "sanitized", "userMessage", "event", "open"]
7
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * LiveChat API 层
3
+ * 处理 SSE 流式通信和 HTTP 请求
4
+ * 基于 specs/livechat-widget/contracts/*.yaml
5
+ */
6
+ import type { ChatStreamRequest, SSEEvent, NewSessionRequest, NewSessionResponse } from '../types';
7
+ /**
8
+ * 发送消息并接收 SSE 流式响应
9
+ * @param apiBaseUrl API 基础 URL
10
+ * @param request 请求参数
11
+ * @param onEvent SSE 事件回调
12
+ */
13
+ export declare function sendMessage(apiBaseUrl: string, request: ChatStreamRequest, onEvent: (event: SSEEvent) => void): Promise<void>;
14
+ /**
15
+ * 创建新会话或恢复现有会话
16
+ *
17
+ * 使用场景:
18
+ * 1. 创建新会话:不传 session_id,返回新的 sessionId
19
+ * 2. 恢复会话:传入 session_id,验证会话有效性并返回历史消息(resumed: true, messages: [...])
20
+ *
21
+ * @param apiBaseUrl API 基础 URL
22
+ * @param request 请求参数
23
+ * @returns 会话信息,可能包含历史消息
24
+ */
25
+ export declare function createNewSession(apiBaseUrl: string, request: NewSessionRequest): Promise<NewSessionResponse>;
@@ -0,0 +1,3 @@
1
+ async function f(o,a,e){const t=await fetch(`${o}/api/chat/stream`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(a)});if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);const n=t.body?.getReader();if(!n)throw new Error("Response body is not readable");const S=new TextDecoder;let i="",c=null;try{for(;;){const{done:r,value:u}=await n.read();if(r)break;i+=S.decode(u,{stream:!0});const p=i.split(`
2
+ `);i=p.pop()||"";for(const h of p){const s=h.trim();if(s===""){c=null;continue}if(s.startsWith("event:"))c=s.substring(6).trim();else if(s.startsWith("data:")){const l=s.substring(5).trim();try{const d=JSON.parse(l);e({event:c||"message",data:d})}catch(d){console.error("[LiveChat API] Failed to parse SSE data:",l,d),e({event:"error",data:{message:"Failed to parse SSE data",code:"PARSE_ERROR"}})}}}}}catch(r){throw console.error("[LiveChat API] SSE stream error:",r),r}finally{n.releaseLock()}}async function m(o,a){const e=await fetch(`${o}/api/chat/new-session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!e.ok){const t=await e.json().catch(()=>({success:!1,error:`HTTP ${e.status}: ${e.statusText}`,code:"HTTP_ERROR"}));throw new Error(t.error||"Failed to create session")}return e.json()}export{m as createNewSession,f as sendMessage};
3
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/api/chat.ts"],
4
+ "sourcesContent": ["/**\n * LiveChat API \u5C42\n * \u5904\u7406 SSE \u6D41\u5F0F\u901A\u4FE1\u548C HTTP \u8BF7\u6C42\n * \u57FA\u4E8E specs/livechat-widget/contracts/*.yaml\n */\n\nimport type { ChatStreamRequest, SSEEvent, NewSessionRequest, NewSessionResponse, ErrorResponse } from '../types'\n\n// ============================================================================\n// SSE \u6D41\u5F0F\u6D88\u606F\u5904\u7406 (T006)\n// ============================================================================\n\n/**\n * \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n * @param apiBaseUrl API \u57FA\u7840 URL\n * @param request \u8BF7\u6C42\u53C2\u6570\n * @param onEvent SSE \u4E8B\u4EF6\u56DE\u8C03\n */\nexport async function sendMessage(\n apiBaseUrl: string,\n request: ChatStreamRequest,\n onEvent: (event: SSEEvent) => void\n): Promise<void> {\n const response = await fetch(`${apiBaseUrl}/api/chat/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(request),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let currentEvent: string | null = null\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n // \u89E3\u7801\u5E76\u8FFD\u52A0\u5230\u7F13\u51B2\u533A\n buffer += decoder.decode(value, { stream: true })\n\n // \u6309\u884C\u5206\u5272\n const lines = buffer.split('\\n')\n\n // \u4FDD\u7559\u6700\u540E\u4E00\u4E2A\u4E0D\u5B8C\u6574\u7684\u884C\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n if (trimmed === '') {\n // \u7A7A\u884C\u8868\u793A\u4E8B\u4EF6\u8FB9\u754C\uFF0C\u91CD\u7F6E\u5F53\u524D\u4E8B\u4EF6\u7C7B\u578B\n currentEvent = null\n continue\n }\n\n if (trimmed.startsWith('event:')) {\n // \u63D0\u53D6\u4E8B\u4EF6\u7C7B\u578B\n currentEvent = trimmed.substring(6).trim()\n } else if (trimmed.startsWith('data:')) {\n // \u63D0\u53D6\u6570\u636E\u5E76\u89E3\u6790 JSON\n const dataStr = trimmed.substring(5).trim()\n try {\n const data = JSON.parse(dataStr)\n onEvent({\n event: (currentEvent as any) || 'message',\n data,\n })\n } catch (err) {\n console.error('[LiveChat API] Failed to parse SSE data:', dataStr, err)\n onEvent({\n event: 'error',\n data: {\n message: 'Failed to parse SSE data',\n code: 'PARSE_ERROR',\n },\n })\n }\n }\n }\n }\n } catch (error) {\n console.error('[LiveChat API] SSE stream error:', error)\n throw error\n } finally {\n reader.releaseLock()\n }\n}\n\n// ============================================================================\n// \u521B\u5EFA/\u6062\u590D\u4F1A\u8BDD (T009)\n// ============================================================================\n\n/**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n *\n * \u4F7F\u7528\u573A\u666F\uFF1A\n * 1. \u521B\u5EFA\u65B0\u4F1A\u8BDD\uFF1A\u4E0D\u4F20 session_id\uFF0C\u8FD4\u56DE\u65B0\u7684 sessionId\n * 2. \u6062\u590D\u4F1A\u8BDD\uFF1A\u4F20\u5165 session_id\uFF0C\u9A8C\u8BC1\u4F1A\u8BDD\u6709\u6548\u6027\u5E76\u8FD4\u56DE\u5386\u53F2\u6D88\u606F\uFF08resumed: true, messages: [...]\uFF09\n *\n * @param apiBaseUrl API \u57FA\u7840 URL\n * @param request \u8BF7\u6C42\u53C2\u6570\n * @returns \u4F1A\u8BDD\u4FE1\u606F\uFF0C\u53EF\u80FD\u5305\u542B\u5386\u53F2\u6D88\u606F\n */\nexport async function createNewSession(apiBaseUrl: string, request: NewSessionRequest): Promise<NewSessionResponse> {\n const response = await fetch(`${apiBaseUrl}/api/chat/new-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n })\n\n if (!response.ok) {\n const errorData: ErrorResponse = await response.json().catch(() => ({\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n code: 'HTTP_ERROR',\n }))\n throw new Error(errorData.error || 'Failed to create session')\n }\n\n return response.json()\n}\n"],
5
+ "mappings": "AAkBA,eAAsBA,EACpBC,EACAC,EACAC,EACe,CACf,MAAMC,EAAW,MAAM,MAAM,GAAGH,CAAU,mBAAoB,CAC5D,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,OAAQ,mBACV,EACA,KAAM,KAAK,UAAUC,CAAO,CAC9B,CAAC,EAED,GAAI,CAACE,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,EAGnE,MAAMC,EAASD,EAAS,MAAM,UAAU,EACxC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAMC,EAAU,IAAI,YACpB,IAAIC,EAAS,GACTC,EAA8B,KAElC,GAAI,CACF,OAAa,CACX,KAAM,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAI,MAAML,EAAO,KAAK,EAC1C,GAAII,EAAM,MAGVF,GAAUD,EAAQ,OAAOI,EAAO,CAAE,OAAQ,EAAK,CAAC,EAGhD,MAAMC,EAAQJ,EAAO,MAAM;AAAA,CAAI,EAG/BA,EAASI,EAAM,IAAI,GAAK,GAExB,UAAWC,KAAQD,EAAO,CACxB,MAAME,EAAUD,EAAK,KAAK,EAE1B,GAAIC,IAAY,GAAI,CAElBL,EAAe,KACf,QACF,CAEA,GAAIK,EAAQ,WAAW,QAAQ,EAE7BL,EAAeK,EAAQ,UAAU,CAAC,EAAE,KAAK,UAChCA,EAAQ,WAAW,OAAO,EAAG,CAEtC,MAAMC,EAAUD,EAAQ,UAAU,CAAC,EAAE,KAAK,EAC1C,GAAI,CACF,MAAME,EAAO,KAAK,MAAMD,CAAO,EAC/BX,EAAQ,CACN,MAAQK,GAAwB,UAChC,KAAAO,CACF,CAAC,CACH,OAASC,EAAK,CACZ,QAAQ,MAAM,2CAA4CF,EAASE,CAAG,EACtEb,EAAQ,CACN,MAAO,QACP,KAAM,CACJ,QAAS,2BACT,KAAM,aACR,CACF,CAAC,CACH,CACF,CACF,CACF,CACF,OAASc,EAAO,CACd,cAAQ,MAAM,mCAAoCA,CAAK,EACjDA,CACR,QAAE,CACAZ,EAAO,YAAY,CACrB,CACF,CAiBA,eAAsBa,EAAiBjB,EAAoBC,EAAyD,CAClH,MAAME,EAAW,MAAM,MAAM,GAAGH,CAAU,wBAAyB,CACjE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAUC,CAAO,CAC9B,CAAC,EAED,GAAI,CAACE,EAAS,GAAI,CAChB,MAAMe,EAA2B,MAAMf,EAAS,KAAK,EAAE,MAAM,KAAO,CAClE,QAAS,GACT,MAAO,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,GACtD,KAAM,YACR,EAAE,EACF,MAAM,IAAI,MAAMe,EAAU,OAAS,0BAA0B,CAC/D,CAEA,OAAOf,EAAS,KAAK,CACvB",
6
+ "names": ["sendMessage", "apiBaseUrl", "request", "onEvent", "response", "reader", "decoder", "buffer", "currentEvent", "done", "value", "lines", "line", "trimmed", "dataStr", "data", "err", "error", "createNewSession", "errorData"]
7
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 聊天悬浮按钮组件
3
+ * 显示在页面角落的气泡按钮,点击后打开聊天窗口
4
+ * 基于 specs/livechat-widget/plan.md 的气泡按钮设计
5
+ */
6
+ import React from 'react';
7
+ import type { BubblePosition } from '../types';
8
+ export interface ChatBubbleProps {
9
+ /**
10
+ * 气泡按钮位置
11
+ * @default { bottom: "1.5rem", right: "1.5rem" }
12
+ */
13
+ position?: BubblePosition;
14
+ /**
15
+ * 点击按钮的回调
16
+ */
17
+ onClick?: () => void;
18
+ /**
19
+ * 自定义图标
20
+ */
21
+ icon?: React.ReactNode;
22
+ /**
23
+ * 自定义图标图片 URL
24
+ * 如果提供,将使用图片替代默认的 SVG 图标
25
+ */
26
+ iconImageUrl?: string;
27
+ /**
28
+ * 是否显示气泡
29
+ * @default true
30
+ */
31
+ visible?: boolean;
32
+ /**
33
+ * 自定义样式类名
34
+ */
35
+ className?: string;
36
+ }
37
+ /**
38
+ * 聊天悬浮按钮组件
39
+ *
40
+ * 功能:
41
+ * - 可配置位置(预设或自定义)
42
+ * - 支持自定义图标(React 节点或图片 URL)
43
+ * - 悬停和点击动画效果
44
+ *
45
+ * 样式:
46
+ * - 使用 livechat.css 中定义的 CSS 变量
47
+ * - 悬停时放大 1.05 倍
48
+ * - 点击时缩小 0.95 倍
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * // 使用默认图标
53
+ * <ChatBubble onClick={() => setIsOpen(true)} />
54
+ *
55
+ * // 使用自定义位置
56
+ * <ChatBubble
57
+ * position={{ bottom: "20px", right: "30px" }}
58
+ * onClick={() => setIsOpen(true)}
59
+ * />
60
+ *
61
+ * // 使用图片作为图标
62
+ * <ChatBubble
63
+ * iconImageUrl="https://example.com/icon.png"
64
+ * onClick={() => setIsOpen(true)}
65
+ * />
66
+ * ```
67
+ */
68
+ export declare const ChatBubble: React.FC<ChatBubbleProps>;
@@ -0,0 +1,2 @@
1
+ import{jsx as t}from"react/jsx-runtime";function c(e){return e||{bottom:"1.5rem",right:"1.5rem"}}const u=()=>t("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:t("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}),d=({position:e,onClick:r,icon:i,iconImageUrl:o,visible:s=!0,className:n=""})=>{if(!s)return null;const a=c(e),l=()=>o?t("img",{src:o,alt:"Chat",className:"size-full object-cover",style:{borderRadius:"inherit"}}):i||t(u,{});return t("button",{type:"button",className:`livechat-bubble ${n}`,style:{...a,...o&&{background:"transparent"}},onClick:r,"aria-label":"\u6253\u5F00\u804A\u5929\u7A97\u53E3",children:t("div",{className:"flex size-full items-center justify-center",children:l()})})};export{d as ChatBubble};
2
+ //# sourceMappingURL=ChatBubble.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/components/ChatBubble.tsx"],
4
+ "sourcesContent": ["/**\n * \u804A\u5929\u60AC\u6D6E\u6309\u94AE\u7EC4\u4EF6\n * \u663E\u793A\u5728\u9875\u9762\u89D2\u843D\u7684\u6C14\u6CE1\u6309\u94AE\uFF0C\u70B9\u51FB\u540E\u6253\u5F00\u804A\u5929\u7A97\u53E3\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6C14\u6CE1\u6309\u94AE\u8BBE\u8BA1\n */\n\nimport React from 'react'\nimport type { BubblePosition } from '../types'\n\nexport interface ChatBubbleProps {\n /**\n * \u6C14\u6CE1\u6309\u94AE\u4F4D\u7F6E\n * @default { bottom: \"1.5rem\", right: \"1.5rem\" }\n */\n position?: BubblePosition\n\n /**\n * \u70B9\u51FB\u6309\u94AE\u7684\u56DE\u8C03\n */\n onClick?: () => void\n\n /**\n * \u81EA\u5B9A\u4E49\u56FE\u6807\n */\n icon?: React.ReactNode\n\n /**\n * \u81EA\u5B9A\u4E49\u56FE\u6807\u56FE\u7247 URL\n * \u5982\u679C\u63D0\u4F9B\uFF0C\u5C06\u4F7F\u7528\u56FE\u7247\u66FF\u4EE3\u9ED8\u8BA4\u7684 SVG \u56FE\u6807\n */\n iconImageUrl?: string\n\n /**\n * \u662F\u5426\u663E\u793A\u6C14\u6CE1\n * @default true\n */\n visible?: boolean\n\n /**\n * \u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n className?: string\n}\n\n/**\n * \u83B7\u53D6\u6C14\u6CE1\u6309\u94AE\u7684\u4F4D\u7F6E\u6837\u5F0F\n * \u5982\u679C\u6CA1\u6709\u4F20\u5165 position\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u4F4D\u7F6E\uFF08\u53F3\u4E0B\u89D2\uFF09\n */\nfunction getPositionStyles(position?: BubblePosition): React.CSSProperties {\n // \u9ED8\u8BA4\u4F4D\u7F6E\uFF1A\u53F3\u4E0B\u89D2\n const defaultPosition: React.CSSProperties = {\n bottom: '1.5rem',\n right: '1.5rem',\n }\n\n // \u5982\u679C\u4F20\u5165\u4E86\u81EA\u5B9A\u4E49\u4F4D\u7F6E\uFF0C\u4F7F\u7528\u81EA\u5B9A\u4E49\u4F4D\u7F6E\n return position ? (position as React.CSSProperties) : defaultPosition\n}\n\n/**\n * \u9ED8\u8BA4\u804A\u5929\u56FE\u6807 (\u7B80\u5355\u7684\u6D88\u606F\u6C14\u6CE1 SVG)\n */\nconst DefaultChatIcon: React.FC = () => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n)\n\n/**\n * \u804A\u5929\u60AC\u6D6E\u6309\u94AE\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u53EF\u914D\u7F6E\u4F4D\u7F6E\uFF08\u9884\u8BBE\u6216\u81EA\u5B9A\u4E49\uFF09\n * - \u652F\u6301\u81EA\u5B9A\u4E49\u56FE\u6807\uFF08React \u8282\u70B9\u6216\u56FE\u7247 URL\uFF09\n * - \u60AC\u505C\u548C\u70B9\u51FB\u52A8\u753B\u6548\u679C\n *\n * \u6837\u5F0F\uFF1A\n * - \u4F7F\u7528 livechat.css \u4E2D\u5B9A\u4E49\u7684 CSS \u53D8\u91CF\n * - \u60AC\u505C\u65F6\u653E\u5927 1.05 \u500D\n * - \u70B9\u51FB\u65F6\u7F29\u5C0F 0.95 \u500D\n *\n * @example\n * ```tsx\n * // \u4F7F\u7528\u9ED8\u8BA4\u56FE\u6807\n * <ChatBubble onClick={() => setIsOpen(true)} />\n *\n * // \u4F7F\u7528\u81EA\u5B9A\u4E49\u4F4D\u7F6E\n * <ChatBubble\n * position={{ bottom: \"20px\", right: \"30px\" }}\n * onClick={() => setIsOpen(true)}\n * />\n *\n * // \u4F7F\u7528\u56FE\u7247\u4F5C\u4E3A\u56FE\u6807\n * <ChatBubble\n * iconImageUrl=\"https://example.com/icon.png\"\n * onClick={() => setIsOpen(true)}\n * />\n * ```\n */\nexport const ChatBubble: React.FC<ChatBubbleProps> = ({\n position,\n onClick,\n icon,\n iconImageUrl,\n visible = true,\n className = '',\n}) => {\n if (!visible) return null\n\n const positionStyles = getPositionStyles(position)\n\n // \u6E32\u67D3\u56FE\u6807\u5185\u5BB9\n const renderIcon = () => {\n // \u4F18\u5148\u4F7F\u7528\u56FE\u7247 URL\n if (iconImageUrl) {\n return (\n <img src={iconImageUrl} alt=\"Chat\" className=\"size-full object-cover\" style={{ borderRadius: 'inherit' }} />\n )\n }\n // \u5176\u6B21\u4F7F\u7528\u81EA\u5B9A\u4E49\u56FE\u6807\n if (icon) {\n return icon\n }\n // \u6700\u540E\u4F7F\u7528\u9ED8\u8BA4\u56FE\u6807\n return <DefaultChatIcon />\n }\n\n return (\n <button\n type=\"button\"\n className={`livechat-bubble ${className}`}\n style={{\n ...positionStyles,\n // \u5982\u679C\u4F20\u5165\u4E86\u56FE\u7247\uFF0C\u79FB\u9664\u9ED8\u8BA4\u80CC\u666F\u8272\n ...(iconImageUrl && { background: 'transparent' }),\n }}\n onClick={onClick}\n aria-label=\"\u6253\u5F00\u804A\u5929\u7A97\u53E3\"\n >\n <div className=\"flex size-full items-center justify-center\">{renderIcon()}</div>\n </button>\n )\n}\n"],
5
+ "mappings": "AAyEI,cAAAA,MAAA,oBAzBJ,SAASC,EAAkBC,EAAgD,CAQzE,OAAOA,GANsC,CAC3C,OAAQ,SACR,MAAO,QACT,CAIF,CAKA,MAAMC,EAA4B,IAChCH,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QAEf,SAAAA,EAAC,QAAK,EAAE,gEAAgE,EAC1E,EAkCWI,EAAwC,CAAC,CACpD,SAAAF,EACA,QAAAG,EACA,KAAAC,EACA,aAAAC,EACA,QAAAC,EAAU,GACV,UAAAC,EAAY,EACd,IAAM,CACJ,GAAI,CAACD,EAAS,OAAO,KAErB,MAAME,EAAiBT,EAAkBC,CAAQ,EAG3CS,EAAa,IAEbJ,EAEAP,EAAC,OAAI,IAAKO,EAAc,IAAI,OAAO,UAAU,yBAAyB,MAAO,CAAE,aAAc,SAAU,EAAG,EAI1GD,GAIGN,EAACG,EAAA,EAAgB,EAG1B,OACEH,EAAC,UACC,KAAK,SACL,UAAW,mBAAmBS,CAAS,GACvC,MAAO,CACL,GAAGC,EAEH,GAAIH,GAAgB,CAAE,WAAY,aAAc,CAClD,EACA,QAASF,EACT,aAAW,uCAEX,SAAAL,EAAC,OAAI,UAAU,6CAA8C,SAAAW,EAAW,EAAE,EAC5E,CAEJ",
6
+ "names": ["jsx", "getPositionStyles", "position", "DefaultChatIcon", "ChatBubble", "onClick", "icon", "iconImageUrl", "visible", "className", "positionStyles", "renderIcon"]
7
+ }