@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,63 @@
1
+ /**
2
+ * 消息内容容器组件
3
+ * 根据消息内容类型分发到对应的渲染器
4
+ * 基于 specs/livechat-widget/plan.md 的消息内容渲染设计
5
+ */
6
+ import React from 'react';
7
+ import type { MessageContent as MessageContentType, MessageRenderer } from '../types';
8
+ import { MessageRendererRegistry } from '../utils/messageRenderers';
9
+ export interface MessageContentProps {
10
+ /**
11
+ * 消息内容
12
+ */
13
+ content: MessageContentType;
14
+ /**
15
+ * 是否为用户消息
16
+ */
17
+ isUser: boolean;
18
+ /**
19
+ * 是否为系统消息
20
+ */
21
+ isSystem: boolean;
22
+ /**
23
+ * 自定义渲染器注册表
24
+ */
25
+ rendererRegistry?: MessageRendererRegistry;
26
+ /**
27
+ * 默认渲染器(当找不到对应渲染器时使用)
28
+ */
29
+ defaultRenderer?: MessageRenderer;
30
+ /**
31
+ * 自定义样式类名
32
+ */
33
+ className?: string;
34
+ /**
35
+ * 商品添加到购物车回调
36
+ */
37
+ onAddToCart?: (product: any) => void;
38
+ }
39
+ /**
40
+ * 消息内容容器组件
41
+ *
42
+ * 功能:
43
+ * - 根据 content.type 分发到对应的渲染器
44
+ * - 支持自定义渲染器注册表
45
+ * - 提供默认兜底渲染器
46
+ *
47
+ * 渲染流程:
48
+ * 1. 检查自定义渲染器注册表是否有对应类型
49
+ * 2. 如果有,使用自定义渲染器
50
+ * 3. 如果没有,使用默认渲染器
51
+ * 4. 如果默认渲染器也没有,显示未知类型提示
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * <MessageContent
56
+ * content={content}
57
+ * isUser={message.role === 'user'}
58
+ * isSystem={message.role === 'system'}
59
+ * rendererRegistry={customRegistry}
60
+ * />
61
+ * ```
62
+ */
63
+ export declare const MessageContent: React.FC<MessageContentProps>;
@@ -0,0 +1,2 @@
1
+ "use strict";var d=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var m=(e,r)=>{for(var t in r)d(e,t,{get:r[t],enumerable:!0})},l=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of y(r))!R.call(e,s)&&s!==t&&d(e,s,{get:()=>r[s],enumerable:!(a=g(r,s))||a.enumerable});return e};var M=e=>l(d({},"__esModule",{value:!0}),e);var f={};m(f,{MessageContent:()=>C});module.exports=M(f);var n=require("react/jsx-runtime");const u={render:e=>(0,n.jsxs)("div",{className:"text-sm italic text-gray-500",children:["\u672A\u77E5\u6D88\u606F\u7C7B\u578B: ",e.type]})},C=({content:e,isUser:r,isSystem:t,rendererRegistry:a,defaultRenderer:s,className:i="",onAddToCart:p})=>{let o=e;(e.type==="product_card"||e.type==="product_list"||e.type==="product_comparison")&&p&&(o={...e,data:{...e.data,onAddToCart:p}});const c=(a?.get(o.type)||s||u).render(o,r,t);return(0,n.jsx)("div",{className:i,children:c})};
2
+ //# sourceMappingURL=MessageContent.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/components/MessageContent.tsx"],
4
+ "sourcesContent": ["/**\n * \u6D88\u606F\u5185\u5BB9\u5BB9\u5668\u7EC4\u4EF6\n * \u6839\u636E\u6D88\u606F\u5185\u5BB9\u7C7B\u578B\u5206\u53D1\u5230\u5BF9\u5E94\u7684\u6E32\u67D3\u5668\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6D88\u606F\u5185\u5BB9\u6E32\u67D3\u8BBE\u8BA1\n */\n\nimport React from 'react'\nimport type { MessageContent as MessageContentType, MessageRenderer } from '../types'\nimport { MessageRendererRegistry } from '../utils/messageRenderers'\n\nexport interface MessageContentProps {\n /**\n * \u6D88\u606F\u5185\u5BB9\n */\n content: MessageContentType\n\n /**\n * \u662F\u5426\u4E3A\u7528\u6237\u6D88\u606F\n */\n isUser: boolean\n\n /**\n * \u662F\u5426\u4E3A\u7CFB\u7EDF\u6D88\u606F\n */\n isSystem: boolean\n\n /**\n * \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n */\n rendererRegistry?: MessageRendererRegistry\n\n /**\n * \u9ED8\u8BA4\u6E32\u67D3\u5668\uFF08\u5F53\u627E\u4E0D\u5230\u5BF9\u5E94\u6E32\u67D3\u5668\u65F6\u4F7F\u7528\uFF09\n */\n defaultRenderer?: MessageRenderer\n\n /**\n * \u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u5546\u54C1\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u56DE\u8C03\n */\n onAddToCart?: (product: any) => void\n}\n\n/**\n * \u9ED8\u8BA4\u6E32\u67D3\u5668 - \u663E\u793A\u672A\u77E5\u7C7B\u578B\u63D0\u793A\n */\nconst defaultFallbackRenderer: MessageRenderer = {\n render: content => <div className=\"text-sm italic text-gray-500\">\u672A\u77E5\u6D88\u606F\u7C7B\u578B: {content.type}</div>,\n}\n\n/**\n * \u6D88\u606F\u5185\u5BB9\u5BB9\u5668\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u6839\u636E content.type \u5206\u53D1\u5230\u5BF9\u5E94\u7684\u6E32\u67D3\u5668\n * - \u652F\u6301\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n * - \u63D0\u4F9B\u9ED8\u8BA4\u515C\u5E95\u6E32\u67D3\u5668\n *\n * \u6E32\u67D3\u6D41\u7A0B\uFF1A\n * 1. \u68C0\u67E5\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\u662F\u5426\u6709\u5BF9\u5E94\u7C7B\u578B\n * 2. \u5982\u679C\u6709\uFF0C\u4F7F\u7528\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n * 3. \u5982\u679C\u6CA1\u6709\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u6E32\u67D3\u5668\n * 4. \u5982\u679C\u9ED8\u8BA4\u6E32\u67D3\u5668\u4E5F\u6CA1\u6709\uFF0C\u663E\u793A\u672A\u77E5\u7C7B\u578B\u63D0\u793A\n *\n * @example\n * ```tsx\n * <MessageContent\n * content={content}\n * isUser={message.role === 'user'}\n * isSystem={message.role === 'system'}\n * rendererRegistry={customRegistry}\n * />\n * ```\n */\nexport const MessageContent: React.FC<MessageContentProps> = ({\n content,\n isUser,\n isSystem,\n rendererRegistry,\n defaultRenderer,\n className = '',\n onAddToCart,\n}) => {\n // \u52A8\u6001\u6CE8\u5165 onAddToCart \u5230 product_card\u3001product_list \u548C product_comparison \u7C7B\u578B\u7684\u5185\u5BB9\u4E2D\n let processedContent = content\n if (\n (content.type === 'product_card' || content.type === 'product_list' || content.type === 'product_comparison') &&\n onAddToCart\n ) {\n processedContent = {\n ...content,\n data: {\n ...(content as any).data,\n onAddToCart,\n },\n }\n }\n\n // \u5C1D\u8BD5\u4ECE\u6CE8\u518C\u8868\u83B7\u53D6\u6E32\u67D3\u5668\n const customRenderer = rendererRegistry?.get(processedContent.type)\n\n // \u786E\u5B9A\u6700\u7EC8\u4F7F\u7528\u7684\u6E32\u67D3\u5668\n const renderer = customRenderer || defaultRenderer || defaultFallbackRenderer\n\n // \u6E32\u67D3\u5185\u5BB9\n const rendered = renderer.render(processedContent, isUser, isSystem)\n\n return <div className={className}>{rendered}</div>\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,IAAA,eAAAC,EAAAH,GAmDqB,IAAAI,EAAA,6BADrB,MAAMC,EAA2C,CAC/C,OAAQC,MAAW,QAAC,OAAI,UAAU,+BAA+B,mDAASA,EAAQ,MAAK,CACzF,EA0BaJ,EAAgD,CAAC,CAC5D,QAAAI,EACA,OAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,UAAAC,EAAY,GACZ,YAAAC,CACF,IAAM,CAEJ,IAAIC,EAAmBP,GAEpBA,EAAQ,OAAS,gBAAkBA,EAAQ,OAAS,gBAAkBA,EAAQ,OAAS,uBACxFM,IAEAC,EAAmB,CACjB,GAAGP,EACH,KAAM,CACJ,GAAIA,EAAgB,KACpB,YAAAM,CACF,CACF,GAUF,MAAME,GANiBL,GAAkB,IAAII,EAAiB,IAAI,GAG/BH,GAAmBL,GAG5B,OAAOQ,EAAkBN,EAAQC,CAAQ,EAEnE,SAAO,OAAC,OAAI,UAAWG,EAAY,SAAAG,EAAS,CAC9C",
6
+ "names": ["MessageContent_exports", "__export", "MessageContent", "__toCommonJS", "import_jsx_runtime", "defaultFallbackRenderer", "content", "isUser", "isSystem", "rendererRegistry", "defaultRenderer", "className", "onAddToCart", "processedContent", "rendered"]
7
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 消息列表组件
3
+ * 显示所有聊天消息,支持滚动
4
+ * 基于 specs/livechat-widget/plan.md 的消息列表设计
5
+ */
6
+ import React from 'react';
7
+ import type { Message, MessageRenderer } from '../types';
8
+ import { MessageRendererRegistry } from '../utils/messageRenderers';
9
+ export interface MessageListProps {
10
+ /**
11
+ * 消息列表
12
+ */
13
+ messages: Message[];
14
+ /**
15
+ * 自定义渲染器注册表
16
+ */
17
+ rendererRegistry?: MessageRendererRegistry;
18
+ /**
19
+ * 默认渲染器
20
+ */
21
+ defaultRenderer?: MessageRenderer;
22
+ /**
23
+ * 是否显示时间戳
24
+ * @default true
25
+ */
26
+ showTimestamp?: boolean;
27
+ /**
28
+ * 是否自动滚动到底部
29
+ * @default true
30
+ */
31
+ autoScroll?: boolean;
32
+ /**
33
+ * 是否正在加载历史消息
34
+ * @default false
35
+ */
36
+ isLoadingHistory?: boolean;
37
+ /**
38
+ * 空状态占位内容
39
+ */
40
+ emptyPlaceholder?: React.ReactNode;
41
+ /**
42
+ * 自定义样式类名
43
+ */
44
+ className?: string;
45
+ /**
46
+ * 商品添加到购物车回调
47
+ */
48
+ onAddToCart?: (product: any) => void;
49
+ }
50
+ /**
51
+ * 消息列表组件
52
+ *
53
+ * 功能:
54
+ * - 显示所有消息(用户、助手、系统)
55
+ * - 自动滚动到最新消息
56
+ * - 加载历史消息时显示指示器
57
+ * - 空状态占位
58
+ *
59
+ * 样式:
60
+ * - 使用自定义滚动条样式(livechat.css)
61
+ * - 内容间距合理
62
+ * - 支持响应式布局
63
+ *
64
+ * @example
65
+ * ```tsx
66
+ * <MessageList
67
+ * messages={messages}
68
+ * rendererRegistry={customRegistry}
69
+ * autoScroll={true}
70
+ * isLoadingHistory={isLoading}
71
+ * />
72
+ * ```
73
+ */
74
+ export declare const MessageList: React.FC<MessageListProps>;
@@ -0,0 +1,5 @@
1
+ "use strict";var f=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var L=(r,o)=>{for(var i in o)f(r,i,{get:o[i],enumerable:!0})},k=(r,o,i,c)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of M(o))!C.call(r,s)&&s!==i&&f(r,s,{get:()=>o[s],enumerable:!(c=w(o,s))||c.enumerable});return r};var B=r=>k(f({},"__esModule",{value:!0}),r);var z={};L(z,{MessageList:()=>S});module.exports=B(z);var e=require("react/jsx-runtime"),n=require("react"),v=require("./ChatMessage"),h=require("./ScrollAnchor");const E=()=>(0,e.jsx)("div",{className:"flex h-full items-center justify-center text-gray-400",children:(0,e.jsx)("p",{className:"text-sm",children:"No messages yet"})}),H=()=>(0,e.jsx)("div",{className:"flex justify-center py-4",children:(0,e.jsxs)("div",{className:"flex gap-1",children:[(0,e.jsx)("div",{className:"size-2 animate-bounce rounded-full bg-gray-400"}),(0,e.jsx)("div",{className:"size-2 animate-bounce rounded-full bg-gray-400",style:{animationDelay:"0.1s"}}),(0,e.jsx)("div",{className:"size-2 animate-bounce rounded-full bg-gray-400",style:{animationDelay:"0.2s"}})]})}),S=({messages:r,rendererRegistry:o,defaultRenderer:i,showTimestamp:c=!0,autoScroll:s=!0,isLoadingHistory:p=!1,emptyPlaceholder:y,className:g="",onAddToCart:b})=>{const a=(0,n.useRef)(null),[u,m]=(0,n.useState)(!1),d=(0,n.useCallback)((t=100)=>{const l=a.current;if(!l)return!0;const{scrollTop:R,scrollHeight:N,clientHeight:T}=l;return N-R-T<t},[]),x=(0,n.useCallback)(()=>{const t=a.current;t&&t.scrollTo({top:t.scrollHeight,behavior:"smooth"})},[]);return(0,n.useEffect)(()=>{const t=a.current;if(!t)return;const l=()=>{m(!d())};return l(),t.addEventListener("scroll",l,{passive:!0}),()=>t.removeEventListener("scroll",l)},[d]),(0,n.useEffect)(()=>{if(s)return;const t=setTimeout(()=>{m(!d())},150);return()=>clearTimeout(t)},[r,s,d]),(0,n.useEffect)(()=>{if(!s||!a.current)return;const t=setTimeout(()=>{a.current&&(a.current.scrollTop=a.current.scrollHeight,m(!1))},100);return()=>clearTimeout(t)},[r,s]),r.length===0&&!p?(0,e.jsx)("div",{className:`flex-1 overflow-hidden ${g}`,children:y||(0,e.jsx)(E,{})}):(0,e.jsxs)("div",{className:"relative flex-1 overflow-hidden",children:[(0,e.jsxs)("div",{ref:a,className:`
2
+ livechat-message-list absolute inset-0 overflow-y-auto p-4
3
+ ${g}
4
+ `,children:[p&&(0,e.jsx)(H,{}),(0,e.jsx)("div",{className:"flex flex-col gap-1",children:r.map(t=>(0,e.jsx)(v.ChatMessage,{message:t,rendererRegistry:o,defaultRenderer:i,showTimestamp:c,onAddToCart:b},t.id))}),s&&(0,e.jsx)(h.ScrollAnchor,{dependencies:[r]})]}),(0,e.jsx)("button",{onClick:x,className:`flex -translate-x-1/2 items-center justify-center ${u?"":"pointer-events-none"}`,style:{position:"absolute",bottom:"24px",left:"50%",zIndex:10,width:"40px",height:"40px",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.95)",boxShadow:"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",transition:"all 300ms ease-in-out",opacity:u?1:0,cursor:"pointer",border:"none"},"aria-label":"Scroll to bottom","aria-hidden":!u,children:(0,e.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-gray-700",children:(0,e.jsx)("polyline",{points:"6 9 12 15 18 9"})})})]})};
5
+ //# sourceMappingURL=MessageList.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/components/MessageList.tsx"],
4
+ "sourcesContent": ["/**\n * \u6D88\u606F\u5217\u8868\u7EC4\u4EF6\n * \u663E\u793A\u6240\u6709\u804A\u5929\u6D88\u606F\uFF0C\u652F\u6301\u6EDA\u52A8\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6D88\u606F\u5217\u8868\u8BBE\u8BA1\n */\n\nimport React, { useRef, useEffect, useState, useCallback } from 'react'\nimport type { Message, MessageRenderer } from '../types'\nimport { ChatMessage } from './ChatMessage'\nimport { ScrollAnchor } from './ScrollAnchor'\nimport { MessageRendererRegistry } from '../utils/messageRenderers'\n\nexport interface MessageListProps {\n /**\n * \u6D88\u606F\u5217\u8868\n */\n messages: Message[]\n\n /**\n * \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n */\n rendererRegistry?: MessageRendererRegistry\n\n /**\n * \u9ED8\u8BA4\u6E32\u67D3\u5668\n */\n defaultRenderer?: MessageRenderer\n\n /**\n * \u662F\u5426\u663E\u793A\u65F6\u95F4\u6233\n * @default true\n */\n showTimestamp?: boolean\n\n /**\n * \u662F\u5426\u81EA\u52A8\u6EDA\u52A8\u5230\u5E95\u90E8\n * @default true\n */\n autoScroll?: boolean\n\n /**\n * \u662F\u5426\u6B63\u5728\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\n * @default false\n */\n isLoadingHistory?: boolean\n\n /**\n * \u7A7A\u72B6\u6001\u5360\u4F4D\u5185\u5BB9\n */\n emptyPlaceholder?: React.ReactNode\n\n /**\n * \u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u5546\u54C1\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u56DE\u8C03\n */\n onAddToCart?: (product: any) => void\n}\n\n/**\n * \u9ED8\u8BA4\u7A7A\u72B6\u6001\u5360\u4F4D\n */\nconst DefaultEmptyPlaceholder: React.FC = () => (\n <div className=\"flex h-full items-center justify-center text-gray-400\">\n <p className=\"text-sm\">No messages yet</p>\n </div>\n)\n\n/**\n * \u52A0\u8F7D\u6307\u793A\u5668\n */\nconst LoadingIndicator: React.FC = () => (\n <div className=\"flex justify-center py-4\">\n <div className=\"flex gap-1\">\n <div className=\"size-2 animate-bounce rounded-full bg-gray-400\" />\n <div className=\"size-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '0.1s' }} />\n <div className=\"size-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '0.2s' }} />\n </div>\n </div>\n)\n\n/**\n * \u6D88\u606F\u5217\u8868\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u663E\u793A\u6240\u6709\u6D88\u606F\uFF08\u7528\u6237\u3001\u52A9\u624B\u3001\u7CFB\u7EDF\uFF09\n * - \u81EA\u52A8\u6EDA\u52A8\u5230\u6700\u65B0\u6D88\u606F\n * - \u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u65F6\u663E\u793A\u6307\u793A\u5668\n * - \u7A7A\u72B6\u6001\u5360\u4F4D\n *\n * \u6837\u5F0F\uFF1A\n * - \u4F7F\u7528\u81EA\u5B9A\u4E49\u6EDA\u52A8\u6761\u6837\u5F0F\uFF08livechat.css\uFF09\n * - \u5185\u5BB9\u95F4\u8DDD\u5408\u7406\n * - \u652F\u6301\u54CD\u5E94\u5F0F\u5E03\u5C40\n *\n * @example\n * ```tsx\n * <MessageList\n * messages={messages}\n * rendererRegistry={customRegistry}\n * autoScroll={true}\n * isLoadingHistory={isLoading}\n * />\n * ```\n */\nexport const MessageList: React.FC<MessageListProps> = ({\n messages,\n rendererRegistry,\n defaultRenderer,\n showTimestamp = true,\n autoScroll = true,\n isLoadingHistory = false,\n emptyPlaceholder,\n className = '',\n onAddToCart,\n}) => {\n const listRef = useRef<HTMLDivElement>(null)\n const [showScrollButton, setShowScrollButton] = useState(false)\n\n // \u68C0\u67E5\u662F\u5426\u63A5\u8FD1\u5E95\u90E8\n const isNearBottom = useCallback((threshold = 100) => {\n const container = listRef.current\n if (!container) return true\n\n const { scrollTop, scrollHeight, clientHeight } = container\n return scrollHeight - scrollTop - clientHeight < threshold\n }, [])\n\n // \u5E73\u6ED1\u6EDA\u52A8\u5230\u5E95\u90E8\n const scrollToBottom = useCallback(() => {\n const container = listRef.current\n if (!container) return\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth',\n })\n }, [])\n\n // \u76D1\u542C\u6EDA\u52A8\u4E8B\u4EF6\uFF0C\u63A7\u5236\u6309\u94AE\u663E\u793A\n useEffect(() => {\n const container = listRef.current\n if (!container) return\n\n const handleScroll = () => {\n setShowScrollButton(!isNearBottom())\n }\n\n // \u521D\u59CB\u68C0\u67E5\n handleScroll()\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n return () => container.removeEventListener('scroll', handleScroll)\n }, [isNearBottom])\n\n // \u5F53\u6D88\u606F\u5217\u8868\u53D8\u5316\u65F6\uFF0C\u91CD\u65B0\u68C0\u67E5\u6309\u94AE\u72B6\u6001\uFF08\u4F46\u4E0D\u5728\u81EA\u52A8\u6EDA\u52A8\u65F6\uFF09\n useEffect(() => {\n if (autoScroll) return // \u81EA\u52A8\u6EDA\u52A8\u4F1A\u5728\u53E6\u4E00\u4E2A effect \u4E2D\u5904\u7406\n\n const timeoutId = setTimeout(() => {\n setShowScrollButton(!isNearBottom())\n }, 150)\n\n return () => clearTimeout(timeoutId)\n }, [messages, autoScroll, isNearBottom])\n\n // \u76D1\u542C\u6D88\u606F\u5217\u8868\u53D8\u5316\uFF0C\u81EA\u52A8\u6EDA\u52A8\n useEffect(() => {\n if (!autoScroll || !listRef.current) return\n\n // \u5EF6\u8FDF\u6EDA\u52A8\u4EE5\u786E\u4FDD DOM \u5DF2\u66F4\u65B0\n const timeoutId = setTimeout(() => {\n if (listRef.current) {\n listRef.current.scrollTop = listRef.current.scrollHeight\n // \u81EA\u52A8\u6EDA\u52A8\u5230\u5E95\u90E8\u540E\uFF0C\u9690\u85CF\u6309\u94AE\n setShowScrollButton(false)\n }\n }, 100)\n\n return () => clearTimeout(timeoutId)\n }, [messages, autoScroll])\n\n // \u7A7A\u72B6\u6001\n if (messages.length === 0 && !isLoadingHistory) {\n return (\n <div className={`flex-1 overflow-hidden ${className}`}>{emptyPlaceholder || <DefaultEmptyPlaceholder />}</div>\n )\n }\n\n return (\n <div className=\"relative flex-1 overflow-hidden\">\n <div\n ref={listRef}\n className={`\n livechat-message-list absolute inset-0 overflow-y-auto p-4\n ${className}\n `}\n >\n {/* \u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u6307\u793A\u5668 */}\n {isLoadingHistory && <LoadingIndicator />}\n\n {/* \u6D88\u606F\u5217\u8868 */}\n <div className=\"flex flex-col gap-1\">\n {messages.map(message => (\n <ChatMessage\n key={message.id}\n message={message}\n rendererRegistry={rendererRegistry}\n defaultRenderer={defaultRenderer}\n showTimestamp={showTimestamp}\n onAddToCart={onAddToCart}\n />\n ))}\n </div>\n\n {/* \u6EDA\u52A8\u951A\u70B9 */}\n {autoScroll && <ScrollAnchor dependencies={[messages]} />}\n </div>\n\n {/* \u56DE\u5230\u5E95\u90E8\u6309\u94AE */}\n <button\n onClick={scrollToBottom}\n className={`flex -translate-x-1/2 items-center justify-center ${showScrollButton ? '' : 'pointer-events-none'}`}\n style={{\n position: 'absolute',\n bottom: '24px',\n left: '50%',\n zIndex: 10,\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n boxShadow: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n transition: 'all 300ms ease-in-out',\n opacity: showScrollButton ? 1 : 0,\n cursor: 'pointer',\n border: 'none',\n }}\n aria-label=\"Scroll to bottom\"\n aria-hidden={!showScrollButton}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-gray-700\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n )\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GAmEI,IAAAI,EAAA,6BA7DJC,EAAgE,iBAEhEC,EAA4B,yBAC5BC,EAA6B,0BAwD7B,MAAMC,EAAoC,OACxC,OAAC,OAAI,UAAU,wDACb,mBAAC,KAAE,UAAU,UAAU,2BAAe,EACxC,EAMIC,EAA6B,OACjC,OAAC,OAAI,UAAU,2BACb,oBAAC,OAAI,UAAU,aACb,oBAAC,OAAI,UAAU,iDAAiD,KAChE,OAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,MAAO,EAAG,KACnG,OAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,MAAO,EAAG,GACrG,EACF,EA2BWP,EAA0C,CAAC,CACtD,SAAAQ,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAC,EAAgB,GAChB,WAAAC,EAAa,GACb,iBAAAC,EAAmB,GACnB,iBAAAC,EACA,UAAAC,EAAY,GACZ,YAAAC,CACF,IAAM,CACJ,MAAMC,KAAU,UAAuB,IAAI,EACrC,CAACC,EAAkBC,CAAmB,KAAI,YAAS,EAAK,EAGxDC,KAAe,eAAY,CAACC,EAAY,MAAQ,CACpD,MAAMC,EAAYL,EAAQ,QAC1B,GAAI,CAACK,EAAW,MAAO,GAEvB,KAAM,CAAE,UAAAC,EAAW,aAAAC,EAAc,aAAAC,CAAa,EAAIH,EAClD,OAAOE,EAAeD,EAAYE,EAAeJ,CACnD,EAAG,CAAC,CAAC,EAGCK,KAAiB,eAAY,IAAM,CACvC,MAAMJ,EAAYL,EAAQ,QACrBK,GAELA,EAAU,SAAS,CACjB,IAAKA,EAAU,aACf,SAAU,QACZ,CAAC,CACH,EAAG,CAAC,CAAC,EA8CL,SA3CA,aAAU,IAAM,CACd,MAAMA,EAAYL,EAAQ,QAC1B,GAAI,CAACK,EAAW,OAEhB,MAAMK,EAAe,IAAM,CACzBR,EAAoB,CAACC,EAAa,CAAC,CACrC,EAGA,OAAAO,EAAa,EAEbL,EAAU,iBAAiB,SAAUK,EAAc,CAAE,QAAS,EAAK,CAAC,EAC7D,IAAML,EAAU,oBAAoB,SAAUK,CAAY,CACnE,EAAG,CAACP,CAAY,CAAC,KAGjB,aAAU,IAAM,CACd,GAAIR,EAAY,OAEhB,MAAMgB,EAAY,WAAW,IAAM,CACjCT,EAAoB,CAACC,EAAa,CAAC,CACrC,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaQ,CAAS,CACrC,EAAG,CAACpB,EAAUI,EAAYQ,CAAY,CAAC,KAGvC,aAAU,IAAM,CACd,GAAI,CAACR,GAAc,CAACK,EAAQ,QAAS,OAGrC,MAAMW,EAAY,WAAW,IAAM,CAC7BX,EAAQ,UACVA,EAAQ,QAAQ,UAAYA,EAAQ,QAAQ,aAE5CE,EAAoB,EAAK,EAE7B,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaS,CAAS,CACrC,EAAG,CAACpB,EAAUI,CAAU,CAAC,EAGrBJ,EAAS,SAAW,GAAK,CAACK,KAE1B,OAAC,OAAI,UAAW,0BAA0BE,CAAS,GAAK,SAAAD,MAAoB,OAACR,EAAA,EAAwB,EAAG,KAK1G,QAAC,OAAI,UAAU,kCACb,qBAAC,OACC,IAAKW,EACL,UAAW;AAAA;AAAA,YAEPF,CAAS;AAAA,UAIZ,UAAAF,MAAoB,OAACN,EAAA,EAAiB,KAGvC,OAAC,OAAI,UAAU,sBACZ,SAAAC,EAAS,IAAIqB,MACZ,OAAC,eAEC,QAASA,EACT,iBAAkBpB,EAClB,gBAAiBC,EACjB,cAAeC,EACf,YAAaK,GALRa,EAAQ,EAMf,CACD,EACH,EAGCjB,MAAc,OAAC,gBAAa,aAAc,CAACJ,CAAQ,EAAG,GACzD,KAGA,OAAC,UACC,QAASkB,EACT,UAAW,qDAAqDR,EAAmB,GAAK,qBAAqB,GAC7G,MAAO,CACL,SAAU,WACV,OAAQ,OACR,KAAM,MACN,OAAQ,GACR,MAAO,OACP,OAAQ,OACR,aAAc,MACd,gBAAiB,4BACjB,UAAW,qEACX,WAAY,wBACZ,QAASA,EAAmB,EAAI,EAChC,OAAQ,UACR,OAAQ,MACV,EACA,aAAW,mBACX,cAAa,CAACA,EAEd,mBAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,UAAU,gBAEV,mBAAC,YAAS,OAAO,iBAAiB,EACpC,EACF,GACF,CAEJ",
6
+ "names": ["MessageList_exports", "__export", "MessageList", "__toCommonJS", "import_jsx_runtime", "import_react", "import_ChatMessage", "import_ScrollAnchor", "DefaultEmptyPlaceholder", "LoadingIndicator", "messages", "rendererRegistry", "defaultRenderer", "showTimestamp", "autoScroll", "isLoadingHistory", "emptyPlaceholder", "className", "onAddToCart", "listRef", "showScrollButton", "setShowScrollButton", "isNearBottom", "threshold", "container", "scrollTop", "scrollHeight", "clientHeight", "scrollToBottom", "handleScroll", "timeoutId", "message"]
7
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 滚动锚点组件
3
+ * 用于自动滚动到消息列表底部
4
+ * 基于 specs/livechat-widget/plan.md 的滚动行为设计
5
+ */
6
+ import React from 'react';
7
+ export interface ScrollAnchorProps {
8
+ /**
9
+ * 是否自动滚动
10
+ * @default true
11
+ */
12
+ autoScroll?: boolean;
13
+ /**
14
+ * 滚动行为
15
+ * @default "smooth"
16
+ */
17
+ behavior?: ScrollBehavior;
18
+ /**
19
+ * 依赖项(当依赖项变化时触发滚动)
20
+ */
21
+ dependencies?: any[];
22
+ }
23
+ /**
24
+ * 滚动锚点组件
25
+ *
26
+ * 功能:
27
+ * - 放置在消息列表底部
28
+ * - 当新消息到达时自动滚动到此位置
29
+ * - 支持平滑滚动动画
30
+ *
31
+ * 使用场景:
32
+ * - 接收新消息时自动滚动
33
+ * - 发送消息后自动滚动
34
+ * - 加载历史消息后保持位置
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * <MessageList>
39
+ * {messages.map(msg => <ChatMessage key={msg.id} message={msg} />)}
40
+ * <ScrollAnchor dependencies={[messages]} />
41
+ * </MessageList>
42
+ * ```
43
+ */
44
+ export declare const ScrollAnchor: React.FC<ScrollAnchorProps>;
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var h=(o,e)=>{for(var t in e)l(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of a(e))!f.call(o,r)&&r!==t&&l(o,r,{get:()=>e[r],enumerable:!(n=u(e,r))||n.enumerable});return o};var p=o=>m(l({},"__esModule",{value:!0}),o);var R={};h(R,{ScrollAnchor:()=>d});module.exports=p(R);var i=require("react/jsx-runtime"),c=require("react");const d=({autoScroll:o=!0,behavior:e="smooth",dependencies:t=[]})=>{const n=(0,c.useRef)(null);return(0,c.useEffect)(()=>{if(!o)return;const r=n.current;if(!r)return;const s=setTimeout(()=>{r.scrollIntoView({behavior:e,block:"end",inline:"nearest"})},100);return()=>clearTimeout(s)},[o,e,...t]),(0,i.jsx)("div",{ref:n,style:{height:0}})};
2
+ //# sourceMappingURL=ScrollAnchor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/components/ScrollAnchor.tsx"],
4
+ "sourcesContent": ["/**\n * \u6EDA\u52A8\u951A\u70B9\u7EC4\u4EF6\n * \u7528\u4E8E\u81EA\u52A8\u6EDA\u52A8\u5230\u6D88\u606F\u5217\u8868\u5E95\u90E8\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6EDA\u52A8\u884C\u4E3A\u8BBE\u8BA1\n */\n\nimport React, { useEffect, useRef } from 'react'\n\nexport interface ScrollAnchorProps {\n /**\n * \u662F\u5426\u81EA\u52A8\u6EDA\u52A8\n * @default true\n */\n autoScroll?: boolean\n\n /**\n * \u6EDA\u52A8\u884C\u4E3A\n * @default \"smooth\"\n */\n behavior?: ScrollBehavior\n\n /**\n * \u4F9D\u8D56\u9879\uFF08\u5F53\u4F9D\u8D56\u9879\u53D8\u5316\u65F6\u89E6\u53D1\u6EDA\u52A8\uFF09\n */\n dependencies?: any[]\n}\n\n/**\n * \u6EDA\u52A8\u951A\u70B9\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u653E\u7F6E\u5728\u6D88\u606F\u5217\u8868\u5E95\u90E8\n * - \u5F53\u65B0\u6D88\u606F\u5230\u8FBE\u65F6\u81EA\u52A8\u6EDA\u52A8\u5230\u6B64\u4F4D\u7F6E\n * - \u652F\u6301\u5E73\u6ED1\u6EDA\u52A8\u52A8\u753B\n *\n * \u4F7F\u7528\u573A\u666F\uFF1A\n * - \u63A5\u6536\u65B0\u6D88\u606F\u65F6\u81EA\u52A8\u6EDA\u52A8\n * - \u53D1\u9001\u6D88\u606F\u540E\u81EA\u52A8\u6EDA\u52A8\n * - \u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u540E\u4FDD\u6301\u4F4D\u7F6E\n *\n * @example\n * ```tsx\n * <MessageList>\n * {messages.map(msg => <ChatMessage key={msg.id} message={msg} />)}\n * <ScrollAnchor dependencies={[messages]} />\n * </MessageList>\n * ```\n */\nexport const ScrollAnchor: React.FC<ScrollAnchorProps> = ({\n autoScroll = true,\n behavior = 'smooth',\n dependencies = [],\n}) => {\n const anchorRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!autoScroll) return\n\n const anchor = anchorRef.current\n if (!anchor) return\n\n // \u4F7F\u7528 setTimeout \u786E\u4FDD DOM \u5DF2\u66F4\u65B0\n const timeoutId = setTimeout(() => {\n anchor.scrollIntoView({\n behavior,\n block: 'end',\n inline: 'nearest',\n })\n }, 100)\n\n return () => clearTimeout(timeoutId)\n }, [autoScroll, behavior, ...dependencies])\n\n return <div ref={anchorRef} style={{ height: 0 }} />\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAyES,IAAAI,EAAA,6BAnETC,EAAyC,iBA0ClC,MAAMH,EAA4C,CAAC,CACxD,WAAAI,EAAa,GACb,SAAAC,EAAW,SACX,aAAAC,EAAe,CAAC,CAClB,IAAM,CACJ,MAAMC,KAAY,UAAuB,IAAI,EAE7C,sBAAU,IAAM,CACd,GAAI,CAACH,EAAY,OAEjB,MAAMI,EAASD,EAAU,QACzB,GAAI,CAACC,EAAQ,OAGb,MAAMC,EAAY,WAAW,IAAM,CACjCD,EAAO,eAAe,CACpB,SAAAH,EACA,MAAO,MACP,OAAQ,SACV,CAAC,CACH,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaI,CAAS,CACrC,EAAG,CAACL,EAAYC,EAAU,GAAGC,CAAY,CAAC,KAEnC,OAAC,OAAI,IAAKC,EAAW,MAAO,CAAE,OAAQ,CAAE,EAAG,CACpD",
6
+ "names": ["ScrollAnchor_exports", "__export", "ScrollAnchor", "__toCommonJS", "import_jsx_runtime", "import_react", "autoScroll", "behavior", "dependencies", "anchorRef", "anchor", "timeoutId"]
7
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * LiveChat 组件常量定义
3
+ */
4
+ import type { CommonText } from './types';
5
+ /**
6
+ * 货币符号映射表
7
+ * 用于将货币代码转换为对应的符号
8
+ */
9
+ export declare const CURRENCY_SYMBOLS: Record<string, string>;
10
+ /**
11
+ * 默认文案配置
12
+ */
13
+ export declare const DEFAULT_COMMON_TEXT: Required<CommonText>;
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var N=(e,o)=>{for(var r in o)s(e,r,{get:o[r],enumerable:!0})},a=(e,o,r,D)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of T(o))!n.call(e,t)&&t!==r&&s(e,t,{get:()=>o[t],enumerable:!(D=C(o,t))||D.enumerable});return e};var i=e=>a(s({},"__esModule",{value:!0}),e);var M={};N(M,{CURRENCY_SYMBOLS:()=>A,DEFAULT_COMMON_TEXT:()=>L});module.exports=i(M);const A={USD:"$",CAD:"CA$",GBP:"\xA3",EUR:"\u20AC",AUD:"$",SGD:"$",NZD:"NZ$",AED:"AED ",VND:"\u20AB",TWD:"NT$",PLN:"z\u0142",RON:"Lei"},L={learnMore:"Learn More",showLess:"Show Less",addToCart:"Add to Cart",viewMore:"View More",off:"OFF",total:"Total"};
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/LiveChatWidget/constants.ts"],
4
+ "sourcesContent": ["/**\n * LiveChat \u7EC4\u4EF6\u5E38\u91CF\u5B9A\u4E49\n */\n\nimport type { CommonText } from './types'\n\n/**\n * \u8D27\u5E01\u7B26\u53F7\u6620\u5C04\u8868\n * \u7528\u4E8E\u5C06\u8D27\u5E01\u4EE3\u7801\u8F6C\u6362\u4E3A\u5BF9\u5E94\u7684\u7B26\u53F7\n */\nexport const CURRENCY_SYMBOLS: Record<string, string> = {\n USD: \"$\",\n CAD: \"CA$\",\n GBP: \"\u00A3\",\n EUR: \"\u20AC\",\n AUD: \"$\",\n SGD: \"$\",\n NZD: \"NZ$\",\n AED: \"AED \",\n VND: \"\u20AB\",\n TWD: \"NT$\",\n PLN: \"z\u0142\",\n RON: \"Lei\"\n}\n\n/**\n * \u9ED8\u8BA4\u6587\u6848\u914D\u7F6E\n */\nexport const DEFAULT_COMMON_TEXT: Required<CommonText> = {\n learnMore: 'Learn More',\n showLess: 'Show Less',\n addToCart: 'Add to Cart',\n viewMore: 'View More',\n off: 'OFF',\n total: 'Total',\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,EAAA,wBAAAC,IAAA,eAAAC,EAAAJ,GAUO,MAAME,EAA2C,CACpD,IAAK,IACL,IAAK,MACL,IAAK,OACL,IAAK,SACL,IAAK,IACL,IAAK,IACL,IAAK,MACL,IAAK,OACL,IAAK,SACL,IAAK,MACL,IAAK,UACL,IAAK,KACT,EAKaC,EAA4C,CACvD,UAAW,aACX,SAAU,YACV,UAAW,cACX,SAAU,YACV,IAAK,MACL,MAAO,OACT",
6
+ "names": ["constants_exports", "__export", "CURRENCY_SYMBOLS", "DEFAULT_COMMON_TEXT", "__toCommonJS"]
7
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 聊天 API 调用 Hook
3
+ * 封装 SSE 流式消息接收、历史消息加载、新会话创建
4
+ * 基于 specs/livechat-widget/plan.md 的 API 调用策略
5
+ */
6
+ import type { ChatStreamRequest, SSEEvent, NewSessionRequest, NewSessionResponse } from '../types';
7
+ import { type RecaptchaConfig } from '../api/chat';
8
+ export interface UseChatAPIOptions {
9
+ /**
10
+ * API 基础 URL
11
+ */
12
+ apiBaseUrl: string;
13
+ /**
14
+ * 自定义请求头
15
+ */
16
+ headers?: Record<string, string>;
17
+ /**
18
+ * reCAPTCHA 配置
19
+ */
20
+ recaptchaConfig?: RecaptchaConfig;
21
+ /**
22
+ * 错误处理回调
23
+ */
24
+ onError?: (error: Error) => void;
25
+ }
26
+ export interface UseChatAPIReturn {
27
+ /**
28
+ * 发送消息并接收 SSE 流式响应
29
+ * @param request 请求参数
30
+ * @param onEvent SSE 事件回调
31
+ * @returns Promise<void>
32
+ */
33
+ sendMessageStream: (request: ChatStreamRequest, onEvent: (event: SSEEvent) => void) => Promise<void>;
34
+ /**
35
+ * 创建新会话或恢复现有会话
36
+ * @param request 请求参数
37
+ * @returns 新会话信息,可能包含历史消息
38
+ */
39
+ createSession: (request: NewSessionRequest) => Promise<NewSessionResponse>;
40
+ /**
41
+ * 中断当前的 SSE 流
42
+ */
43
+ abortStream: () => void;
44
+ /**
45
+ * 是否正在发送消息
46
+ */
47
+ isSending: boolean;
48
+ }
49
+ /**
50
+ * 聊天 API 调用 Hook
51
+ *
52
+ * 功能:
53
+ * 1. sendMessageStream: 发送消息并接收 SSE 流式响应
54
+ * 2. createSession: 创建新会话或恢复现有会话
55
+ * 3. abortStream: 中断当前流
56
+ *
57
+ * @param options Hook 配置选项
58
+ * @returns API 调用工具对象
59
+ */
60
+ export declare function useChatAPI(options: UseChatAPIOptions): UseChatAPIReturn;
@@ -0,0 +1,2 @@
1
+ "use strict";var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var E=(t,e)=>{for(var s in e)f(t,s,{get:e[s],enumerable:!0})},g=(t,e,s,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of R(e))!d.call(t,r)&&r!==s&&f(t,r,{get:()=>e[r],enumerable:!(o=m(e,r))||o.enumerable});return t};var w=t=>g(f({},"__esModule",{value:!0}),t);var b={};E(b,{useChatAPI:()=>v});module.exports=w(b);var a=require("react"),l=require("../api/chat");function v(t){const{apiBaseUrl:e,headers:s,recaptchaConfig:o,onError:r}=t,n=(0,a.useRef)(null),u=(0,a.useRef)(!1),h=(0,a.useCallback)(async(S,i)=>{n.current&&n.current.abort(),n.current=new AbortController,u.current=!0;try{await(0,l.sendMessage)(e,S,i,s,o)}catch(c){if(c instanceof Error&&c.name==="AbortError")return;throw console.error("[useChatAPI] Stream error:",c),r?.(c),c}finally{u.current=!1,n.current=null}},[e,s,o,r]),p=(0,a.useCallback)(async S=>{try{return await(0,l.createNewSession)(e,S,s,o)}catch(i){throw console.error("[useChatAPI] Create session error:",i),r?.(i),i}},[e,s,o,r]),C=(0,a.useCallback)(()=>{n.current&&(n.current.abort(),n.current=null,u.current=!1)},[]);return{sendMessageStream:h,createSession:p,abortStream:C,isSending:u.current}}
2
+ //# sourceMappingURL=useChatAPI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/hooks/useChatAPI.ts"],
4
+ "sourcesContent": ["/**\n * \u804A\u5929 API \u8C03\u7528 Hook\n * \u5C01\u88C5 SSE \u6D41\u5F0F\u6D88\u606F\u63A5\u6536\u3001\u5386\u53F2\u6D88\u606F\u52A0\u8F7D\u3001\u65B0\u4F1A\u8BDD\u521B\u5EFA\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684 API \u8C03\u7528\u7B56\u7565\n */\n\nimport { useCallback, useRef } from 'react'\nimport type { ChatStreamRequest, SSEEvent, NewSessionRequest, NewSessionResponse } from '../types'\nimport { sendMessage, createNewSession, type RecaptchaConfig } from '../api/chat'\n\nexport interface UseChatAPIOptions {\n /**\n * API \u57FA\u7840 URL\n */\n apiBaseUrl: string\n\n /**\n * \u81EA\u5B9A\u4E49\u8BF7\u6C42\u5934\n */\n headers?: Record<string, string>\n\n /**\n * reCAPTCHA \u914D\u7F6E\n */\n recaptchaConfig?: RecaptchaConfig\n\n /**\n * \u9519\u8BEF\u5904\u7406\u56DE\u8C03\n */\n onError?: (error: Error) => void\n}\n\nexport interface UseChatAPIReturn {\n /**\n * \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n * @param request \u8BF7\u6C42\u53C2\u6570\n * @param onEvent SSE \u4E8B\u4EF6\u56DE\u8C03\n * @returns Promise<void>\n */\n sendMessageStream: (request: ChatStreamRequest, onEvent: (event: SSEEvent) => void) => Promise<void>\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n * @param request \u8BF7\u6C42\u53C2\u6570\n * @returns \u65B0\u4F1A\u8BDD\u4FE1\u606F\uFF0C\u53EF\u80FD\u5305\u542B\u5386\u53F2\u6D88\u606F\n */\n createSession: (request: NewSessionRequest) => Promise<NewSessionResponse>\n\n /**\n * \u4E2D\u65AD\u5F53\u524D\u7684 SSE \u6D41\n */\n abortStream: () => void\n\n /**\n * \u662F\u5426\u6B63\u5728\u53D1\u9001\u6D88\u606F\n */\n isSending: boolean\n}\n\n/**\n * \u804A\u5929 API \u8C03\u7528 Hook\n *\n * \u529F\u80FD\uFF1A\n * 1. sendMessageStream: \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n * 2. createSession: \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n * 3. abortStream: \u4E2D\u65AD\u5F53\u524D\u6D41\n *\n * @param options Hook \u914D\u7F6E\u9009\u9879\n * @returns API \u8C03\u7528\u5DE5\u5177\u5BF9\u8C61\n */\nexport function useChatAPI(options: UseChatAPIOptions): UseChatAPIReturn {\n const { apiBaseUrl, headers, recaptchaConfig, onError } = options\n\n // \u7528\u4E8E\u4E2D\u65AD\u5F53\u524D\u8BF7\u6C42\u7684 AbortController\n const abortControllerRef = useRef<AbortController | null>(null)\n\n // \u53D1\u9001\u72B6\u6001\u6807\u8BB0\n const isSendingRef = useRef(false)\n\n /**\n * \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n */\n const sendMessageStream = useCallback(\n async (request: ChatStreamRequest, onEvent: (event: SSEEvent) => void) => {\n // \u5982\u679C\u6B63\u5728\u53D1\u9001\uFF0C\u5148\u4E2D\u65AD\u4E4B\u524D\u7684\u8BF7\u6C42\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n }\n\n // \u521B\u5EFA\u65B0\u7684 AbortController\n abortControllerRef.current = new AbortController()\n isSendingRef.current = true\n\n try {\n await sendMessage(apiBaseUrl, request, onEvent, headers, recaptchaConfig)\n } catch (error) {\n // \u5FFD\u7565\u624B\u52A8\u4E2D\u65AD\u7684\u9519\u8BEF\n if (error instanceof Error && error.name === 'AbortError') {\n return\n }\n\n console.error('[useChatAPI] Stream error:', error)\n onError?.(error as Error)\n throw error\n } finally {\n isSendingRef.current = false\n abortControllerRef.current = null\n }\n },\n [apiBaseUrl, headers, recaptchaConfig, onError]\n )\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n */\n const createSession = useCallback(\n async (request: NewSessionRequest): Promise<NewSessionResponse> => {\n try {\n return await createNewSession(apiBaseUrl, request, headers, recaptchaConfig)\n } catch (error) {\n console.error('[useChatAPI] Create session error:', error)\n onError?.(error as Error)\n throw error\n }\n },\n [apiBaseUrl, headers, recaptchaConfig, onError]\n )\n\n /**\n * \u4E2D\u65AD\u5F53\u524D\u7684 SSE \u6D41\n */\n const abortStream = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n isSendingRef.current = false\n }\n }, [])\n\n return {\n sendMessageStream,\n createSession,\n abortStream,\n isSending: isSendingRef.current,\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EAAoC,iBAEpCC,EAAoE,uBA8D7D,SAASH,EAAWI,EAA8C,CACvE,KAAM,CAAE,WAAAC,EAAY,QAAAC,EAAS,gBAAAC,EAAiB,QAAAC,CAAQ,EAAIJ,EAGpDK,KAAqB,UAA+B,IAAI,EAGxDC,KAAe,UAAO,EAAK,EAK3BC,KAAoB,eACxB,MAAOC,EAA4BC,IAAuC,CAEpEJ,EAAmB,SACrBA,EAAmB,QAAQ,MAAM,EAInCA,EAAmB,QAAU,IAAI,gBACjCC,EAAa,QAAU,GAEvB,GAAI,CACF,QAAM,eAAYL,EAAYO,EAASC,EAASP,EAASC,CAAe,CAC1E,OAASO,EAAO,CAEd,GAAIA,aAAiB,OAASA,EAAM,OAAS,aAC3C,OAGF,cAAQ,MAAM,6BAA8BA,CAAK,EACjDN,IAAUM,CAAc,EAClBA,CACR,QAAE,CACAJ,EAAa,QAAU,GACvBD,EAAmB,QAAU,IAC/B,CACF,EACA,CAACJ,EAAYC,EAASC,EAAiBC,CAAO,CAChD,EAKMO,KAAgB,eACpB,MAAOH,GAA4D,CACjE,GAAI,CACF,OAAO,QAAM,oBAAiBP,EAAYO,EAASN,EAASC,CAAe,CAC7E,OAASO,EAAO,CACd,cAAQ,MAAM,qCAAsCA,CAAK,EACzDN,IAAUM,CAAc,EAClBA,CACR,CACF,EACA,CAACT,EAAYC,EAASC,EAAiBC,CAAO,CAChD,EAKMQ,KAAc,eAAY,IAAM,CAChCP,EAAmB,UACrBA,EAAmB,QAAQ,MAAM,EACjCA,EAAmB,QAAU,KAC7BC,EAAa,QAAU,GAE3B,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,kBAAAC,EACA,cAAAI,EACA,YAAAC,EACA,UAAWN,EAAa,OAC1B,CACF",
6
+ "names": ["useChatAPI_exports", "__export", "useChatAPI", "__toCommonJS", "import_react", "import_chat", "options", "apiBaseUrl", "headers", "recaptchaConfig", "onError", "abortControllerRef", "isSendingRef", "sendMessageStream", "request", "onEvent", "error", "createSession", "abortStream"]
7
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * 聊天状态管理 Hook
3
+ * 管理消息列表、窗口状态、输入框状态、流式消息累积
4
+ * 基于 specs/livechat-widget/plan.md 的状态管理策略
5
+ */
6
+ import type { Message, SSEEvent, Product } from '../types';
7
+ export interface UseChatStateOptions {
8
+ /**
9
+ * 初始欢迎消息
10
+ */
11
+ welcomeMessage?: string;
12
+ /**
13
+ * Shopify 店铺域名
14
+ */
15
+ site?: string;
16
+ /**
17
+ * 受控模式:是否打开聊天窗口
18
+ * 提供此参数时,组件处于受控模式
19
+ */
20
+ open?: boolean;
21
+ /**
22
+ * 受控模式:状态变化回调(必需)
23
+ * 用于同步状态到父组件
24
+ */
25
+ onOpenChange?: (open: boolean) => void;
26
+ /**
27
+ * 窗口打开事件监听(可选)
28
+ * 用于埋点、日志等副作用
29
+ */
30
+ onOpen?: () => void;
31
+ /**
32
+ * 窗口关闭事件监听(可选)
33
+ * 用于埋点、日志等副作用
34
+ */
35
+ onClose?: () => void;
36
+ /**
37
+ * 消息发送回调
38
+ */
39
+ onMessageSend?: (message: string) => void;
40
+ /**
41
+ * 错误处理回调
42
+ */
43
+ onError?: (error: Error) => void;
44
+ /**
45
+ * AI 消息回调
46
+ */
47
+ /**
48
+ * AI 回复文本消息时触发
49
+ */
50
+ onTextMessage?: () => void;
51
+ /**
52
+ * AI 回复商品列表卡片时触发
53
+ */
54
+ onProductList?: () => void;
55
+ /**
56
+ * AI 回复促销卡片时触发
57
+ */
58
+ onPromotionList?: () => void;
59
+ /**
60
+ * 商品添加到购物车回调
61
+ */
62
+ onAddToCart?: (product: any) => void;
63
+ /**
64
+ * 购物车按钮点击回调
65
+ */
66
+ onCart?: (cartId: string, checkoutUrl?: string) => void;
67
+ /**
68
+ * 自定义产品卡片渲染函数
69
+ */
70
+ productCardRender?: (product: Product) => React.ReactNode;
71
+ }
72
+ export interface UseChatStateReturn {
73
+ /**
74
+ * 消息列表
75
+ */
76
+ messages: Message[];
77
+ /**
78
+ * 聊天窗口是否打开
79
+ */
80
+ isOpen: boolean;
81
+ /**
82
+ * 用户 ID
83
+ */
84
+ userId: string;
85
+ /**
86
+ * 会话 ID
87
+ */
88
+ sessionId: string | null;
89
+ /**
90
+ * 输入框内容
91
+ */
92
+ inputValue: string;
93
+ /**
94
+ * 是否正在接收流式消息
95
+ */
96
+ isStreaming: boolean;
97
+ /**
98
+ * 打开聊天窗口
99
+ */
100
+ openChat: () => void;
101
+ /**
102
+ * 关闭聊天窗口
103
+ */
104
+ closeChat: () => void;
105
+ /**
106
+ * 切换聊天窗口状态
107
+ */
108
+ toggleChat: () => void;
109
+ /**
110
+ * 设置输入框内容
111
+ */
112
+ setInputValue: (value: string) => void;
113
+ /**
114
+ * 添加消息到列表
115
+ */
116
+ addMessage: (message: Message) => void;
117
+ /**
118
+ * 批量设置消息列表(用于加载历史)
119
+ */
120
+ setMessages: (messages: Message[]) => void;
121
+ /**
122
+ * 清空消息列表
123
+ */
124
+ clearMessages: () => void;
125
+ /**
126
+ * 处理 SSE 事件
127
+ */
128
+ handleSSEEvent: (event: SSEEvent) => void;
129
+ /**
130
+ * 保存会话 ID
131
+ */
132
+ saveSession: (id: string) => void;
133
+ /**
134
+ * 清空会话
135
+ */
136
+ clearSession: () => void;
137
+ }
138
+ /**
139
+ * 聊天状态管理 Hook
140
+ *
141
+ * 功能:
142
+ * 1. 管理消息列表(添加、清空、批量设置)
143
+ * 2. 管理窗口状态(打开、关闭、切换)
144
+ * 3. 管理输入框状态
145
+ * 4. 处理 SSE 流式消息事件
146
+ * 5. 累积流式文本内容
147
+ *
148
+ * @param options Hook 配置选项
149
+ * @returns 状态管理工具对象
150
+ */
151
+ export declare function useChatState(options?: UseChatStateOptions): UseChatStateReturn;
@@ -0,0 +1,2 @@
1
+ "use strict";var V=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var it=Object.prototype.hasOwnProperty;var dt=(t,c)=>{for(var h in c)V(t,h,{get:c[h],enumerable:!0})},ut=(t,c,h,x)=>{if(c&&typeof c=="object"||typeof c=="function")for(let p of ct(c))!it.call(t,p)&&p!==h&&V(t,p,{get:()=>c[p],enumerable:!(x=rt(c,p))||x.enumerable});return t};var lt=t=>ut(V({},"__esModule",{value:!0}),t);var yt={};dt(yt,{useChatState:()=>Ct});module.exports=lt(yt);var u=require("react"),K=require("../utils/userId"),W=require("./useSession"),F=require("../utils/productTransformers"),j=require("../utils/cartTransformers");function pt(t,c,h,x,p){const o=[],f=/\{\{(?:product:)?([^}]+)\}\}/g;let S=0,a,C=!1;for(;(a=f.exec(t))!==null;){C=!0;const r=t.slice(S,a.index);r&&o.push({type:"text",text:r});const i=a[1].trim(),M=c.get(i),E=h.get(i);M?(console.log("[useChatState] \u{1F3AF} \u5B9E\u65F6\u68C0\u6D4B\u5230\u4EA7\u54C1:",i,"\u2192",M.title),o.push({type:"product_card",data:{product:M,rawProduct:E,onAddToCart:x,productCardRender:p}})):(console.warn("[useChatState] \u26A0\uFE0F \u5B9E\u65F6\u89E3\u6790\u672A\u627E\u5230\u4EA7\u54C1:",i),o.push({type:"text",text:a[0]})),S=f.lastIndex}if(C){const r=t.slice(S);return{contents:o,remainingBuffer:r}}else{const r=t.match(/\{\{[^}]*$/);if(r){const i=t.slice(0,r.index);return i&&o.push({type:"text",text:i}),{contents:o,remainingBuffer:r[0]}}else return t&&o.push({type:"text",text:t}),{contents:o,remainingBuffer:""}}}function ft(t,c,h,x,p){const o=[],f=/\{\{(?:product:)?([^}]+)\}\}/g;let S=0,a;for(;(a=f.exec(t))!==null;){const r=t.slice(S,a.index).trim(),i=a[1].trim();r&&o.push({type:"text",text:r});const M=c.get(i),E=h.get(i);if(M)console.log(`[useChatState] \u2705 \u627E\u5230\u4EA7\u54C1\u5339\u914D: ${i} \u2192 ${M.title}`),o.push({type:"product_card",data:{product:M,rawProduct:E,onAddToCart:x,productCardRender:p}});else{const R=Array.from(c.keys());console.warn(`[useChatState] \u274C Product not found for ID: "${i}"`),console.warn("[useChatState] \u53EF\u7528\u7684\u4EA7\u54C1ID\u5217\u8868:",R),console.warn("[useChatState] ID\u7C7B\u578B:",typeof i,"\u957F\u5EA6:",i.length),o.push({type:"text",text:a[0]})}S=f.lastIndex}const C=t.slice(S).trim();return C&&o.push({type:"text",text:C}),o}function gt(t,c,h,x,p){const o=[];for(const f of t)if(f.type==="text"){const a=ft(f.text,c,h,x,p);o.push(...a)}else{if(f.type==="product_list")continue;o.push(f)}return o}function ht(t,c,h){if(!t.content.some(a=>a.type==="product_list")||!t.content.some(a=>a.type==="text"&&/\{\{(?:product:)?[^}]+\}\}/.test(a.text)))return t;console.log("[useChatState] \u68C0\u6D4B\u5230\u5386\u53F2\u6D88\u606F\u9700\u8981\u91CD\u7EC4, \u6D88\u606FID:",t.id);const o=new Map,f=new Map;t.structured_content&&t.structured_content.forEach(a=>{a.type==="product_list"&&Array.isArray(a.data)&&a.data.forEach(C=>{if(C&&C.shopify_product_id){const r=C.shopify_product_id;f.set(r,C);const i=r.match(/\d+$/)?.[0];i&&f.set(i,C),console.log("[useChatState] \u4ECE structured_content \u63D0\u53D6\u539F\u59CB\u4EA7\u54C1\u6570\u636E:",{fullId:r,numericId:i,title:C.title})}})}),t.content.forEach(a=>{a.type==="product_list"&&a.data.products.forEach(r=>{if(r&&r.shopifyId){o.set(r.shopifyId,r);const i=r.shopifyId.match(/\d+$/)?.[0];i&&o.set(i,r)}})});const S=gt(t.content,o,f,c,h);return{...t,content:S}}function Ct(t={}){const{welcomeMessage:c,site:h,open:x,onOpenChange:p,onOpen:o,onClose:f,onMessageSend:S,onError:a,onTextMessage:C,onProductList:r,onPromotionList:i,onAddToCart:M,onCart:E,productCardRender:R}=t,{sessionId:O,saveSession:L,clearSession:B}=(0,W.useSession)(),[G,J]=(0,u.useState)("");(0,u.useEffect)(()=>{(0,K.getUserId)().then(m=>J(m))},[]);const[Q,k]=(0,u.useState)(()=>c?[{id:`welcome-${Date.now()}`,role:"assistant",content:[{type:"text",text:c}],timestamp:Date.now()}]:[]),[X,U]=(0,u.useState)(!1),D=x!==void 0,N=D?x:X,[Y,Z]=(0,u.useState)(""),[tt,w]=(0,u.useState)(!1),n=(0,u.useRef)(null),q=(0,u.useRef)(!1),b=(0,u.useRef)(new Map),A=(0,u.useRef)(new Map),_=(0,u.useRef)(""),et=(0,u.useCallback)(()=>{D||U(!0),p?.(!0),o?.()},[D,p,o]),nt=(0,u.useCallback)(()=>{D||U(!1),p?.(!1),f?.()},[D,p,f]),st=(0,u.useCallback)(()=>{const m=!N;D||U(m),p?.(m),m?o?.():f?.()},[D,N,p,o,f]),$=(0,u.useCallback)(m=>{if(!m){console.warn("[useChatState] Attempted to add null/undefined message");return}k(P=>[...P,m])},[]),ot=(0,u.useCallback)(m=>{const P=m.filter(d=>d!=null);P.length!==m.length&&console.warn("[useChatState] Filtered out null/undefined messages from batch set");const T=P.map(d=>ht(d,M,R));k(T)},[M,R]),z=(0,u.useCallback)(()=>{k([])},[]),at=(0,u.useCallback)(m=>{const{event:P,data:T}=m;switch(P){case"message_start":{w(!0),q.current=!1,_.current="";const d=T;d.sessionId&&d.sessionId!==O&&L(d.sessionId),k(l=>{const e=l[l.length-1];if(e&&e.role==="assistant"&&e.content.length===1&&e.content[0].type==="thinking")return n.current=e,l;{const I=`msg-${Date.now()}`;return n.current={id:I,role:"assistant",content:[{type:"thinking",data:{status:"thinking"}}],timestamp:Date.now()},[...l,n.current]}});break}case"content_delta":{const d=T,l=d.delta||d.text||"";if(n.current&&l){q.current||(q.current=!0,C?.()),n.current.content.some(s=>s.type==="thinking")&&(n.current.content=n.current.content.filter(s=>s.type!=="thinking")),_.current+=l;const{contents:y,remainingBuffer:I}=pt(_.current,b.current,A.current,M,R);_.current=I,y.length>0&&(y.forEach(s=>{const g=n.current.content[n.current.content.length-1];s.type==="text"&&g&&g.type==="text"?g.text+=s.text:n.current.content.push(s)}),k(s=>{if(!n.current)return s;const g=[...s],v=g.findIndex(H=>H&&H.id===n.current.id);return v>=0?g[v]={...n.current}:g.push({...n.current}),g}))}break}case"content_block":{const d=T;if(n.current){const l=d.type||d.data?.type,e=d.data;if(!l||!e){console.warn("[useChatState] Invalid content_block:",d);break}let y;if(l==="product_list"&&Array.isArray(e)){r?.(),e.forEach(s=>{if(s&&s.shopify_product_id){const g=s.shopify_product_id;A.current.set(g,s);const v=g.match(/\d+$/)?.[0];v&&A.current.set(v,s)}}),(0,F.transformProducts)(e,h).forEach(s=>{if(s&&s.shopifyId){b.current.set(s.shopifyId,s);const g=s.shopifyId.match(/\d+$/)?.[0];g&&b.current.set(g,s),console.log("[useChatState] \u5EFA\u7ACB\u4EA7\u54C1\u6620\u5C04:",{fullId:s.shopifyId,numericId:g,title:s.title})}}),console.log("[useChatState] \u2705 \u4EA7\u54C1\u5217\u8868\u5DF2\u7F13\u5B58\uFF0C\u4E0D\u6DFB\u52A0\u5230\u6D88\u606F\u4E2D\uFF08\u907F\u514D\u95EA\u70C1\uFF09");break}else l==="product_comparison"&&e.products?y={type:"product_comparison",data:{products:(0,F.transformProducts)(e.products,h),dimensions:e.dimensions||{}}}:l==="faq_list"&&e.found!==void 0?y={type:"faq_list",data:e}:l==="quick_replies"&&e.replies?y={type:"quick_replies",data:{replies:e.replies}}:l==="policy"&&e.title&&e.content?y={type:"policy",data:{title:e.title,content:e.content}}:l==="promotion_list"&&e.found!==void 0?(i?.(),y={type:"promotion_list",data:e}):l==="cart"&&e.id!==void 0?y={type:"cart",data:{...(0,j.transformCartData)(e),onCart:E}}:y={type:l,data:e};n.current.content.push(y),k(I=>{if(!n.current)return I;const s=[...I],g=s.findIndex(v=>v&&v.id===n.current.id);return g>=0?s[g]={...n.current}:s.push({...n.current}),s})}break}case"tool_start":case"tool_end":break;case"message_end":{if(w(!1),n.current&&_.current){console.log("[useChatState] \u5904\u7406\u5269\u4F59\u7F13\u51B2\u533A:",_.current);const d=n.current.content[n.current.content.length-1];d&&d.type==="text"?d.text+=_.current:n.current.content.push({type:"text",text:_.current}),k(l=>{if(!n.current)return l;const e=[...l],y=e.findIndex(I=>I&&I.id===n.current.id);return y>=0&&(e[y]={...n.current}),e})}_.current="",b.current.clear(),A.current.clear(),n.current=null;break}case"status":{T.type==="session_expired"&&(z(),B(),c&&$({id:`welcome-${Date.now()}`,role:"assistant",content:[{type:"text",text:c}],timestamp:Date.now()}));break}case"error":{const d=T;w(!1),n.current=null,$({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:d.message,code:d.code}}],timestamp:Date.now()}),a?.(new Error(d.message));break}case"done":{w(!1),n.current=null;break}default:break}},[c,h,$,z,B,L,O,a,C,r,i,M,E]);return{messages:Q,isOpen:N,userId:G,sessionId:O,inputValue:Y,isStreaming:tt,openChat:et,closeChat:nt,toggleChat:st,setInputValue:Z,addMessage:$,setMessages:ot,clearMessages:z,handleSSEEvent:at,saveSession:L,clearSession:B}}
2
+ //# sourceMappingURL=useChatState.js.map