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

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 (491) hide show
  1. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.d.ts +63 -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 +46 -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 +41 -0
  35. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js +2 -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 +75 -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 +81 -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 +13 -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 +60 -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 +151 -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 +767 -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/fetcher.d.ts +36 -0
  89. package/dist/cjs/components/LiveChatWidget/utils/fetcher.js +2 -0
  90. package/dist/cjs/components/LiveChatWidget/utils/fetcher.js.map +7 -0
  91. package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.d.ts +64 -0
  92. package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.js +2 -0
  93. package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.js.map +7 -0
  94. package/dist/cjs/components/LiveChatWidget/utils/productTransformers.d.ts +43 -0
  95. package/dist/cjs/components/LiveChatWidget/utils/productTransformers.js +2 -0
  96. package/dist/cjs/components/LiveChatWidget/utils/productTransformers.js.map +7 -0
  97. package/dist/cjs/components/LiveChatWidget/utils/userId.d.ts +18 -0
  98. package/dist/cjs/components/LiveChatWidget/utils/userId.js +2 -0
  99. package/dist/cjs/components/LiveChatWidget/utils/userId.js.map +7 -0
  100. package/dist/cjs/components/LiveChatWidget/utils/validation.d.ts +37 -0
  101. package/dist/cjs/components/LiveChatWidget/utils/validation.js +2 -0
  102. package/dist/cjs/components/LiveChatWidget/utils/validation.js.map +7 -0
  103. package/dist/cjs/components/chat/markdown.js +1 -1
  104. package/dist/cjs/components/chat/markdown.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/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
  117. package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
  118. package/dist/cjs/components/credits/creditsBanner/index.d.ts +2 -0
  119. package/dist/cjs/components/credits/creditsBanner/index.js +12 -1
  120. package/dist/cjs/components/credits/creditsBanner/index.js.map +3 -3
  121. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js +2 -0
  122. package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js.map +7 -0
  123. package/dist/cjs/components/credits/creditsBenefits/{iconInfo.js → IconInfo.js} +1 -1
  124. package/dist/cjs/components/credits/creditsBenefits/{iconInfo.js.map → IconInfo.js.map} +1 -1
  125. package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
  126. package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
  127. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js +1 -1
  128. package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  129. package/dist/cjs/components/credits/creditsCash/type.d.ts +1 -0
  130. package/dist/cjs/components/credits/creditsCash/type.js +1 -1
  131. package/dist/cjs/components/credits/creditsCash/type.js.map +1 -1
  132. package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
  133. package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
  134. package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
  135. package/dist/cjs/components/credits/creditsInfoCard/index.js.map +2 -2
  136. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
  137. package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
  138. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
  139. package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
  140. package/dist/cjs/components/credits/creditsMemberPrice/type.d.ts +3 -5
  141. package/dist/cjs/components/credits/creditsMemberPrice/type.js +1 -1
  142. package/dist/cjs/components/credits/creditsMemberPrice/type.js.map +1 -1
  143. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
  144. package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
  145. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  146. package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  147. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  148. package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
  149. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  150. package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
  151. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  152. package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  153. package/dist/cjs/components/index.d.ts +3 -1
  154. package/dist/cjs/components/index.js +1 -1
  155. package/dist/cjs/components/index.js.map +3 -3
  156. package/dist/cjs/components/registration/authCodeActivate/index.js +1 -1
  157. package/dist/cjs/components/registration/authCodeActivate/index.js.map +2 -2
  158. package/dist/cjs/stories/CartCard.stories.d.ts +33 -0
  159. package/dist/cjs/stories/CartCard.stories.js +21 -0
  160. package/dist/cjs/stories/CartCard.stories.js.map +7 -0
  161. package/dist/cjs/stories/LiveChatWidget.stories.d.ts +108 -0
  162. package/dist/cjs/stories/LiveChatWidget.stories.js +149 -0
  163. package/dist/cjs/stories/LiveChatWidget.stories.js.map +7 -0
  164. package/dist/cjs/templates/{credits.d.ts → Credits.d.ts} +16 -1
  165. package/dist/cjs/templates/Credits.js +2 -0
  166. package/dist/cjs/templates/Credits.js.map +7 -0
  167. package/dist/esm/components/LiveChatWidget/LiveChatWidget.d.ts +63 -0
  168. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js +2 -0
  169. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js.map +7 -0
  170. package/dist/esm/components/LiveChatWidget/api/chat.d.ts +46 -0
  171. package/dist/esm/components/LiveChatWidget/api/chat.js +3 -0
  172. package/dist/esm/components/LiveChatWidget/api/chat.js.map +7 -0
  173. package/dist/esm/components/LiveChatWidget/components/ChatBubble.d.ts +68 -0
  174. package/dist/esm/components/LiveChatWidget/components/ChatBubble.js +2 -0
  175. package/dist/esm/components/LiveChatWidget/components/ChatBubble.js.map +7 -0
  176. package/dist/esm/components/LiveChatWidget/components/ChatHeader.d.ts +57 -0
  177. package/dist/esm/components/LiveChatWidget/components/ChatHeader.js +2 -0
  178. package/dist/esm/components/LiveChatWidget/components/ChatHeader.js.map +7 -0
  179. package/dist/esm/components/LiveChatWidget/components/ChatInput.d.ts +70 -0
  180. package/dist/esm/components/LiveChatWidget/components/ChatInput.js +2 -0
  181. package/dist/esm/components/LiveChatWidget/components/ChatInput.js.map +7 -0
  182. package/dist/esm/components/LiveChatWidget/components/ChatMessage.d.ts +59 -0
  183. package/dist/esm/components/LiveChatWidget/components/ChatMessage.js +5 -0
  184. package/dist/esm/components/LiveChatWidget/components/ChatMessage.js.map +7 -0
  185. package/dist/esm/components/LiveChatWidget/components/ChatWindow.d.ts +127 -0
  186. package/dist/esm/components/LiveChatWidget/components/ChatWindow.js +2 -0
  187. package/dist/esm/components/LiveChatWidget/components/ChatWindow.js.map +7 -0
  188. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.d.ts +54 -0
  189. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js +2 -0
  190. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js.map +7 -0
  191. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.d.ts +33 -0
  192. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +2 -0
  193. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +7 -0
  194. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.d.ts +16 -0
  195. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js +2 -0
  196. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js.map +7 -0
  197. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.d.ts +45 -0
  198. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +5 -0
  199. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +7 -0
  200. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +41 -0
  201. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js +2 -0
  202. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +7 -0
  203. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +75 -0
  204. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js +2 -0
  205. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +7 -0
  206. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.d.ts +47 -0
  207. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js +2 -0
  208. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js.map +7 -0
  209. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +81 -0
  210. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js +2 -0
  211. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +7 -0
  212. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.d.ts +54 -0
  213. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js +2 -0
  214. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +7 -0
  215. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.d.ts +31 -0
  216. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +2 -0
  217. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +7 -0
  218. package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.d.ts +31 -0
  219. package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js +2 -0
  220. package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js.map +7 -0
  221. package/dist/esm/components/LiveChatWidget/components/MessageContent/index.d.ts +15 -0
  222. package/dist/esm/components/LiveChatWidget/components/MessageContent/index.js +2 -0
  223. package/dist/esm/components/LiveChatWidget/components/MessageContent/index.js.map +7 -0
  224. package/dist/esm/components/LiveChatWidget/components/MessageContent.d.ts +63 -0
  225. package/dist/esm/components/LiveChatWidget/components/MessageContent.js +2 -0
  226. package/dist/esm/components/LiveChatWidget/components/MessageContent.js.map +7 -0
  227. package/dist/esm/components/LiveChatWidget/components/MessageList.d.ts +74 -0
  228. package/dist/esm/components/LiveChatWidget/components/MessageList.js +5 -0
  229. package/dist/esm/components/LiveChatWidget/components/MessageList.js.map +7 -0
  230. package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.d.ts +44 -0
  231. package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.js +2 -0
  232. package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.js.map +7 -0
  233. package/dist/esm/components/LiveChatWidget/constants.d.ts +13 -0
  234. package/dist/esm/components/LiveChatWidget/constants.js +2 -0
  235. package/dist/esm/components/LiveChatWidget/constants.js.map +7 -0
  236. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.d.ts +60 -0
  237. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js +2 -0
  238. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js.map +7 -0
  239. package/dist/esm/components/LiveChatWidget/hooks/useChatState.d.ts +151 -0
  240. package/dist/esm/components/LiveChatWidget/hooks/useChatState.js +2 -0
  241. package/dist/esm/components/LiveChatWidget/hooks/useChatState.js.map +7 -0
  242. package/dist/esm/components/LiveChatWidget/hooks/useSession.d.ts +37 -0
  243. package/dist/esm/components/LiveChatWidget/hooks/useSession.js +2 -0
  244. package/dist/esm/components/LiveChatWidget/hooks/useSession.js.map +7 -0
  245. package/dist/esm/components/LiveChatWidget/index.d.ts +12 -0
  246. package/dist/esm/components/LiveChatWidget/index.js +2 -0
  247. package/dist/esm/components/LiveChatWidget/index.js.map +7 -0
  248. package/dist/esm/components/LiveChatWidget/types.d.ts +767 -0
  249. package/dist/esm/components/LiveChatWidget/types.js +1 -0
  250. package/dist/esm/components/LiveChatWidget/types.js.map +7 -0
  251. package/dist/esm/components/LiveChatWidget/utils/cartTransformers.d.ts +25 -0
  252. package/dist/esm/components/LiveChatWidget/utils/cartTransformers.js +2 -0
  253. package/dist/esm/components/LiveChatWidget/utils/cartTransformers.js.map +7 -0
  254. package/dist/esm/components/LiveChatWidget/utils/fetcher.d.ts +36 -0
  255. package/dist/esm/components/LiveChatWidget/utils/fetcher.js +2 -0
  256. package/dist/esm/components/LiveChatWidget/utils/fetcher.js.map +7 -0
  257. package/dist/esm/components/LiveChatWidget/utils/messageRenderers.d.ts +64 -0
  258. package/dist/esm/components/LiveChatWidget/utils/messageRenderers.js +2 -0
  259. package/dist/esm/components/LiveChatWidget/utils/messageRenderers.js.map +7 -0
  260. package/dist/esm/components/LiveChatWidget/utils/productTransformers.d.ts +43 -0
  261. package/dist/esm/components/LiveChatWidget/utils/productTransformers.js +2 -0
  262. package/dist/esm/components/LiveChatWidget/utils/productTransformers.js.map +7 -0
  263. package/dist/esm/components/LiveChatWidget/utils/userId.d.ts +18 -0
  264. package/dist/esm/components/LiveChatWidget/utils/userId.js +2 -0
  265. package/dist/esm/components/LiveChatWidget/utils/userId.js.map +7 -0
  266. package/dist/esm/components/LiveChatWidget/utils/validation.d.ts +37 -0
  267. package/dist/esm/components/LiveChatWidget/utils/validation.js +2 -0
  268. package/dist/esm/components/LiveChatWidget/utils/validation.js.map +7 -0
  269. package/dist/esm/components/chat/markdown.js +1 -1
  270. package/dist/esm/components/chat/markdown.js.map +2 -2
  271. package/dist/esm/components/credits/context/hooks/useRedeemableList.js +1 -1
  272. package/dist/esm/components/credits/context/hooks/useRedeemableList.js.map +2 -2
  273. package/dist/esm/components/credits/context/memberPriceConst.d.ts +0 -5
  274. package/dist/esm/components/credits/context/memberPriceConst.js +1 -1
  275. package/dist/esm/components/credits/context/memberPriceConst.js.map +3 -3
  276. package/dist/esm/components/credits/context/memberPriceTypes.d.ts +1 -22
  277. package/dist/esm/components/credits/context/provider.d.ts +16 -1
  278. package/dist/esm/components/credits/context/provider.js +1 -1
  279. package/dist/esm/components/credits/context/provider.js.map +3 -3
  280. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
  281. package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
  282. package/dist/esm/components/credits/creditsBanner/index.d.ts +2 -0
  283. package/dist/esm/components/credits/creditsBanner/index.js +12 -1
  284. package/dist/esm/components/credits/creditsBanner/index.js.map +3 -3
  285. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js +2 -0
  286. package/dist/esm/components/credits/creditsBenefits/BenefitItem.js.map +7 -0
  287. package/dist/esm/components/credits/creditsBenefits/{iconInfo.js → IconInfo.js} +1 -1
  288. package/dist/esm/components/credits/creditsBenefits/{iconInfo.js.map → IconInfo.js.map} +1 -1
  289. package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
  290. package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
  291. package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
  292. package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +3 -3
  293. package/dist/esm/components/credits/creditsCash/type.d.ts +1 -0
  294. package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
  295. package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
  296. package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
  297. package/dist/esm/components/credits/creditsInfoCard/index.js.map +2 -2
  298. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
  299. package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
  300. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
  301. package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
  302. package/dist/esm/components/credits/creditsMemberPrice/type.d.ts +3 -5
  303. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
  304. package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
  305. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
  306. package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
  307. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
  308. package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
  309. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
  310. package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
  311. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
  312. package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
  313. package/dist/esm/components/index.d.ts +3 -1
  314. package/dist/esm/components/index.js +1 -1
  315. package/dist/esm/components/index.js.map +3 -3
  316. package/dist/esm/components/registration/authCodeActivate/index.js +1 -1
  317. package/dist/esm/components/registration/authCodeActivate/index.js.map +2 -2
  318. package/dist/esm/stories/CartCard.stories.d.ts +33 -0
  319. package/dist/esm/stories/CartCard.stories.js +21 -0
  320. package/dist/esm/stories/CartCard.stories.js.map +7 -0
  321. package/dist/esm/stories/LiveChatWidget.stories.d.ts +108 -0
  322. package/dist/esm/stories/LiveChatWidget.stories.js +149 -0
  323. package/dist/esm/stories/LiveChatWidget.stories.js.map +7 -0
  324. package/dist/esm/templates/{credits.d.ts → Credits.d.ts} +16 -1
  325. package/dist/esm/templates/Credits.js +2 -0
  326. package/dist/esm/templates/Credits.js.map +7 -0
  327. package/dist/index.d.mts +1305 -0
  328. package/dist/index.d.ts +1305 -0
  329. package/dist/index.js +26656 -0
  330. package/dist/index.js.map +1 -0
  331. package/dist/index.mjs +26641 -0
  332. package/dist/index.mjs.map +1 -0
  333. package/package.json +7 -3
  334. package/src/components/LiveChatWidget/LiveChatWidget.tsx +732 -0
  335. package/src/components/LiveChatWidget/api/chat.ts +174 -0
  336. package/src/components/LiveChatWidget/components/ChatBubble.tsx +152 -0
  337. package/src/components/LiveChatWidget/components/ChatHeader.tsx +150 -0
  338. package/src/components/LiveChatWidget/components/ChatInput.tsx +241 -0
  339. package/src/components/LiveChatWidget/components/ChatMessage.tsx +190 -0
  340. package/src/components/LiveChatWidget/components/ChatWindow.tsx +353 -0
  341. package/src/components/LiveChatWidget/components/MessageContent/CartCard.tsx +202 -0
  342. package/src/components/LiveChatWidget/components/MessageContent/ErrorBlock.tsx +75 -0
  343. package/src/components/LiveChatWidget/components/MessageContent/FAQList.tsx +127 -0
  344. package/src/components/LiveChatWidget/components/MessageContent/PolicyBlock.tsx +150 -0
  345. package/src/components/LiveChatWidget/components/MessageContent/ProductCard.tsx +218 -0
  346. package/src/components/LiveChatWidget/components/MessageContent/ProductComparison.tsx +359 -0
  347. package/src/components/LiveChatWidget/components/MessageContent/ProductList.tsx +293 -0
  348. package/src/components/LiveChatWidget/components/MessageContent/PromotionList.tsx +170 -0
  349. package/src/components/LiveChatWidget/components/MessageContent/QuickReplies.tsx +91 -0
  350. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +89 -0
  351. package/src/components/LiveChatWidget/components/MessageContent/ThinkingBlock.tsx +53 -0
  352. package/src/components/LiveChatWidget/components/MessageContent/index.ts +16 -0
  353. package/src/components/LiveChatWidget/components/MessageContent.tsx +113 -0
  354. package/src/components/LiveChatWidget/components/MessageList.tsx +261 -0
  355. package/src/components/LiveChatWidget/components/ScrollAnchor.tsx +75 -0
  356. package/src/components/LiveChatWidget/constants.ts +36 -0
  357. package/src/components/LiveChatWidget/hooks/useChatAPI.ts +146 -0
  358. package/src/components/LiveChatWidget/hooks/useChatState.ts +1086 -0
  359. package/src/components/LiveChatWidget/hooks/useSession.ts +123 -0
  360. package/src/components/LiveChatWidget/index.tsx +62 -0
  361. package/src/components/LiveChatWidget/types.ts +949 -0
  362. package/src/components/LiveChatWidget/utils/cartTransformers.ts +72 -0
  363. package/src/components/LiveChatWidget/utils/fetcher.ts +126 -0
  364. package/src/components/LiveChatWidget/utils/messageRenderers.ts +120 -0
  365. package/src/components/LiveChatWidget/utils/productTransformers.ts +149 -0
  366. package/src/components/LiveChatWidget/utils/userId.ts +140 -0
  367. package/src/components/LiveChatWidget/utils/validation.ts +99 -0
  368. package/src/components/chat/markdown.tsx +1 -1
  369. package/src/components/credits/context/hooks/useRedeemableList.ts +1 -1
  370. package/src/components/credits/context/memberPriceConst.ts +0 -7
  371. package/src/components/credits/context/memberPriceTypes.ts +1 -26
  372. package/src/components/credits/context/provider.tsx +16 -0
  373. package/src/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.tsx +26 -26
  374. package/src/components/credits/creditsBanner/index.tsx +31 -3
  375. package/src/components/credits/creditsBenefits/BenefitItem.tsx +11 -4
  376. package/src/components/credits/creditsBenefits/IconInfo.tsx +1 -1
  377. package/src/components/credits/creditsCash/CreditsCash.tsx +6 -3
  378. package/src/components/credits/creditsCash/RedeemableItem.tsx +23 -10
  379. package/src/components/credits/creditsCash/type.ts +1 -0
  380. package/src/components/credits/creditsFaq/faqItem/FaqItem.tsx +25 -23
  381. package/src/components/credits/creditsInfoCard/index.tsx +8 -2
  382. package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +124 -25
  383. package/src/components/credits/creditsMemberPrice/MemberPriceItem.tsx +113 -31
  384. package/src/components/credits/creditsMemberPrice/type.ts +3 -5
  385. package/src/components/credits/creditsNavigation/CreditsNavigation.tsx +3 -3
  386. package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +31 -18
  387. package/src/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.tsx +6 -4
  388. package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +19 -6
  389. package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +20 -17
  390. package/src/components/index.ts +23 -1
  391. package/src/components/registration/authCodeActivate/index.tsx +2 -0
  392. package/src/stories/CartCard.stories.tsx +459 -0
  393. package/src/stories/LiveChatWidget.stories.tsx +754 -0
  394. package/src/styles/livechat.css +268 -0
  395. package/src/templates/Credits.tsx +27 -9
  396. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +0 -7
  397. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +0 -2
  398. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +0 -7
  399. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.d.ts +0 -1
  400. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.js +0 -2
  401. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.js.map +0 -7
  402. package/dist/cjs/components/credits/context/hooks/useSubscriptions.d.ts +0 -9
  403. package/dist/cjs/components/credits/context/hooks/useSubscriptions.js +0 -2
  404. package/dist/cjs/components/credits/context/hooks/useSubscriptions.js.map +0 -7
  405. package/dist/cjs/components/credits/context/utils/atobID.d.ts +0 -1
  406. package/dist/cjs/components/credits/context/utils/atobID.js +0 -2
  407. package/dist/cjs/components/credits/context/utils/atobID.js.map +0 -7
  408. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.d.ts +0 -5
  409. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js +0 -2
  410. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js.map +0 -7
  411. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +0 -8
  412. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +0 -2
  413. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +0 -7
  414. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +0 -9
  415. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +0 -2
  416. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +0 -7
  417. package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +0 -6
  418. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +0 -2
  419. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +0 -7
  420. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js +0 -2
  421. package/dist/cjs/components/credits/creditsBenefits/benefitItem.js.map +0 -7
  422. package/dist/cjs/helpers/fetchResponse.d.ts +0 -14
  423. package/dist/cjs/helpers/fetchResponse.js +0 -2
  424. package/dist/cjs/helpers/fetchResponse.js.map +0 -7
  425. package/dist/cjs/helpers/fetcher.d.ts +0 -2
  426. package/dist/cjs/helpers/fetcher.js +0 -2
  427. package/dist/cjs/helpers/fetcher.js.map +0 -7
  428. package/dist/cjs/helpers/index.d.ts +0 -2
  429. package/dist/cjs/helpers/index.js +0 -2
  430. package/dist/cjs/helpers/index.js.map +0 -7
  431. package/dist/cjs/helpers/track.d.ts +0 -19
  432. package/dist/cjs/helpers/track.js +0 -2
  433. package/dist/cjs/helpers/track.js.map +0 -7
  434. package/dist/cjs/helpers/utils.d.ts +0 -3
  435. package/dist/cjs/helpers/utils.js +0 -2
  436. package/dist/cjs/helpers/utils.js.map +0 -7
  437. package/dist/cjs/templates/credits.js +0 -2
  438. package/dist/cjs/templates/credits.js.map +0 -7
  439. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +0 -7
  440. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +0 -2
  441. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +0 -7
  442. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.d.ts +0 -1
  443. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.js +0 -2
  444. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.js.map +0 -7
  445. package/dist/esm/components/credits/context/hooks/useSubscriptions.d.ts +0 -9
  446. package/dist/esm/components/credits/context/hooks/useSubscriptions.js +0 -2
  447. package/dist/esm/components/credits/context/hooks/useSubscriptions.js.map +0 -7
  448. package/dist/esm/components/credits/context/utils/atobID.d.ts +0 -1
  449. package/dist/esm/components/credits/context/utils/atobID.js +0 -2
  450. package/dist/esm/components/credits/context/utils/atobID.js.map +0 -7
  451. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.d.ts +0 -5
  452. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js +0 -2
  453. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js.map +0 -7
  454. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +0 -8
  455. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +0 -2
  456. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +0 -7
  457. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +0 -9
  458. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +0 -2
  459. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +0 -7
  460. package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +0 -6
  461. package/dist/esm/components/credits/context/utils/variantGetCoupon.js +0 -2
  462. package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +0 -7
  463. package/dist/esm/components/credits/creditsBenefits/benefitItem.js +0 -2
  464. package/dist/esm/components/credits/creditsBenefits/benefitItem.js.map +0 -7
  465. package/dist/esm/helpers/fetchResponse.d.ts +0 -14
  466. package/dist/esm/helpers/fetchResponse.js +0 -2
  467. package/dist/esm/helpers/fetchResponse.js.map +0 -7
  468. package/dist/esm/helpers/fetcher.d.ts +0 -2
  469. package/dist/esm/helpers/fetcher.js +0 -2
  470. package/dist/esm/helpers/fetcher.js.map +0 -7
  471. package/dist/esm/helpers/index.d.ts +0 -2
  472. package/dist/esm/helpers/index.js +0 -2
  473. package/dist/esm/helpers/index.js.map +0 -7
  474. package/dist/esm/helpers/track.d.ts +0 -19
  475. package/dist/esm/helpers/track.js +0 -2
  476. package/dist/esm/helpers/track.js.map +0 -7
  477. package/dist/esm/helpers/utils.d.ts +0 -3
  478. package/dist/esm/helpers/utils.js +0 -2
  479. package/dist/esm/helpers/utils.js.map +0 -7
  480. package/dist/esm/templates/credits.js +0 -2
  481. package/dist/esm/templates/credits.js.map +0 -7
  482. package/src/components/credits/context/hooks/useFunctionMemberPrice.ts +0 -33
  483. package/src/components/credits/context/utils/atobID.ts +0 -8
  484. package/src/components/credits/context/utils/functionDiscountCalculate.ts +0 -57
  485. package/src/components/credits/context/utils/getFunctionMemberPrice.ts +0 -135
  486. package/src/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.ts +0 -51
  487. package/src/components/credits/context/utils/variantGetCoupon.ts +0 -34
  488. /package/dist/cjs/components/credits/creditsBenefits/{benefitItem.d.ts → BenefitItem.d.ts} +0 -0
  489. /package/dist/cjs/components/credits/creditsBenefits/{iconInfo.d.ts → IconInfo.d.ts} +0 -0
  490. /package/dist/esm/components/credits/creditsBenefits/{benefitItem.d.ts → BenefitItem.d.ts} +0 -0
  491. /package/dist/esm/components/credits/creditsBenefits/{iconInfo.d.ts → IconInfo.d.ts} +0 -0
