@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,2 @@
1
+ "use strict";var o=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var u=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of s(t))!c.call(e,r)&&r!==i&&o(e,r,{get:()=>t[r],enumerable:!(n=a(t,r))||n.enumerable});return e};var g=e=>u(o({},"__esModule",{value:!0}),e);var d={};module.exports=g(d);
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/LiveChatWidget/types.ts"],
4
+ "sourcesContent": ["/**\n * LiveChat \u7EC4\u4EF6\u6838\u5FC3\u7C7B\u578B\u5B9A\u4E49\n * \u57FA\u4E8E specs/livechat-widget/data-model.md\n */\n\n// ============================================================================\n// Session Types (\u4F1A\u8BDD)\n// ============================================================================\n\nexport type SessionStatus = 'active' | 'expired'\n\nexport interface Session {\n sessionId: string\n userId: string\n site: string\n status: SessionStatus\n createdAt?: number\n lastActivityAt?: number\n}\n\n// ============================================================================\n// Message Types (\u6D88\u606F)\n// ============================================================================\n\nexport type MessageRole = 'user' | 'assistant' | 'system' | 'tool'\n\nexport interface MessageMetadata {\n tokenUsage?: {\n inputTokens: number\n outputTokens: number\n }\n toolCalls?: Array<{\n id: string\n type: string\n name: string\n }>\n}\n\nexport interface Message {\n id: string\n sessionId?: string\n role: MessageRole\n content: MessageContent[]\n timestamp: number\n metadata?: MessageMetadata\n structured_content?: Array<{\n type: string\n data: any\n }>\n}\n\n// ============================================================================\n// Message Content Types (\u6D88\u606F\u5185\u5BB9)\n// ============================================================================\n\nexport type MessageContentType =\n | 'text'\n | 'product_card'\n | 'product_list'\n | 'product_comparison'\n | 'policy'\n | 'quick_replies'\n | 'thinking'\n | 'error'\n | 'faq_list'\n | 'cart'\n\nexport type MessageContent =\n | TextContent\n | ProductCardContent\n | ProductListContent\n | ProductComparisonContent\n | PolicyContent\n | QuickRepliesContent\n | ThinkingContent\n | ErrorContent\n | FAQListContent\n | PromotionListContent\n | CartContent\n\nexport interface TextContent {\n type: 'text'\n text: string\n}\n\nexport interface ProductCardContent {\n type: 'product_card'\n data: {\n product: Product\n rawProduct?: any // Raw backend product data (for custom render)\n onAddToCart?: (product: Product) => void\n productCardRender?: (product: any) => React.ReactNode\n }\n}\n\nexport interface ProductListContent {\n type: 'product_list'\n data: {\n products: Product[]\n title?: string\n onAddToCart?: (product: Product) => void\n commonText?: CommonText\n }\n}\n\nexport interface ProductComparisonContent {\n type: 'product_comparison'\n data: {\n products: Product[]\n dimensions: {\n price?: {\n label: string\n values: Array<{\n product_id: string\n min: number\n max: number\n currency: string\n has_discount: boolean\n }>\n }\n variants?: {\n label: string\n values: Array<{\n product_id: string\n count: number\n }>\n }\n member_price?: {\n label: string\n values: Array<{\n product_id: string\n available: boolean\n min: number\n max: number\n currency: string\n }>\n }\n discount?: {\n label: string\n values: Array<{\n product_id: string\n has_discount: boolean\n }>\n }\n [key: string]: any\n }\n onAddToCart?: (product: Product) => void\n commonText?: CommonText\n }\n}\n\nexport interface PolicyContent {\n type: 'policy'\n data: {\n title: string\n content: string\n }\n}\n\nexport interface QuickRepliesContent {\n type: 'quick_replies'\n data: {\n replies: QuickReply[]\n }\n}\n\nexport interface ThinkingContent {\n type: 'thinking'\n data: {\n status: string\n }\n}\n\nexport interface ErrorContent {\n type: 'error'\n data: {\n message: string\n code?: string\n }\n}\n\nexport interface FAQListContent {\n type: 'faq_list'\n data: {\n found: boolean\n count: number\n total?: number\n results: FAQItem[]\n }\n}\n\nexport interface PromotionListContent {\n type: 'promotion_list'\n data: {\n found: boolean\n count: number\n total?: number\n results: PromotionItem[]\n commonText?: CommonText\n }\n}\n\n// ============================================================================\n// FAQ Types (\u5E38\u89C1\u95EE\u9898)\n// ============================================================================\n\nexport type FAQCategory = 'shipping' | 'return' | 'product' | 'payment' | 'general'\n\nexport interface FAQItem {\n id: string\n question: string\n answer: string\n category: FAQCategory\n keywords?: string[]\n relatedQuestions?: string[]\n metadata?: {\n language?: string\n priority?: number\n lastUpdated?: string\n }\n}\n\n// ============================================================================\n// Promotion Types (\u4FC3\u9500\u6D3B\u52A8)\n// ============================================================================\n\nexport interface PromotionItem {\n id: string\n title: string\n subtitle?: string\n description?: string\n banner_url?: string\n url?: string\n time_range: {\n start: string\n end?: string | null\n is_active: boolean\n }\n priority?: number\n product_count?: number\n metadata?: {\n display_order?: number\n target_audience?: string\n }\n}\n\n// ============================================================================\n// Product Types (\u5546\u54C1)\n// ============================================================================\n\nexport type StockStatus = 'in_stock' | 'low_stock' | 'out_of_stock'\n\nexport interface Price {\n amount: number\n currency: string\n}\n\nexport interface PriceRange {\n min: number\n max: number\n currency: string\n}\n\nexport interface VariantDiscount {\n has_discount: boolean\n discount_price?: number\n discount_code?: string\n discount_percentage?: number\n /** \u6298\u6263\u7C7B\u578B\uFF1Afixed_amount \u56FA\u5B9A\u91D1\u989D\u6298\u6263\uFF0Cpercentage \u767E\u5206\u6BD4\u6298\u6263 */\n discount_type?: 'fixed_amount' | 'percentage'\n /** \u6298\u6263\u6570\u503C\uFF08\u53EF\u80FD\u662F\u5B57\u7B26\u4E32\u6216\u6570\u5B57\uFF09 */\n discount_value?: string | number\n}\n\nexport interface VariantMemberPrice {\n has_member_price: boolean\n price?: number\n}\n\nexport interface ProductFeatures {\n is_new?: boolean\n has_rental?: boolean\n has_presale?: boolean\n has_member_price?: boolean\n has_discount?: boolean\n}\n\nexport interface Variant {\n id: string\n title: string\n sku?: string\n price?: Price\n availableForSale: boolean\n color?: string\n discount?: VariantDiscount\n memberPrice?: VariantMemberPrice\n inventoryQuantity?: number\n option1?: string\n option2?: string\n option3?: string\n}\n\nexport interface Product {\n shopifyId: string\n sku?: string\n handle: string\n title: string\n description?: string\n vendor?: string\n price: Price\n priceRange?: PriceRange\n memberPriceRange?: PriceRange\n imageUrl: string\n productUrl: string\n stockStatus: StockStatus\n hotScore?: number\n averageRating?: number\n reviewCount?: number\n variants?: Variant[]\n variantCount?: number\n availableCount?: number\n features?: ProductFeatures\n tags?: string[]\n}\n\n// ============================================================================\n// Quick Reply Types (\u5FEB\u6377\u56DE\u590D)\n// ============================================================================\n\nexport interface QuickReply {\n id: string\n label: string\n value: string\n icon?: string\n}\n\n// ============================================================================\n// Policy Types (\u653F\u7B56)\n// ============================================================================\n\nexport interface Policy {\n title: string\n content: string\n}\n\n// ============================================================================\n// Cart Types (\u8D2D\u7269\u8F66)\n// ============================================================================\n\n/**\n * \u8D2D\u7269\u8F66\u91D1\u989D\u4FE1\u606F\n */\nexport interface CartAmount {\n /** \u91D1\u989D\u5B57\u7B26\u4E32\uFF08\u5982 \"99.99\"\uFF09 */\n amount: string\n /** \u8D27\u5E01\u4EE3\u7801\uFF08\u5982 \"USD\"\uFF09 */\n currencyCode: string\n}\n\n/**\n * \u8D2D\u7269\u8F66\u4EF7\u683C\u6C47\u603B\n */\nexport interface CartCost {\n /** \u5E94\u4ED8\u603B\u4EF7\uFF08\u5DF2\u5E94\u7528\u6298\u6263\uFF09 */\n totalAmount: CartAmount\n /** \u539F\u4EF7\u5C0F\u8BA1\uFF08\u672A\u5E94\u7528\u6298\u6263\uFF09 */\n subtotalAmount: CartAmount\n}\n\n/**\n * \u8D2D\u7269\u8F66\u5546\u54C1\u53D8\u4F53\u4FE1\u606F\n */\nexport interface CartMerchandise {\n /** \u53D8\u4F53 ID (Shopify ProductVariant GID) */\n id: string\n /** \u53D8\u4F53\u6807\u9898\uFF08\u5982 \"Black\", \"Large\" \u7B49\uFF09 */\n title: string\n /** \u5355\u4EF7 */\n price: CartAmount\n /** \u5546\u54C1\u56FE\u7247 URL */\n image?: {\n url: string\n altText?: string\n }\n /** \u5173\u8054\u7684\u5546\u54C1\u4FE1\u606F */\n product: {\n /** \u5546\u54C1 ID */\n id: string\n /** \u5546\u54C1\u6807\u9898 */\n title: string\n /** \u5546\u54C1 handle */\n handle: string\n }\n}\n\n/**\n * \u8D2D\u7269\u8F66\u5546\u54C1\u884C\n */\nexport interface CartLine {\n /** \u8D2D\u7269\u8F66\u884C ID (\u7528\u4E8E\u66F4\u65B0/\u5220\u9664\u64CD\u4F5C) */\n id: string\n /** \u5546\u54C1\u6570\u91CF */\n quantity: number\n /** \u4EF7\u683C\u4FE1\u606F */\n cost: {\n /** \u884C\u603B\u4EF7\uFF08\u5355\u4EF7 \u00D7 \u6570\u91CF\uFF0C\u5DF2\u5E94\u7528\u6298\u6263\uFF09 */\n totalAmount: CartAmount\n /** \u5355\u4EF7 */\n amountPerQuantity: CartAmount\n /** \u884C\u5C0F\u8BA1\uFF08\u5355\u4EF7 \u00D7 \u6570\u91CF\uFF0C\u672A\u5E94\u7528\u6298\u6263\uFF09 */\n subtotalAmount: CartAmount\n }\n /** \u5546\u54C1\u53D8\u4F53\u4FE1\u606F */\n merchandise: CartMerchandise\n /** \u81EA\u5B9A\u4E49\u5C5E\u6027\uFF08\u53EF\u9009\uFF09 */\n attributes?: Array<{\n key: string\n value: string\n }>\n}\n\n/**\n * \u8D2D\u7269\u8F66\u6298\u6263\u7801\n */\nexport interface CartDiscountCode {\n /** \u6298\u6263\u7801 */\n code: string\n /** \u662F\u5426\u6709\u6548/\u9002\u7528 */\n applicable: boolean\n}\n\n/**\n * \u8D2D\u7269\u8F66\u6570\u636E\n */\nexport interface CartData {\n /** \u8D2D\u7269\u8F66\u662F\u5426\u4E3A\u7A7A */\n isEmpty: boolean\n /** \u8D2D\u7269\u8F66 ID (Shopify Cart GID) */\n cartId: string\n /** \u5546\u54C1\u603B\u6570\u91CF */\n totalQuantity: number\n /** \u5546\u54C1\u5217\u8868 */\n lines: CartLine[]\n /** \u4EF7\u683C\u6C47\u603B */\n cost: CartCost\n /** \u6298\u6263\u7801\u5217\u8868 */\n discountCodes?: CartDiscountCode[]\n /** \u7ED3\u8D26\u9875\u9762 URL */\n checkoutUrl?: string\n /** \u8D2D\u7269\u8F66\u6309\u94AE\u56DE\u8C03\u51FD\u6570 */\n onCart?: (cartId: string, checkoutUrl?: string) => void\n /** \u901A\u7528\u6587\u6848\u914D\u7F6E */\n commonText?: CommonText\n}\n\n/**\n * \u8D2D\u7269\u8F66\u5185\u5BB9\u5757\n */\nexport interface CartContent {\n type: 'cart'\n data: CartData\n}\n\n// ============================================================================\n// Backend Cart Types (\u540E\u7AEF\u8D2D\u7269\u8F66\u6570\u636E\u683C\u5F0F - Shopify GraphQL)\n// ============================================================================\n\n/**\n * \u540E\u7AEF\u8FD4\u56DE\u7684\u8D2D\u7269\u8F66\u5546\u54C1\u884C\u6570\u636E (Shopify GraphQL \u683C\u5F0F)\n */\nexport interface BackendCartLineNode {\n id: string\n quantity: number\n cost: {\n totalAmount: CartAmount\n amountPerQuantity: CartAmount\n compareAtAmountPerQuantity?: CartAmount | null\n subtotalAmount: CartAmount\n }\n discountAllocations: any[]\n merchandise: {\n id: string\n title: string\n availableForSale: boolean\n quantityAvailable?: number\n price: CartAmount\n compareAtPrice?: CartAmount | null\n image?: {\n url: string\n altText?: string | null\n width?: number\n height?: number\n } | null\n product: {\n id: string\n title: string\n handle: string\n vendor?: string\n featuredImage?: {\n url: string\n altText?: string | null\n width?: number\n height?: number\n } | null\n tags?: string[]\n }\n }\n attributes?: Array<{\n key: string\n value: string\n }>\n}\n\n/**\n * \u540E\u7AEF\u8FD4\u56DE\u7684\u8D2D\u7269\u8F66\u6570\u636E (Shopify GraphQL \u683C\u5F0F)\n */\nexport interface BackendCartData {\n id: string\n checkoutUrl?: string\n totalQuantity: number\n lines: {\n edges: Array<{\n node: BackendCartLineNode\n }>\n }\n cost: {\n totalAmount: CartAmount\n subtotalAmount: CartAmount\n checkoutChargeAmount?: CartAmount\n totalAmountEstimated?: boolean\n subtotalAmountEstimated?: boolean\n totalTaxAmount?: CartAmount | null\n totalDutyAmount?: CartAmount | null\n }\n discountAllocations?: any[]\n buyerIdentity?: any\n attributes?: Array<{\n key: string\n value: string\n }>\n discountCodes?: any[]\n createdAt?: string\n updatedAt?: string\n}\n\n// ============================================================================\n// SSE Event Types (SSE \u4E8B\u4EF6)\n// ============================================================================\n\nexport type SSEEventType =\n | 'message_start'\n | 'content_delta'\n | 'content_block'\n | 'message_end'\n | 'tool_start'\n | 'tool_end'\n | 'status'\n | 'error'\n | 'done'\n\nexport interface SSEEvent<T = any> {\n event: SSEEventType | null\n data: T\n}\n\n// \u5177\u4F53\u4E8B\u4EF6\u6570\u636E\u7C7B\u578B\nexport interface MessageStartData {\n sessionId: string\n}\n\nexport interface ContentDeltaData {\n text: string\n}\n\nexport interface ContentBlockData {\n type: string\n data: any\n}\n\nexport interface MessageEndData {\n usage: {\n inputTokens: number\n outputTokens: number\n }\n}\n\nexport interface ToolStartData {\n id: string\n type: string\n name: string\n}\n\nexport interface ToolEndData {\n id: string\n}\n\nexport interface StatusData {\n type: string\n message?: string\n}\n\nexport interface ErrorData {\n message: string\n code?: string\n}\n\n// ============================================================================\n// API Request/Response Types (API \u8BF7\u6C42\u54CD\u5E94)\n// ============================================================================\n\n/**\n * \u6D41\u5F0F\u5BF9\u8BDD\u8BF7\u6C42\u53C2\u6570\n */\nexport interface ChatStreamRequest {\n /** \u7528\u6237\u7684\u6D88\u606F\u6587\u672C */\n message: string\n /** \u7528\u6237\u6807\u8BC6\u7B26 */\n user_id: string\n /** \u6765\u81EA new-session \u7AEF\u70B9\u7684\u4F1A\u8BDD ID */\n session_id: string\n /** \u53EF\u9009\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F */\n context?: {\n /** \u7528\u4E8E\u8D2D\u7269\u8F66\u64CD\u4F5C\u7684 Shopify \u8D2D\u7269\u8F66 ID */\n cartId?: string\n /** Storefront API \u8BBF\u95EE\u4EE4\u724C */\n accessToken?: string\n /** \u5DF2\u767B\u5F55\u7528\u6237\u7684 ID */\n real_user_id?: string\n }\n}\n\nexport interface NewSessionRequest {\n user_id: string\n session_id?: string\n site?: string\n channel_code?: string\n real_user_id?: string\n}\n\nexport interface NewSessionResponse {\n success: boolean\n sessionId: string\n message: string\n resumed?: boolean\n messages?: Message[]\n welcomeMessage?: string\n quickQuestions?: string[]\n brand?: string\n}\n\nexport interface ErrorResponse {\n success: boolean\n error: string\n code?: string\n details?: any\n}\n\n// ============================================================================\n// Common Text Types (\u901A\u7528\u6587\u6848)\n// ============================================================================\n\n/**\n * \u901A\u7528\u6587\u6848\u914D\u7F6E\n * \u7528\u4E8E\u81EA\u5B9A\u4E49\u7EC4\u4EF6\u4E2D\u7684\u6309\u94AE\u6587\u6848\n */\nexport interface CommonText {\n /**\n * \u4EA7\u54C1\u5217\u8868\u5C55\u5F00\u6309\u94AE\u6587\u6848\n * @default \"Learn More\"\n */\n learnMore?: string\n\n /**\n * \u4EA7\u54C1\u5217\u8868\u6536\u8D77\u6309\u94AE\u6587\u6848\n * @default \"Show Less\"\n */\n showLess?: string\n\n /**\n * \u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\u6587\u6848\n * @default \"Add to Cart\"\n */\n addToCart?: string\n\n /**\n * \u67E5\u770B\u8D2D\u7269\u8F66/\u66F4\u591A\u6309\u94AE\u6587\u6848\n * @default \"View More\"\n */\n viewMore?: string\n\n /**\n * \u6298\u6263\u6807\u7B7E\u540E\u7F00\u6587\u6848\uFF08\u5982 \"20% OFF\" \u4E2D\u7684 \"OFF\"\uFF09\n * @default \"OFF\"\n */\n off?: string\n\n /**\n * \u8D2D\u7269\u8F66\u603B\u8BA1\u6587\u6848\n * @default \"Total\"\n */\n total?: string\n}\n\n// ============================================================================\n// Component Props Types (\u7EC4\u4EF6 Props)\n// ============================================================================\n\nexport interface LiveChatWidgetProps {\n /**\n * API \u57FA\u7840 URL\n * @example \"https://beta-api-livechat.anker.com\"\n */\n apiBaseUrl: string\n\n /**\n * \u81EA\u5B9A\u4E49\u8BF7\u6C42\u5934\n * \u5C06\u5728\u6240\u6709 API \u8BF7\u6C42\u4E2D\u6DFB\u52A0\u8FD9\u4E9B\u8BF7\u6C42\u5934\n * @example { \"Authorization\": \"Bearer token\", \"X-Custom-Header\": \"value\" }\n */\n headers?: Record<string, string>\n\n /**\n * reCAPTCHA site key\n * \u63D0\u4F9B\u6B64\u53C2\u6570\u5C06\u81EA\u52A8\u542F\u7528 reCAPTCHA v3 \u9A8C\u8BC1\n * @example \"6LfS4J4pAAAAACX1e_WrxutmxxzCK7FU4WzVqL14\"\n */\n recaptchaSitekey?: string\n\n /**\n * reCAPTCHA action \u524D\u7F00\n * \u5B9E\u9645\u4F7F\u7528\u65F6\u4F1A\u6839\u636E\u4E0D\u540C\u63A5\u53E3\u6DFB\u52A0\u540E\u7F00\uFF08\u5982 chat_stream, new_session\uFF09\n * @default \"livechat\"\n */\n recaptchaAction?: string\n\n /**\n * Shopify \u5E97\u94FA\u57DF\u540D\n * @example \"www.eufy.com\"\n */\n site?: string\n\n /**\n * \u6E20\u9053\u7F16\u7801\n * \u7528\u4E8E\u6807\u8BC6\u6765\u6E90\u6E20\u9053\n * @example \"web_homepage\"\n */\n channelCode?: string\n\n /**\n * \u5DF2\u767B\u5F55\u7528\u6237\u7684 ID\uFF08\u53EF\u9009\uFF09\n * \u5982\u679C\u63D0\u4F9B\uFF0C\u5C06\u5728 API \u8BF7\u6C42\u4E2D\u4F20\u9012\n */\n loginUserId?: string\n\n /**\n * Shopify \u8D2D\u7269\u8F66 ID\uFF08\u53EF\u9009\uFF09\n * \u7528\u4E8E\u8D2D\u7269\u8F66\u64CD\u4F5C\uFF0C\u5C06\u5728 stream \u63A5\u53E3\u7684 context \u4E2D\u4F20\u9012\n * @example \"gid://shopify/Cart/Z2NwLXVzLWVhc3QxOjAxSkZH...\"\n */\n cartId?: string\n\n /**\n * Storefront API \u8BBF\u95EE\u4EE4\u724C\uFF08\u53EF\u9009\uFF09\n * \u7528\u4E8E\u8D2D\u7269\u8F66\u64CD\u4F5C\uFF0C\u5C06\u5728 stream \u63A5\u53E3\u7684 context \u4E2D\u4F20\u9012\n */\n accessToken?: string\n\n /**\n * \u6C14\u6CE1\u6309\u94AE\u4F4D\u7F6E\n * \u81EA\u5B9A\u4E49\u4F4D\u7F6E\u5BF9\u8C61\uFF1A{ top?: string, bottom?: string, left?: string, right?: string }\n * @default { bottom: \"1.5rem\", right: \"1.5rem\" }\n * @example\n * // \u81EA\u5B9A\u4E49\u4F4D\u7F6E\n * position={{ bottom: \"20px\", right: \"30px\" }}\n * position={{ top: \"100px\", left: \"50px\" }}\n */\n position?: BubblePosition\n\n /**\n * \u6B22\u8FCE\u6D88\u606F\n * @default \"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u52A9\u4F60\u7684\u5417\uFF1F\"\n */\n welcomeMessage?: string\n\n /**\n * \u521D\u59CB\u5FEB\u6377\u56DE\u590D\u6309\u94AE\n */\n quickReplies?: QuickReply[]\n\n /**\n * \u81EA\u5B9A\u4E49\u6D88\u606F\u6E32\u67D3\u5668\n */\n customRenderers?: Record<string, MessageRenderer>\n\n /**\n * Logo URL\n */\n logoUrl?: string\n\n /**\n * \u804A\u5929\u7A97\u53E3\u6807\u9898\n * @default \"AI \u52A9\u624B\"\n */\n title?: string\n\n /**\n * \u804A\u5929\u6C14\u6CE1\u6309\u94AE\u56FE\u6807\uFF08\u56FE\u7247 URL\uFF09\n * \u5982\u679C\u63D0\u4F9B\uFF0C\u5C06\u4F7F\u7528\u56FE\u7247\u66FF\u4EE3\u9ED8\u8BA4\u7684 SVG \u56FE\u6807\n */\n chatBubbleIcon?: string\n\n /**\n * \u53D7\u63A7\u6A21\u5F0F\uFF1A\u662F\u5426\u6253\u5F00\u804A\u5929\u7A97\u53E3\n * \u63D0\u4F9B\u6B64\u53C2\u6570\u65F6\uFF0C\u7EC4\u4EF6\u5C06\u5904\u4E8E\u53D7\u63A7\u6A21\u5F0F\n * @example\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false)\n * <LiveChatWidget open={isOpen} onOpenChange={setIsOpen} />\n * ```\n */\n open?: boolean\n\n /**\n * \u53D7\u63A7\u6A21\u5F0F\uFF1A\u6253\u5F00/\u5173\u95ED\u72B6\u6001\u53D8\u5316\u56DE\u8C03\n * \u3010\u5FC5\u9700\u3011\u914D\u5408 `open` \u4F7F\u7528\uFF0C\u7528\u4E8E\u540C\u6B65\u72B6\u6001\u5230\u7236\u7EC4\u4EF6\n * \u5F53\u7528\u6237\u70B9\u51FB\u6253\u5F00\u6216\u5173\u95ED\u6309\u94AE\u65F6\u89E6\u53D1\n * @example\n * ```tsx\n * <LiveChatWidget\n * open={isOpen}\n * onOpenChange={setIsOpen} // \u5FC5\u9700\uFF1A\u540C\u6B65\u72B6\u6001\n * />\n * ```\n */\n onOpenChange?: (open: boolean) => void\n\n /**\n * \u3010\u53EF\u9009\u3011\u7A97\u53E3\u6253\u5F00\u4E8B\u4EF6\u76D1\u542C\n * \u7528\u4E8E\u57CB\u70B9\u3001\u65E5\u5FD7\u7B49\u526F\u4F5C\u7528\uFF0C\u4E0D\u5F71\u54CD\u72B6\u6001\u63A7\u5236\n * \u5728 onOpenChange \u4E4B\u540E\u89E6\u53D1\n * @example\n * ```tsx\n * <LiveChatWidget\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * onOpen={() => trackEvent('chat_opened')} // \u53EF\u9009\uFF1A\u57CB\u70B9\n * />\n * ```\n */\n onOpen?: () => void\n\n /**\n * \u3010\u53EF\u9009\u3011\u7A97\u53E3\u5173\u95ED\u4E8B\u4EF6\u76D1\u542C\n * \u7528\u4E8E\u57CB\u70B9\u3001\u65E5\u5FD7\u7B49\u526F\u4F5C\u7528\uFF0C\u4E0D\u5F71\u54CD\u72B6\u6001\u63A7\u5236\n * \u5728 onOpenChange \u4E4B\u540E\u89E6\u53D1\n * @example\n * ```tsx\n * <LiveChatWidget\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * onClose={() => trackEvent('chat_closed')} // \u53EF\u9009\uFF1A\u57CB\u70B9\n * />\n * ```\n */\n onClose?: () => void\n onMessageSend?: (message: string) => void\n onError?: (error: Error) => void\n\n /**\n * AI \u6D88\u606F\u56DE\u8C03\n */\n /**\n * AI \u56DE\u590D\u6587\u672C\u6D88\u606F\u65F6\u89E6\u53D1\n */\n onTextMessage?: () => void\n\n /**\n * AI \u56DE\u590D\u5546\u54C1\u5217\u8868\u5361\u7247\u65F6\u89E6\u53D1\n */\n onProductList?: () => void\n\n /**\n * AI \u56DE\u590D\u4FC3\u9500\u5361\u7247\u65F6\u89E6\u53D1\n */\n onPromotionList?: () => void\n\n /**\n * \u5546\u54C1\u64CD\u4F5C\u56DE\u8C03\n */\n onAddToCart?: (product: Product) => void\n\n /**\n * \u8D2D\u7269\u8F66\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\n */\n onCart?: (cartId: string, checkoutUrl?: string) => void\n\n /**\n * \u662F\u5426\u663E\u793A\u65B0\u4F1A\u8BDD\u6309\u94AE\n * @default true\n */\n showNewSessionButton?: boolean\n\n /**\n * \u901A\u7528\u6587\u6848\u914D\u7F6E\n * \u7528\u4E8E\u81EA\u5B9A\u4E49\u6309\u94AE\u6587\u6848\n */\n commonText?: CommonText\n\n /**\n * \u81EA\u5B9A\u4E49\u4EA7\u54C1\u5361\u7247\u6E32\u67D3\u51FD\u6570\n * \u7528\u4E8E\u81EA\u5B9A\u4E49\u6E32\u67D3 product_card \u7C7B\u578B\u7684\u4EA7\u54C1\u5361\u7247\n * \u5F53\u63D0\u4F9B\u6B64\u51FD\u6570\u65F6\uFF0C\u5C06\u66FF\u4EE3\u9ED8\u8BA4\u7684\u4EA7\u54C1\u5361\u7247\u6E32\u67D3\u903B\u8F91\n * @param product \u539F\u59CB\u540E\u7AEF\u4EA7\u54C1\u6570\u636E\uFF08\u672A\u7ECF\u8F6C\u6362\u7684\u6570\u636E\uFF09\n * @returns React \u53EF\u6E32\u67D3\u7684\u5185\u5BB9\n * @example\n * ```tsx\n * <LiveChatWidget\n * productCardRender={(product) => (\n * <div>\n * <h3>{product.title}</h3>\n * <p>{product.price_range?.min}</p>\n * </div>\n * )}\n * />\n * ```\n */\n productCardRender?: (product: any) => React.ReactNode\n}\n\nexport interface MessageRenderer {\n render: (content: MessageContent, isUser: boolean, isSystem: boolean) => React.ReactNode\n}\n\nexport interface CustomRendererMap {\n [type: string]: MessageRenderer\n}\n\n// ============================================================================\n// Utility Types (\u5DE5\u5177\u7C7B\u578B)\n// ============================================================================\n\nexport interface PositionStyles {\n bottom?: string\n top?: string\n left?: string\n right?: string\n}\n\nexport type BubblePosition = PositionStyles\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["types_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 购物车数据转换工具
3
+ * 将后端返回的 Shopify GraphQL 格式转换为前端标准格式
4
+ */
5
+ import type { BackendCartData, CartData } from '../types';
6
+ /**
7
+ * 转换后端购物车数据为前端格式
8
+ *
9
+ * @param backendData 后端返回的 Shopify GraphQL 格式数据
10
+ * @returns 前端标准化的购物车数据
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const backendData = {
15
+ * id: "gid://shopify/Cart/xxx",
16
+ * lines: { edges: [{ node: {...} }] },
17
+ * cost: { totalAmount: {...}, subtotalAmount: {...} },
18
+ * ...
19
+ * }
20
+ *
21
+ * const cartData = transformCartData(backendData)
22
+ * // => { cartId: "gid://shopify/Cart/xxx", lines: [...], ... }
23
+ * ```
24
+ */
25
+ export declare function transformCartData(backendData: BackendCartData): CartData;
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var l=(o,n)=>{for(var t in n)a(o,t,{get:n[t],enumerable:!0})},m=(o,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of u(n))!s.call(o,i)&&i!==t&&a(o,i,{get:()=>n[i],enumerable:!(e=r(n,i))||e.enumerable});return o};var c=o=>m(a({},"__esModule",{value:!0}),o);var p={};l(p,{transformCartData:()=>d});module.exports=c(p);function d(o){const n=o.lines.edges.map(t=>({id:t.node.id,quantity:t.node.quantity,cost:{totalAmount:t.node.cost.totalAmount,amountPerQuantity:t.node.cost.amountPerQuantity,subtotalAmount:t.node.cost.subtotalAmount},merchandise:{id:t.node.merchandise.id,title:t.node.merchandise.title,price:t.node.merchandise.price,image:t.node.merchandise.image?{url:t.node.merchandise.image.url,altText:t.node.merchandise.image.altText||void 0}:void 0,product:{id:t.node.merchandise.product.id,title:t.node.merchandise.product.title,handle:t.node.merchandise.product.handle}},attributes:t.node.attributes}));return{isEmpty:o.totalQuantity===0||n.length===0,cartId:o.id,totalQuantity:o.totalQuantity,lines:n,cost:{totalAmount:o.cost.totalAmount,subtotalAmount:o.cost.subtotalAmount},discountCodes:o.discountCodes?.map(t=>({code:t.code||t,applicable:t.applicable!==!1})),checkoutUrl:o.checkoutUrl}}
2
+ //# sourceMappingURL=cartTransformers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/utils/cartTransformers.ts"],
4
+ "sourcesContent": ["/**\n * \u8D2D\u7269\u8F66\u6570\u636E\u8F6C\u6362\u5DE5\u5177\n * \u5C06\u540E\u7AEF\u8FD4\u56DE\u7684 Shopify GraphQL \u683C\u5F0F\u8F6C\u6362\u4E3A\u524D\u7AEF\u6807\u51C6\u683C\u5F0F\n */\n\nimport type { BackendCartData, CartData, CartLine } from '../types'\n\n/**\n * \u8F6C\u6362\u540E\u7AEF\u8D2D\u7269\u8F66\u6570\u636E\u4E3A\u524D\u7AEF\u683C\u5F0F\n *\n * @param backendData \u540E\u7AEF\u8FD4\u56DE\u7684 Shopify GraphQL \u683C\u5F0F\u6570\u636E\n * @returns \u524D\u7AEF\u6807\u51C6\u5316\u7684\u8D2D\u7269\u8F66\u6570\u636E\n *\n * @example\n * ```typescript\n * const backendData = {\n * id: \"gid://shopify/Cart/xxx\",\n * lines: { edges: [{ node: {...} }] },\n * cost: { totalAmount: {...}, subtotalAmount: {...} },\n * ...\n * }\n *\n * const cartData = transformCartData(backendData)\n * // => { cartId: \"gid://shopify/Cart/xxx\", lines: [...], ... }\n * ```\n */\nexport function transformCartData(backendData: BackendCartData): CartData {\n // \u8F6C\u6362\u5546\u54C1\u884C\u6570\u636E\uFF1A\u4ECE edges[].node \u7ED3\u6784\u8F6C\u4E3A\u6241\u5E73\u6570\u7EC4\n const lines: CartLine[] = backendData.lines.edges.map(edge => ({\n id: edge.node.id,\n quantity: edge.node.quantity,\n cost: {\n totalAmount: edge.node.cost.totalAmount,\n amountPerQuantity: edge.node.cost.amountPerQuantity,\n subtotalAmount: edge.node.cost.subtotalAmount,\n },\n merchandise: {\n id: edge.node.merchandise.id,\n title: edge.node.merchandise.title,\n price: edge.node.merchandise.price,\n image: edge.node.merchandise.image\n ? {\n url: edge.node.merchandise.image.url,\n altText: edge.node.merchandise.image.altText || undefined,\n }\n : undefined,\n product: {\n id: edge.node.merchandise.product.id,\n title: edge.node.merchandise.product.title,\n handle: edge.node.merchandise.product.handle,\n },\n },\n attributes: edge.node.attributes,\n }))\n\n // \u8FD4\u56DE\u6807\u51C6\u5316\u7684\u8D2D\u7269\u8F66\u6570\u636E\n return {\n isEmpty: backendData.totalQuantity === 0 || lines.length === 0,\n cartId: backendData.id,\n totalQuantity: backendData.totalQuantity,\n lines,\n cost: {\n totalAmount: backendData.cost.totalAmount,\n subtotalAmount: backendData.cost.subtotalAmount,\n },\n discountCodes: backendData.discountCodes?.map((code: any) => ({\n code: code.code || code,\n applicable: code.applicable !== false,\n })),\n checkoutUrl: backendData.checkoutUrl,\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GA0BO,SAASE,EAAkBE,EAAwC,CAExE,MAAMC,EAAoBD,EAAY,MAAM,MAAM,IAAIE,IAAS,CAC7D,GAAIA,EAAK,KAAK,GACd,SAAUA,EAAK,KAAK,SACpB,KAAM,CACJ,YAAaA,EAAK,KAAK,KAAK,YAC5B,kBAAmBA,EAAK,KAAK,KAAK,kBAClC,eAAgBA,EAAK,KAAK,KAAK,cACjC,EACA,YAAa,CACX,GAAIA,EAAK,KAAK,YAAY,GAC1B,MAAOA,EAAK,KAAK,YAAY,MAC7B,MAAOA,EAAK,KAAK,YAAY,MAC7B,MAAOA,EAAK,KAAK,YAAY,MACzB,CACE,IAAKA,EAAK,KAAK,YAAY,MAAM,IACjC,QAASA,EAAK,KAAK,YAAY,MAAM,SAAW,MAClD,EACA,OACJ,QAAS,CACP,GAAIA,EAAK,KAAK,YAAY,QAAQ,GAClC,MAAOA,EAAK,KAAK,YAAY,QAAQ,MACrC,OAAQA,EAAK,KAAK,YAAY,QAAQ,MACxC,CACF,EACA,WAAYA,EAAK,KAAK,UACxB,EAAE,EAGF,MAAO,CACL,QAASF,EAAY,gBAAkB,GAAKC,EAAM,SAAW,EAC7D,OAAQD,EAAY,GACpB,cAAeA,EAAY,cAC3B,MAAAC,EACA,KAAM,CACJ,YAAaD,EAAY,KAAK,YAC9B,eAAgBA,EAAY,KAAK,cACnC,EACA,cAAeA,EAAY,eAAe,IAAKG,IAAe,CAC5D,KAAMA,EAAK,MAAQA,EACnB,WAAYA,EAAK,aAAe,EAClC,EAAE,EACF,YAAaH,EAAY,WAC3B,CACF",
6
+ "names": ["cartTransformers_exports", "__export", "transformCartData", "__toCommonJS", "backendData", "lines", "edge", "code"]
7
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * LiveChat Fetcher
3
+ * 参照 storefront 的实现,支持 reCAPTCHA
4
+ */
5
+ /**
6
+ * Fetcher 参数
7
+ */
8
+ export interface FetcherOptions {
9
+ url: string;
10
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
11
+ headers?: Record<string, string>;
12
+ body?: any;
13
+ timeout?: number;
14
+ needRecaptcha?: boolean;
15
+ recaptchaSitekey?: string;
16
+ recaptchaAction?: string;
17
+ recaptchaHeaderKey?: string;
18
+ }
19
+ /**
20
+ * Fetcher 函数
21
+ * 支持 reCAPTCHA 和自定义 headers
22
+ */
23
+ export declare const fetcher: ({ url, method, headers, body, timeout, needRecaptcha, recaptchaSitekey, recaptchaAction, recaptchaHeaderKey, }: FetcherOptions) => Promise<Response>;
24
+ /**
25
+ * 扩展 Window 接口以支持 grecaptcha
26
+ */
27
+ declare global {
28
+ interface Window {
29
+ grecaptcha?: {
30
+ execute: (sitekey: string, options: {
31
+ action: string;
32
+ }) => Promise<string>;
33
+ ready: (callback: () => void) => void;
34
+ };
35
+ }
36
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var y=(t,e)=>{for(var r in e)o(t,r,{get:e[r],enumerable:!0})},m=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of T(e))!w.call(t,a)&&a!==r&&o(t,a,{get:()=>e[a],enumerable:!(n=f(e,a))||n.enumerable});return t};var C=t=>m(o({},"__esModule",{value:!0}),t);var k={};y(k,{fetcher:()=>b});module.exports=C(k);const P=async(t,e)=>{if(typeof window>"u"||!window.grecaptcha?.execute)return console.warn("[LiveChat Fetcher] reCAPTCHA not loaded"),!1;try{return await window.grecaptcha.execute(e,{action:t})}catch(r){return console.error("[LiveChat Fetcher] reCAPTCHA execution failed:",r),!1}};async function R(t,e,r="X-Recaptcha-Token"){const n=await P(t,e);return n?{[r]:n}:{}}const b=async({url:t,method:e="POST",headers:r={},body:n,timeout:a=9e4,needRecaptcha:g=!1,recaptchaSitekey:s,recaptchaAction:p="",recaptchaHeaderKey:u="X-Recaptcha-Token"})=>{let d={};g&&(s?d=await R(p,s,u):console.warn("[LiveChat Fetcher] needRecaptcha=true but recaptchaSitekey is missing"));const h=n?JSON.stringify(n):void 0,l=new AbortController;let c;a&&(c=setTimeout(()=>l.abort(),a));try{const i=await fetch(t,{method:e,mode:"cors",headers:{"Content-Type":"application/json",...r,...d},signal:l.signal,...e!=="GET"&&h&&{body:h}});return c&&clearTimeout(c),i}catch(i){throw c&&clearTimeout(c),i}};
2
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/utils/fetcher.ts"],
4
+ "sourcesContent": ["/**\n * LiveChat Fetcher\n * \u53C2\u7167 storefront \u7684\u5B9E\u73B0\uFF0C\u652F\u6301 reCAPTCHA\n */\n\n/**\n * \u6267\u884C Google reCAPTCHA \u9A8C\u8BC1\n */\nconst executeRecaptcha = async (action: string, sitekey: string): Promise<string | false> => {\n if (typeof window === 'undefined' || !window.grecaptcha?.execute) {\n console.warn('[LiveChat Fetcher] reCAPTCHA not loaded')\n return false\n }\n\n try {\n const token = await window.grecaptcha.execute(sitekey, { action })\n return token\n } catch (error) {\n console.error('[LiveChat Fetcher] reCAPTCHA execution failed:', error)\n return false\n }\n}\n\n/**\n * \u83B7\u53D6 reCAPTCHA headers\n */\nasync function getRecaptchaHeaders(\n action: string,\n sitekey: string,\n headerKey = 'X-Recaptcha-Token'\n): Promise<Record<string, string>> {\n const recaptchaToken = await executeRecaptcha(action, sitekey)\n if (!recaptchaToken) {\n return {}\n }\n return {\n [headerKey]: recaptchaToken,\n }\n}\n\n/**\n * Fetcher \u53C2\u6570\n */\nexport interface FetcherOptions {\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n headers?: Record<string, string>\n body?: any\n timeout?: number\n needRecaptcha?: boolean\n recaptchaSitekey?: string\n recaptchaAction?: string\n recaptchaHeaderKey?: string\n}\n\n/**\n * Fetcher \u51FD\u6570\n * \u652F\u6301 reCAPTCHA \u548C\u81EA\u5B9A\u4E49 headers\n */\nexport const fetcher = async ({\n url,\n method = 'POST',\n headers = {},\n body,\n timeout = 90000,\n needRecaptcha = false,\n recaptchaSitekey,\n recaptchaAction = '',\n recaptchaHeaderKey = 'X-Recaptcha-Token',\n}: FetcherOptions): Promise<Response> => {\n // \u83B7\u53D6 reCAPTCHA headers\uFF08\u5982\u679C\u9700\u8981\uFF09\n let recaptchaHeaders: Record<string, string> = {}\n if (needRecaptcha) {\n if (!recaptchaSitekey) {\n console.warn('[LiveChat Fetcher] needRecaptcha=true but recaptchaSitekey is missing')\n } else {\n recaptchaHeaders = await getRecaptchaHeaders(recaptchaAction, recaptchaSitekey, recaptchaHeaderKey)\n }\n }\n\n // \u51C6\u5907\u8BF7\u6C42\u4F53\n const bodyData = body ? JSON.stringify(body) : undefined\n\n const controller = new AbortController()\n let timeoutTimer: NodeJS.Timeout | undefined\n if (timeout) {\n timeoutTimer = setTimeout(() => controller.abort(), timeout)\n }\n\n try {\n const response = await fetch(url, {\n method,\n mode: 'cors',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n ...recaptchaHeaders,\n },\n signal: controller.signal,\n ...(method !== 'GET' && bodyData && { body: bodyData }),\n })\n\n if (timeoutTimer) {\n clearTimeout(timeoutTimer)\n }\n\n return response\n } catch (error) {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer)\n }\n throw error\n }\n}\n\n/**\n * \u6269\u5C55 Window \u63A5\u53E3\u4EE5\u652F\u6301 grecaptcha\n */\ndeclare global {\n interface Window {\n grecaptcha?: {\n execute: (sitekey: string, options: { action: string }) => Promise<string>\n ready: (callback: () => void) => void\n }\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAQA,MAAMI,EAAmB,MAAOC,EAAgBC,IAA6C,CAC3F,GAAI,OAAO,OAAW,KAAe,CAAC,OAAO,YAAY,QACvD,eAAQ,KAAK,yCAAyC,EAC/C,GAGT,GAAI,CAEF,OADc,MAAM,OAAO,WAAW,QAAQA,EAAS,CAAE,OAAAD,CAAO,CAAC,CAEnE,OAASE,EAAO,CACd,eAAQ,MAAM,iDAAkDA,CAAK,EAC9D,EACT,CACF,EAKA,eAAeC,EACbH,EACAC,EACAG,EAAY,oBACqB,CACjC,MAAMC,EAAiB,MAAMN,EAAiBC,EAAQC,CAAO,EAC7D,OAAKI,EAGE,CACL,CAACD,CAAS,EAAGC,CACf,EAJS,CAAC,CAKZ,CAqBO,MAAMR,EAAU,MAAO,CAC5B,IAAAS,EACA,OAAAC,EAAS,OACT,QAAAC,EAAU,CAAC,EACX,KAAAC,EACA,QAAAC,EAAU,IACV,cAAAC,EAAgB,GAChB,iBAAAC,EACA,gBAAAC,EAAkB,GAClB,mBAAAC,EAAqB,mBACvB,IAAyC,CAEvC,IAAIC,EAA2C,CAAC,EAC5CJ,IACGC,EAGHG,EAAmB,MAAMZ,EAAoBU,EAAiBD,EAAkBE,CAAkB,EAFlG,QAAQ,KAAK,uEAAuE,GAOxF,MAAME,EAAWP,EAAO,KAAK,UAAUA,CAAI,EAAI,OAEzCQ,EAAa,IAAI,gBACvB,IAAIC,EACAR,IACFQ,EAAe,WAAW,IAAMD,EAAW,MAAM,EAAGP,CAAO,GAG7D,GAAI,CACF,MAAMS,EAAW,MAAM,MAAMb,EAAK,CAChC,OAAAC,EACA,KAAM,OACN,QAAS,CACP,eAAgB,mBAChB,GAAGC,EACH,GAAGO,CACL,EACA,OAAQE,EAAW,OACnB,GAAIV,IAAW,OAASS,GAAY,CAAE,KAAMA,CAAS,CACvD,CAAC,EAED,OAAIE,GACF,aAAaA,CAAY,EAGpBC,CACT,OAASjB,EAAO,CACd,MAAIgB,GACF,aAAaA,CAAY,EAErBhB,CACR,CACF",
6
+ "names": ["fetcher_exports", "__export", "fetcher", "__toCommonJS", "executeRecaptcha", "action", "sitekey", "error", "getRecaptchaHeaders", "headerKey", "recaptchaToken", "url", "method", "headers", "body", "timeout", "needRecaptcha", "recaptchaSitekey", "recaptchaAction", "recaptchaHeaderKey", "recaptchaHeaders", "bodyData", "controller", "timeoutTimer", "response"]
7
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 消息渲染器注册表
3
+ * 支持自定义消息类型的扩展机制
4
+ * 基于 specs/livechat-widget/plan.md 的扩展机制设计
5
+ */
6
+ import type { MessageContent, MessageRenderer } from '../types';
7
+ /**
8
+ * 消息渲染器注册表
9
+ * 允许注册自定义的消息类型渲染器
10
+ */
11
+ export declare class MessageRendererRegistry {
12
+ private renderers;
13
+ /**
14
+ * 注册自定义渲染器
15
+ * @param type 消息内容类型
16
+ * @param renderer 渲染器实现
17
+ */
18
+ register(type: string, renderer: MessageRenderer): void;
19
+ /**
20
+ * 批量注册渲染器
21
+ * @param renderers 渲染器映射表
22
+ */
23
+ registerMany(renderers: Record<string, MessageRenderer>): void;
24
+ /**
25
+ * 获取指定类型的渲染器
26
+ * @param type 消息内容类型
27
+ * @returns 渲染器实现,如果未注册则返回 undefined
28
+ */
29
+ get(type: string): MessageRenderer | undefined;
30
+ /**
31
+ * 检查是否已注册指定类型的渲染器
32
+ * @param type 消息内容类型
33
+ * @returns 是否已注册
34
+ */
35
+ has(type: string): boolean;
36
+ /**
37
+ * 移除指定类型的渲染器
38
+ * @param type 消息内容类型
39
+ * @returns 是否成功移除
40
+ */
41
+ unregister(type: string): boolean;
42
+ /**
43
+ * 清空所有已注册的渲染器
44
+ */
45
+ clear(): void;
46
+ /**
47
+ * 渲染消息内容
48
+ * @param content 消息内容
49
+ * @param isUser 是否为用户消息
50
+ * @param isSystem 是否为系统消息
51
+ * @returns 渲染结果,如果未找到对应渲染器则返回 null
52
+ */
53
+ render(content: MessageContent, isUser: boolean, isSystem: boolean): React.ReactNode;
54
+ /**
55
+ * 获取所有已注册的消息类型
56
+ * @returns 消息类型数组
57
+ */
58
+ getRegisteredTypes(): string[];
59
+ }
60
+ /**
61
+ * 创建默认的渲染器注册表实例
62
+ * @returns 新的注册表实例
63
+ */
64
+ export declare function createRendererRegistry(): MessageRendererRegistry;
@@ -0,0 +1,2 @@
1
+ "use strict";var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var y=(s,e,r)=>e in s?i(s,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[e]=r;var h=(s,e)=>{for(var r in e)i(s,r,{get:e[r],enumerable:!0})},f=(s,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of R(e))!u.call(s,n)&&n!==r&&i(s,n,{get:()=>e[n],enumerable:!(t=a(e,n))||t.enumerable});return s};var c=s=>f(i({},"__esModule",{value:!0}),s);var o=(s,e,r)=>(y(s,typeof e!="symbol"?e+"":e,r),r);var p={};h(p,{MessageRendererRegistry:()=>d,createRendererRegistry:()=>l});module.exports=c(p);class d{constructor(){o(this,"renderers",new Map)}register(e,r){if(!e||typeof e!="string")throw new Error("Message type must be a non-empty string");if(!r)throw new Error("Renderer is required");if(!("render"in r)||typeof r.render!="function")throw new Error("Renderer must have a render function");this.renderers.set(e,r)}registerMany(e){Object.entries(e).forEach(([r,t])=>{this.register(r,t)})}get(e){return this.renderers.get(e)}has(e){return this.renderers.has(e)}unregister(e){return this.renderers.delete(e)}clear(){this.renderers.clear()}render(e,r,t){const n=this.renderers.get(e.type);if(!n)return console.warn(`[MessageRendererRegistry] No renderer found for type: ${e.type}`),null;try{return n.render(e,r,t)}catch(g){return console.error(`[MessageRendererRegistry] Error rendering ${e.type}:`,g),null}}getRegisteredTypes(){return Array.from(this.renderers.keys())}}function l(){return new d}
2
+ //# sourceMappingURL=messageRenderers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/utils/messageRenderers.ts"],
4
+ "sourcesContent": ["/**\n * \u6D88\u606F\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n * \u652F\u6301\u81EA\u5B9A\u4E49\u6D88\u606F\u7C7B\u578B\u7684\u6269\u5C55\u673A\u5236\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6269\u5C55\u673A\u5236\u8BBE\u8BA1\n */\n\nimport type { MessageContent, MessageRenderer } from '../types'\n\n/**\n * \u6D88\u606F\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n * \u5141\u8BB8\u6CE8\u518C\u81EA\u5B9A\u4E49\u7684\u6D88\u606F\u7C7B\u578B\u6E32\u67D3\u5668\n */\nexport class MessageRendererRegistry {\n private renderers = new Map<string, MessageRenderer>()\n\n /**\n * \u6CE8\u518C\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n * @param type \u6D88\u606F\u5185\u5BB9\u7C7B\u578B\n * @param renderer \u6E32\u67D3\u5668\u5B9E\u73B0\n */\n register(type: string, renderer: MessageRenderer): void {\n if (!type || typeof type !== 'string') {\n throw new Error('Message type must be a non-empty string')\n }\n\n if (!renderer) {\n throw new Error('Renderer is required')\n }\n\n // \u68C0\u67E5 renderer \u662F\u5426\u6709 render \u5C5E\u6027\n if (!('render' in renderer) || typeof renderer.render !== 'function') {\n throw new Error('Renderer must have a render function')\n }\n\n this.renderers.set(type, renderer)\n }\n\n /**\n * \u6279\u91CF\u6CE8\u518C\u6E32\u67D3\u5668\n * @param renderers \u6E32\u67D3\u5668\u6620\u5C04\u8868\n */\n registerMany(renderers: Record<string, MessageRenderer>): void {\n Object.entries(renderers).forEach(([type, renderer]) => {\n this.register(type, renderer)\n })\n }\n\n /**\n * \u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u6E32\u67D3\u5668\n * @param type \u6D88\u606F\u5185\u5BB9\u7C7B\u578B\n * @returns \u6E32\u67D3\u5668\u5B9E\u73B0\uFF0C\u5982\u679C\u672A\u6CE8\u518C\u5219\u8FD4\u56DE undefined\n */\n get(type: string): MessageRenderer | undefined {\n return this.renderers.get(type)\n }\n\n /**\n * \u68C0\u67E5\u662F\u5426\u5DF2\u6CE8\u518C\u6307\u5B9A\u7C7B\u578B\u7684\u6E32\u67D3\u5668\n * @param type \u6D88\u606F\u5185\u5BB9\u7C7B\u578B\n * @returns \u662F\u5426\u5DF2\u6CE8\u518C\n */\n has(type: string): boolean {\n return this.renderers.has(type)\n }\n\n /**\n * \u79FB\u9664\u6307\u5B9A\u7C7B\u578B\u7684\u6E32\u67D3\u5668\n * @param type \u6D88\u606F\u5185\u5BB9\u7C7B\u578B\n * @returns \u662F\u5426\u6210\u529F\u79FB\u9664\n */\n unregister(type: string): boolean {\n return this.renderers.delete(type)\n }\n\n /**\n * \u6E05\u7A7A\u6240\u6709\u5DF2\u6CE8\u518C\u7684\u6E32\u67D3\u5668\n */\n clear(): void {\n this.renderers.clear()\n }\n\n /**\n * \u6E32\u67D3\u6D88\u606F\u5185\u5BB9\n * @param content \u6D88\u606F\u5185\u5BB9\n * @param isUser \u662F\u5426\u4E3A\u7528\u6237\u6D88\u606F\n * @param isSystem \u662F\u5426\u4E3A\u7CFB\u7EDF\u6D88\u606F\n * @returns \u6E32\u67D3\u7ED3\u679C\uFF0C\u5982\u679C\u672A\u627E\u5230\u5BF9\u5E94\u6E32\u67D3\u5668\u5219\u8FD4\u56DE null\n */\n render(content: MessageContent, isUser: boolean, isSystem: boolean): React.ReactNode {\n const renderer = this.renderers.get(content.type)\n\n if (!renderer) {\n console.warn(`[MessageRendererRegistry] No renderer found for type: ${content.type}`)\n return null\n }\n\n try {\n return renderer.render(content, isUser, isSystem)\n } catch (error) {\n console.error(`[MessageRendererRegistry] Error rendering ${content.type}:`, error)\n return null\n }\n }\n\n /**\n * \u83B7\u53D6\u6240\u6709\u5DF2\u6CE8\u518C\u7684\u6D88\u606F\u7C7B\u578B\n * @returns \u6D88\u606F\u7C7B\u578B\u6570\u7EC4\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.renderers.keys())\n }\n}\n\n/**\n * \u521B\u5EFA\u9ED8\u8BA4\u7684\u6E32\u67D3\u5668\u6CE8\u518C\u8868\u5B9E\u4F8B\n * @returns \u65B0\u7684\u6CE8\u518C\u8868\u5B9E\u4F8B\n */\nexport function createRendererRegistry(): MessageRendererRegistry {\n return new MessageRendererRegistry()\n}\n"],
5
+ "mappings": "qjBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,EAAA,2BAAAC,IAAA,eAAAC,EAAAJ,GAYO,MAAMK,CAAwB,CAA9B,cACLC,EAAA,KAAQ,YAAY,IAAI,KAOxB,SAASC,EAAcC,EAAiC,CACtD,GAAI,CAACD,GAAQ,OAAOA,GAAS,SAC3B,MAAM,IAAI,MAAM,yCAAyC,EAG3D,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,sBAAsB,EAIxC,GAAI,EAAE,WAAYA,IAAa,OAAOA,EAAS,QAAW,WACxD,MAAM,IAAI,MAAM,sCAAsC,EAGxD,KAAK,UAAU,IAAID,EAAMC,CAAQ,CACnC,CAMA,aAAaC,EAAkD,CAC7D,OAAO,QAAQA,CAAS,EAAE,QAAQ,CAAC,CAACF,EAAMC,CAAQ,IAAM,CACtD,KAAK,SAASD,EAAMC,CAAQ,CAC9B,CAAC,CACH,CAOA,IAAID,EAA2C,CAC7C,OAAO,KAAK,UAAU,IAAIA,CAAI,CAChC,CAOA,IAAIA,EAAuB,CACzB,OAAO,KAAK,UAAU,IAAIA,CAAI,CAChC,CAOA,WAAWA,EAAuB,CAChC,OAAO,KAAK,UAAU,OAAOA,CAAI,CACnC,CAKA,OAAc,CACZ,KAAK,UAAU,MAAM,CACvB,CASA,OAAOG,EAAyBC,EAAiBC,EAAoC,CACnF,MAAMJ,EAAW,KAAK,UAAU,IAAIE,EAAQ,IAAI,EAEhD,GAAI,CAACF,EACH,eAAQ,KAAK,yDAAyDE,EAAQ,IAAI,EAAE,EAC7E,KAGT,GAAI,CACF,OAAOF,EAAS,OAAOE,EAASC,EAAQC,CAAQ,CAClD,OAASC,EAAO,CACd,eAAQ,MAAM,6CAA6CH,EAAQ,IAAI,IAAKG,CAAK,EAC1E,IACT,CACF,CAMA,oBAA+B,CAC7B,OAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,CACzC,CACF,CAMO,SAASC,GAAkD,CAChE,OAAO,IAAIT,CACb",
6
+ "names": ["messageRenderers_exports", "__export", "MessageRendererRegistry", "createRendererRegistry", "__toCommonJS", "MessageRendererRegistry", "__publicField", "type", "renderer", "renderers", "content", "isUser", "isSystem", "error", "createRendererRegistry"]
7
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 产品数据转换工具函数
3
+ * 将后端返回的产品数据转换为前端使用的格式
4
+ */
5
+ import type { Product } from '../types';
6
+ /**
7
+ * 转换产品数据
8
+ * 将后端返回的产品对象转换为前端使用的 Product 类型
9
+ *
10
+ * @param product - 后端返回的产品数据
11
+ * @param site - 站点域名,用于构建产品 URL(可选,默认为空字符串)
12
+ * @returns 转换后的 Product 对象
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const backendProduct = {
17
+ * shopify_product_id: "gid://shopify/Product/123",
18
+ * handle: "product-handle",
19
+ * title: "Product Title",
20
+ * price_range: { min: 99.99, max: 149.99, currency: "USD" },
21
+ * // ... 其他字段
22
+ * }
23
+ *
24
+ * const product = transformProduct(backendProduct, "www.example.com")
25
+ * // product.shopifyId === "gid://shopify/Product/123"
26
+ * // product.productUrl === "https://www.example.com/products/product-handle"
27
+ * ```
28
+ */
29
+ export declare function transformProduct(product: any, site?: string): Product;
30
+ /**
31
+ * 批量转换产品列表
32
+ *
33
+ * @param products - 后端返回的产品数组
34
+ * @param site - 站点域名(可选)
35
+ * @returns 转换后的 Product 数组
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * const backendProducts = [product1, product2, product3]
40
+ * const products = transformProducts(backendProducts, "www.example.com")
41
+ * ```
42
+ */
43
+ export declare function transformProducts(products: any[], site?: string): Product[];
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var m=(e,n)=>{for(var i in n)s(e,i,{get:n[i],enumerable:!0})},u=(e,n,i,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of _(n))!o.call(e,r)&&r!==i&&s(e,r,{get:()=>n[r],enumerable:!(a=c(n,r))||a.enumerable});return e};var l=e=>u(s({},"__esModule",{value:!0}),e);var d={};m(d,{transformProduct:()=>t,transformProducts:()=>y});module.exports=l(d);function f(e){return{id:e.shopify_variant_id||e.id,title:e.title||e.option1,sku:e.sku,price:e.price?{amount:e.price,currency:e.currency||"USD"}:void 0,availableForSale:e.available,discount:e.discount?{has_discount:e.discount.has_discount,discount_price:e.discount.discount_price,discount_code:e.discount.discount_code,discount_percentage:e.discount.discount_percentage,discount_type:e.discount.discount_type,discount_value:e.discount.discount_value}:void 0,memberPrice:e.member_price?{has_member_price:e.member_price.has_member_price,price:e.member_price.price}:void 0,inventoryQuantity:e.inventory_quantity,option1:e.option1,option2:e.option2,option3:e.option3}}function t(e,n=""){return{shopifyId:e.shopify_product_id||e.id,sku:e.variants?.[0]?.sku||"",handle:e.handle,title:e.title,description:e.description,vendor:e.vendor,price:{amount:e.price_range?.min||e.variants?.[0]?.price||0,currency:e.price_range?.currency||e.variants?.[0]?.currency||"USD"},priceRange:e.price_range?{min:e.price_range.min,max:e.price_range.max,currency:e.price_range.currency}:void 0,memberPriceRange:e.member_price_range?{min:e.member_price_range.min,max:e.member_price_range.max,currency:e.member_price_range.currency}:void 0,imageUrl:e.featured_image||"",productUrl:n?`https://${n}/products/${e.handle}`:`/products/${e.handle}`,stockStatus:e.variants?.[0]?.available?"in_stock":"out_of_stock",hotScore:e.popularity_score,averageRating:e.average_rating,reviewCount:e.review_count,variantCount:e.variant_count,availableCount:e.available_count,variants:e.variants?.map(f),features:e.features?{is_new:e.features.is_new,has_rental:e.features.has_rental,has_presale:e.features.has_presale,has_member_price:e.features.has_member_price,has_discount:e.features.has_discount}:void 0,tags:e.tags}}function y(e,n){return Array.isArray(e)?e.map(i=>t(i,n)):[]}
2
+ //# sourceMappingURL=productTransformers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/utils/productTransformers.ts"],
4
+ "sourcesContent": ["/**\n * \u4EA7\u54C1\u6570\u636E\u8F6C\u6362\u5DE5\u5177\u51FD\u6570\n * \u5C06\u540E\u7AEF\u8FD4\u56DE\u7684\u4EA7\u54C1\u6570\u636E\u8F6C\u6362\u4E3A\u524D\u7AEF\u4F7F\u7528\u7684\u683C\u5F0F\n */\n\nimport type { Product, Variant } from '../types'\n\n/**\n * \u8F6C\u6362\u5355\u4E2A\u53D8\u4F53\u6570\u636E\n */\nfunction transformVariant(variant: any): Variant {\n return {\n id: variant.shopify_variant_id || variant.id,\n title: variant.title || variant.option1,\n sku: variant.sku,\n price: variant.price\n ? {\n amount: variant.price,\n currency: variant.currency || 'USD',\n }\n : undefined,\n availableForSale: variant.available,\n discount: variant.discount\n ? {\n has_discount: variant.discount.has_discount,\n discount_price: variant.discount.discount_price,\n discount_code: variant.discount.discount_code,\n discount_percentage: variant.discount.discount_percentage,\n discount_type: variant.discount.discount_type,\n discount_value: variant.discount.discount_value,\n }\n : undefined,\n memberPrice: variant.member_price\n ? {\n has_member_price: variant.member_price.has_member_price,\n price: variant.member_price.price,\n }\n : undefined,\n inventoryQuantity: variant.inventory_quantity,\n option1: variant.option1,\n option2: variant.option2,\n option3: variant.option3,\n }\n}\n\n/**\n * \u8F6C\u6362\u4EA7\u54C1\u6570\u636E\n * \u5C06\u540E\u7AEF\u8FD4\u56DE\u7684\u4EA7\u54C1\u5BF9\u8C61\u8F6C\u6362\u4E3A\u524D\u7AEF\u4F7F\u7528\u7684 Product \u7C7B\u578B\n *\n * @param product - \u540E\u7AEF\u8FD4\u56DE\u7684\u4EA7\u54C1\u6570\u636E\n * @param site - \u7AD9\u70B9\u57DF\u540D\uFF0C\u7528\u4E8E\u6784\u5EFA\u4EA7\u54C1 URL\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4E3A\u7A7A\u5B57\u7B26\u4E32\uFF09\n * @returns \u8F6C\u6362\u540E\u7684 Product \u5BF9\u8C61\n *\n * @example\n * ```ts\n * const backendProduct = {\n * shopify_product_id: \"gid://shopify/Product/123\",\n * handle: \"product-handle\",\n * title: \"Product Title\",\n * price_range: { min: 99.99, max: 149.99, currency: \"USD\" },\n * // ... \u5176\u4ED6\u5B57\u6BB5\n * }\n *\n * const product = transformProduct(backendProduct, \"www.example.com\")\n * // product.shopifyId === \"gid://shopify/Product/123\"\n * // product.productUrl === \"https://www.example.com/products/product-handle\"\n * ```\n */\nexport function transformProduct(product: any, site: string = ''): Product {\n return {\n // \u57FA\u672C\u4FE1\u606F\n shopifyId: product.shopify_product_id || product.id,\n sku: product.variants?.[0]?.sku || '',\n handle: product.handle,\n title: product.title,\n description: product.description,\n vendor: product.vendor,\n\n // \u4EF7\u683C\u4FE1\u606F\n price: {\n amount: product.price_range?.min || product.variants?.[0]?.price || 0,\n currency: product.price_range?.currency || product.variants?.[0]?.currency || 'USD',\n },\n priceRange: product.price_range\n ? {\n min: product.price_range.min,\n max: product.price_range.max,\n currency: product.price_range.currency,\n }\n : undefined,\n memberPriceRange: product.member_price_range\n ? {\n min: product.member_price_range.min,\n max: product.member_price_range.max,\n currency: product.member_price_range.currency,\n }\n : undefined,\n\n // \u5A92\u4F53\u548C\u94FE\u63A5\n imageUrl: product.featured_image || '',\n productUrl: site ? `https://${site}/products/${product.handle}` : `/products/${product.handle}`,\n\n // \u5E93\u5B58\u548C\u72B6\u6001\n stockStatus: product.variants?.[0]?.available ? 'in_stock' : 'out_of_stock',\n\n // \u8BC4\u5206\u548C\u70ED\u5EA6\n hotScore: product.popularity_score,\n averageRating: product.average_rating,\n reviewCount: product.review_count,\n\n // \u53D8\u4F53\u4FE1\u606F\n variantCount: product.variant_count,\n availableCount: product.available_count,\n variants: product.variants?.map(transformVariant),\n\n // \u7279\u6027\u548C\u6807\u7B7E\n features: product.features\n ? {\n is_new: product.features.is_new,\n has_rental: product.features.has_rental,\n has_presale: product.features.has_presale,\n has_member_price: product.features.has_member_price,\n has_discount: product.features.has_discount,\n }\n : undefined,\n tags: product.tags,\n }\n}\n\n/**\n * \u6279\u91CF\u8F6C\u6362\u4EA7\u54C1\u5217\u8868\n *\n * @param products - \u540E\u7AEF\u8FD4\u56DE\u7684\u4EA7\u54C1\u6570\u7EC4\n * @param site - \u7AD9\u70B9\u57DF\u540D\uFF08\u53EF\u9009\uFF09\n * @returns \u8F6C\u6362\u540E\u7684 Product \u6570\u7EC4\n *\n * @example\n * ```ts\n * const backendProducts = [product1, product2, product3]\n * const products = transformProducts(backendProducts, \"www.example.com\")\n * ```\n */\nexport function transformProducts(products: any[], site?: string): Product[] {\n if (!Array.isArray(products)) {\n return []\n }\n\n return products.map(product => transformProduct(product, site))\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,EAAA,sBAAAC,IAAA,eAAAC,EAAAJ,GAUA,SAASK,EAAiBC,EAAuB,CAC/C,MAAO,CACL,GAAIA,EAAQ,oBAAsBA,EAAQ,GAC1C,MAAOA,EAAQ,OAASA,EAAQ,QAChC,IAAKA,EAAQ,IACb,MAAOA,EAAQ,MACX,CACE,OAAQA,EAAQ,MAChB,SAAUA,EAAQ,UAAY,KAChC,EACA,OACJ,iBAAkBA,EAAQ,UAC1B,SAAUA,EAAQ,SACd,CACE,aAAcA,EAAQ,SAAS,aAC/B,eAAgBA,EAAQ,SAAS,eACjC,cAAeA,EAAQ,SAAS,cAChC,oBAAqBA,EAAQ,SAAS,oBACtC,cAAeA,EAAQ,SAAS,cAChC,eAAgBA,EAAQ,SAAS,cACnC,EACA,OACJ,YAAaA,EAAQ,aACjB,CACE,iBAAkBA,EAAQ,aAAa,iBACvC,MAAOA,EAAQ,aAAa,KAC9B,EACA,OACJ,kBAAmBA,EAAQ,mBAC3B,QAASA,EAAQ,QACjB,QAASA,EAAQ,QACjB,QAASA,EAAQ,OACnB,CACF,CAyBO,SAASJ,EAAiBK,EAAcC,EAAe,GAAa,CACzE,MAAO,CAEL,UAAWD,EAAQ,oBAAsBA,EAAQ,GACjD,IAAKA,EAAQ,WAAW,CAAC,GAAG,KAAO,GACnC,OAAQA,EAAQ,OAChB,MAAOA,EAAQ,MACf,YAAaA,EAAQ,YACrB,OAAQA,EAAQ,OAGhB,MAAO,CACL,OAAQA,EAAQ,aAAa,KAAOA,EAAQ,WAAW,CAAC,GAAG,OAAS,EACpE,SAAUA,EAAQ,aAAa,UAAYA,EAAQ,WAAW,CAAC,GAAG,UAAY,KAChF,EACA,WAAYA,EAAQ,YAChB,CACE,IAAKA,EAAQ,YAAY,IACzB,IAAKA,EAAQ,YAAY,IACzB,SAAUA,EAAQ,YAAY,QAChC,EACA,OACJ,iBAAkBA,EAAQ,mBACtB,CACE,IAAKA,EAAQ,mBAAmB,IAChC,IAAKA,EAAQ,mBAAmB,IAChC,SAAUA,EAAQ,mBAAmB,QACvC,EACA,OAGJ,SAAUA,EAAQ,gBAAkB,GACpC,WAAYC,EAAO,WAAWA,CAAI,aAAaD,EAAQ,MAAM,GAAK,aAAaA,EAAQ,MAAM,GAG7F,YAAaA,EAAQ,WAAW,CAAC,GAAG,UAAY,WAAa,eAG7D,SAAUA,EAAQ,iBAClB,cAAeA,EAAQ,eACvB,YAAaA,EAAQ,aAGrB,aAAcA,EAAQ,cACtB,eAAgBA,EAAQ,gBACxB,SAAUA,EAAQ,UAAU,IAAIF,CAAgB,EAGhD,SAAUE,EAAQ,SACd,CACE,OAAQA,EAAQ,SAAS,OACzB,WAAYA,EAAQ,SAAS,WAC7B,YAAaA,EAAQ,SAAS,YAC9B,iBAAkBA,EAAQ,SAAS,iBACnC,aAAcA,EAAQ,SAAS,YACjC,EACA,OACJ,KAAMA,EAAQ,IAChB,CACF,CAeO,SAASJ,EAAkBM,EAAiBD,EAA0B,CAC3E,OAAK,MAAM,QAAQC,CAAQ,EAIpBA,EAAS,IAAIF,GAAWL,EAAiBK,EAASC,CAAI,CAAC,EAHrD,CAAC,CAIZ",
6
+ "names": ["productTransformers_exports", "__export", "transformProduct", "transformProducts", "__toCommonJS", "transformVariant", "variant", "product", "site", "products"]
7
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * userId 生成和管理工具
3
+ * 基于 specs/livechat-widget/research.md 的决策
4
+ *
5
+ * 策略:
6
+ * 1. 优先从 localStorage 读取
7
+ * 2. 尝试获取 Google Analytics ID (GAID)
8
+ * 3. 兜底:时间戳 + 随机数哈希
9
+ */
10
+ /**
11
+ * 获取用户唯一标识符(异步版本)
12
+ * @returns userId (GAID 或哈希值)
13
+ */
14
+ export declare function getUserId(): Promise<string>;
15
+ /**
16
+ * 清除保存的 userId(用于测试或重置)
17
+ */
18
+ export declare function clearUserId(): void;
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var g=(e,t)=>{for(var n in t)s(e,n,{get:t[n],enumerable:!0})},h=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of f(t))!u.call(e,o)&&o!==n&&s(e,o,{get:()=>t[o],enumerable:!(r=l(t,o))||r.enumerable});return e};var w=e=>h(s({},"__esModule",{value:!0}),e);var A={};g(A,{clearUserId:()=>I,getUserId:()=>y});module.exports=w(A);const i="livechat_user_id";async function y(){if(typeof window<"u"){const t=localStorage.getItem(i);if(t)return t}const e=m();if(e)return typeof window<"u"&&localStorage.setItem(i,e),e;try{const t=await S();return typeof window<"u"&&localStorage.setItem(i,t),t}catch(t){console.warn("[LiveChat userId] SHA-256 failed, using sync fallback:",t);const n=p();return typeof window<"u"&&localStorage.setItem(i,n),n}}function m(){if(typeof window>"u")return null;if(typeof window.gtag!="function")return console.warn("[LiveChat userId] Google Analytics gtag is not available"),null;try{const e=window.dataLayer||[];for(const t of e)if(t&&t[1]&&typeof t[1]=="object"){const n=t[1].client_id||t[1].clientId;if(n&&typeof n=="string")return`G-${n}`}return null}catch(e){return console.error("[LiveChat userId] Failed to get GAID:",e),null}}async function S(){const e=Date.now(),t=Math.random().toString(36).substring(2,15),n=`${e}${t}`,o=new TextEncoder().encode(n),a=await crypto.subtle.digest("SHA-256",o);return`user-${Array.from(new Uint8Array(a)).map(d=>d.toString(16).padStart(2,"0")).join("").substring(0,16)}`}function p(){const e=Date.now(),t=Math.random().toString(36).substring(2,15),n=`${e}${t}`;let r=0;for(let a=0;a<n.length;a++){const c=n.charCodeAt(a);r=(r<<5)-r+c,r=r&r}return`user-${Math.abs(r).toString(16).padStart(8,"0")}`}function I(){typeof window<"u"&&localStorage.removeItem(i)}
2
+ //# sourceMappingURL=userId.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/utils/userId.ts"],
4
+ "sourcesContent": ["/**\n * userId \u751F\u6210\u548C\u7BA1\u7406\u5DE5\u5177\n * \u57FA\u4E8E specs/livechat-widget/research.md \u7684\u51B3\u7B56\n *\n * \u7B56\u7565\uFF1A\n * 1. \u4F18\u5148\u4ECE localStorage \u8BFB\u53D6\n * 2. \u5C1D\u8BD5\u83B7\u53D6 Google Analytics ID (GAID)\n * 3. \u515C\u5E95\uFF1A\u65F6\u95F4\u6233 + \u968F\u673A\u6570\u54C8\u5E0C\n */\n\nconst STORAGE_KEY = 'livechat_user_id'\n\n/**\n * \u83B7\u53D6\u7528\u6237\u552F\u4E00\u6807\u8BC6\u7B26\uFF08\u5F02\u6B65\u7248\u672C\uFF09\n * @returns userId (GAID \u6216\u54C8\u5E0C\u503C)\n */\nexport async function getUserId(): Promise<string> {\n // 1. \u5C1D\u8BD5\u4ECE localStorage \u8BFB\u53D6\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored) return stored\n }\n\n // 2. \u5C1D\u8BD5\u83B7\u53D6 GAID\n const gaid = getGAID()\n if (gaid) {\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, gaid)\n }\n return gaid\n }\n\n // 3. \u515C\u5E95\uFF1A\u4F7F\u7528 SHA-256 \u751F\u6210\u54C8\u5E0C\n try {\n const fallback = await generateHashedUserId()\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, fallback)\n }\n return fallback\n } catch (error) {\n // \u5982\u679C SHA-256 \u5931\u8D25\uFF0C\u4F7F\u7528\u540C\u6B65\u515C\u5E95\u65B9\u6848\n console.warn('[LiveChat userId] SHA-256 failed, using sync fallback:', error)\n const fallback = generateHashedUserIdSync()\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, fallback)\n }\n return fallback\n }\n}\n\n/**\n * \u4ECE Google Analytics \u83B7\u53D6 Client ID (GAID)\n * @returns GAID \u6216 null\n */\nfunction getGAID(): string | null {\n if (typeof window === 'undefined') return null\n\n // \u68C0\u67E5 gtag \u662F\u5426\u53EF\u7528\n if (typeof (window as any).gtag !== 'function') {\n console.warn('[LiveChat userId] Google Analytics gtag is not available')\n return null\n }\n\n try {\n // Google Analytics 4 \u65B9\u6CD5\n // \u6CE8\u610F\uFF1Agtag \u7684 'get' \u547D\u4EE4\u662F\u5F02\u6B65\u7684\uFF0C\u8FD9\u91CC\u4F7F\u7528\u540C\u6B65 fallback\n // \u5728\u5B9E\u9645\u9879\u76EE\u4E2D\uFF0C\u5982\u679C GA \u5DF2\u521D\u59CB\u5316\uFF0C\u53EF\u4EE5\u4ECE dataLayer \u8BFB\u53D6\n const dataLayer = (window as any).dataLayer || []\n\n // \u5C1D\u8BD5\u4ECE dataLayer \u4E2D\u67E5\u627E\u5DF2\u5B58\u5728\u7684 client_id\n for (const item of dataLayer) {\n if (item && item[1] && typeof item[1] === 'object') {\n const clientId = item[1].client_id || item[1].clientId\n if (clientId && typeof clientId === 'string') {\n return `G-${clientId}`\n }\n }\n }\n\n // \u5982\u679C\u6CA1\u6709\u627E\u5230\uFF0C\u8FD4\u56DE null\uFF0C\u4F7F\u7528\u515C\u5E95\u65B9\u6848\n return null\n } catch (error) {\n console.error('[LiveChat userId] Failed to get GAID:', error)\n return null\n }\n}\n\n/**\n * \u751F\u6210\u54C8\u5E0C\u7528\u6237 ID\uFF08\u515C\u5E95\u65B9\u6848\uFF09\n * @returns \u683C\u5F0F\u4E3A user-{hash} \u7684\u7528\u6237 ID\uFF0Chash \u7531 timestamp + random \u901A\u8FC7 SHA-256 \u751F\u6210\n */\nasync function generateHashedUserId(): Promise<string> {\n const timestamp = Date.now()\n const random = Math.random().toString(36).substring(2, 15) // \u751F\u6210\u968F\u673A\u5B57\u7B26\u4E32\n\n // \u5C06 timestamp \u548C random \u7EC4\u5408\u6210\u5B57\u7B26\u4E32\n const rawString = `${timestamp}${random}`\n\n // \u4F7F\u7528 Web Crypto API \u751F\u6210 SHA-256 \u54C8\u5E0C\n const encoder = new TextEncoder()\n const data = encoder.encode(rawString)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n\n // \u5C06 ArrayBuffer \u8F6C\u6362\u4E3A 16 \u8FDB\u5236\u5B57\u7B26\u4E32\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n\n // \u53D6\u524D 16 \u4F4D\u4F5C\u4E3A\u7528\u6237 ID\uFF08\u4FDD\u6301\u7B80\u6D01\uFF09\n return `user-${hashHex.substring(0, 16)}`\n}\n\n/**\n * \u540C\u6B65\u7248\u672C\u7684\u54C8\u5E0C\u7528\u6237 ID \u751F\u6210\uFF08\u515C\u5E95\u7684\u515C\u5E95\uFF09\n * \u5F53 Web Crypto API \u4E0D\u53EF\u7528\u65F6\u4F7F\u7528\n */\nfunction generateHashedUserIdSync(): string {\n const timestamp = Date.now()\n const random = Math.random().toString(36).substring(2, 15)\n const rawString = `${timestamp}${random}`\n\n // \u4F7F\u7528\u7B80\u5355\u7684\u54C8\u5E0C\u7B97\u6CD5\u4F5C\u4E3A\u515C\u5E95\n let hash = 0\n for (let i = 0; i < rawString.length; i++) {\n const char = rawString.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash\n }\n\n const hashString = Math.abs(hash).toString(16).padStart(8, '0')\n return `user-${hashString}`\n}\n\n/**\n * \u6E05\u9664\u4FDD\u5B58\u7684 userId\uFF08\u7528\u4E8E\u6D4B\u8BD5\u6216\u91CD\u7F6E\uFF09\n */\nexport function clearUserId(): void {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEY)\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,cAAAC,IAAA,eAAAC,EAAAJ,GAUA,MAAMK,EAAc,mBAMpB,eAAsBF,GAA6B,CAEjD,GAAI,OAAO,OAAW,IAAa,CACjC,MAAMG,EAAS,aAAa,QAAQD,CAAW,EAC/C,GAAIC,EAAQ,OAAOA,CACrB,CAGA,MAAMC,EAAOC,EAAQ,EACrB,GAAID,EACF,OAAI,OAAO,OAAW,KACpB,aAAa,QAAQF,EAAaE,CAAI,EAEjCA,EAIT,GAAI,CACF,MAAME,EAAW,MAAMC,EAAqB,EAC5C,OAAI,OAAO,OAAW,KACpB,aAAa,QAAQL,EAAaI,CAAQ,EAErCA,CACT,OAASE,EAAO,CAEd,QAAQ,KAAK,yDAA0DA,CAAK,EAC5E,MAAMF,EAAWG,EAAyB,EAC1C,OAAI,OAAO,OAAW,KACpB,aAAa,QAAQP,EAAaI,CAAQ,EAErCA,CACT,CACF,CAMA,SAASD,GAAyB,CAChC,GAAI,OAAO,OAAW,IAAa,OAAO,KAG1C,GAAI,OAAQ,OAAe,MAAS,WAClC,eAAQ,KAAK,0DAA0D,EAChE,KAGT,GAAI,CAIF,MAAMK,EAAa,OAAe,WAAa,CAAC,EAGhD,UAAWC,KAAQD,EACjB,GAAIC,GAAQA,EAAK,CAAC,GAAK,OAAOA,EAAK,CAAC,GAAM,SAAU,CAClD,MAAMC,EAAWD,EAAK,CAAC,EAAE,WAAaA,EAAK,CAAC,EAAE,SAC9C,GAAIC,GAAY,OAAOA,GAAa,SAClC,MAAO,KAAKA,CAAQ,EAExB,CAIF,OAAO,IACT,OAASJ,EAAO,CACd,eAAQ,MAAM,wCAAyCA,CAAK,EACrD,IACT,CACF,CAMA,eAAeD,GAAwC,CACrD,MAAMM,EAAY,KAAK,IAAI,EACrBC,EAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EAGnDC,EAAY,GAAGF,CAAS,GAAGC,CAAM,GAIjCE,EADU,IAAI,YAAY,EACX,OAAOD,CAAS,EAC/BE,EAAa,MAAM,OAAO,OAAO,OAAO,UAAWD,CAAI,EAO7D,MAAO,QAJW,MAAM,KAAK,IAAI,WAAWC,CAAU,CAAC,EAC7B,IAAIC,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAGpD,UAAU,EAAG,EAAE,CAAC,EACzC,CAMA,SAAST,GAAmC,CAC1C,MAAMI,EAAY,KAAK,IAAI,EACrBC,EAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EACnDC,EAAY,GAAGF,CAAS,GAAGC,CAAM,GAGvC,IAAIK,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIL,EAAU,OAAQK,IAAK,CACzC,MAAMC,EAAON,EAAU,WAAWK,CAAC,EACnCD,GAAQA,GAAQ,GAAKA,EAAOE,EAC5BF,EAAOA,EAAOA,CAChB,CAGA,MAAO,QADY,KAAK,IAAIA,CAAI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CACrC,EAC3B,CAKO,SAASpB,GAAoB,CAC9B,OAAO,OAAW,KACpB,aAAa,WAAWG,CAAW,CAEvC",
6
+ "names": ["userId_exports", "__export", "clearUserId", "getUserId", "__toCommonJS", "STORAGE_KEY", "stored", "gaid", "getGAID", "fallback", "generateHashedUserId", "error", "generateHashedUserIdSync", "dataLayer", "item", "clientId", "timestamp", "random", "rawString", "data", "hashBuffer", "b", "hash", "i", "char"]
7
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 输入验证工具
3
+ * 基于 specs/livechat-widget/research.md 的 XSS 防护策略
4
+ */
5
+ /**
6
+ * 清理用户输入
7
+ * - 移除控制字符
8
+ * - 限制长度
9
+ * @param input 用户输入的字符串
10
+ * @param maxLength 最大长度
11
+ * @returns 清理后的字符串
12
+ */
13
+ export declare function sanitizeInput(input: string, maxLength?: number): string;
14
+ /**
15
+ * 验证 URL 是否安全
16
+ * @param url URL 字符串
17
+ * @returns 是否为安全的 URL
18
+ */
19
+ export declare function isValidUrl(url: string): boolean;
20
+ /**
21
+ * 验证 sessionId 是否为有效的 UUID
22
+ * @param sessionId 会话 ID
23
+ * @returns 是否为有效的 UUID
24
+ */
25
+ export declare function isValidUUID(sessionId: string): boolean;
26
+ /**
27
+ * 验证消息内容是否有效
28
+ * @param content 消息内容
29
+ * @returns 是否有效
30
+ */
31
+ export declare function isValidMessageContent(content: string): boolean;
32
+ /**
33
+ * 转义 HTML 特殊字符
34
+ * @param text 原始文本
35
+ * @returns 转义后的文本
36
+ */
37
+ export declare function escapeHtml(text: string): string;
@@ -0,0 +1,2 @@
1
+ "use strict";var i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var g=(t,r)=>{for(var e in r)i(t,e,{get:r[e],enumerable:!0})},u=(t,r,e,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of f(r))!a.call(t,n)&&n!==e&&i(t,n,{get:()=>r[n],enumerable:!(o=s(r,n))||o.enumerable});return t};var l=t=>u(i({},"__esModule",{value:!0}),t);var b={};g(b,{escapeHtml:()=>x,isValidMessageContent:()=>m,isValidUUID:()=>d,isValidUrl:()=>c,sanitizeInput:()=>p});module.exports=l(b);function p(t,r=5e3){if(!t||typeof t!="string")return"";let e=t.replace(/[\x00-\x1F\x7F]/g,"");return e.length>r&&(e=e.substring(0,r)),e.trim()}function c(t){if(!t||typeof t!="string")return!1;try{const r=new URL(t);return r.protocol==="http:"||r.protocol==="https:"}catch{return!1}}function d(t){return!t||typeof t!="string"?!1:/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function m(t){if(!t||typeof t!="string")return!1;const r=t.trim();return r.length>0&&r.length<=5e3}function x(t){if(!t||typeof t!="string")return"";const r={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};return t.replace(/[&<>"']/g,e=>r[e]||e)}
2
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/LiveChatWidget/utils/validation.ts"],
4
+ "sourcesContent": ["/**\n * \u8F93\u5165\u9A8C\u8BC1\u5DE5\u5177\n * \u57FA\u4E8E specs/livechat-widget/research.md \u7684 XSS \u9632\u62A4\u7B56\u7565\n */\n\n/**\n * \u6E05\u7406\u7528\u6237\u8F93\u5165\n * - \u79FB\u9664\u63A7\u5236\u5B57\u7B26\n * - \u9650\u5236\u957F\u5EA6\n * @param input \u7528\u6237\u8F93\u5165\u7684\u5B57\u7B26\u4E32\n * @param maxLength \u6700\u5927\u957F\u5EA6\n * @returns \u6E05\u7406\u540E\u7684\u5B57\u7B26\u4E32\n */\nexport function sanitizeInput(input: string, maxLength: number = 5000): string {\n if (!input || typeof input !== 'string') {\n return ''\n }\n\n // \u79FB\u9664\u63A7\u5236\u5B57\u7B26\uFF08ASCII 0-31 \u548C 127\uFF09\n let sanitized = input.replace(/[\\x00-\\x1F\\x7F]/g, '')\n\n // \u9650\u5236\u957F\u5EA6\n if (sanitized.length > maxLength) {\n sanitized = sanitized.substring(0, maxLength)\n }\n\n // \u53BB\u9664\u9996\u5C3E\u7A7A\u767D\n return sanitized.trim()\n}\n\n/**\n * \u9A8C\u8BC1 URL \u662F\u5426\u5B89\u5168\n * @param url URL \u5B57\u7B26\u4E32\n * @returns \u662F\u5426\u4E3A\u5B89\u5168\u7684 URL\n */\nexport function isValidUrl(url: string): boolean {\n if (!url || typeof url !== 'string') {\n return false\n }\n\n try {\n const parsed = new URL(url)\n // \u53EA\u5141\u8BB8 http \u548C https \u534F\u8BAE\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\n } catch {\n return false\n }\n}\n\n/**\n * \u9A8C\u8BC1 sessionId \u662F\u5426\u4E3A\u6709\u6548\u7684 UUID\n * @param sessionId \u4F1A\u8BDD ID\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 UUID\n */\nexport function isValidUUID(sessionId: string): boolean {\n if (!sessionId || typeof sessionId !== 'string') {\n return false\n }\n\n // UUID v4 \u683C\u5F0F\uFF1Axxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n return uuidRegex.test(sessionId)\n}\n\n/**\n * \u9A8C\u8BC1\u6D88\u606F\u5185\u5BB9\u662F\u5426\u6709\u6548\n * @param content \u6D88\u606F\u5185\u5BB9\n * @returns \u662F\u5426\u6709\u6548\n */\nexport function isValidMessageContent(content: string): boolean {\n if (!content || typeof content !== 'string') {\n return false\n }\n\n // \u53BB\u9664\u7A7A\u767D\u540E\u4E0D\u80FD\u4E3A\u7A7A\n const trimmed = content.trim()\n return trimmed.length > 0 && trimmed.length <= 5000\n}\n\n/**\n * \u8F6C\u4E49 HTML \u7279\u6B8A\u5B57\u7B26\n * @param text \u539F\u59CB\u6587\u672C\n * @returns \u8F6C\u4E49\u540E\u7684\u6587\u672C\n */\nexport function escapeHtml(text: string): string {\n if (!text || typeof text !== 'string') {\n return ''\n }\n\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n }\n\n return text.replace(/[&<>\"']/g, char => map[char] || char)\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,EAAA,0BAAAC,EAAA,gBAAAC,EAAA,eAAAC,EAAA,kBAAAC,IAAA,eAAAC,EAAAP,GAaO,SAASM,EAAcE,EAAeC,EAAoB,IAAc,CAC7E,GAAI,CAACD,GAAS,OAAOA,GAAU,SAC7B,MAAO,GAIT,IAAIE,EAAYF,EAAM,QAAQ,mBAAoB,EAAE,EAGpD,OAAIE,EAAU,OAASD,IACrBC,EAAYA,EAAU,UAAU,EAAGD,CAAS,GAIvCC,EAAU,KAAK,CACxB,CAOO,SAASL,EAAWM,EAAsB,CAC/C,GAAI,CAACA,GAAO,OAAOA,GAAQ,SACzB,MAAO,GAGT,GAAI,CACF,MAAMC,EAAS,IAAI,IAAID,CAAG,EAE1B,OAAOC,EAAO,WAAa,SAAWA,EAAO,WAAa,QAC5D,MAAQ,CACN,MAAO,EACT,CACF,CAOO,SAASR,EAAYS,EAA4B,CACtD,MAAI,CAACA,GAAa,OAAOA,GAAc,SAC9B,GAIS,yEACD,KAAKA,CAAS,CACjC,CAOO,SAASV,EAAsBW,EAA0B,CAC9D,GAAI,CAACA,GAAW,OAAOA,GAAY,SACjC,MAAO,GAIT,MAAMC,EAAUD,EAAQ,KAAK,EAC7B,OAAOC,EAAQ,OAAS,GAAKA,EAAQ,QAAU,GACjD,CAOO,SAASb,EAAWc,EAAsB,CAC/C,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAC3B,MAAO,GAGT,MAAMC,EAA8B,CAClC,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,OACP,EAEA,OAAOD,EAAK,QAAQ,WAAYE,GAAQD,EAAIC,CAAI,GAAKA,CAAI,CAC3D",
6
+ "names": ["validation_exports", "__export", "escapeHtml", "isValidMessageContent", "isValidUUID", "isValidUrl", "sanitizeInput", "__toCommonJS", "input", "maxLength", "sanitized", "url", "parsed", "sessionId", "content", "trimmed", "text", "map", "char"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var k=Object.create;var a=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var f=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var y=(o,e)=>{for(var r in e)a(o,r,{get:e[r],enumerable:!0})},i=(o,e,r,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of w(e))!u.call(o,n)&&n!==r&&a(o,n,{get:()=>e[n],enumerable:!(p=M(e,n))||p.enumerable});return o};var m=(o,e,r)=>(r=o!=null?k(f(o)):{},i(e||!o||!o.__esModule?a(r,"default",{value:o,enumerable:!0}):r,o)),C=o=>i(a({},"__esModule",{value:!0}),o);var R={};y(R,{Markdown:()=>h});module.exports=C(R);var t=require("react/jsx-runtime"),s=require("react"),c=m(require("react-markdown")),d=m(require("remark-gfm")),l=m(require("remark-math"));const g=(0,s.memo)(c.default,(o,e)=>o.children===e.children&&o.className===e.className),h=({content:o})=>(0,t.jsx)("div",{className:"copilotKitMarkdown",children:(0,t.jsx)(g,{components:N,remarkPlugins:[d.default,l.default],children:o})}),N={p({children:o}){return(0,t.jsx)("p",{children:o})},a({children:o,...e}){return(0,t.jsx)("a",{style:{color:"blue",textDecoration:"underline"},...e,target:"_blank",rel:"noopener noreferrer",children:o})}};
1
+ "use strict";var l=Object.create;var p=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var f=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var y=(o,r)=>{for(var e in r)p(o,e,{get:r[e],enumerable:!0})},i=(o,r,e,m)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of w(r))!u.call(o,n)&&n!==e&&p(o,n,{get:()=>r[n],enumerable:!(m=M(r,n))||m.enumerable});return o};var a=(o,r,e)=>(e=o!=null?l(f(o)):{},i(r||!o||!o.__esModule?p(e,"default",{value:o,enumerable:!0}):e,o)),C=o=>i(p({},"__esModule",{value:!0}),o);var R={};y(R,{Markdown:()=>h});module.exports=C(R);var t=require("react/jsx-runtime"),s=require("react"),c=a(require("react-markdown")),d=a(require("remark-gfm")),k=a(require("remark-math"));const g=(0,s.memo)(c.default,(o,r)=>o.children===r.children),h=({content:o})=>(0,t.jsx)("div",{className:"copilotKitMarkdown",children:(0,t.jsx)(g,{components:P,remarkPlugins:[d.default,k.default],children:o})}),P={p({children:o}){return(0,t.jsx)("p",{children:o})},a({children:o,...r}){return(0,t.jsx)("a",{style:{color:"blue",textDecoration:"underline"},...r,target:"_blank",rel:"noopener noreferrer",children:o})}};
2
2
  //# sourceMappingURL=markdown.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/chat/markdown.tsx"],
4
- "sourcesContent": ["import { type FC, memo } from 'react'\nimport ReactMarkdown, { type Options, type Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport remarkMath from 'remark-math'\n\nconst MemoizedReactMarkdown: FC<Options> = memo(\n ReactMarkdown,\n (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className\n)\n\ntype MarkdownProps = {\n content: string\n}\n\nexport const Markdown = ({ content }: MarkdownProps) => {\n return (\n <div className=\"copilotKitMarkdown\">\n <MemoizedReactMarkdown components={components} remarkPlugins={[remarkGfm, remarkMath]}>\n {content}\n </MemoizedReactMarkdown>\n </div>\n )\n}\n\nconst components: Components = {\n p({ children }) {\n return <p>{children}</p>\n },\n a({ children, ...props }) {\n return (\n <a style={{ color: 'blue', textDecoration: 'underline' }} {...props} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n )\n },\n}\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAiBM,IAAAI,EAAA,6BAjBNC,EAA8B,iBAC9BC,EAA6D,6BAC7DC,EAAsB,yBACtBC,EAAuB,0BAEvB,MAAMC,KAAqC,QACzC,EAAAC,QACA,CAACC,EAAWC,IAAcD,EAAU,WAAaC,EAAU,UAAYD,EAAU,YAAcC,EAAU,SAC3G,EAMaV,EAAW,CAAC,CAAE,QAAAW,CAAQ,OAE/B,OAAC,OAAI,UAAU,qBACb,mBAACJ,EAAA,CAAsB,WAAYK,EAAY,cAAe,CAAC,EAAAC,QAAW,EAAAC,OAAU,EACjF,SAAAH,EACH,EACF,EAIEC,EAAyB,CAC7B,EAAE,CAAE,SAAAG,CAAS,EAAG,CACd,SAAO,OAAC,KAAG,SAAAA,EAAS,CACtB,EACA,EAAE,CAAE,SAAAA,EAAU,GAAGC,CAAM,EAAG,CACxB,SACE,OAAC,KAAE,MAAO,CAAE,MAAO,OAAQ,eAAgB,WAAY,EAAI,GAAGA,EAAO,OAAO,SAAS,IAAI,sBACtF,SAAAD,EACH,CAEJ,CACF",
4
+ "sourcesContent": ["import { type FC, memo } from 'react'\nimport ReactMarkdown, { type Options, type Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport remarkMath from 'remark-math'\n\nconst MemoizedReactMarkdown: FC<Options> = memo(\n ReactMarkdown,\n (prevProps, nextProps) => prevProps.children === nextProps.children\n)\n\ntype MarkdownProps = {\n content: string\n}\n\nexport const Markdown = ({ content }: MarkdownProps) => {\n return (\n <div className=\"copilotKitMarkdown\">\n <MemoizedReactMarkdown components={components} remarkPlugins={[remarkGfm, remarkMath]}>\n {content}\n </MemoizedReactMarkdown>\n </div>\n )\n}\n\nconst components: Components = {\n p({ children }) {\n return <p>{children}</p>\n },\n a({ children, ...props }) {\n return (\n <a style={{ color: 'blue', textDecoration: 'underline' }} {...props} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n )\n },\n}\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAiBM,IAAAI,EAAA,6BAjBNC,EAA8B,iBAC9BC,EAA6D,6BAC7DC,EAAsB,yBACtBC,EAAuB,0BAEvB,MAAMC,KAAqC,QACzC,EAAAC,QACA,CAACC,EAAWC,IAAcD,EAAU,WAAaC,EAAU,QAC7D,EAMaV,EAAW,CAAC,CAAE,QAAAW,CAAQ,OAE/B,OAAC,OAAI,UAAU,qBACb,mBAACJ,EAAA,CAAsB,WAAYK,EAAY,cAAe,CAAC,EAAAC,QAAW,EAAAC,OAAU,EACjF,SAAAH,EACH,EACF,EAIEC,EAAyB,CAC7B,EAAE,CAAE,SAAAG,CAAS,EAAG,CACd,SAAO,OAAC,KAAG,SAAAA,EAAS,CACtB,EACA,EAAE,CAAE,SAAAA,EAAU,GAAGC,CAAM,EAAG,CACxB,SACE,OAAC,KAAE,MAAO,CAAE,MAAO,OAAQ,eAAgB,WAAY,EAAI,GAAGA,EAAO,OAAO,SAAS,IAAI,sBACtF,SAAAD,EACH,CAEJ,CACF",
6
6
  "names": ["markdown_exports", "__export", "Markdown", "__toCommonJS", "import_jsx_runtime", "import_react", "import_react_markdown", "import_remark_gfm", "import_remark_math", "MemoizedReactMarkdown", "ReactMarkdown", "prevProps", "nextProps", "content", "components", "remarkGfm", "remarkMath", "children", "props"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var D=(e,t)=>{for(var r in t)d(e,r,{get:t[r],enumerable:!0})},N=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of P(t))!B.call(e,s)&&s!==r&&d(e,s,{get:()=>t[s],enumerable:!(n=M(t,s))||n.enumerable});return e};var O=e=>N(d({},"__esModule",{value:!0}),e);var k={};D(k,{default:()=>h});module.exports=O(k);var i=require("react"),f=require("./useAlpcFetch"),g=require("../const"),C=require("../provider"),L=require("@anker-in/lib");function U(){let e="";const{profile:t,isLoadingProfile:r,alpcBrand:n}=(0,C.useCreditsContext)(),{locale:s,brand:R}=(0,L.useHeadlessContext)(),b=n||R;s==="pl"?e="eu":e=s;const[x,y]=(0,i.useState)([]),{isMutating:S,trigger:m}=(0,f.useAlpcMutation)({url:"/v1/credit/consume_credit_rules",initData:{brand:b,page:1,page_size:20,country:(g.ALPC_COUNTRY_MAP.get(e)||e)?.toUpperCase()}}),c=(0,i.useCallback)(()=>{m({user_id:t?.user_id},{onSuccess(A){let p=A.data.consume_credit_rules||[],u=p.filter(o=>o.consume_type==1)||[],l=p.filter(o=>o.consume_type==2)||[];u=u.sort((o,a)=>o.consume_credits-a.consume_credits),l=l.sort((o,a)=>o.consume_credits-a.consume_credits);const _=u.concat(l);y(_),localStorage?.setItem(`consume_credit_rules-${e}`,JSON.stringify({expire:Date.now()+10*60*1e3,consume_credit_rules:_}))}})},[t,m,e]);return(0,i.useEffect)(()=>{r||c()},[c,r]),{listLoading:S,redeemableList:x,getRedeemableList:c}}var h=U;
1
+ "use strict";var d=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var D=(e,t)=>{for(var r in t)d(e,r,{get:t[r],enumerable:!0})},N=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of P(t))!B.call(e,s)&&s!==r&&d(e,s,{get:()=>t[s],enumerable:!(n=M(t,s))||n.enumerable});return e};var O=e=>N(d({},"__esModule",{value:!0}),e);var k={};D(k,{default:()=>h});module.exports=O(k);var i=require("react"),f=require("./useAlpcFetch"),g=require("../const"),C=require("../provider"),L=require("@anker-in/lib");function U(){let e="";const{profile:t,isLoadingProfile:r,alpcBrand:n}=(0,C.useCreditsContext)(),{locale:s,brand:R}=(0,L.useHeadlessContext)(),b=n||R;s==="pl"?e="eu":e=s;const[x,y]=(0,i.useState)([]),{isMutating:S,trigger:m}=(0,f.useAlpcMutation)({url:"/v1/credit/consume_credit_rules",initData:{brand:b,page:1,page_size:999,country:(g.ALPC_COUNTRY_MAP.get(e)||e)?.toUpperCase()}}),c=(0,i.useCallback)(()=>{m({user_id:t?.user_id},{onSuccess(A){let p=A.data.consume_credit_rules||[],u=p.filter(o=>o.consume_type==1)||[],l=p.filter(o=>o.consume_type==2)||[];u=u.sort((o,a)=>o.consume_credits-a.consume_credits),l=l.sort((o,a)=>o.consume_credits-a.consume_credits);const _=u.concat(l);y(_),localStorage?.setItem(`consume_credit_rules-${e}`,JSON.stringify({expire:Date.now()+10*60*1e3,consume_credit_rules:_}))}})},[t,m,e]);return(0,i.useEffect)(()=>{r||c()},[c,r]),{listLoading:S,redeemableList:x,getRedeemableList:c}}var h=U;
2
2
  //# sourceMappingURL=useRedeemableList.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/components/credits/context/hooks/useRedeemableList.ts"],
4
- "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\n\nimport { useAlpcMutation } from './useAlpcFetch'\nimport { ALPC_COUNTRY_MAP } from '../const'\nimport { useCreditsContext } from '../provider'\nimport type { ConsumeCreditRuleResponse } from '../response'\nimport { useHeadlessContext } from '@anker-in/lib'\n\nfunction useRedeemableList() {\n let locale = '' as string\n const { profile, isLoadingProfile, alpcBrand } = useCreditsContext()\n const { locale: contextLocale, brand: headlessBrand } = useHeadlessContext()\n const brand = alpcBrand || headlessBrand\n\n if (contextLocale === 'pl') {\n locale = 'eu'\n } else {\n locale = contextLocale\n }\n\n const [redeemableList, setRedeemableList] = useState<ConsumeCreditRuleResponse[]>([])\n const { isMutating: listLoading, trigger } = useAlpcMutation<\n {\n data: { consume_credit_rules: ConsumeCreditRuleResponse[] }\n },\n { user_id?: string }\n >({\n url: `/v1/credit/consume_credit_rules`,\n initData: {\n brand,\n page: 1,\n page_size: 20,\n country: (ALPC_COUNTRY_MAP.get(locale) || locale)?.toUpperCase(),\n },\n })\n\n const getRedeemableList = useCallback(() => {\n trigger(\n {\n user_id: profile?.user_id,\n },\n {\n onSuccess(responseData) {\n let list = responseData.data.consume_credit_rules || []\n let cList = list.filter(i => i.consume_type == 1) || []\n let pList = list.filter(i => i.consume_type == 2) || []\n cList = cList.sort((prev, next) => prev.consume_credits - next.consume_credits)\n pList = pList.sort((prev, next) => prev.consume_credits - next.consume_credits)\n const resultList = cList.concat(pList)\n setRedeemableList(resultList)\n\n localStorage?.setItem(\n `consume_credit_rules-${locale}`,\n JSON.stringify({\n expire: Date.now() + 10 * 60 * 1000,\n consume_credit_rules: resultList,\n })\n )\n },\n }\n )\n }, [profile, trigger, locale])\n\n useEffect(() => {\n if (!isLoadingProfile) {\n getRedeemableList()\n }\n }, [getRedeemableList, isLoadingProfile])\n\n return {\n listLoading,\n redeemableList,\n getRedeemableList,\n }\n}\n\nexport default useRedeemableList\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiD,iBAEjDC,EAAgC,0BAChCC,EAAiC,oBACjCC,EAAkC,uBAElCC,EAAmC,yBAEnC,SAASC,GAAoB,CAC3B,IAAIC,EAAS,GACb,KAAM,CAAE,QAAAC,EAAS,iBAAAC,EAAkB,UAAAC,CAAU,KAAI,qBAAkB,EAC7D,CAAE,OAAQC,EAAe,MAAOC,CAAc,KAAI,sBAAmB,EACrEC,EAAQH,GAAaE,EAEvBD,IAAkB,KACpBJ,EAAS,KAETA,EAASI,EAGX,KAAM,CAACG,EAAgBC,CAAiB,KAAI,YAAsC,CAAC,CAAC,EAC9E,CAAE,WAAYC,EAAa,QAAAC,CAAQ,KAAI,mBAK3C,CACA,IAAK,kCACL,SAAU,CACR,MAAAJ,EACA,KAAM,EACN,UAAW,GACX,SAAU,mBAAiB,IAAIN,CAAM,GAAKA,IAAS,YAAY,CACjE,CACF,CAAC,EAEKW,KAAoB,eAAY,IAAM,CAC1CD,EACE,CACE,QAAST,GAAS,OACpB,EACA,CACE,UAAUW,EAAc,CACtB,IAAIC,EAAOD,EAAa,KAAK,sBAAwB,CAAC,EAClDE,EAAQD,EAAK,OAAOE,GAAKA,EAAE,cAAgB,CAAC,GAAK,CAAC,EAClDC,EAAQH,EAAK,OAAOE,GAAKA,EAAE,cAAgB,CAAC,GAAK,CAAC,EACtDD,EAAQA,EAAM,KAAK,CAACG,EAAMC,IAASD,EAAK,gBAAkBC,EAAK,eAAe,EAC9EF,EAAQA,EAAM,KAAK,CAACC,EAAMC,IAASD,EAAK,gBAAkBC,EAAK,eAAe,EAC9E,MAAMC,EAAaL,EAAM,OAAOE,CAAK,EACrCR,EAAkBW,CAAU,EAE5B,cAAc,QACZ,wBAAwBnB,CAAM,GAC9B,KAAK,UAAU,CACb,OAAQ,KAAK,IAAI,EAAI,GAAK,GAAK,IAC/B,qBAAsBmB,CACxB,CAAC,CACH,CACF,CACF,CACF,CACF,EAAG,CAAClB,EAASS,EAASV,CAAM,CAAC,EAE7B,sBAAU,IAAM,CACTE,GACHS,EAAkB,CAEtB,EAAG,CAACA,EAAmBT,CAAgB,CAAC,EAEjC,CACL,YAAAO,EACA,eAAAF,EACA,kBAAAI,CACF,CACF,CAEA,IAAOnB,EAAQO",
4
+ "sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\n\nimport { useAlpcMutation } from './useAlpcFetch'\nimport { ALPC_COUNTRY_MAP } from '../const'\nimport { useCreditsContext } from '../provider'\nimport type { ConsumeCreditRuleResponse } from '../response'\nimport { useHeadlessContext } from '@anker-in/lib'\n\nfunction useRedeemableList() {\n let locale = '' as string\n const { profile, isLoadingProfile, alpcBrand } = useCreditsContext()\n const { locale: contextLocale, brand: headlessBrand } = useHeadlessContext()\n const brand = alpcBrand || headlessBrand\n\n if (contextLocale === 'pl') {\n locale = 'eu'\n } else {\n locale = contextLocale\n }\n\n const [redeemableList, setRedeemableList] = useState<ConsumeCreditRuleResponse[]>([])\n const { isMutating: listLoading, trigger } = useAlpcMutation<\n {\n data: { consume_credit_rules: ConsumeCreditRuleResponse[] }\n },\n { user_id?: string }\n >({\n url: `/v1/credit/consume_credit_rules`,\n initData: {\n brand,\n page: 1,\n page_size: 999,\n country: (ALPC_COUNTRY_MAP.get(locale) || locale)?.toUpperCase(),\n },\n })\n\n const getRedeemableList = useCallback(() => {\n trigger(\n {\n user_id: profile?.user_id,\n },\n {\n onSuccess(responseData) {\n let list = responseData.data.consume_credit_rules || []\n let cList = list.filter(i => i.consume_type == 1) || []\n let pList = list.filter(i => i.consume_type == 2) || []\n cList = cList.sort((prev, next) => prev.consume_credits - next.consume_credits)\n pList = pList.sort((prev, next) => prev.consume_credits - next.consume_credits)\n const resultList = cList.concat(pList)\n setRedeemableList(resultList)\n\n localStorage?.setItem(\n `consume_credit_rules-${locale}`,\n JSON.stringify({\n expire: Date.now() + 10 * 60 * 1000,\n consume_credit_rules: resultList,\n })\n )\n },\n }\n )\n }, [profile, trigger, locale])\n\n useEffect(() => {\n if (!isLoadingProfile) {\n getRedeemableList()\n }\n }, [getRedeemableList, isLoadingProfile])\n\n return {\n listLoading,\n redeemableList,\n getRedeemableList,\n }\n}\n\nexport default useRedeemableList\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiD,iBAEjDC,EAAgC,0BAChCC,EAAiC,oBACjCC,EAAkC,uBAElCC,EAAmC,yBAEnC,SAASC,GAAoB,CAC3B,IAAIC,EAAS,GACb,KAAM,CAAE,QAAAC,EAAS,iBAAAC,EAAkB,UAAAC,CAAU,KAAI,qBAAkB,EAC7D,CAAE,OAAQC,EAAe,MAAOC,CAAc,KAAI,sBAAmB,EACrEC,EAAQH,GAAaE,EAEvBD,IAAkB,KACpBJ,EAAS,KAETA,EAASI,EAGX,KAAM,CAACG,EAAgBC,CAAiB,KAAI,YAAsC,CAAC,CAAC,EAC9E,CAAE,WAAYC,EAAa,QAAAC,CAAQ,KAAI,mBAK3C,CACA,IAAK,kCACL,SAAU,CACR,MAAAJ,EACA,KAAM,EACN,UAAW,IACX,SAAU,mBAAiB,IAAIN,CAAM,GAAKA,IAAS,YAAY,CACjE,CACF,CAAC,EAEKW,KAAoB,eAAY,IAAM,CAC1CD,EACE,CACE,QAAST,GAAS,OACpB,EACA,CACE,UAAUW,EAAc,CACtB,IAAIC,EAAOD,EAAa,KAAK,sBAAwB,CAAC,EAClDE,EAAQD,EAAK,OAAOE,GAAKA,EAAE,cAAgB,CAAC,GAAK,CAAC,EAClDC,EAAQH,EAAK,OAAOE,GAAKA,EAAE,cAAgB,CAAC,GAAK,CAAC,EACtDD,EAAQA,EAAM,KAAK,CAACG,EAAMC,IAASD,EAAK,gBAAkBC,EAAK,eAAe,EAC9EF,EAAQA,EAAM,KAAK,CAACC,EAAMC,IAASD,EAAK,gBAAkBC,EAAK,eAAe,EAC9E,MAAMC,EAAaL,EAAM,OAAOE,CAAK,EACrCR,EAAkBW,CAAU,EAE5B,cAAc,QACZ,wBAAwBnB,CAAM,GAC9B,KAAK,UAAU,CACb,OAAQ,KAAK,IAAI,EAAI,GAAK,GAAK,IAC/B,qBAAsBmB,CACxB,CAAC,CACH,CACF,CACF,CACF,CACF,EAAG,CAAClB,EAASS,EAASV,CAAM,CAAC,EAE7B,sBAAU,IAAM,CACTE,GACHS,EAAkB,CAEtB,EAAG,CAACA,EAAmBT,CAAgB,CAAC,EAEjC,CACL,YAAAO,EACA,eAAAF,EACA,kBAAAI,CACF,CACF,CAEA,IAAOnB,EAAQO",
6
6
  "names": ["useRedeemableList_exports", "__export", "useRedeemableList_default", "__toCommonJS", "import_react", "import_useAlpcFetch", "import_const", "import_provider", "import_lib", "useRedeemableList", "locale", "profile", "isLoadingProfile", "alpcBrand", "contextLocale", "headlessBrand", "brand", "redeemableList", "setRedeemableList", "listLoading", "trigger", "getRedeemableList", "responseData", "list", "cList", "i", "pList", "prev", "next", "resultList"]
7
7
  }
@@ -3,8 +3,3 @@ export declare enum FunctionDiscountType {
3
3
  FixedAmount = 2,
4
4
  FixedPrice = 3
5
5
  }
6
- export declare enum RoundSelected {
7
- RoundHighest = "round_highest",
8
- RoundLowest = "round_lowest",
9
- RoundNearest = "round_nearest"
10
- }
@@ -1,2 +1,2 @@
1
- "use strict";var h=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var A=(a,x)=>{for(var g in x)h(a,g,{get:x[g],enumerable:!0})},H=(a,x,g,r)=>{if(x&&typeof x=="object"||typeof x=="function")for(let e of w(x))!P.call(a,e)&&e!==g&&h(a,e,{get:()=>x[e],enumerable:!(r=d(x,e))||r.enumerable});return a};var L=a=>H(h({},"__esModule",{value:!0}),a);var N={};A(N,{FunctionDiscountType:()=>m,RoundSelected:()=>_});module.exports=L(N);var m=(r=>(r[r.Percentage=1]="Percentage",r[r.FixedAmount=2]="FixedAmount",r[r.FixedPrice=3]="FixedPrice",r))(m||{}),_=(r=>(r.RoundHighest="round_highest",r.RoundLowest="round_lowest",r.RoundNearest="round_nearest",r))(_||{});
1
+ "use strict";var P=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var f=(d,r)=>{for(var m in r)P(d,m,{get:r[m],enumerable:!0})},h=(d,r,m,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of A(r))!b.call(d,e)&&e!==m&&P(d,e,{get:()=>r[e],enumerable:!(x=g(r,e))||x.enumerable});return d};var j=d=>h(P({},"__esModule",{value:!0}),d);var k={};f(k,{FunctionDiscountType:()=>a});module.exports=j(k);var a=(x=>(x[x.Percentage=1]="Percentage",x[x.FixedAmount=2]="FixedAmount",x[x.FixedPrice=3]="FixedPrice",x))(a||{});
2
2
  //# sourceMappingURL=memberPriceConst.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/components/credits/context/memberPriceConst.ts"],