@@ -0,0 +1,732 @@
1
+ /**
2
+ * LiveChat 主组件
3
+ * 集成所有子组件,提供完整的聊天功能
4
+ * 基于 specs/livechat-widget/plan.md 的三层架构设计
5
+ */
6
+
7
+ import React, { useEffect, useCallback } from 'react'
8
+ import * as Dialog from '@radix-ui/react-dialog'
9
+ import type {
10
+ LiveChatWidgetProps,
11
+ QuickReply,
12
+ Message,
13
+ MessageContent,
14
+ ChatStreamRequest,
15
+ BackendCartData,
16
+ CommonText,
17
+ } from './types'
18
+ import { DEFAULT_COMMON_TEXT } from './constants'
19
+ import { ChatBubble } from './components/ChatBubble'
20
+ import { ChatWindow } from './components/ChatWindow'
21
+ import { useChatState } from './hooks/useChatState'
22
+ import { useChatAPI } from './hooks/useChatAPI'
23
+ import { MessageRendererRegistry } from './utils/messageRenderers'
24
+ import { sanitizeInput } from './utils/validation'
25
+ import { transformProducts } from './utils/productTransformers.js'
26
+ import { transformCartData } from './utils/cartTransformers.js'
27
+ import {
28
+ TextBlock,
29
+ ProductCard,
30
+ ProductList,
31
+ ProductComparisonRenderer,
32
+ PolicyBlock,
33
+ createQuickRepliesRenderer,
34
+ ThinkingBlock,
35
+ ErrorBlock,
36
+ FAQListRenderer,
37
+ PromotionListRenderer,
38
+ CartCard,
39
+ } from './components/MessageContent/index.js'
40
+
41
+ /**
42
+ * LiveChat 聊天组件
43
+ *
44
+ * 功能:
45
+ * - 气泡弹窗聊天界面
46
+ * - SSE 流式消息接收
47
+ * - 会话管理(userId, sessionId)
48
+ * - 历史消息加载
49
+ * - 多种消息类型渲染
50
+ * - 自定义扩展机制
51
+ * - reCAPTCHA v3 安全防护
52
+ *
53
+ * 架构:
54
+ * - UI Layer: ChatBubble, ChatWindow, MessageList, etc.
55
+ * - Logic Layer: useChatState, useChatAPI, useSession
56
+ * - Core Layer: MessageRendererRegistry, 自定义渲染器
57
+ *
58
+ * @example
59
+ * ```tsx
60
+ * // 基础使用(使用默认位置)
61
+ * <LiveChatWidget
62
+ * apiBaseUrl="https://beta-api-livechat.anker.com"
63
+ * site="www.eufy.com"
64
+ * welcomeMessage="你好!我是 AI 助手"
65
+ * onMessageSend={(msg) => console.log('Sent:', msg)}
66
+ * />
67
+ *
68
+ * // 使用自定义位置
69
+ * <LiveChatWidget
70
+ * apiBaseUrl="https://beta-api-livechat.anker.com"
71
+ * site="www.eufy.com"
72
+ * position={{ bottom: "20px", right: "30px" }}
73
+ * onMessageSend={(msg) => console.log('Sent:', msg)}
74
+ * />
75
+ *
76
+ * // 启用 reCAPTCHA v3 安全防护(提供 sitekey 即自动启用)
77
+ * <LiveChatWidget
78
+ * apiBaseUrl="https://beta-api-livechat.anker.com"
79
+ * site="www.eufy.com"
80
+ * recaptchaSitekey="6LfS4J4pAAAAACX1e_WrxutmxxzCK7FU4WzVqL14"
81
+ * recaptchaAction="livechat"
82
+ * />
83
+ *
84
+ * // 使用自定义 headers 和 reCAPTCHA
85
+ * <LiveChatWidget
86
+ * apiBaseUrl="https://beta-api-livechat.anker.com"
87
+ * site="www.eufy.com"
88
+ * headers={{
89
+ * "Authorization": "Bearer your-token",
90
+ * "X-Custom-Header": "value"
91
+ * }}
92
+ * recaptchaSitekey="your-site-key"
93
+ * />
94
+ * ```
95
+ */
96
+ export const LiveChatWidget: React.FC<LiveChatWidgetProps> = ({
97
+ apiBaseUrl,
98
+ headers,
99
+ recaptchaSitekey,
100
+ recaptchaAction,
101
+ site,
102
+ channelCode,
103
+ loginUserId,
104
+ cartId,
105
+ accessToken,
106
+ position,
107
+ welcomeMessage,
108
+ quickReplies,
109
+ customRenderers,
110
+ logoUrl,
111
+ title,
112
+ chatBubbleIcon,
113
+ open,
114
+ onOpenChange,
115
+ onOpen,
116
+ onClose,
117
+ onMessageSend,
118
+ onError,
119
+ onTextMessage,
120
+ onProductList,
121
+ onPromotionList,
122
+ onAddToCart,
123
+ onCart,
124
+ showNewSessionButton,
125
+ commonText,
126
+ productCardRender,
127
+ }) => {
128
+ // 合并默认文案和自定义文案
129
+ const mergedText: Required<CommonText> = React.useMemo(
130
+ () => ({
131
+ ...DEFAULT_COMMON_TEXT,
132
+ ...commonText,
133
+ }),
134
+ [commonText]
135
+ )
136
+
137
+ // 状态管理
138
+ const chatState = useChatState({
139
+ welcomeMessage,
140
+ site,
141
+ open,
142
+ onOpenChange,
143
+ onOpen,
144
+ onClose,
145
+ onMessageSend,
146
+ onError,
147
+ onTextMessage,
148
+ onProductList,
149
+ onPromotionList,
150
+ onAddToCart,
151
+ onCart,
152
+ productCardRender,
153
+ })
154
+
155
+ const {
156
+ messages,
157
+ isOpen,
158
+ userId,
159
+ sessionId,
160
+ inputValue,
161
+ isStreaming,
162
+ openChat,
163
+ closeChat,
164
+ setInputValue,
165
+ addMessage,
166
+ setMessages,
167
+ clearMessages,
168
+ handleSSEEvent,
169
+ saveSession,
170
+ clearSession,
171
+ } = chatState
172
+
173
+ // API 调用
174
+ const { sendMessageStream, createSession } = useChatAPI({
175
+ apiBaseUrl,
176
+ headers,
177
+ recaptchaConfig: {
178
+ needRecaptcha: !!recaptchaSitekey, // 根据 sitekey 自动判断是否启用
179
+ recaptchaSitekey,
180
+ recaptchaAction,
181
+ },
182
+ onError,
183
+ })
184
+
185
+ // 使用 ref 存储最新的 handleSendMessage,避免循环依赖
186
+ const handleSendMessageRef = React.useRef<(_message?: string) => Promise<void>>(async (_message?: string) => {})
187
+
188
+ // 消息渲染器注册表
189
+ const rendererRegistry = React.useMemo(() => {
190
+ const registry = new MessageRendererRegistry()
191
+
192
+ // 注册默认渲染器
193
+ registry.register('text', TextBlock)
194
+ registry.register('product_card', ProductCard)
195
+ registry.register('product_list', ProductList)
196
+ registry.register('product_comparison', ProductComparisonRenderer)
197
+ registry.register('policy', PolicyBlock)
198
+ registry.register('thinking', ThinkingBlock)
199
+ registry.register('error', ErrorBlock)
200
+ registry.register('faq_list', FAQListRenderer)
201
+ registry.register('promotion_list', PromotionListRenderer)
202
+ registry.register('cart', CartCard)
203
+
204
+ // 注册快捷回复渲染器(带回调)
205
+ const quickRepliesRenderer = createQuickRepliesRenderer((reply: QuickReply) => {
206
+ // 使用 ref 调用最新的 handleSendMessage
207
+ handleSendMessageRef.current(reply.value)
208
+ })
209
+ registry.register('quick_replies', quickRepliesRenderer)
210
+
211
+ // 注册自定义渲染器
212
+ if (customRenderers) {
213
+ registry.registerMany(customRenderers)
214
+ }
215
+
216
+ return registry
217
+ }, [customRenderers])
218
+
219
+ /**
220
+ * T043: 打开聊天窗口时初始化会话
221
+ * 使用 API v2.0.0 的统一接口:
222
+ * - 如果没有 sessionId,创建新会话
223
+ * - 如果有 sessionId,恢复会话并加载历史消息
224
+ */
225
+ useEffect(() => {
226
+ if (!isOpen || !userId) return
227
+
228
+ const currentSessionId = sessionId
229
+
230
+ if (!currentSessionId) {
231
+ // 没有会话,创建新会话
232
+ handleCreateNewSession()
233
+ } else {
234
+ // 有会话,尝试恢复会话和历史消息
235
+ handleResumeSession(currentSessionId)
236
+ }
237
+ // eslint-disable-next-line react-hooks/exhaustive-deps
238
+ }, [isOpen, userId])
239
+
240
+ /**
241
+ * 规范化消息格式(确保 content 是数组)
242
+ * 后端返回格式:
243
+ * - content: 字符串(文本内容)
244
+ * - structuredContent: 数组(结构化内容,如产品列表、政策等)
245
+ * 需要合并为统一的 content 数组格式
246
+ */
247
+ const normalizeMessage = useCallback(
248
+ (message: any): Message => {
249
+ // 如果 content 已经是数组,直接返回
250
+ if (Array.isArray(message.content)) {
251
+ return message as Message
252
+ }
253
+
254
+ const contentBlocks: MessageContent[] = []
255
+
256
+ // 处理文本内容
257
+ if (typeof message.content === 'string' && message.content.trim()) {
258
+ contentBlocks.push({
259
+ type: 'text',
260
+ text: message.content,
261
+ })
262
+ }
263
+
264
+ // 处理结构化内容
265
+ // 历史消息格式: structured_content: [{type, data}]
266
+ const structuredData = message.structuredContent || message.structured_content
267
+
268
+ if (Array.isArray(structuredData)) {
269
+ structuredData.forEach((block: any) => {
270
+ if (block.type === 'product_list' && Array.isArray(block.data)) {
271
+ // 转换产品列表数据结构 - data 直接是产品数组
272
+ contentBlocks.push({
273
+ type: 'product_list',
274
+ data: {
275
+ products: transformProducts(block.data, site),
276
+ title: undefined, // 历史消息不包含 title
277
+ commonText: mergedText,
278
+ },
279
+ })
280
+ } else if (block.type === 'quick_replies' && block.data?.replies) {
281
+ contentBlocks.push({
282
+ type: 'quick_replies',
283
+ data: {
284
+ replies: block.data.replies,
285
+ },
286
+ })
287
+ } else if (block.type === 'policy' && block.data?.title && block.data?.content) {
288
+ contentBlocks.push({
289
+ type: 'policy',
290
+ data: {
291
+ title: block.data.title,
292
+ content: block.data.content,
293
+ },
294
+ })
295
+ } else if (block.type === 'product_comparison' && block.data?.products && block.data?.dimensions) {
296
+ // 转换产品对比数据结构并注入 onAddToCart 回调
297
+ contentBlocks.push({
298
+ type: 'product_comparison',
299
+ data: {
300
+ products: transformProducts(block.data.products, site),
301
+ dimensions: block.data.dimensions,
302
+ onAddToCart: onAddToCart,
303
+ commonText: mergedText,
304
+ },
305
+ })
306
+ } else if (block.type === 'faq_list' && block.data?.found !== undefined) {
307
+ // FAQ 列表卡片 - 直接使用后端数据
308
+ contentBlocks.push({
309
+ type: 'faq_list',
310
+ data: block.data,
311
+ })
312
+ } else if (block.type === 'promotion_list' && block.data?.found !== undefined) {
313
+ // 促销活动列表卡片 - 直接使用后端数据
314
+ contentBlocks.push({
315
+ type: 'promotion_list',
316
+ data: {
317
+ ...block.data,
318
+ commonText: mergedText,
319
+ },
320
+ })
321
+ } else if (block.type === 'cart' && block.data?.id !== undefined) {
322
+ // 购物车卡片 - 转换后端数据格式并注入 onCart 回调
323
+ const transformedData = transformCartData(block.data as BackendCartData)
324
+ contentBlocks.push({
325
+ type: 'cart',
326
+ data: {
327
+ ...transformedData,
328
+ onCart: onCart,
329
+ commonText: mergedText,
330
+ },
331
+ })
332
+ } else {
333
+ // 其他类型直接添加
334
+ contentBlocks.push(block)
335
+ }
336
+ })
337
+ }
338
+
339
+ // 如果没有任何内容块,返回空文本块
340
+ if (contentBlocks.length === 0) {
341
+ contentBlocks.push({
342
+ type: 'text',
343
+ text: '',
344
+ })
345
+ }
346
+
347
+ return {
348
+ ...message,
349
+ content: contentBlocks,
350
+ } as Message
351
+ },
352
+ [site, onCart, onAddToCart, mergedText]
353
+ )
354
+
355
+ /**
356
+ * 创建新会话
357
+ */
358
+ const handleCreateNewSession = useCallback(async () => {
359
+ if (!userId) return
360
+
361
+ try {
362
+ const response = await createSession({
363
+ user_id: userId,
364
+ site: site,
365
+ channel_code: channelCode,
366
+ real_user_id: loginUserId,
367
+ })
368
+
369
+ if (response.success) {
370
+ // 保存新会话 ID
371
+ saveSession(response.sessionId)
372
+
373
+ // 清空消息列表
374
+ clearMessages()
375
+
376
+ // 使用后端返回的欢迎消息,如果没有则使用 props 中的默认值
377
+ const messageText = response.welcomeMessage || welcomeMessage
378
+
379
+ if (messageText) {
380
+ const welcomeContent: MessageContent[] = [{ type: 'text', text: messageText }]
381
+
382
+ // 使用后端返回的快捷问题,如果没有则使用 props 中的快捷回复
383
+ const questions = response.quickQuestions
384
+ if (questions && questions.length > 0) {
385
+ // 将后端的 quickQuestions (字符串数组) 转换为 QuickReply 格式
386
+ const quickRepliesFromBackend = questions.map((question, index) => ({
387
+ id: `quick-${index}`,
388
+ label: question,
389
+ value: question,
390
+ }))
391
+
392
+ welcomeContent.push({
393
+ type: 'quick_replies',
394
+ data: {
395
+ replies: quickRepliesFromBackend,
396
+ },
397
+ })
398
+ } else if (quickReplies && quickReplies.length > 0) {
399
+ // 如果后端没有返回,使用 props 中的快捷回复
400
+ welcomeContent.push({
401
+ type: 'quick_replies',
402
+ data: {
403
+ replies: quickReplies,
404
+ },
405
+ })
406
+ }
407
+
408
+ addMessage({
409
+ id: `welcome-${Date.now()}`,
410
+ role: 'assistant',
411
+ content: welcomeContent,
412
+ timestamp: Date.now(),
413
+ })
414
+ }
415
+ }
416
+ } catch (error) {
417
+ console.error('[LiveChatWidget] Failed to create new session:', error)
418
+ onError?.(error as Error)
419
+
420
+ // 添加错误消息到界面
421
+ addMessage({
422
+ id: `error-${Date.now()}`,
423
+ role: 'system',
424
+ content: [
425
+ {
426
+ type: 'error',
427
+ data: {
428
+ message: 'Failed to create session. Please refresh the page and try again.',
429
+ code: 'SESSION_CREATE_ERROR',
430
+ },
431
+ },
432
+ ],
433
+ timestamp: Date.now(),
434
+ })
435
+ }
436
+ }, [
437
+ userId,
438
+ site,
439
+ channelCode,
440
+ loginUserId,
441
+ createSession,
442
+ saveSession,
443
+ clearMessages,
444
+ welcomeMessage,
445
+ quickReplies,
446
+ addMessage,
447
+ onError,
448
+ ])
449
+
450
+ /**
451
+ * 恢复会话和历史消息(使用新的 API v2.0.0)
452
+ */
453
+ const handleResumeSession = useCallback(
454
+ async (existingSessionId: string) => {
455
+ try {
456
+ const response = await createSession({
457
+ user_id: userId,
458
+ session_id: existingSessionId,
459
+ site: site,
460
+ channel_code: channelCode,
461
+ real_user_id: loginUserId,
462
+ })
463
+
464
+ if (response.success && response.resumed) {
465
+ // 会话恢复成功
466
+ if (response.messages && response.messages.length > 0) {
467
+ // 有历史消息,规范化并加载(过滤掉 null/undefined 值和空内容消息)
468
+ const normalizedMessages = response.messages
469
+ .filter((msg: any) => msg != null)
470
+ .map(normalizeMessage)
471
+ .filter((msg: Message) => msg.content && msg.content.length > 0 && !(msg.content.length === 1 && msg.content[0].type === 'text' && !msg.content[0].text))
472
+ setMessages(normalizedMessages)
473
+ } else {
474
+ // 没有历史消息,显示欢迎消息
475
+ clearMessages()
476
+
477
+ // 使用后端返回的欢迎消息,如果没有则使用 props 中的默认值
478
+ const messageText = response.welcomeMessage || welcomeMessage
479
+
480
+ if (messageText) {
481
+ const welcomeContent: MessageContent[] = [{ type: 'text', text: messageText }]
482
+
483
+ // 使用后端返回的快捷问题
484
+ const questions = response.quickQuestions
485
+ if (questions && questions.length > 0) {
486
+ const quickRepliesFromBackend = questions.map((question, index) => ({
487
+ id: `quick-${index}`,
488
+ label: question,
489
+ value: question,
490
+ }))
491
+
492
+ welcomeContent.push({
493
+ type: 'quick_replies',
494
+ data: {
495
+ replies: quickRepliesFromBackend,
496
+ },
497
+ })
498
+ } else if (quickReplies && quickReplies.length > 0) {
499
+ welcomeContent.push({
500
+ type: 'quick_replies',
501
+ data: {
502
+ replies: quickReplies,
503
+ },
504
+ })
505
+ }
506
+
507
+ addMessage({
508
+ id: `welcome-${Date.now()}`,
509
+ role: 'assistant',
510
+ content: welcomeContent,
511
+ timestamp: Date.now(),
512
+ })
513
+ }
514
+ }
515
+ } else if (!response.resumed) {
516
+ // 会话无效或过期,创建新会话
517
+ clearSession()
518
+ handleCreateNewSession()
519
+ }
520
+ } catch (error) {
521
+ console.error('[LiveChatWidget] Failed to resume session:', error)
522
+
523
+ // 添加错误消息到界面
524
+ addMessage({
525
+ id: `error-${Date.now()}`,
526
+ role: 'system',
527
+ content: [
528
+ {
529
+ type: 'error',
530
+ data: {
531
+ message: 'Failed to resume session. Creating a new session...',
532
+ code: 'SESSION_RESUME_ERROR',
533
+ },
534
+ },
535
+ ],
536
+ timestamp: Date.now(),
537
+ })
538
+
539
+ // 恢复失败,清空会话并创建新的
540
+ clearSession()
541
+ handleCreateNewSession()
542
+ }
543
+ },
544
+ [
545
+ userId,
546
+ site,
547
+ channelCode,
548
+ loginUserId,
549
+ createSession,
550
+ setMessages,
551
+ clearSession,
552
+ clearMessages,
553
+ normalizeMessage,
554
+ handleCreateNewSession,
555
+ welcomeMessage,
556
+ quickReplies,
557
+ addMessage,
558
+ ]
559
+ )
560
+
561
+ /**
562
+ * 发送消息
563
+ */
564
+ const handleSendMessage = useCallback(
565
+ async (message?: string) => {
566
+ const textToSend = message || inputValue.trim()
567
+
568
+ if (!textToSend) return
569
+
570
+ // 清空输入框
571
+ if (!message) {
572
+ setInputValue('')
573
+ }
574
+
575
+ // 输入验证
576
+ const sanitized = sanitizeInput(textToSend)
577
+ if (!sanitized) {
578
+ onError?.(new Error('Invalid message'))
579
+ return
580
+ }
581
+
582
+ // 添加用户消息到界面
583
+ const userMessage = {
584
+ id: `user-${Date.now()}`,
585
+ role: 'user' as const,
586
+ content: [{ type: 'text' as const, text: sanitized }],
587
+ timestamp: Date.now(),
588
+ }
589
+ addMessage(userMessage)
590
+
591
+ // 立即添加思考状态消息,提升用户体验
592
+ const thinkingMessage = {
593
+ id: `thinking-${Date.now()}`,
594
+ role: 'assistant' as const,
595
+ content: [{ type: 'thinking' as const, data: { status: 'thinking' } }],
596
+ timestamp: Date.now(),
597
+ }
598
+ addMessage(thinkingMessage)
599
+
600
+ // 触发消息发送回调
601
+ onMessageSend?.(sanitized)
602
+
603
+ try {
604
+ // 确保有 sessionId,如果没有则先创建会话
605
+ let currentSessionId = sessionId
606
+ if (!currentSessionId) {
607
+ // 没有会话,创建新会话
608
+ const response = await createSession({
609
+ user_id: userId,
610
+ site: site,
611
+ channel_code: channelCode,
612
+ real_user_id: loginUserId,
613
+ })
614
+ if (response.success) {
615
+ currentSessionId = response.sessionId
616
+ saveSession(currentSessionId)
617
+ } else {
618
+ throw new Error('Failed to create session')
619
+ }
620
+ }
621
+
622
+ // 构建请求参数(session_id 现在是必填的)
623
+ const requestPayload: ChatStreamRequest = {
624
+ message: sanitized,
625
+ user_id: userId,
626
+ session_id: currentSessionId,
627
+ context: {
628
+ cartId: cartId,
629
+ accessToken: accessToken,
630
+ real_user_id: loginUserId,
631
+ },
632
+ }
633
+
634
+ // 发送消息到后端
635
+ await sendMessageStream(requestPayload, event => {
636
+ // 处理 SSE 事件
637
+ handleSSEEvent(event)
638
+
639
+ // 特殊处理:会话过期
640
+ if (event.event === 'status' && event.data.type === 'session_expired') {
641
+ clearSession()
642
+ }
643
+ })
644
+ } catch (error) {
645
+ console.error('[LiveChatWidget] Failed to send message:', error)
646
+ onError?.(error as Error)
647
+
648
+ // 移除刚才添加的 thinking 消息,并添加错误消息
649
+ const messagesWithoutThinking = messages.filter(msg => msg.id !== thinkingMessage.id)
650
+ setMessages([
651
+ ...messagesWithoutThinking,
652
+ {
653
+ id: `error-${Date.now()}`,
654
+ role: 'system',
655
+ content: [
656
+ {
657
+ type: 'error',
658
+ data: {
659
+ message: 'Failed to send message. Please check your network connection and try again.',
660
+ code: 'NETWORK_ERROR',
661
+ },
662
+ },
663
+ ],
664
+ timestamp: Date.now(),
665
+ },
666
+ ])
667
+ }
668
+ },
669
+ [
670
+ inputValue,
671
+ userId,
672
+ sessionId,
673
+ site,
674
+ channelCode,
675
+ loginUserId,
676
+ cartId,
677
+ accessToken,
678
+ messages,
679
+ setInputValue,
680
+ addMessage,
681
+ setMessages,
682
+ createSession,
683
+ sendMessageStream,
684
+ handleSSEEvent,
685
+ saveSession,
686
+ clearSession,
687
+ onMessageSend,
688
+ onError,
689
+ ]
690
+ )
691
+
692
+ // 更新 ref 以保持最新的 handleSendMessage
693
+ React.useEffect(() => {
694
+ handleSendMessageRef.current = handleSendMessage
695
+ }, [handleSendMessage])
696
+
697
+ return (
698
+ <>
699
+ {/* 气泡按钮 */}
700
+ <ChatBubble position={position} onClick={openChat} visible={!isOpen} iconImageUrl={chatBubbleIcon} />
701
+
702
+ {/* 聊天窗口(使用 Radix UI Dialog) */}
703
+ <Dialog.Root open={isOpen} onOpenChange={open => (open ? openChat() : closeChat())}>
704
+ <Dialog.Portal>
705
+ <Dialog.Content
706
+ className="livechat-window-enter"
707
+ style={{
708
+ position: 'fixed',
709
+ zIndex: 9998,
710
+ }}
711
+ >
712
+ <ChatWindow
713
+ messages={messages}
714
+ inputValue={inputValue}
715
+ onInputChange={setInputValue}
716
+ onSend={() => handleSendMessage()}
717
+ onClose={closeChat}
718
+ onNewSession={handleCreateNewSession}
719
+ title={title}
720
+ logoUrl={logoUrl}
721
+ isSending={isStreaming}
722
+ rendererRegistry={rendererRegistry}
723
+ inputPlaceholder=""
724
+ onAddToCart={onAddToCart}
725
+ showNewSessionButton={showNewSessionButton}
726
+ />
727
+ </Dialog.Content>
728
+ </Dialog.Portal>
729
+ </Dialog.Root>
730
+ </>
731
+ )
732
+ }