4
- "sourcesContent": ["// Function \u6298\u6263\u7C7B\u578B\nexport enum FunctionDiscountType {\n Percentage = 1,\n FixedAmount,\n FixedPrice,\n}\n\n// \u5C0F\u6570\u4F4D\u53D6\u820D\u65B9\u5F0F\nexport enum RoundSelected {\n RoundHighest = 'round_highest',\n RoundLowest = 'round_lowest',\n RoundNearest = 'round_nearest',\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,kBAAAC,IAAA,eAAAC,EAAAJ,GACO,IAAKE,OACVA,IAAA,WAAa,GAAb,aACAA,IAAA,6BACAA,IAAA,2BAHUA,OAAA,IAOAC,OACVA,EAAA,aAAe,gBACfA,EAAA,YAAc,eACdA,EAAA,aAAe,gBAHLA,OAAA",
6
- "names": ["memberPriceConst_exports", "__export", "FunctionDiscountType", "RoundSelected", "__toCommonJS"]
4
+ "sourcesContent": ["// Function \u6298\u6263\u7C7B\u578B\nexport enum FunctionDiscountType {\n Percentage = 1,\n FixedAmount,\n FixedPrice,\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GACO,IAAKE,OACVA,IAAA,WAAa,GAAb,aACAA,IAAA,6BACAA,IAAA,2BAHUA,OAAA",
6
+ "names": ["memberPriceConst_exports", "__export", "FunctionDiscountType", "__toCommonJS"]
7
7
  }
@@ -1,14 +1,7 @@
1
- import { FunctionDiscountType, RoundSelected } from './memberPriceConst';
2
- export type PriceEndingConf = {
3
- apply_price_ending: boolean;
4
- one_decimal_place: string;
5
- two_decimal_place: string;
6
- round_selected: RoundSelected;
7
- };
1
+ import { FunctionDiscountType } from './memberPriceConst';
8
2
  export type DiscountConfig = {
9
3
  discount_type: FunctionDiscountType;
10
4
  discount_value: number;
11
- price_ending_conf?: PriceEndingConf;
12
5
  };
13
6
  export type FunctionMemberPriceConfig = {
14
7
  rule_id: string;
@@ -30,17 +23,3 @@ export type FunctionMemberPriceConfig = {
30
23
  other_product_discounts: boolean;
31
24
  };
32
25
  };
33
- export type FunctionMemberPriceResult = {
34
- hasMemberPrice: boolean;
35
- useCoupon: boolean;
36
- originalPrice: number;
37
- originalPriceWithCurrency: string;
38
- salePrice: number;
39
- salePriceWithCurrency: string;
40
- salePriceWithoutCoupon: number;
41
- salePriceWithoutCouponWithCurrency: string;
42
- savePrice: number;
43
- savePriceWithCurrency: string;
44
- savePriceWithoutCoupon: number;
45
- savePriceWithoutCouponWithCurrency: string;
46
- };