@anker-in/campaign-ui 0.5.9 → 0.5.11

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 (251) hide show
  1. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js +1 -1
  2. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js.map +3 -3
  3. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.d.ts +1 -0
  4. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.js +2 -0
  5. package/dist/cjs/components/credits/context/hooks/useSendEmailValidation.js.map +7 -0
  6. package/dist/cjs/components/credits/context/hooks/useSubscriptions.d.ts +5 -0
  7. package/dist/cjs/components/credits/context/hooks/useSubscriptions.js +2 -0
  8. package/dist/cjs/components/credits/context/hooks/useSubscriptions.js.map +7 -0
  9. package/dist/cjs/components/credits/context/provider.d.ts +2 -1
  10. package/dist/cjs/components/credits/context/provider.js +1 -1
  11. package/dist/cjs/components/credits/context/provider.js.map +3 -3
  12. package/dist/cjs/components/credits/modal/MyRewardsModal.d.ts +32 -0
  13. package/dist/cjs/components/credits/modal/MyRewardsModal.js +2 -0
  14. package/dist/cjs/components/credits/modal/MyRewardsModal.js.map +7 -0
  15. package/dist/cjs/components/credits/modal/activitiesModal.js +2 -0
  16. package/dist/cjs/components/credits/modal/activitiesModal.js.map +7 -0
  17. package/dist/cjs/helpers/fetchResponse.d.ts +14 -0
  18. package/dist/cjs/helpers/fetchResponse.js +2 -0
  19. package/dist/cjs/helpers/fetchResponse.js.map +7 -0
  20. package/dist/cjs/helpers/fetcher.d.ts +2 -0
  21. package/dist/cjs/helpers/fetcher.js +2 -0
  22. package/dist/cjs/helpers/fetcher.js.map +7 -0
  23. package/dist/cjs/helpers/index.d.ts +2 -0
  24. package/dist/cjs/helpers/index.js +2 -0
  25. package/dist/cjs/helpers/index.js.map +7 -0
  26. package/dist/cjs/helpers/track.d.ts +15 -0
  27. package/dist/cjs/helpers/track.js +2 -0
  28. package/dist/cjs/helpers/track.js.map +7 -0
  29. package/dist/cjs/helpers/utils.d.ts +3 -0
  30. package/dist/cjs/helpers/utils.js +2 -0
  31. package/dist/cjs/helpers/utils.js.map +7 -0
  32. package/dist/cjs/index.css +2 -0
  33. package/dist/cjs/index.css.map +7 -0
  34. package/dist/cjs/shopify/context/ShopifyProvider.d.ts +10 -0
  35. package/dist/cjs/shopify/fetchers/create-cart.d.ts +13 -0
  36. package/dist/cjs/shopify/fetchers/get-products-by-handles.d.ts +7 -0
  37. package/dist/cjs/shopify/fetchers/index.d.ts +2 -0
  38. package/dist/cjs/shopify/fragments/article.d.ts +2 -0
  39. package/dist/cjs/shopify/fragments/blog.d.ts +1 -0
  40. package/dist/cjs/shopify/fragments/cart.d.ts +1 -0
  41. package/dist/cjs/shopify/fragments/collection.d.ts +1 -0
  42. package/dist/cjs/shopify/fragments/image.d.ts +1 -0
  43. package/dist/cjs/shopify/fragments/index.d.ts +11 -0
  44. package/dist/cjs/shopify/fragments/metafields.d.ts +2 -0
  45. package/dist/cjs/shopify/fragments/page-info.d.ts +1 -0
  46. package/dist/cjs/shopify/fragments/page.d.ts +1 -0
  47. package/dist/cjs/shopify/fragments/product.d.ts +1 -0
  48. package/dist/cjs/shopify/fragments/seo.d.ts +1 -0
  49. package/dist/cjs/shopify/fragments/variant.d.ts +1 -0
  50. package/dist/cjs/shopify/gql/fragment-masking.d.ts +15 -0
  51. package/dist/cjs/shopify/gql/gql.d.ts +87 -0
  52. package/dist/cjs/shopify/gql/graphql.d.ts +7669 -0
  53. package/dist/cjs/shopify/gql/index.d.ts +3 -0
  54. package/dist/cjs/shopify/hooks/index.d.ts +2 -0
  55. package/dist/cjs/shopify/hooks/useCreateCart.d.ts +2 -0
  56. package/dist/cjs/shopify/hooks/useProductsByHandles.d.ts +4 -0
  57. package/dist/cjs/shopify/mutations/create-cart.d.ts +1 -0
  58. package/dist/cjs/shopify/queries/get-product-by-handles.d.ts +1 -0
  59. package/dist/cjs/shopify/queries/index.d.ts +1 -0
  60. package/dist/cjs/shopify/src/index.d.ts +5 -0
  61. package/dist/cjs/shopify/tsup.config.d.ts +2 -0
  62. package/dist/cjs/shopify/types/article.d.ts +48 -0
  63. package/dist/cjs/shopify/types/cart.d.ts +173 -0
  64. package/dist/cjs/shopify/types/checkout.d.ts +42 -0
  65. package/dist/cjs/shopify/types/collection.d.ts +122 -0
  66. package/dist/cjs/shopify/types/common.d.ts +42 -0
  67. package/dist/cjs/shopify/types/config.d.ts +12 -0
  68. package/dist/cjs/shopify/types/customer.d.ts +30 -0
  69. package/dist/cjs/shopify/types/fetcher.d.ts +38 -0
  70. package/dist/cjs/shopify/types/index.d.ts +10 -0
  71. package/dist/cjs/shopify/types/page.d.ts +33 -0
  72. package/dist/cjs/shopify/types/product.d.ts +174 -0
  73. package/dist/cjs/shopify/types/search.d.ts +54 -0
  74. package/dist/cjs/shopify/types/site.d.ts +33 -0
  75. package/dist/cjs/shopify/types/type-helper.d.ts +5 -0
  76. package/dist/cjs/shopify/utils/colors.d.ts +3 -0
  77. package/dist/cjs/shopify/utils/const.d.ts +76 -0
  78. package/dist/cjs/shopify/utils/cookie.d.ts +15 -0
  79. package/dist/cjs/shopify/utils/errors.d.ts +38 -0
  80. package/dist/cjs/shopify/utils/fetch-graphql-api.d.ts +19 -0
  81. package/dist/cjs/shopify/utils/handle-fetch-response.d.ts +5 -0
  82. package/dist/cjs/shopify/utils/helper.d.ts +28 -0
  83. package/dist/cjs/shopify/utils/normalize/cart.d.ts +7 -0
  84. package/dist/cjs/shopify/utils/normalize/customer.d.ts +3 -0
  85. package/dist/cjs/shopify/utils/normalize/index.d.ts +2 -0
  86. package/dist/cjs/shopify/utils/normalize/metafield.d.ts +5 -0
  87. package/dist/cjs/shopify/utils/normalize/product.d.ts +16 -0
  88. package/dist/cjs/shopify/utils/store.d.ts +2 -0
  89. package/dist/cjs/shopify/utils/type-helper.d.ts +5 -0
  90. package/dist/cjs/templates/Credits.types.d.ts +1 -0
  91. package/dist/cjs/templates/Credits.types.js.map +1 -1
  92. package/dist/cjs/templates/{Credits.js → credits.js} +1 -1
  93. package/dist/cjs/templates/{Credits.js.map → credits.js.map} +2 -2
  94. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  95. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js +1 -1
  96. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js.map +3 -3
  97. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.d.ts +1 -0
  98. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.js +2 -0
  99. package/dist/esm/components/credits/context/hooks/useSendEmailValidation.js.map +7 -0
  100. package/dist/esm/components/credits/context/hooks/useSubscriptions.d.ts +5 -0
  101. package/dist/esm/components/credits/context/hooks/useSubscriptions.js +2 -0
  102. package/dist/esm/components/credits/context/hooks/useSubscriptions.js.map +7 -0
  103. package/dist/esm/components/credits/context/provider.d.ts +2 -1
  104. package/dist/esm/components/credits/context/provider.js +1 -1
  105. package/dist/esm/components/credits/context/provider.js.map +3 -3
  106. package/dist/esm/components/credits/modal/MyRewardsModal.d.ts +32 -0
  107. package/dist/esm/components/credits/modal/MyRewardsModal.js +2 -0
  108. package/dist/esm/components/credits/modal/MyRewardsModal.js.map +7 -0
  109. package/dist/esm/components/credits/modal/activitiesModal.js +2 -0
  110. package/dist/esm/components/credits/modal/activitiesModal.js.map +7 -0
  111. package/dist/esm/helpers/fetchResponse.d.ts +14 -0
  112. package/dist/esm/helpers/fetchResponse.js +2 -0
  113. package/dist/esm/helpers/fetchResponse.js.map +7 -0
  114. package/dist/esm/helpers/fetcher.d.ts +2 -0
  115. package/dist/esm/helpers/fetcher.js +2 -0
  116. package/dist/esm/helpers/fetcher.js.map +7 -0
  117. package/dist/esm/helpers/index.d.ts +2 -0
  118. package/dist/esm/helpers/index.js +2 -0
  119. package/dist/esm/helpers/index.js.map +7 -0
  120. package/dist/esm/helpers/track.d.ts +15 -0
  121. package/dist/esm/helpers/track.js +2 -0
  122. package/dist/esm/helpers/track.js.map +7 -0
  123. package/dist/esm/helpers/utils.d.ts +3 -0
  124. package/dist/esm/helpers/utils.js +2 -0
  125. package/dist/esm/helpers/utils.js.map +7 -0
  126. package/dist/esm/index.css +2 -0
  127. package/dist/esm/index.css.map +7 -0
  128. package/dist/esm/shopify/context/ShopifyProvider.d.ts +10 -0
  129. package/dist/esm/shopify/fetchers/create-cart.d.ts +13 -0
  130. package/dist/esm/shopify/fetchers/get-products-by-handles.d.ts +7 -0
  131. package/dist/esm/shopify/fetchers/index.d.ts +2 -0
  132. package/dist/esm/shopify/fragments/article.d.ts +2 -0
  133. package/dist/esm/shopify/fragments/blog.d.ts +1 -0
  134. package/dist/esm/shopify/fragments/cart.d.ts +1 -0
  135. package/dist/esm/shopify/fragments/collection.d.ts +1 -0
  136. package/dist/esm/shopify/fragments/image.d.ts +1 -0
  137. package/dist/esm/shopify/fragments/index.d.ts +11 -0
  138. package/dist/esm/shopify/fragments/metafields.d.ts +2 -0
  139. package/dist/esm/shopify/fragments/page-info.d.ts +1 -0
  140. package/dist/esm/shopify/fragments/page.d.ts +1 -0
  141. package/dist/esm/shopify/fragments/product.d.ts +1 -0
  142. package/dist/esm/shopify/fragments/seo.d.ts +1 -0
  143. package/dist/esm/shopify/fragments/variant.d.ts +1 -0
  144. package/dist/esm/shopify/gql/fragment-masking.d.ts +15 -0
  145. package/dist/esm/shopify/gql/gql.d.ts +87 -0
  146. package/dist/esm/shopify/gql/graphql.d.ts +7669 -0
  147. package/dist/esm/shopify/gql/index.d.ts +3 -0
  148. package/dist/esm/shopify/hooks/index.d.ts +2 -0
  149. package/dist/esm/shopify/hooks/useCreateCart.d.ts +2 -0
  150. package/dist/esm/shopify/hooks/useProductsByHandles.d.ts +4 -0
  151. package/dist/esm/shopify/mutations/create-cart.d.ts +1 -0
  152. package/dist/esm/shopify/queries/get-product-by-handles.d.ts +1 -0
  153. package/dist/esm/shopify/queries/index.d.ts +1 -0
  154. package/dist/esm/shopify/src/index.d.ts +5 -0
  155. package/dist/esm/shopify/tsup.config.d.ts +2 -0
  156. package/dist/esm/shopify/types/article.d.ts +48 -0
  157. package/dist/esm/shopify/types/cart.d.ts +173 -0
  158. package/dist/esm/shopify/types/checkout.d.ts +42 -0
  159. package/dist/esm/shopify/types/collection.d.ts +122 -0
  160. package/dist/esm/shopify/types/common.d.ts +42 -0
  161. package/dist/esm/shopify/types/config.d.ts +12 -0
  162. package/dist/esm/shopify/types/customer.d.ts +30 -0
  163. package/dist/esm/shopify/types/fetcher.d.ts +38 -0
  164. package/dist/esm/shopify/types/index.d.ts +10 -0
  165. package/dist/esm/shopify/types/page.d.ts +33 -0
  166. package/dist/esm/shopify/types/product.d.ts +174 -0
  167. package/dist/esm/shopify/types/search.d.ts +54 -0
  168. package/dist/esm/shopify/types/site.d.ts +33 -0
  169. package/dist/esm/shopify/types/type-helper.d.ts +5 -0
  170. package/dist/esm/shopify/utils/colors.d.ts +3 -0
  171. package/dist/esm/shopify/utils/const.d.ts +76 -0
  172. package/dist/esm/shopify/utils/cookie.d.ts +15 -0
  173. package/dist/esm/shopify/utils/errors.d.ts +38 -0
  174. package/dist/esm/shopify/utils/fetch-graphql-api.d.ts +19 -0
  175. package/dist/esm/shopify/utils/handle-fetch-response.d.ts +5 -0
  176. package/dist/esm/shopify/utils/helper.d.ts +28 -0
  177. package/dist/esm/shopify/utils/normalize/cart.d.ts +7 -0
  178. package/dist/esm/shopify/utils/normalize/customer.d.ts +3 -0
  179. package/dist/esm/shopify/utils/normalize/index.d.ts +2 -0
  180. package/dist/esm/shopify/utils/normalize/metafield.d.ts +5 -0
  181. package/dist/esm/shopify/utils/normalize/product.d.ts +16 -0
  182. package/dist/esm/shopify/utils/store.d.ts +2 -0
  183. package/dist/esm/shopify/utils/type-helper.d.ts +5 -0
  184. package/dist/esm/templates/Credits.types.d.ts +1 -0
  185. package/dist/esm/templates/Credits.types.js.map +1 -1
  186. package/dist/esm/templates/credits.js +2 -0
  187. package/dist/esm/templates/{Credits.js.map → credits.js.map} +2 -2
  188. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  189. package/package.json +19 -19
  190. package/src/components/LiveChatWidget/LiveChatWidget.tsx +13 -12
  191. package/src/components/credits/context/provider.tsx +4 -0
  192. package/src/components/credits/modal/ActivitiesModal.tsx +6 -1
  193. package/src/templates/Credits.tsx +1 -0
  194. package/src/templates/Credits.types.ts +1 -0
  195. package/dist/cjs/components/credits/modal/ActivitiesModal.js +0 -2
  196. package/dist/cjs/components/credits/modal/ActivitiesModal.js.map +0 -7
  197. package/dist/esm/components/credits/modal/ActivitiesModal.js +0 -2
  198. package/dist/esm/components/credits/modal/ActivitiesModal.js.map +0 -7
  199. package/dist/esm/templates/Credits.js +0 -2
  200. /package/dist/cjs/components/credits/creditsBenefits/{BenefitItem.d.ts → benefitItem.d.ts} +0 -0
  201. /package/dist/cjs/components/credits/creditsBenefits/{BenefitItem.js → benefitItem.js} +0 -0
  202. /package/dist/cjs/components/credits/creditsBenefits/{BenefitItem.js.map → benefitItem.js.map} +0 -0
  203. /package/dist/cjs/components/credits/creditsBenefits/{IconInfo.d.ts → iconInfo.d.ts} +0 -0
  204. /package/dist/cjs/components/credits/creditsBenefits/{IconInfo.js → iconInfo.js} +0 -0
  205. /package/dist/cjs/components/credits/creditsBenefits/{IconInfo.js.map → iconInfo.js.map} +0 -0
  206. /package/dist/cjs/components/credits/modal/{ActivitiesModal.d.ts → activitiesModal.d.ts} +0 -0
  207. /package/dist/cjs/components/credits/modal/{CreditsUploadReceiptModal.d.ts → creditsUploadReceiptModal.d.ts} +0 -0
  208. /package/dist/cjs/components/credits/modal/{CreditsUploadReceiptModal.js → creditsUploadReceiptModal.js} +0 -0
  209. /package/dist/cjs/components/credits/modal/{CreditsUploadReceiptModal.js.map → creditsUploadReceiptModal.js.map} +0 -0
  210. /package/dist/cjs/components/credits/modal/{LoadingDots.d.ts → loadingDots.d.ts} +0 -0
  211. /package/dist/cjs/components/credits/modal/{LoadingDots.js → loadingDots.js} +0 -0
  212. /package/dist/cjs/components/credits/modal/{LoadingDots.js.map → loadingDots.js.map} +0 -0
  213. /package/dist/cjs/components/credits/modal/{ModalContainer.d.ts → modalContainer.d.ts} +0 -0
  214. /package/dist/cjs/components/credits/modal/{ModalContainer.js → modalContainer.js} +0 -0
  215. /package/dist/cjs/components/credits/modal/{ModalContainer.js.map → modalContainer.js.map} +0 -0
  216. /package/dist/cjs/components/credits/modal/{RulesModal.d.ts → rulesModal.d.ts} +0 -0
  217. /package/dist/cjs/components/credits/modal/{RulesModal.js → rulesModal.js} +0 -0
  218. /package/dist/cjs/components/credits/modal/{RulesModal.js.map → rulesModal.js.map} +0 -0
  219. /package/dist/cjs/components/credits/modal/{SubscribeModal.d.ts → subscribeModal.d.ts} +0 -0
  220. /package/dist/cjs/components/credits/modal/{SubscribeModal.js → subscribeModal.js} +0 -0
  221. /package/dist/cjs/components/credits/modal/{SubscribeModal.js.map → subscribeModal.js.map} +0 -0
  222. /package/dist/cjs/components/credits/modal/{Tip.d.ts → tip.d.ts} +0 -0
  223. /package/dist/cjs/components/credits/modal/{Tip.js → tip.js} +0 -0
  224. /package/dist/cjs/components/credits/modal/{Tip.js.map → tip.js.map} +0 -0
  225. /package/dist/cjs/templates/{Credits.d.ts → credits.d.ts} +0 -0
  226. /package/dist/esm/components/credits/creditsBenefits/{BenefitItem.d.ts → benefitItem.d.ts} +0 -0
  227. /package/dist/esm/components/credits/creditsBenefits/{BenefitItem.js → benefitItem.js} +0 -0
  228. /package/dist/esm/components/credits/creditsBenefits/{BenefitItem.js.map → benefitItem.js.map} +0 -0
  229. /package/dist/esm/components/credits/creditsBenefits/{IconInfo.d.ts → iconInfo.d.ts} +0 -0
  230. /package/dist/esm/components/credits/creditsBenefits/{IconInfo.js → iconInfo.js} +0 -0
  231. /package/dist/esm/components/credits/creditsBenefits/{IconInfo.js.map → iconInfo.js.map} +0 -0
  232. /package/dist/esm/components/credits/modal/{ActivitiesModal.d.ts → activitiesModal.d.ts} +0 -0
  233. /package/dist/esm/components/credits/modal/{CreditsUploadReceiptModal.d.ts → creditsUploadReceiptModal.d.ts} +0 -0
  234. /package/dist/esm/components/credits/modal/{CreditsUploadReceiptModal.js → creditsUploadReceiptModal.js} +0 -0
  235. /package/dist/esm/components/credits/modal/{CreditsUploadReceiptModal.js.map → creditsUploadReceiptModal.js.map} +0 -0
  236. /package/dist/esm/components/credits/modal/{LoadingDots.d.ts → loadingDots.d.ts} +0 -0
  237. /package/dist/esm/components/credits/modal/{LoadingDots.js → loadingDots.js} +0 -0
  238. /package/dist/esm/components/credits/modal/{LoadingDots.js.map → loadingDots.js.map} +0 -0
  239. /package/dist/esm/components/credits/modal/{ModalContainer.d.ts → modalContainer.d.ts} +0 -0
  240. /package/dist/esm/components/credits/modal/{ModalContainer.js → modalContainer.js} +0 -0
  241. /package/dist/esm/components/credits/modal/{ModalContainer.js.map → modalContainer.js.map} +0 -0
  242. /package/dist/esm/components/credits/modal/{RulesModal.d.ts → rulesModal.d.ts} +0 -0
  243. /package/dist/esm/components/credits/modal/{RulesModal.js → rulesModal.js} +0 -0
  244. /package/dist/esm/components/credits/modal/{RulesModal.js.map → rulesModal.js.map} +0 -0
  245. /package/dist/esm/components/credits/modal/{SubscribeModal.d.ts → subscribeModal.d.ts} +0 -0
  246. /package/dist/esm/components/credits/modal/{SubscribeModal.js → subscribeModal.js} +0 -0
  247. /package/dist/esm/components/credits/modal/{SubscribeModal.js.map → subscribeModal.js.map} +0 -0
  248. /package/dist/esm/components/credits/modal/{Tip.d.ts → tip.d.ts} +0 -0
  249. /package/dist/esm/components/credits/modal/{Tip.js → tip.js} +0 -0
  250. /package/dist/esm/components/credits/modal/{Tip.js.map → tip.js.map} +0 -0
  251. /package/dist/esm/templates/{Credits.d.ts → credits.d.ts} +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";var je=Object.create;var k=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var et=Object.getPrototypeOf,tt=Object.prototype.hasOwnProperty;var st=(o,c)=>{for(var p in c)k(o,p,{get:c[p],enumerable:!0})},_e=(o,c,p,q)=>{if(c&&typeof c=="object"||typeof c=="function")for(let i of be(c))!tt.call(o,i)&&i!==p&&k(o,i,{get:()=>c[i],enumerable:!(q=Ue(c,i))||q.enumerable});return o};var ee=(o,c,p)=>(p=o!=null?je(et(o)):{},_e(c||!o||!o.__esModule?k(p,"default",{value:o,enumerable:!0}):p,o)),at=o=>_e(k({},"__esModule",{value:!0}),o);var nt={};st(nt,{LiveChatWidget:()=>rt});module.exports=at(nt);var g=require("react/jsx-runtime"),n=ee(require("react")),te=ee(require("@radix-ui/react-dialog")),we=require("./constants"),Ce=require("./components/ChatBubble"),Re=require("./components/ChatWindow"),xe=require("./components/ComplianceDialog"),De=require("./hooks/useChatState"),Se=require("./hooks/useChatAPI"),Ee=require("./utils/messageRenderers"),Ie=require("./utils/validation"),se=require("./utils/userId"),ae=require("./utils/productTransformers.js"),Pe=require("./utils/cartTransformers.js"),re=ee(require("js-cookie")),r=require("./components/MessageContent/index.js");const rt=({apiBaseUrl:o,headers:c,recaptchaSitekey:p,recaptchaAction:q,site:i,channelCode:w,loginUserId:y,cartId:ne,accessToken:ie,position:Me,welcomeMessage:C,quickReplies:_,customRenderers:z,logoUrl:Te,title:ve,chatBubbleIcon:Ae,open:oe,onOpenChange:H,onOpen:qe,onClose:Fe,onMessageSend:Q,onError:R,onTextMessage:Oe,onProductList:Be,onPromotionList:Le,onAddToCart:F,onCart:Y,showNewSessionButton:We,commonText:de,productCardRender:Ne,productComparisonRender:ce,bottomTips:$e,complianceConfig:E})=>{const G=E?.cookieName||"livechat_compliance_agreed",[ke,V]=n.default.useState(!1),[ze,He]=n.default.useState(()=>E?re.default.get(G)!==void 0:!0),I=n.default.useMemo(()=>({...we.DEFAULT_COMMON_TEXT,...de}),[de]),Qe=(0,De.useChatState)({welcomeMessage:C,site:i,open:oe,onOpenChange:H,onOpen:qe,onClose:Fe,onMessageSend:Q,onError:R,onTextMessage:Oe,onProductList:Be,onPromotionList:Le,onAddToCart:F,onCart:Y,productCardRender:Ne,productComparisonRender:ce}),{messages:O,isOpen:X,userId:u,sessionId:K,inputValue:J,isStreaming:Ye,openChat:P,closeChat:le,setInputValue:Z,setUserId:pe,addMessage:h,setMessages:D,clearMessages:B,startStream:ue,saveSession:M,clearSession:T}=Qe,[Ge,L]=n.default.useState(!1),{sendMessageStream:fe,createSession:x}=(0,Se.useChatAPI)({apiBaseUrl:o,headers:c,recaptchaConfig:{needRecaptcha:!!p,recaptchaSitekey:p,recaptchaAction:q},onError:R}),me=n.default.useRef(async e=>{}),Ve=n.default.useMemo(()=>{const e=new Ee.MessageRendererRegistry;e.register("text",r.TextBlock),e.register("product_card",r.ProductCard),e.register("product_list",r.ProductList),e.register("product_comparison",r.ProductComparisonRenderer),e.register("policy",r.PolicyBlock),e.register("thinking",r.ThinkingBlock),e.register("error",r.ErrorBlock),e.register("faq_list",r.FAQListRenderer),e.register("promotion_list",r.PromotionListRenderer),e.register("cart",r.CartCard);const s=(0,r.createQuickRepliesRenderer)(d=>{me.current(d.value)});return e.register("quick_replies",s),z&&e.registerMany(z),e},[z]),j=n.default.useRef(!1);(0,n.useEffect)(()=>{if(!X){j.current=!1;return}if(u===void 0||j.current)return;j.current=!0;const e=K;e?Xe(e):v()},[X,u]);const ge=(0,n.useCallback)(e=>{if(Array.isArray(e.content))return e;const s=[];typeof e.content=="string"&&e.content.trim()&&s.push({type:"text",text:e.content});const d=e.structuredContent||e.structured_content;return Array.isArray(d)&&d.forEach(t=>{if(t.type==="product_list"&&Array.isArray(t.data))s.push({type:"product_list",data:{products:(0,ae.transformProducts)(t.data,i),title:void 0,commonText:I}});else if(t.type==="quick_replies"&&t.data?.replies)s.push({type:"quick_replies",data:{replies:t.data.replies}});else if(t.type==="policy"&&t.data?.title&&t.data?.content)s.push({type:"policy",data:{title:t.data.title,content:t.data.content}});else if(t.type==="product_comparison"&&t.data?.products&&t.data?.dimensions)s.push({type:"product_comparison",data:{products:(0,ae.transformProducts)(t.data.products,i),dimensions:t.data.dimensions,onAddToCart:F,commonText:I,productComparisonRender:ce}});else if(t.type==="faq_list"&&t.data?.found!==void 0)s.push({type:"faq_list",data:t.data});else if(t.type==="promotion_list"&&t.data?.found!==void 0)s.push({type:"promotion_list",data:{...t.data,commonText:I}});else if(t.type==="cart"&&t.data?.id!==void 0){const f=(0,Pe.transformCartData)(t.data);s.push({type:"cart",data:{...f,onCart:Y,commonText:I}})}else s.push(t)}),s.length===0&&s.push({type:"text",text:""}),{...e,content:s}},[i,Y,F,I]),v=(0,n.useCallback)(async()=>{if(u!==void 0){C||L(!0);try{const e=await x({user_id:u??"",site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(e.success){M(e.sessionId),e.userId&&((0,se.saveUserId)(e.userId),pe(e.userId)),B();const s=e.welcomeMessage||C;if(s){const d=[{type:"text",text:s}],t=e.quickQuestions;if(t&&t.length>0){const f=t.map((m,a)=>({id:`quick-${a}`,label:m,value:m}));d.push({type:"quick_replies",data:{replies:f}})}else _&&_.length>0&&d.push({type:"quick_replies",data:{replies:_}});h({id:`welcome-${Date.now()}`,role:"assistant",content:d,timestamp:Date.now()})}}}catch(e){console.error("[LiveChatWidget] Failed to create new session:",e),R?.(e);const s=e?.type==="GoogleRecaptchaError";h({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:s?"Your session has expired. Please refresh the page and try again.":"Failed to create session. Please refresh the page and try again.",code:s?"RECAPTCHA_ERROR":"SESSION_CREATE_ERROR"}}],timestamp:Date.now()})}finally{L(!1)}}},[u,i,w,y,x,M,B,C,_,h,R]),Xe=(0,n.useCallback)(async e=>{C||L(!0);try{const s=await x({user_id:u??"",session_id:e,site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(s.success&&s.resumed){s.userId&&((0,se.saveUserId)(s.userId),pe(s.userId));const d=s.welcomeMessage||C,t=d?[{type:"text",text:d}]:[],f=s.quickQuestions;if(f&&f.length>0){const m=f.map((a,A)=>({id:`quick-${A}`,label:a,value:a}));t.push({type:"quick_replies",data:{replies:m}})}else _&&_.length>0&&t.push({type:"quick_replies",data:{replies:_}});if(s.messages&&s.messages.length>0){const m=s.messages.filter(a=>a!=null).map(ge).filter(a=>a.content&&a.content.length>0&&!(a.content.length===1&&a.content[0].type==="text"&&!a.content[0].text));if(t.length>0){const a={id:`welcome-${Date.now()}`,role:"assistant",content:t,timestamp:Date.now()};D([a,...m])}else D(m)}else B(),t.length>0&&h({id:`welcome-${Date.now()}`,role:"assistant",content:t,timestamp:Date.now()})}else s.resumed||(T(),v())}catch(s){console.error("[LiveChatWidget] Failed to resume session:",s),s?.type==="GoogleRecaptchaError"?h({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:"Your session has expired. Please refresh the page and try again.",code:"RECAPTCHA_ERROR"}}],timestamp:Date.now()}):(h({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:"Failed to resume session. Creating a new session...",code:"SESSION_RESUME_ERROR"}}],timestamp:Date.now()}),T(),v())}finally{L(!1)}},[u,i,w,y,x,D,T,B,ge,v,C,_,h]),W=(0,n.useCallback)(async(e,s=!1)=>{const d=e||J.trim();if(!d)return;!e&&!s&&Z("");const t=(0,Ie.sanitizeInput)(d);if(!t){R?.(new Error("Invalid message"));return}if(!s){const a={id:`user-${Date.now()}`,role:"user",content:[{type:"text",text:t}],timestamp:Date.now()};h(a)}const f={id:`thinking-${Date.now()}`,role:"assistant",content:[{type:"thinking",data:{status:"thinking"}}],timestamp:Date.now()};h(f),s||Q?.(t);let m=!1;try{let a=K;if(!a){const l=await x({user_id:u??"",site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(l.success)a=l.sessionId,M(a);else throw new Error("Failed to create session")}const A={message:t,user_id:u??"",session_id:a,context:{cartId:ne,accessToken:ie,real_user_id:y}},S=ue();if(await fe(A,l=>{S(l),l.event==="error"&&l.data.type==="validation_error"&&(m=!0,T())}),m&&!s){console.log("[LiveChatWidget] Session expired (validation_error), creating new session and retrying...");const l=O.filter(b=>b.id!==f.id);D(l);const $=await x({user_id:u??"",site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if($.success)M($.sessionId),await W(t,!0);else throw new Error("Failed to recreate session after expiration")}}catch(a){console.error("[LiveChatWidget] Failed to send message:",a),R?.(a);const A=a?.type==="GoogleRecaptchaError";let S,l;A?(S="Your session has expired. Please refresh the page and try again.",l="RECAPTCHA_ERROR"):m?(S="Your session has expired. We tried to reconnect but failed. Please try again.",l="SESSION_EXPIRED"):(S="Failed to send message. Please check your network connection and try again.",l="NETWORK_ERROR");const $=O.filter(b=>b.id!==f.id);D([...$,{id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:S,code:l}}],timestamp:Date.now()}])}},[J,u,K,i,w,y,ne,ie,O,Z,h,D,x,fe,ue,M,T,Q,R]);n.default.useEffect(()=>{me.current=W},[W]);const U=!!E&&!ze,N=oe===!0&&U,he=X&&!N,ye=ke||N,Ke=(0,n.useCallback)(()=>{U?V(!0):P()},[U,P]);(0,n.useEffect)(()=>{N&&H?.(!1)},[N,H]);const Je=(0,n.useCallback)(()=>{He(!0),V(!1),re.default.set(G,"true",{expires:365}),P()},[P,G]),Ze=(0,n.useCallback)(()=>{V(!1)},[]);return(0,g.jsxs)(g.Fragment,{children:[E&&(0,g.jsx)(xe.ComplianceDialog,{open:ye,config:E,onAgree:Je,onClose:Ze}),(0,g.jsx)(Ce.ChatBubble,{position:Me,onClick:Ke,visible:!he&&!ye,iconImageUrl:Ae}),(0,g.jsx)(te.Root,{open:he,onOpenChange:e=>e?P():le(),children:(0,g.jsx)(te.Portal,{children:(0,g.jsx)(te.Content,{className:"livechat-window-enter",style:{position:"fixed",zIndex:9998},children:(0,g.jsx)(Re.ChatWindow,{messages:O,inputValue:J,onInputChange:Z,onSend:()=>W(),onClose:le,onNewSession:v,title:ve,logoUrl:Te,isSending:Ye,isLoadingHistory:Ge,rendererRegistry:Ve,inputPlaceholder:"",onAddToCart:F,showNewSessionButton:We,bottomTips:$e})})})})]})};
1
+ "use strict";var je=Object.create;var z=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var et=Object.getPrototypeOf,tt=Object.prototype.hasOwnProperty;var st=(o,c)=>{for(var p in c)z(o,p,{get:c[p],enumerable:!0})},ye=(o,c,p,q)=>{if(c&&typeof c=="object"||typeof c=="function")for(let i of be(c))!tt.call(o,i)&&i!==p&&z(o,i,{get:()=>c[i],enumerable:!(q=Ue(c,i))||q.enumerable});return o};var ee=(o,c,p)=>(p=o!=null?je(et(o)):{},ye(c||!o||!o.__esModule?z(p,"default",{value:o,enumerable:!0}):p,o)),at=o=>ye(z({},"__esModule",{value:!0}),o);var nt={};st(nt,{LiveChatWidget:()=>rt});module.exports=at(nt);var g=require("react/jsx-runtime"),n=ee(require("react")),te=ee(require("@radix-ui/react-dialog")),_e=require("./constants"),we=require("./components/ChatBubble"),Ce=require("./components/ChatWindow"),Re=require("./components/ComplianceDialog"),xe=require("./hooks/useChatState"),De=require("./hooks/useChatAPI"),Se=require("./utils/messageRenderers"),Ee=require("./utils/validation"),se=require("./utils/userId"),ae=require("./utils/productTransformers.js"),Ie=require("./utils/cartTransformers.js"),re=ee(require("js-cookie")),r=require("./components/MessageContent/index.js");const rt=({apiBaseUrl:o,headers:c,recaptchaSitekey:p,recaptchaAction:q,site:i,channelCode:w,loginUserId:y,cartId:ne,accessToken:ie,position:Pe,welcomeMessage:C,quickReplies:_,customRenderers:H,logoUrl:Me,title:Te,chatBubbleIcon:ve,open:oe,onOpenChange:Q,onOpen:Ae,onClose:qe,onMessageSend:Y,onError:R,onTextMessage:Fe,onProductList:Oe,onPromotionList:Be,onAddToCart:F,onCart:G,showNewSessionButton:Le,commonText:de,productCardRender:We,productComparisonRender:ce,bottomTips:Ne,complianceConfig:E})=>{const V=E?.cookieName||"livechat_compliance_agreed",[$e,X]=n.default.useState(!1),[ke,ze]=n.default.useState(()=>E?re.default.get(V)!==void 0:!0),I=n.default.useMemo(()=>({..._e.DEFAULT_COMMON_TEXT,...de}),[de]),He=(0,xe.useChatState)({welcomeMessage:C,site:i,open:oe,onOpenChange:Q,onOpen:Ae,onClose:qe,onMessageSend:Y,onError:R,onTextMessage:Fe,onProductList:Oe,onPromotionList:Be,onAddToCart:F,onCart:G,productCardRender:We,productComparisonRender:ce}),{messages:O,isOpen:Qe,userId:u,sessionId:K,inputValue:J,isStreaming:Ye,openChat:P,closeChat:le,setInputValue:Z,setUserId:pe,addMessage:h,setMessages:D,clearMessages:B,startStream:ue,saveSession:M,clearSession:T}=He,j=!!E&&!ke,L=oe===!0&&j,W=Qe&&!L,[Ge,N]=n.default.useState(!1),{sendMessageStream:fe,createSession:x}=(0,De.useChatAPI)({apiBaseUrl:o,headers:c,recaptchaConfig:{needRecaptcha:!!p,recaptchaSitekey:p,recaptchaAction:q},onError:R}),me=n.default.useRef(async e=>{}),Ve=n.default.useMemo(()=>{const e=new Se.MessageRendererRegistry;e.register("text",r.TextBlock),e.register("product_card",r.ProductCard),e.register("product_list",r.ProductList),e.register("product_comparison",r.ProductComparisonRenderer),e.register("policy",r.PolicyBlock),e.register("thinking",r.ThinkingBlock),e.register("error",r.ErrorBlock),e.register("faq_list",r.FAQListRenderer),e.register("promotion_list",r.PromotionListRenderer),e.register("cart",r.CartCard);const s=(0,r.createQuickRepliesRenderer)(d=>{me.current(d.value)});return e.register("quick_replies",s),H&&e.registerMany(H),e},[H]),U=n.default.useRef(!1);(0,n.useEffect)(()=>{if(!W){U.current=!1;return}if(u===void 0||U.current)return;U.current=!0;const e=K;e?Xe(e):v()},[W,u]);const ge=(0,n.useCallback)(e=>{if(Array.isArray(e.content))return e;const s=[];typeof e.content=="string"&&e.content.trim()&&s.push({type:"text",text:e.content});const d=e.structuredContent||e.structured_content;return Array.isArray(d)&&d.forEach(t=>{if(t.type==="product_list"&&Array.isArray(t.data))s.push({type:"product_list",data:{products:(0,ae.transformProducts)(t.data,i),title:void 0,commonText:I}});else if(t.type==="quick_replies"&&t.data?.replies)s.push({type:"quick_replies",data:{replies:t.data.replies}});else if(t.type==="policy"&&t.data?.title&&t.data?.content)s.push({type:"policy",data:{title:t.data.title,content:t.data.content}});else if(t.type==="product_comparison"&&t.data?.products&&t.data?.dimensions)s.push({type:"product_comparison",data:{products:(0,ae.transformProducts)(t.data.products,i),dimensions:t.data.dimensions,onAddToCart:F,commonText:I,productComparisonRender:ce}});else if(t.type==="faq_list"&&t.data?.found!==void 0)s.push({type:"faq_list",data:t.data});else if(t.type==="promotion_list"&&t.data?.found!==void 0)s.push({type:"promotion_list",data:{...t.data,commonText:I}});else if(t.type==="cart"&&t.data?.id!==void 0){const f=(0,Ie.transformCartData)(t.data);s.push({type:"cart",data:{...f,onCart:G,commonText:I}})}else s.push(t)}),s.length===0&&s.push({type:"text",text:""}),{...e,content:s}},[i,G,F,I]),v=(0,n.useCallback)(async()=>{if(u!==void 0){C||N(!0);try{const e=await x({user_id:u??"",site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(e.success){M(e.sessionId),e.userId&&((0,se.saveUserId)(e.userId),pe(e.userId)),B();const s=e.welcomeMessage||C;if(s){const d=[{type:"text",text:s}],t=e.quickQuestions;if(t&&t.length>0){const f=t.map((m,a)=>({id:`quick-${a}`,label:m,value:m}));d.push({type:"quick_replies",data:{replies:f}})}else _&&_.length>0&&d.push({type:"quick_replies",data:{replies:_}});h({id:`welcome-${Date.now()}`,role:"assistant",content:d,timestamp:Date.now()})}}}catch(e){console.error("[LiveChatWidget] Failed to create new session:",e),R?.(e);const s=e?.type==="GoogleRecaptchaError";h({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:s?"Your session has expired. Please refresh the page and try again.":"Failed to create session. Please refresh the page and try again.",code:s?"RECAPTCHA_ERROR":"SESSION_CREATE_ERROR"}}],timestamp:Date.now()})}finally{N(!1)}}},[u,i,w,y,x,M,B,C,_,h,R]),Xe=(0,n.useCallback)(async e=>{C||N(!0);try{const s=await x({user_id:u??"",session_id:e,site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(s.success&&s.resumed){s.userId&&((0,se.saveUserId)(s.userId),pe(s.userId));const d=s.welcomeMessage||C,t=d?[{type:"text",text:d}]:[],f=s.quickQuestions;if(f&&f.length>0){const m=f.map((a,A)=>({id:`quick-${A}`,label:a,value:a}));t.push({type:"quick_replies",data:{replies:m}})}else _&&_.length>0&&t.push({type:"quick_replies",data:{replies:_}});if(s.messages&&s.messages.length>0){const m=s.messages.filter(a=>a!=null).map(ge).filter(a=>a.content&&a.content.length>0&&!(a.content.length===1&&a.content[0].type==="text"&&!a.content[0].text));if(t.length>0){const a={id:`welcome-${Date.now()}`,role:"assistant",content:t,timestamp:Date.now()};D([a,...m])}else D(m)}else B(),t.length>0&&h({id:`welcome-${Date.now()}`,role:"assistant",content:t,timestamp:Date.now()})}else s.resumed||(T(),v())}catch(s){console.error("[LiveChatWidget] Failed to resume session:",s),s?.type==="GoogleRecaptchaError"?h({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:"Your session has expired. Please refresh the page and try again.",code:"RECAPTCHA_ERROR"}}],timestamp:Date.now()}):(h({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:"Failed to resume session. Creating a new session...",code:"SESSION_RESUME_ERROR"}}],timestamp:Date.now()}),T(),v())}finally{N(!1)}},[u,i,w,y,x,D,T,B,ge,v,C,_,h]),$=(0,n.useCallback)(async(e,s=!1)=>{const d=e||J.trim();if(!d)return;!e&&!s&&Z("");const t=(0,Ee.sanitizeInput)(d);if(!t){R?.(new Error("Invalid message"));return}if(!s){const a={id:`user-${Date.now()}`,role:"user",content:[{type:"text",text:t}],timestamp:Date.now()};h(a)}const f={id:`thinking-${Date.now()}`,role:"assistant",content:[{type:"thinking",data:{status:"thinking"}}],timestamp:Date.now()};h(f),s||Y?.(t);let m=!1;try{let a=K;if(!a){const l=await x({user_id:u??"",site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(l.success)a=l.sessionId,M(a);else throw new Error("Failed to create session")}const A={message:t,user_id:u??"",session_id:a,context:{cartId:ne,accessToken:ie,real_user_id:y}},S=ue();if(await fe(A,l=>{S(l),l.event==="error"&&l.data.type==="validation_error"&&(m=!0,T())}),m&&!s){console.log("[LiveChatWidget] Session expired (validation_error), creating new session and retrying...");const l=O.filter(b=>b.id!==f.id);D(l);const k=await x({user_id:u??"",site:i,channel_code:w,real_user_id:y,page_url:typeof window<"u"?window.location.href:void 0});if(k.success)M(k.sessionId),await $(t,!0);else throw new Error("Failed to recreate session after expiration")}}catch(a){console.error("[LiveChatWidget] Failed to send message:",a),R?.(a);const A=a?.type==="GoogleRecaptchaError";let S,l;A?(S="Your session has expired. Please refresh the page and try again.",l="RECAPTCHA_ERROR"):m?(S="Your session has expired. We tried to reconnect but failed. Please try again.",l="SESSION_EXPIRED"):(S="Failed to send message. Please check your network connection and try again.",l="NETWORK_ERROR");const k=O.filter(b=>b.id!==f.id);D([...k,{id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:S,code:l}}],timestamp:Date.now()}])}},[J,u,K,i,w,y,ne,ie,O,Z,h,D,x,fe,ue,M,T,Y,R]);n.default.useEffect(()=>{me.current=$},[$]);const he=$e||L,Ke=(0,n.useCallback)(()=>{j?X(!0):P()},[j,P]);(0,n.useEffect)(()=>{L&&Q?.(!1)},[L,Q]);const Je=(0,n.useCallback)(()=>{ze(!0),X(!1),re.default.set(V,"true",{expires:365}),P()},[P,V]),Ze=(0,n.useCallback)(()=>{X(!1)},[]);return(0,g.jsxs)(g.Fragment,{children:[E&&(0,g.jsx)(Re.ComplianceDialog,{open:he,config:E,onAgree:Je,onClose:Ze}),(0,g.jsx)(we.ChatBubble,{position:Pe,onClick:Ke,visible:!W&&!he,iconImageUrl:ve}),(0,g.jsx)(te.Root,{open:W,onOpenChange:e=>e?P():le(),children:(0,g.jsx)(te.Portal,{children:(0,g.jsx)(te.Content,{className:"livechat-window-enter",style:{position:"fixed",zIndex:9998},children:(0,g.jsx)(Ce.ChatWindow,{messages:O,inputValue:J,onInputChange:Z,onSend:()=>$(),onClose:le,onNewSession:v,title:Te,logoUrl:Me,isSending:Ye,isLoadingHistory:Ge,rendererRegistry:Ve,inputPlaceholder:"",onAddToCart:F,showNewSessionButton:Le,bottomTips:Ne})})})})]})};
2
2
  //# sourceMappingURL=LiveChatWidget.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/LiveChatWidget/LiveChatWidget.tsx"],
4
- "sourcesContent": ["/**\n * LiveChat \u4E3B\u7EC4\u4EF6\n * \u96C6\u6210\u6240\u6709\u5B50\u7EC4\u4EF6\uFF0C\u63D0\u4F9B\u5B8C\u6574\u7684\u804A\u5929\u529F\u80FD\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u4E09\u5C42\u67B6\u6784\u8BBE\u8BA1\n */\n\nimport React, { useEffect, useCallback } from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport type {\n LiveChatWidgetProps,\n QuickReply,\n Message,\n MessageContent,\n ChatStreamRequest,\n BackendCartData,\n CommonText,\n} from './types'\nimport { DEFAULT_COMMON_TEXT } from './constants'\nimport { ChatBubble } from './components/ChatBubble'\nimport { ChatWindow } from './components/ChatWindow'\nimport { ComplianceDialog } from './components/ComplianceDialog'\nimport { useChatState } from './hooks/useChatState'\nimport { useChatAPI } from './hooks/useChatAPI'\nimport { MessageRendererRegistry } from './utils/messageRenderers'\nimport { sanitizeInput } from './utils/validation'\nimport { saveUserId } from './utils/userId'\nimport { transformProducts } from './utils/productTransformers.js'\nimport { transformCartData } from './utils/cartTransformers.js'\nimport Cookies from 'js-cookie'\nimport {\n TextBlock,\n ProductCard,\n ProductList,\n ProductComparisonRenderer,\n PolicyBlock,\n createQuickRepliesRenderer,\n ThinkingBlock,\n ErrorBlock,\n FAQListRenderer,\n PromotionListRenderer,\n CartCard,\n} from './components/MessageContent/index.js'\n\n/**\n * LiveChat \u804A\u5929\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u6C14\u6CE1\u5F39\u7A97\u804A\u5929\u754C\u9762\n * - SSE \u6D41\u5F0F\u6D88\u606F\u63A5\u6536\n * - \u4F1A\u8BDD\u7BA1\u7406\uFF08userId, sessionId\uFF09\n * - \u5386\u53F2\u6D88\u606F\u52A0\u8F7D\n * - \u591A\u79CD\u6D88\u606F\u7C7B\u578B\u6E32\u67D3\n * - \u81EA\u5B9A\u4E49\u6269\u5C55\u673A\u5236\n * - reCAPTCHA v3 \u5B89\u5168\u9632\u62A4\n *\n * \u67B6\u6784\uFF1A\n * - UI Layer: ChatBubble, ChatWindow, MessageList, etc.\n * - Logic Layer: useChatState, useChatAPI, useSession\n * - Core Layer: MessageRendererRegistry, \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n *\n * @example\n * ```tsx\n * // \u57FA\u7840\u4F7F\u7528\uFF08\u4F7F\u7528\u9ED8\u8BA4\u4F4D\u7F6E\uFF09\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * welcomeMessage=\"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\"\n * onMessageSend={(msg) => console.log('Sent:', msg)}\n * />\n *\n * // \u4F7F\u7528\u81EA\u5B9A\u4E49\u4F4D\u7F6E\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * position={{ bottom: \"20px\", right: \"30px\" }}\n * onMessageSend={(msg) => console.log('Sent:', msg)}\n * />\n *\n * // \u542F\u7528 reCAPTCHA v3 \u5B89\u5168\u9632\u62A4\uFF08\u63D0\u4F9B sitekey \u5373\u81EA\u52A8\u542F\u7528\uFF09\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * recaptchaSitekey=\"6LfS4J4pAAAAACX1e_WrxutmxxzCK7FU4WzVqL14\"\n * recaptchaAction=\"livechat\"\n * />\n *\n * // \u4F7F\u7528\u81EA\u5B9A\u4E49 headers \u548C reCAPTCHA\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * headers={{\n * \"Authorization\": \"Bearer your-token\",\n * \"X-Custom-Header\": \"value\"\n * }}\n * recaptchaSitekey=\"your-site-key\"\n * />\n * ```\n */\nexport const LiveChatWidget: React.FC<LiveChatWidgetProps> = ({\n apiBaseUrl,\n headers,\n recaptchaSitekey,\n recaptchaAction,\n site,\n channelCode,\n loginUserId,\n cartId,\n accessToken,\n position,\n welcomeMessage,\n quickReplies,\n customRenderers,\n logoUrl,\n title,\n chatBubbleIcon,\n open,\n onOpenChange,\n onOpen,\n onClose,\n onMessageSend,\n onError,\n onTextMessage,\n onProductList,\n onPromotionList,\n onAddToCart,\n onCart,\n showNewSessionButton,\n commonText,\n productCardRender,\n productComparisonRender,\n bottomTips,\n complianceConfig,\n}) => {\n // \u6CD5\u89C4\u534F\u8BAE\u5F39\u7A97\u72B6\u6001\n // \u4ECE Cookie \u8BFB\u53D6\u7528\u6237\u662F\u5426\u5DF2\u540C\u610F\uFF08\u6709\u6548\u671F 365 \u5929\uFF09\n const cookieName = complianceConfig?.cookieName || 'livechat_compliance_agreed'\n const [showComplianceDialog, setShowComplianceDialog] = React.useState(false)\n const [hasAgreedCompliance, setHasAgreedCompliance] = React.useState(() => {\n // \u521D\u59CB\u5316\u65F6\u68C0\u67E5 Cookie\n return complianceConfig ? Cookies.get(cookieName) !== undefined : true\n })\n\n // \u5408\u5E76\u9ED8\u8BA4\u6587\u6848\u548C\u81EA\u5B9A\u4E49\u6587\u6848\n const mergedText: Required<CommonText> = React.useMemo(\n () => ({\n ...DEFAULT_COMMON_TEXT,\n ...commonText,\n }),\n [commonText]\n )\n\n // \u72B6\u6001\u7BA1\u7406\n const chatState = useChatState({\n welcomeMessage,\n site,\n open,\n onOpenChange,\n onOpen,\n onClose,\n onMessageSend,\n onError,\n onTextMessage,\n onProductList,\n onPromotionList,\n onAddToCart,\n onCart,\n productCardRender,\n productComparisonRender,\n })\n\n const {\n messages,\n isOpen,\n userId,\n sessionId,\n inputValue,\n isStreaming,\n openChat,\n closeChat,\n setInputValue,\n setUserId,\n addMessage,\n setMessages,\n clearMessages,\n startStream,\n saveSession,\n clearSession,\n } = chatState\n\n // \u521D\u59CB\u5316\u52A0\u8F7D\u72B6\u6001\uFF08\u7528\u6237\u672A\u914D\u7F6E\u6B22\u8FCE\u8BED\u65F6\uFF0C\u663E\u793A loading \u76F4\u5230\u63A5\u53E3\u8FD4\u56DE\uFF09\n const [isInitializing, setIsInitializing] = React.useState(false)\n\n // API \u8C03\u7528\n const { sendMessageStream, createSession } = useChatAPI({\n apiBaseUrl,\n headers,\n recaptchaConfig: {\n needRecaptcha: !!recaptchaSitekey, // \u6839\u636E sitekey \u81EA\u52A8\u5224\u65AD\u662F\u5426\u542F\u7528\n recaptchaSitekey,\n recaptchaAction,\n },\n onError,\n })\n\n // \u4F7F\u7528 ref \u5B58\u50A8\u6700\u65B0\u7684 handleSendMessage\uFF0C\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n const handleSendMessageRef = React.useRef<(_message?: string) => Promise<void>>(async (_message?: string) => {})\n\n // \u6D88\u606F\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n const rendererRegistry = React.useMemo(() => {\n const registry = new MessageRendererRegistry()\n\n // \u6CE8\u518C\u9ED8\u8BA4\u6E32\u67D3\u5668\n registry.register('text', TextBlock)\n registry.register('product_card', ProductCard)\n registry.register('product_list', ProductList)\n registry.register('product_comparison', ProductComparisonRenderer)\n registry.register('policy', PolicyBlock)\n registry.register('thinking', ThinkingBlock)\n registry.register('error', ErrorBlock)\n registry.register('faq_list', FAQListRenderer)\n registry.register('promotion_list', PromotionListRenderer)\n registry.register('cart', CartCard)\n\n // \u6CE8\u518C\u5FEB\u6377\u56DE\u590D\u6E32\u67D3\u5668\uFF08\u5E26\u56DE\u8C03\uFF09\n const quickRepliesRenderer = createQuickRepliesRenderer((reply: QuickReply) => {\n // \u4F7F\u7528 ref \u8C03\u7528\u6700\u65B0\u7684 handleSendMessage\n handleSendMessageRef.current(reply.value)\n })\n registry.register('quick_replies', quickRepliesRenderer)\n\n // \u6CE8\u518C\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n if (customRenderers) {\n registry.registerMany(customRenderers)\n }\n\n return registry\n }, [customRenderers])\n\n // \u6807\u8BB0\u662F\u5426\u5DF2\u7ECF\u521D\u59CB\u5316\u8FC7\u4F1A\u8BDD\uFF0C\u9632\u6B62\u91CD\u590D\u8C03\u7528\n const sessionInitializedRef = React.useRef(false)\n\n /**\n * T043: \u6253\u5F00\u804A\u5929\u7A97\u53E3\u65F6\u521D\u59CB\u5316\u4F1A\u8BDD\n * \u4F7F\u7528 API v2.0.0 \u7684\u7EDF\u4E00\u63A5\u53E3\uFF1A\n * - \u5982\u679C\u6CA1\u6709 sessionId\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n * - \u5982\u679C\u6709 sessionId\uFF0C\u6062\u590D\u4F1A\u8BDD\u5E76\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\n */\n useEffect(() => {\n // \u7A97\u53E3\u5173\u95ED\u65F6\u91CD\u7F6E\u521D\u59CB\u5316\u6807\u8BB0\n if (!isOpen) {\n sessionInitializedRef.current = false\n return\n }\n\n // userId \u4E3A undefined \u8868\u793A\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u7B49\u5F85\u521D\u59CB\u5316\u5B8C\u6210\n if (userId === undefined) return\n\n // \u5982\u679C\u5DF2\u7ECF\u521D\u59CB\u5316\u8FC7\uFF0C\u4E0D\u518D\u91CD\u590D\u8C03\u7528\n if (sessionInitializedRef.current) return\n sessionInitializedRef.current = true\n\n const currentSessionId = sessionId\n\n if (!currentSessionId) {\n // \u6CA1\u6709\u4F1A\u8BDD\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n handleCreateNewSession()\n } else {\n // \u6709\u4F1A\u8BDD\uFF0C\u5C1D\u8BD5\u6062\u590D\u4F1A\u8BDD\u548C\u5386\u53F2\u6D88\u606F\n handleResumeSession(currentSessionId)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, userId])\n\n /**\n * \u89C4\u8303\u5316\u6D88\u606F\u683C\u5F0F\uFF08\u786E\u4FDD content \u662F\u6570\u7EC4\uFF09\n * \u540E\u7AEF\u8FD4\u56DE\u683C\u5F0F\uFF1A\n * - content: \u5B57\u7B26\u4E32\uFF08\u6587\u672C\u5185\u5BB9\uFF09\n * - structuredContent: \u6570\u7EC4\uFF08\u7ED3\u6784\u5316\u5185\u5BB9\uFF0C\u5982\u4EA7\u54C1\u5217\u8868\u3001\u653F\u7B56\u7B49\uFF09\n * \u9700\u8981\u5408\u5E76\u4E3A\u7EDF\u4E00\u7684 content \u6570\u7EC4\u683C\u5F0F\n */\n const normalizeMessage = useCallback(\n (message: any): Message => {\n // \u5982\u679C content \u5DF2\u7ECF\u662F\u6570\u7EC4\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (Array.isArray(message.content)) {\n return message as Message\n }\n\n const contentBlocks: MessageContent[] = []\n\n // \u5904\u7406\u6587\u672C\u5185\u5BB9\n if (typeof message.content === 'string' && message.content.trim()) {\n contentBlocks.push({\n type: 'text',\n text: message.content,\n })\n }\n\n // \u5904\u7406\u7ED3\u6784\u5316\u5185\u5BB9\n // \u5386\u53F2\u6D88\u606F\u683C\u5F0F: structured_content: [{type, data}]\n const structuredData = message.structuredContent || message.structured_content\n\n if (Array.isArray(structuredData)) {\n structuredData.forEach((block: any) => {\n if (block.type === 'product_list' && Array.isArray(block.data)) {\n // \u8F6C\u6362\u4EA7\u54C1\u5217\u8868\u6570\u636E\u7ED3\u6784 - data \u76F4\u63A5\u662F\u4EA7\u54C1\u6570\u7EC4\n contentBlocks.push({\n type: 'product_list',\n data: {\n products: transformProducts(block.data, site),\n title: undefined, // \u5386\u53F2\u6D88\u606F\u4E0D\u5305\u542B title\n commonText: mergedText,\n },\n })\n } else if (block.type === 'quick_replies' && block.data?.replies) {\n contentBlocks.push({\n type: 'quick_replies',\n data: {\n replies: block.data.replies,\n },\n })\n } else if (block.type === 'policy' && block.data?.title && block.data?.content) {\n contentBlocks.push({\n type: 'policy',\n data: {\n title: block.data.title,\n content: block.data.content,\n },\n })\n } else if (block.type === 'product_comparison' && block.data?.products && block.data?.dimensions) {\n // \u8F6C\u6362\u4EA7\u54C1\u5BF9\u6BD4\u6570\u636E\u7ED3\u6784\u5E76\u6CE8\u5165 onAddToCart \u56DE\u8C03\u548C\u81EA\u5B9A\u4E49\u6E32\u67D3\u51FD\u6570\n contentBlocks.push({\n type: 'product_comparison',\n data: {\n products: transformProducts(block.data.products, site),\n dimensions: block.data.dimensions,\n onAddToCart: onAddToCart,\n commonText: mergedText,\n productComparisonRender: productComparisonRender,\n },\n })\n } else if (block.type === 'faq_list' && block.data?.found !== undefined) {\n // FAQ \u5217\u8868\u5361\u7247 - \u76F4\u63A5\u4F7F\u7528\u540E\u7AEF\u6570\u636E\n contentBlocks.push({\n type: 'faq_list',\n data: block.data,\n })\n } else if (block.type === 'promotion_list' && block.data?.found !== undefined) {\n // \u4FC3\u9500\u6D3B\u52A8\u5217\u8868\u5361\u7247 - \u76F4\u63A5\u4F7F\u7528\u540E\u7AEF\u6570\u636E\n contentBlocks.push({\n type: 'promotion_list',\n data: {\n ...block.data,\n commonText: mergedText,\n },\n })\n } else if (block.type === 'cart' && block.data?.id !== undefined) {\n // \u8D2D\u7269\u8F66\u5361\u7247 - \u8F6C\u6362\u540E\u7AEF\u6570\u636E\u683C\u5F0F\u5E76\u6CE8\u5165 onCart \u56DE\u8C03\n const transformedData = transformCartData(block.data as BackendCartData)\n contentBlocks.push({\n type: 'cart',\n data: {\n ...transformedData,\n onCart: onCart,\n commonText: mergedText,\n },\n })\n } else {\n // \u5176\u4ED6\u7C7B\u578B\u76F4\u63A5\u6DFB\u52A0\n contentBlocks.push(block)\n }\n })\n }\n\n // \u5982\u679C\u6CA1\u6709\u4EFB\u4F55\u5185\u5BB9\u5757\uFF0C\u8FD4\u56DE\u7A7A\u6587\u672C\u5757\n if (contentBlocks.length === 0) {\n contentBlocks.push({\n type: 'text',\n text: '',\n })\n }\n\n return {\n ...message,\n content: contentBlocks,\n } as Message\n },\n [site, onCart, onAddToCart, mergedText]\n )\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\n */\n const handleCreateNewSession = useCallback(async () => {\n // userId \u4E3A undefined \u8868\u793A\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u7B49\u5F85\u521D\u59CB\u5316\u5B8C\u6210\n if (userId === undefined) return\n\n // \u5982\u679C\u7528\u6237\u6CA1\u6709\u914D\u7F6E\u6B22\u8FCE\u8BED\uFF0C\u663E\u793A loading \u72B6\u6001\n if (!welcomeMessage) {\n setIsInitializing(true)\n }\n\n try {\n const response = await createSession({\n user_id: userId ?? '',\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n\n if (response.success) {\n // \u4FDD\u5B58\u65B0\u4F1A\u8BDD ID\n saveSession(response.sessionId)\n\n // \u4FDD\u5B58\u540E\u7AEF\u8FD4\u56DE\u7684 userId\uFF08\u5982\u679C\u6709\uFF09\n if (response.userId) {\n saveUserId(response.userId)\n setUserId(response.userId)\n }\n\n // \u6E05\u7A7A\u6D88\u606F\u5217\u8868\n clearMessages()\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u6B22\u8FCE\u6D88\u606F\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u9ED8\u8BA4\u503C\n const messageText = response.welcomeMessage || welcomeMessage\n\n if (messageText) {\n const welcomeContent: MessageContent[] = [{ type: 'text', text: messageText }]\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u5FEB\u6377\u95EE\u9898\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u5FEB\u6377\u56DE\u590D\n const questions = response.quickQuestions\n if (questions && questions.length > 0) {\n // \u5C06\u540E\u7AEF\u7684 quickQuestions (\u5B57\u7B26\u4E32\u6570\u7EC4) \u8F6C\u6362\u4E3A QuickReply \u683C\u5F0F\n const quickRepliesFromBackend = questions.map((question, index) => ({\n id: `quick-${index}`,\n label: question,\n value: question,\n }))\n\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickRepliesFromBackend,\n },\n })\n } else if (quickReplies && quickReplies.length > 0) {\n // \u5982\u679C\u540E\u7AEF\u6CA1\u6709\u8FD4\u56DE\uFF0C\u4F7F\u7528 props \u4E2D\u7684\u5FEB\u6377\u56DE\u590D\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickReplies,\n },\n })\n }\n\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n })\n }\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to create new session:', error)\n onError?.(error as Error)\n\n // Check if it's a reCAPTCHA error\n const isRecaptcha = (error as any)?.type === 'GoogleRecaptchaError'\n\n // \u6DFB\u52A0\u9519\u8BEF\u6D88\u606F\u5230\u754C\u9762\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: isRecaptcha\n ? 'Your session has expired. Please refresh the page and try again.'\n : 'Failed to create session. Please refresh the page and try again.',\n code: isRecaptcha ? 'RECAPTCHA_ERROR' : 'SESSION_CREATE_ERROR',\n },\n },\n ],\n timestamp: Date.now(),\n })\n } finally {\n // \u63A5\u53E3\u8FD4\u56DE\u540E\u5173\u95ED loading \u72B6\u6001\n setIsInitializing(false)\n }\n }, [\n userId,\n site,\n channelCode,\n loginUserId,\n createSession,\n saveSession,\n clearMessages,\n welcomeMessage,\n quickReplies,\n addMessage,\n onError,\n ])\n\n /**\n * \u6062\u590D\u4F1A\u8BDD\u548C\u5386\u53F2\u6D88\u606F\uFF08\u4F7F\u7528\u65B0\u7684 API v2.0.0\uFF09\n */\n const handleResumeSession = useCallback(\n async (existingSessionId: string) => {\n // \u5982\u679C\u7528\u6237\u6CA1\u6709\u914D\u7F6E\u6B22\u8FCE\u8BED\uFF0C\u663E\u793A loading \u72B6\u6001\n if (!welcomeMessage) {\n setIsInitializing(true)\n }\n\n try {\n const response = await createSession({\n user_id: userId ?? '',\n session_id: existingSessionId,\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n\n if (response.success && response.resumed) {\n // \u4F1A\u8BDD\u6062\u590D\u6210\u529F\n\n // \u4FDD\u5B58\u540E\u7AEF\u8FD4\u56DE\u7684 userId\uFF08\u5982\u679C\u6709\uFF09\n if (response.userId) {\n saveUserId(response.userId)\n setUserId(response.userId)\n }\n\n // \u51C6\u5907\u6B22\u8FCE\u6D88\u606F\uFF08\u65E0\u8BBA\u662F\u5426\u6709\u5386\u53F2\u6D88\u606F\u90FD\u9700\u8981\uFF09\n const messageText = response.welcomeMessage || welcomeMessage\n const welcomeContent: MessageContent[] = messageText ? [{ type: 'text', text: messageText }] : []\n\n // \u6DFB\u52A0\u5FEB\u6377\u56DE\u590D\u5230\u6B22\u8FCE\u6D88\u606F\n const questions = response.quickQuestions\n if (questions && questions.length > 0) {\n const quickRepliesFromBackend = questions.map((question, index) => ({\n id: `quick-${index}`,\n label: question,\n value: question,\n }))\n\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickRepliesFromBackend,\n },\n })\n } else if (quickReplies && quickReplies.length > 0) {\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickReplies,\n },\n })\n }\n\n if (response.messages && response.messages.length > 0) {\n // \u6709\u5386\u53F2\u6D88\u606F\uFF0C\u89C4\u8303\u5316\u5E76\u52A0\u8F7D\uFF08\u8FC7\u6EE4\u6389 null/undefined \u503C\u548C\u7A7A\u5185\u5BB9\u6D88\u606F\uFF09\n const normalizedMessages = response.messages\n .filter((msg: any) => msg != null)\n .map(normalizeMessage)\n .filter((msg: Message) => msg.content && msg.content.length > 0 && !(msg.content.length === 1 && msg.content[0].type === 'text' && !msg.content[0].text))\n\n // \u5982\u679C\u6709\u6B22\u8FCE\u6D88\u606F\uFF0C\u5C06\u5176\u6DFB\u52A0\u5230\u5386\u53F2\u6D88\u606F\u7684\u5F00\u5934\n if (welcomeContent.length > 0) {\n const welcomeMsg: Message = {\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n }\n setMessages([welcomeMsg, ...normalizedMessages])\n } else {\n setMessages(normalizedMessages)\n }\n } else {\n // \u6CA1\u6709\u5386\u53F2\u6D88\u606F\uFF0C\u4EC5\u663E\u793A\u6B22\u8FCE\u6D88\u606F\n clearMessages()\n\n if (welcomeContent.length > 0) {\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n })\n }\n }\n } else if (!response.resumed) {\n // \u4F1A\u8BDD\u65E0\u6548\u6216\u8FC7\u671F\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n clearSession()\n handleCreateNewSession()\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to resume session:', error)\n\n // Check if it's a reCAPTCHA error\n const isRecaptcha = (error as any)?.type === 'GoogleRecaptchaError'\n\n if (isRecaptcha) {\n // reCAPTCHA error - show refresh page message, don't retry\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: 'Your session has expired. Please refresh the page and try again.',\n code: 'RECAPTCHA_ERROR',\n },\n },\n ],\n timestamp: Date.now(),\n })\n } else {\n // Other errors - show message and try to create new session\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: 'Failed to resume session. Creating a new session...',\n code: 'SESSION_RESUME_ERROR',\n },\n },\n ],\n timestamp: Date.now(),\n })\n\n // \u6062\u590D\u5931\u8D25\uFF0C\u6E05\u7A7A\u4F1A\u8BDD\u5E76\u521B\u5EFA\u65B0\u7684\n clearSession()\n handleCreateNewSession()\n }\n } finally {\n // \u63A5\u53E3\u8FD4\u56DE\u540E\u5173\u95ED loading \u72B6\u6001\n setIsInitializing(false)\n }\n },\n [\n userId,\n site,\n channelCode,\n loginUserId,\n createSession,\n setMessages,\n clearSession,\n clearMessages,\n normalizeMessage,\n handleCreateNewSession,\n welcomeMessage,\n quickReplies,\n addMessage,\n ]\n )\n\n /**\n * \u53D1\u9001\u6D88\u606F\n */\n const handleSendMessage = useCallback(\n async (message?: string, isRetry: boolean = false) => {\n const textToSend = message || inputValue.trim()\n\n if (!textToSend) return\n\n // \u6E05\u7A7A\u8F93\u5165\u6846\uFF08\u4EC5\u5728\u975E\u91CD\u8BD5\u65F6\uFF09\n if (!message && !isRetry) {\n setInputValue('')\n }\n\n // \u8F93\u5165\u9A8C\u8BC1\n const sanitized = sanitizeInput(textToSend)\n if (!sanitized) {\n onError?.(new Error('Invalid message'))\n return\n }\n\n // \u6DFB\u52A0\u7528\u6237\u6D88\u606F\u5230\u754C\u9762\uFF08\u4EC5\u5728\u975E\u91CD\u8BD5\u65F6\uFF09\n if (!isRetry) {\n const userMessage = {\n id: `user-${Date.now()}`,\n role: 'user' as const,\n content: [{ type: 'text' as const, text: sanitized }],\n timestamp: Date.now(),\n }\n addMessage(userMessage)\n }\n\n // \u7ACB\u5373\u6DFB\u52A0\u601D\u8003\u72B6\u6001\u6D88\u606F\uFF0C\u63D0\u5347\u7528\u6237\u4F53\u9A8C\n const thinkingMessage = {\n id: `thinking-${Date.now()}`,\n role: 'assistant' as const,\n content: [{ type: 'thinking' as const, data: { status: 'thinking' } }],\n timestamp: Date.now(),\n }\n addMessage(thinkingMessage)\n\n // \u89E6\u53D1\u6D88\u606F\u53D1\u9001\u56DE\u8C03\uFF08\u4EC5\u5728\u975E\u91CD\u8BD5\u65F6\uFF09\n if (!isRetry) {\n onMessageSend?.(sanitized)\n }\n\n // \u6807\u8BB0\u662F\u5426\u68C0\u6D4B\u5230\u4F1A\u8BDD\u8FC7\u671F\n let sessionExpiredDetected = false\n\n try {\n // \u786E\u4FDD\u6709 sessionId\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u5148\u521B\u5EFA\u4F1A\u8BDD\n let currentSessionId = sessionId\n if (!currentSessionId) {\n // \u6CA1\u6709\u4F1A\u8BDD\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n const response = await createSession({\n user_id: userId ?? '',\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n if (response.success) {\n currentSessionId = response.sessionId\n saveSession(currentSessionId)\n } else {\n throw new Error('Failed to create session')\n }\n }\n\n // \u6784\u5EFA\u8BF7\u6C42\u53C2\u6570\uFF08session_id \u73B0\u5728\u662F\u5FC5\u586B\u7684\uFF09\n const requestPayload: ChatStreamRequest = {\n message: sanitized,\n user_id: userId ?? '',\n session_id: currentSessionId,\n context: {\n cartId: cartId,\n accessToken: accessToken,\n real_user_id: loginUserId,\n },\n }\n\n // \u521B\u5EFA\u7ED1\u5B9A\u4E86\u5F53\u524D streamId \u7684\u4E8B\u4EF6\u5904\u7406\u5668\uFF0C\u9632\u6B62\u5E76\u53D1 stream \u6C61\u67D3\u5171\u4EAB buffer\n const streamEventHandler = startStream()\n\n // \u53D1\u9001\u6D88\u606F\u5230\u540E\u7AEF\n await sendMessageStream(requestPayload, event => {\n streamEventHandler(event)\n\n // \u7279\u6B8A\u5904\u7406\uFF1A\u4F1A\u8BDD\u8FC7\u671F\uFF08error \u4E8B\u4EF6\u4E14 type \u4E3A validation_error\uFF09\n if (event.event === 'error' && event.data.type === 'validation_error') {\n sessionExpiredDetected = true\n clearSession()\n }\n })\n\n // \u5982\u679C\u68C0\u6D4B\u5230\u4F1A\u8BDD\u8FC7\u671F\u4E14\u4E0D\u662F\u91CD\u8BD5\uFF0C\u81EA\u52A8\u521B\u5EFA\u65B0\u4F1A\u8BDD\u5E76\u91CD\u8BD5\n if (sessionExpiredDetected && !isRetry) {\n console.log('[LiveChatWidget] Session expired (validation_error), creating new session and retrying...')\n\n // \u79FB\u9664 thinking \u6D88\u606F\n const messagesWithoutThinking = messages.filter(msg => msg.id !== thinkingMessage.id)\n setMessages(messagesWithoutThinking)\n\n // \u521B\u5EFA\u65B0\u4F1A\u8BDD\n const response = await createSession({\n user_id: userId ?? '',\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n\n if (response.success) {\n saveSession(response.sessionId)\n // \u91CD\u8BD5\u53D1\u9001\u6D88\u606F\n await handleSendMessage(sanitized, true)\n } else {\n throw new Error('Failed to recreate session after expiration')\n }\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to send message:', error)\n onError?.(error as Error)\n\n // Check if it's a reCAPTCHA error\n const isRecaptcha = (error as any)?.type === 'GoogleRecaptchaError'\n\n // Determine error message based on error type\n let errorMessage: string\n let errorCode: string\n\n if (isRecaptcha) {\n errorMessage = 'Your session has expired. Please refresh the page and try again.'\n errorCode = 'RECAPTCHA_ERROR'\n } else if (sessionExpiredDetected) {\n errorMessage = 'Your session has expired. We tried to reconnect but failed. Please try again.'\n errorCode = 'SESSION_EXPIRED'\n } else {\n errorMessage = 'Failed to send message. Please check your network connection and try again.'\n errorCode = 'NETWORK_ERROR'\n }\n\n // \u79FB\u9664\u521A\u624D\u6DFB\u52A0\u7684 thinking \u6D88\u606F\uFF0C\u5E76\u6DFB\u52A0\u9519\u8BEF\u6D88\u606F\n const messagesWithoutThinking = messages.filter(msg => msg.id !== thinkingMessage.id)\n setMessages([\n ...messagesWithoutThinking,\n {\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: errorMessage,\n code: errorCode,\n },\n },\n ],\n timestamp: Date.now(),\n },\n ])\n }\n },\n [\n inputValue,\n userId,\n sessionId,\n site,\n channelCode,\n loginUserId,\n cartId,\n accessToken,\n messages,\n setInputValue,\n addMessage,\n setMessages,\n createSession,\n sendMessageStream,\n startStream,\n saveSession,\n clearSession,\n onMessageSend,\n onError,\n ]\n )\n\n // \u66F4\u65B0 ref \u4EE5\u4FDD\u6301\u6700\u65B0\u7684 handleSendMessage\n React.useEffect(() => {\n handleSendMessageRef.current = handleSendMessage\n }, [handleSendMessage])\n\n // \u662F\u5426\u9700\u8981\u5C55\u793A\u6CD5\u89C4\u534F\u8BAE\uFF08\u914D\u7F6E\u4E86\u534F\u8BAE\u4E14\u7528\u6237\u5C1A\u672A\u540C\u610F\uFF09\n const requiresCompliance = !!complianceConfig && !hasAgreedCompliance\n\n // \u53D7\u63A7\u6A21\u5F0F\u4E0B\uFF0C\u5916\u90E8\u8981\u6C42\u6253\u5F00\u804A\u5929\u7A97\u53E3\u4F46\u5C1A\u672A\u540C\u610F\u534F\u8BAE\u65F6\uFF0C\u9700\u8981\u5728\u6E32\u67D3\u9636\u6BB5\n // \u76F4\u63A5\u62E6\u622A\uFF08\u800C\u4E0D\u662F\u7B49 useEffect \u4E8B\u540E\u8865\u6551\uFF09\uFF0C\u907F\u514D\u804A\u5929\u7A97\u53E3\u5148\u77ED\u6682\u6253\u5F00\n // \u518D\u88AB\u5173\u95ED\u7684\u7ADE\u6001\u95EA\u70C1\uFF0C\u4E5F\u907F\u514D\u534F\u8BAE\u5F39\u7A97\u56E0\u6B64\u663E\u793A\u4E0D\u51FA\u6765\n const shouldInterceptForCompliance = open === true && requiresCompliance\n\n // \u804A\u5929\u7A97\u53E3\u5B9E\u9645\u5C55\u793A\u72B6\u6001\uFF1A\u547D\u4E2D\u534F\u8BAE\u62E6\u622A\u65F6\uFF0C\u804A\u5929\u7A97\u53E3\u4E0D\u5E94\u8BE5\u88AB\u6253\u5F00\n const displayChatOpen = isOpen && !shouldInterceptForCompliance\n // \u534F\u8BAE\u5F39\u7A97\u5B9E\u9645\u5C55\u793A\u72B6\u6001\uFF1A\u6C14\u6CE1\u70B9\u51FB\u89E6\u53D1\u7684 showComplianceDialog\uFF0C\n // \u6216\u53D7\u63A7\u6A21\u5F0F\u4E0B\u547D\u4E2D\u62E6\u622A\u65F6\u4E5F\u5E94\u5C55\u793A\n const displayComplianceDialog = showComplianceDialog || shouldInterceptForCompliance\n\n /**\n * \u5904\u7406\u6C14\u6CE1\u6309\u94AE\u70B9\u51FB\n * \u5982\u679C\u914D\u7F6E\u4E86\u6CD5\u89C4\u534F\u8BAE\u4E14\u7528\u6237\u672A\u540C\u610F\uFF0C\u5148\u663E\u793A\u6CD5\u89C4\u5F39\u7A97\n * \u5426\u5219\u76F4\u63A5\u6253\u5F00\u804A\u5929\u7A97\u53E3\n */\n const handleBubbleClick = useCallback(() => {\n if (requiresCompliance) {\n // \u663E\u793A\u6CD5\u89C4\u534F\u8BAE\u5F39\u7A97\n setShowComplianceDialog(true)\n } else {\n // \u76F4\u63A5\u6253\u5F00\u804A\u5929\u7A97\u53E3\n openChat()\n }\n }, [requiresCompliance, openChat])\n\n /**\n * \u53D7\u63A7\u6A21\u5F0F\u4E0B\uFF0C\u547D\u4E2D\u534F\u8BAE\u62E6\u622A\u65F6\u540C\u6B65\u5C06\u5916\u90E8\u72B6\u6001\u6253\u56DE false\uFF0C\n * \u9632\u6B62\u7236\u7EC4\u4EF6\u7684 open \u72B6\u6001\u957F\u671F\u505C\u7559\u5728 true\uFF08\u4F8B\u5982\u5F71\u54CD\u5176\u4ED6\u4F9D\u8D56\u8BE5\u72B6\u6001\u7684\u4E1A\u52A1\u903B\u8F91\uFF09\n * \u6CE8\u610F\uFF1A\u8FD9\u91CC\u53EA\u505A\u5916\u90E8\u72B6\u6001\u540C\u6B65\uFF0C\u804A\u5929\u7A97\u53E3\u662F\u5426\u5C55\u793A\u5DF2\u7ECF\u5728\u6E32\u67D3\u9636\u6BB5\u7531\n * displayChatOpen \u76F4\u63A5\u51B3\u5B9A\uFF0C\u4E0D\u4F9D\u8D56\u8FD9\u4E2A effect \u7684\u6267\u884C\u65F6\u673A\n */\n useEffect(() => {\n if (shouldInterceptForCompliance) {\n onOpenChange?.(false)\n }\n }, [shouldInterceptForCompliance, onOpenChange])\n\n /**\n * \u5904\u7406\u7528\u6237\u540C\u610F\u6CD5\u89C4\u534F\u8BAE\n */\n const handleComplianceAgree = useCallback(() => {\n // \u8BBE\u7F6E\u540C\u610F\u72B6\u6001\n setHasAgreedCompliance(true)\n setShowComplianceDialog(false)\n\n // \u4FDD\u5B58\u5230 Cookie\uFF08\u6709\u6548\u671F 365 \u5929\uFF09\n Cookies.set(cookieName, 'true', { expires: 365 })\n\n // \u540C\u610F\u540E\u7ACB\u5373\u6253\u5F00\u804A\u5929\u7A97\u53E3\n openChat()\n }, [openChat, cookieName])\n\n /**\n * \u5904\u7406\u6CD5\u89C4\u5F39\u7A97\u5173\u95ED\n */\n const handleComplianceClose = useCallback(() => {\n setShowComplianceDialog(false)\n }, [])\n\n return (\n <>\n {/* \u6CD5\u89C4\u534F\u8BAE\u5F39\u7A97 */}\n {complianceConfig && (\n <ComplianceDialog\n open={displayComplianceDialog}\n config={complianceConfig}\n onAgree={handleComplianceAgree}\n onClose={handleComplianceClose}\n />\n )}\n\n {/* \u6C14\u6CE1\u6309\u94AE */}\n <ChatBubble\n position={position}\n onClick={handleBubbleClick}\n visible={!displayChatOpen && !displayComplianceDialog}\n iconImageUrl={chatBubbleIcon}\n />\n\n {/* \u804A\u5929\u7A97\u53E3\uFF08\u4F7F\u7528 Radix UI Dialog\uFF09 */}\n <Dialog.Root open={displayChatOpen} onOpenChange={open => (open ? openChat() : closeChat())}>\n <Dialog.Portal>\n <Dialog.Content\n className=\"livechat-window-enter\"\n style={{\n position: 'fixed',\n zIndex: 9998,\n }}\n >\n <ChatWindow\n messages={messages}\n inputValue={inputValue}\n onInputChange={setInputValue}\n onSend={() => handleSendMessage()}\n onClose={closeChat}\n onNewSession={handleCreateNewSession}\n title={title}\n logoUrl={logoUrl}\n isSending={isStreaming}\n isLoadingHistory={isInitializing}\n rendererRegistry={rendererRegistry}\n inputPlaceholder=\"\"\n onAddToCart={onAddToCart}\n showNewSessionButton={showNewSessionButton}\n bottomTips={bottomTips}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["LiveChatWidget_exports", "__export", "LiveChatWidget", "__toCommonJS", "import_jsx_runtime", "import_react", "Dialog", "import_constants", "import_ChatBubble", "import_ChatWindow", "import_ComplianceDialog", "import_useChatState", "import_useChatAPI", "import_messageRenderers", "import_validation", "import_userId", "import_productTransformers", "import_cartTransformers", "import_js_cookie", "import_MessageContent", "apiBaseUrl", "headers", "recaptchaSitekey", "recaptchaAction", "site", "channelCode", "loginUserId", "cartId", "accessToken", "position", "welcomeMessage", "quickReplies", "customRenderers", "logoUrl", "title", "chatBubbleIcon", "open", "onOpenChange", "onOpen", "onClose", "onMessageSend", "onError", "onTextMessage", "onProductList", "onPromotionList", "onAddToCart", "onCart", "showNewSessionButton", "commonText", "productCardRender", "productComparisonRender", "bottomTips", "complianceConfig", "cookieName", "showComplianceDialog", "setShowComplianceDialog", "React", "hasAgreedCompliance", "setHasAgreedCompliance", "Cookies", "mergedText", "chatState", "messages", "isOpen", "userId", "sessionId", "inputValue", "isStreaming", "openChat", "closeChat", "setInputValue", "setUserId", "addMessage", "setMessages", "clearMessages", "startStream", "saveSession", "clearSession", "isInitializing", "setIsInitializing", "sendMessageStream", "createSession", "handleSendMessageRef", "_message", "rendererRegistry", "registry", "quickRepliesRenderer", "reply", "sessionInitializedRef", "currentSessionId", "handleResumeSession", "handleCreateNewSession", "normalizeMessage", "message", "contentBlocks", "structuredData", "block", "transformedData", "response", "messageText", "welcomeContent", "questions", "quickRepliesFromBackend", "question", "index", "error", "isRecaptcha", "existingSessionId", "normalizedMessages", "msg", "welcomeMsg", "handleSendMessage", "isRetry", "textToSend", "sanitized", "userMessage", "thinkingMessage", "sessionExpiredDetected", "requestPayload", "streamEventHandler", "event", "messagesWithoutThinking", "errorMessage", "errorCode", "requiresCompliance", "shouldInterceptForCompliance", "displayChatOpen", "displayComplianceDialog", "handleBubbleClick", "handleComplianceAgree", "handleComplianceClose"]
4
+ "sourcesContent": ["/**\n * LiveChat \u4E3B\u7EC4\u4EF6\n * \u96C6\u6210\u6240\u6709\u5B50\u7EC4\u4EF6\uFF0C\u63D0\u4F9B\u5B8C\u6574\u7684\u804A\u5929\u529F\u80FD\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u4E09\u5C42\u67B6\u6784\u8BBE\u8BA1\n */\n\nimport React, { useEffect, useCallback } from 'react'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport type {\n LiveChatWidgetProps,\n QuickReply,\n Message,\n MessageContent,\n ChatStreamRequest,\n BackendCartData,\n CommonText,\n} from './types'\nimport { DEFAULT_COMMON_TEXT } from './constants'\nimport { ChatBubble } from './components/ChatBubble'\nimport { ChatWindow } from './components/ChatWindow'\nimport { ComplianceDialog } from './components/ComplianceDialog'\nimport { useChatState } from './hooks/useChatState'\nimport { useChatAPI } from './hooks/useChatAPI'\nimport { MessageRendererRegistry } from './utils/messageRenderers'\nimport { sanitizeInput } from './utils/validation'\nimport { saveUserId } from './utils/userId'\nimport { transformProducts } from './utils/productTransformers.js'\nimport { transformCartData } from './utils/cartTransformers.js'\nimport Cookies from 'js-cookie'\nimport {\n TextBlock,\n ProductCard,\n ProductList,\n ProductComparisonRenderer,\n PolicyBlock,\n createQuickRepliesRenderer,\n ThinkingBlock,\n ErrorBlock,\n FAQListRenderer,\n PromotionListRenderer,\n CartCard,\n} from './components/MessageContent/index.js'\n\n/**\n * LiveChat \u804A\u5929\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u6C14\u6CE1\u5F39\u7A97\u804A\u5929\u754C\u9762\n * - SSE \u6D41\u5F0F\u6D88\u606F\u63A5\u6536\n * - \u4F1A\u8BDD\u7BA1\u7406\uFF08userId, sessionId\uFF09\n * - \u5386\u53F2\u6D88\u606F\u52A0\u8F7D\n * - \u591A\u79CD\u6D88\u606F\u7C7B\u578B\u6E32\u67D3\n * - \u81EA\u5B9A\u4E49\u6269\u5C55\u673A\u5236\n * - reCAPTCHA v3 \u5B89\u5168\u9632\u62A4\n *\n * \u67B6\u6784\uFF1A\n * - UI Layer: ChatBubble, ChatWindow, MessageList, etc.\n * - Logic Layer: useChatState, useChatAPI, useSession\n * - Core Layer: MessageRendererRegistry, \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n *\n * @example\n * ```tsx\n * // \u57FA\u7840\u4F7F\u7528\uFF08\u4F7F\u7528\u9ED8\u8BA4\u4F4D\u7F6E\uFF09\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * welcomeMessage=\"\u4F60\u597D\uFF01\u6211\u662F AI \u52A9\u624B\"\n * onMessageSend={(msg) => console.log('Sent:', msg)}\n * />\n *\n * // \u4F7F\u7528\u81EA\u5B9A\u4E49\u4F4D\u7F6E\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * position={{ bottom: \"20px\", right: \"30px\" }}\n * onMessageSend={(msg) => console.log('Sent:', msg)}\n * />\n *\n * // \u542F\u7528 reCAPTCHA v3 \u5B89\u5168\u9632\u62A4\uFF08\u63D0\u4F9B sitekey \u5373\u81EA\u52A8\u542F\u7528\uFF09\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * recaptchaSitekey=\"6LfS4J4pAAAAACX1e_WrxutmxxzCK7FU4WzVqL14\"\n * recaptchaAction=\"livechat\"\n * />\n *\n * // \u4F7F\u7528\u81EA\u5B9A\u4E49 headers \u548C reCAPTCHA\n * <LiveChatWidget\n * apiBaseUrl=\"https://beta-api-livechat.anker.com\"\n * site=\"www.eufy.com\"\n * headers={{\n * \"Authorization\": \"Bearer your-token\",\n * \"X-Custom-Header\": \"value\"\n * }}\n * recaptchaSitekey=\"your-site-key\"\n * />\n * ```\n */\nexport const LiveChatWidget: React.FC<LiveChatWidgetProps> = ({\n apiBaseUrl,\n headers,\n recaptchaSitekey,\n recaptchaAction,\n site,\n channelCode,\n loginUserId,\n cartId,\n accessToken,\n position,\n welcomeMessage,\n quickReplies,\n customRenderers,\n logoUrl,\n title,\n chatBubbleIcon,\n open,\n onOpenChange,\n onOpen,\n onClose,\n onMessageSend,\n onError,\n onTextMessage,\n onProductList,\n onPromotionList,\n onAddToCart,\n onCart,\n showNewSessionButton,\n commonText,\n productCardRender,\n productComparisonRender,\n bottomTips,\n complianceConfig,\n}) => {\n // \u6CD5\u89C4\u534F\u8BAE\u5F39\u7A97\u72B6\u6001\n // \u4ECE Cookie \u8BFB\u53D6\u7528\u6237\u662F\u5426\u5DF2\u540C\u610F\uFF08\u6709\u6548\u671F 365 \u5929\uFF09\n const cookieName = complianceConfig?.cookieName || 'livechat_compliance_agreed'\n const [showComplianceDialog, setShowComplianceDialog] = React.useState(false)\n const [hasAgreedCompliance, setHasAgreedCompliance] = React.useState(() => {\n // \u521D\u59CB\u5316\u65F6\u68C0\u67E5 Cookie\n return complianceConfig ? Cookies.get(cookieName) !== undefined : true\n })\n\n // \u5408\u5E76\u9ED8\u8BA4\u6587\u6848\u548C\u81EA\u5B9A\u4E49\u6587\u6848\n const mergedText: Required<CommonText> = React.useMemo(\n () => ({\n ...DEFAULT_COMMON_TEXT,\n ...commonText,\n }),\n [commonText]\n )\n\n // \u72B6\u6001\u7BA1\u7406\n const chatState = useChatState({\n welcomeMessage,\n site,\n open,\n onOpenChange,\n onOpen,\n onClose,\n onMessageSend,\n onError,\n onTextMessage,\n onProductList,\n onPromotionList,\n onAddToCart,\n onCart,\n productCardRender,\n productComparisonRender,\n })\n\n const {\n messages,\n isOpen,\n userId,\n sessionId,\n inputValue,\n isStreaming,\n openChat,\n closeChat,\n setInputValue,\n setUserId,\n addMessage,\n setMessages,\n clearMessages,\n startStream,\n saveSession,\n clearSession,\n } = chatState\n\n // \u662F\u5426\u9700\u8981\u5C55\u793A\u6CD5\u89C4\u534F\u8BAE\uFF08\u914D\u7F6E\u4E86\u534F\u8BAE\u4E14\u7528\u6237\u5C1A\u672A\u540C\u610F\uFF09\n const requiresCompliance = !!complianceConfig && !hasAgreedCompliance\n\n // \u53D7\u63A7\u6A21\u5F0F\u4E0B\uFF0C\u5916\u90E8\u8981\u6C42\u6253\u5F00\u804A\u5929\u7A97\u53E3\u4F46\u5C1A\u672A\u540C\u610F\u534F\u8BAE\u65F6\uFF0C\u9700\u8981\u5728\u6E32\u67D3\u9636\u6BB5\n // \u76F4\u63A5\u62E6\u622A\uFF08\u800C\u4E0D\u662F\u7B49 useEffect \u4E8B\u540E\u8865\u6551\uFF09\uFF0C\u907F\u514D\u804A\u5929\u7A97\u53E3\u5148\u77ED\u6682\u6253\u5F00\n // \u518D\u88AB\u5173\u95ED\u7684\u7ADE\u6001\u95EA\u70C1\uFF0C\u4E5F\u907F\u514D\u534F\u8BAE\u5F39\u7A97\u56E0\u6B64\u663E\u793A\u4E0D\u51FA\u6765\n const shouldInterceptForCompliance = open === true && requiresCompliance\n\n // \u804A\u5929\u7A97\u53E3\u5B9E\u9645\u5C55\u793A\u72B6\u6001\uFF1A\u547D\u4E2D\u534F\u8BAE\u62E6\u622A\u65F6\uFF0C\u804A\u5929\u7A97\u53E3\u4E0D\u5E94\u8BE5\u88AB\u6253\u5F00\n const displayChatOpen = isOpen && !shouldInterceptForCompliance\n\n // \u521D\u59CB\u5316\u52A0\u8F7D\u72B6\u6001\uFF08\u7528\u6237\u672A\u914D\u7F6E\u6B22\u8FCE\u8BED\u65F6\uFF0C\u663E\u793A loading \u76F4\u5230\u63A5\u53E3\u8FD4\u56DE\uFF09\n const [isInitializing, setIsInitializing] = React.useState(false)\n\n // API \u8C03\u7528\n const { sendMessageStream, createSession } = useChatAPI({\n apiBaseUrl,\n headers,\n recaptchaConfig: {\n needRecaptcha: !!recaptchaSitekey, // \u6839\u636E sitekey \u81EA\u52A8\u5224\u65AD\u662F\u5426\u542F\u7528\n recaptchaSitekey,\n recaptchaAction,\n },\n onError,\n })\n\n // \u4F7F\u7528 ref \u5B58\u50A8\u6700\u65B0\u7684 handleSendMessage\uFF0C\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n const handleSendMessageRef = React.useRef<(_message?: string) => Promise<void>>(async (_message?: string) => {})\n\n // \u6D88\u606F\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n const rendererRegistry = React.useMemo(() => {\n const registry = new MessageRendererRegistry()\n\n // \u6CE8\u518C\u9ED8\u8BA4\u6E32\u67D3\u5668\n registry.register('text', TextBlock)\n registry.register('product_card', ProductCard)\n registry.register('product_list', ProductList)\n registry.register('product_comparison', ProductComparisonRenderer)\n registry.register('policy', PolicyBlock)\n registry.register('thinking', ThinkingBlock)\n registry.register('error', ErrorBlock)\n registry.register('faq_list', FAQListRenderer)\n registry.register('promotion_list', PromotionListRenderer)\n registry.register('cart', CartCard)\n\n // \u6CE8\u518C\u5FEB\u6377\u56DE\u590D\u6E32\u67D3\u5668\uFF08\u5E26\u56DE\u8C03\uFF09\n const quickRepliesRenderer = createQuickRepliesRenderer((reply: QuickReply) => {\n // \u4F7F\u7528 ref \u8C03\u7528\u6700\u65B0\u7684 handleSendMessage\n handleSendMessageRef.current(reply.value)\n })\n registry.register('quick_replies', quickRepliesRenderer)\n\n // \u6CE8\u518C\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n if (customRenderers) {\n registry.registerMany(customRenderers)\n }\n\n return registry\n }, [customRenderers])\n\n // \u6807\u8BB0\u662F\u5426\u5DF2\u7ECF\u521D\u59CB\u5316\u8FC7\u4F1A\u8BDD\uFF0C\u9632\u6B62\u91CD\u590D\u8C03\u7528\n const sessionInitializedRef = React.useRef(false)\n\n /**\n * T043: \u6253\u5F00\u804A\u5929\u7A97\u53E3\u65F6\u521D\u59CB\u5316\u4F1A\u8BDD\n * \u4F7F\u7528 API v2.0.0 \u7684\u7EDF\u4E00\u63A5\u53E3\uFF1A\n * - \u5982\u679C\u6CA1\u6709 sessionId\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n * - \u5982\u679C\u6709 sessionId\uFF0C\u6062\u590D\u4F1A\u8BDD\u5E76\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\n */\n useEffect(() => {\n // \u7A97\u53E3\u5173\u95ED\u65F6\u91CD\u7F6E\u521D\u59CB\u5316\u6807\u8BB0\n if (!displayChatOpen) {\n sessionInitializedRef.current = false\n return\n }\n\n // userId \u4E3A undefined \u8868\u793A\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u7B49\u5F85\u521D\u59CB\u5316\u5B8C\u6210\n if (userId === undefined) return\n\n // \u5982\u679C\u5DF2\u7ECF\u521D\u59CB\u5316\u8FC7\uFF0C\u4E0D\u518D\u91CD\u590D\u8C03\u7528\n if (sessionInitializedRef.current) return\n sessionInitializedRef.current = true\n\n const currentSessionId = sessionId\n\n if (!currentSessionId) {\n // \u6CA1\u6709\u4F1A\u8BDD\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n handleCreateNewSession()\n } else {\n // \u6709\u4F1A\u8BDD\uFF0C\u5C1D\u8BD5\u6062\u590D\u4F1A\u8BDD\u548C\u5386\u53F2\u6D88\u606F\n handleResumeSession(currentSessionId)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [displayChatOpen, userId])\n\n /**\n * \u89C4\u8303\u5316\u6D88\u606F\u683C\u5F0F\uFF08\u786E\u4FDD content \u662F\u6570\u7EC4\uFF09\n * \u540E\u7AEF\u8FD4\u56DE\u683C\u5F0F\uFF1A\n * - content: \u5B57\u7B26\u4E32\uFF08\u6587\u672C\u5185\u5BB9\uFF09\n * - structuredContent: \u6570\u7EC4\uFF08\u7ED3\u6784\u5316\u5185\u5BB9\uFF0C\u5982\u4EA7\u54C1\u5217\u8868\u3001\u653F\u7B56\u7B49\uFF09\n * \u9700\u8981\u5408\u5E76\u4E3A\u7EDF\u4E00\u7684 content \u6570\u7EC4\u683C\u5F0F\n */\n const normalizeMessage = useCallback(\n (message: any): Message => {\n // \u5982\u679C content \u5DF2\u7ECF\u662F\u6570\u7EC4\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (Array.isArray(message.content)) {\n return message as Message\n }\n\n const contentBlocks: MessageContent[] = []\n\n // \u5904\u7406\u6587\u672C\u5185\u5BB9\n if (typeof message.content === 'string' && message.content.trim()) {\n contentBlocks.push({\n type: 'text',\n text: message.content,\n })\n }\n\n // \u5904\u7406\u7ED3\u6784\u5316\u5185\u5BB9\n // \u5386\u53F2\u6D88\u606F\u683C\u5F0F: structured_content: [{type, data}]\n const structuredData = message.structuredContent || message.structured_content\n\n if (Array.isArray(structuredData)) {\n structuredData.forEach((block: any) => {\n if (block.type === 'product_list' && Array.isArray(block.data)) {\n // \u8F6C\u6362\u4EA7\u54C1\u5217\u8868\u6570\u636E\u7ED3\u6784 - data \u76F4\u63A5\u662F\u4EA7\u54C1\u6570\u7EC4\n contentBlocks.push({\n type: 'product_list',\n data: {\n products: transformProducts(block.data, site),\n title: undefined, // \u5386\u53F2\u6D88\u606F\u4E0D\u5305\u542B title\n commonText: mergedText,\n },\n })\n } else if (block.type === 'quick_replies' && block.data?.replies) {\n contentBlocks.push({\n type: 'quick_replies',\n data: {\n replies: block.data.replies,\n },\n })\n } else if (block.type === 'policy' && block.data?.title && block.data?.content) {\n contentBlocks.push({\n type: 'policy',\n data: {\n title: block.data.title,\n content: block.data.content,\n },\n })\n } else if (block.type === 'product_comparison' && block.data?.products && block.data?.dimensions) {\n // \u8F6C\u6362\u4EA7\u54C1\u5BF9\u6BD4\u6570\u636E\u7ED3\u6784\u5E76\u6CE8\u5165 onAddToCart \u56DE\u8C03\u548C\u81EA\u5B9A\u4E49\u6E32\u67D3\u51FD\u6570\n contentBlocks.push({\n type: 'product_comparison',\n data: {\n products: transformProducts(block.data.products, site),\n dimensions: block.data.dimensions,\n onAddToCart: onAddToCart,\n commonText: mergedText,\n productComparisonRender: productComparisonRender,\n },\n })\n } else if (block.type === 'faq_list' && block.data?.found !== undefined) {\n // FAQ \u5217\u8868\u5361\u7247 - \u76F4\u63A5\u4F7F\u7528\u540E\u7AEF\u6570\u636E\n contentBlocks.push({\n type: 'faq_list',\n data: block.data,\n })\n } else if (block.type === 'promotion_list' && block.data?.found !== undefined) {\n // \u4FC3\u9500\u6D3B\u52A8\u5217\u8868\u5361\u7247 - \u76F4\u63A5\u4F7F\u7528\u540E\u7AEF\u6570\u636E\n contentBlocks.push({\n type: 'promotion_list',\n data: {\n ...block.data,\n commonText: mergedText,\n },\n })\n } else if (block.type === 'cart' && block.data?.id !== undefined) {\n // \u8D2D\u7269\u8F66\u5361\u7247 - \u8F6C\u6362\u540E\u7AEF\u6570\u636E\u683C\u5F0F\u5E76\u6CE8\u5165 onCart \u56DE\u8C03\n const transformedData = transformCartData(block.data as BackendCartData)\n contentBlocks.push({\n type: 'cart',\n data: {\n ...transformedData,\n onCart: onCart,\n commonText: mergedText,\n },\n })\n } else {\n // \u5176\u4ED6\u7C7B\u578B\u76F4\u63A5\u6DFB\u52A0\n contentBlocks.push(block)\n }\n })\n }\n\n // \u5982\u679C\u6CA1\u6709\u4EFB\u4F55\u5185\u5BB9\u5757\uFF0C\u8FD4\u56DE\u7A7A\u6587\u672C\u5757\n if (contentBlocks.length === 0) {\n contentBlocks.push({\n type: 'text',\n text: '',\n })\n }\n\n return {\n ...message,\n content: contentBlocks,\n } as Message\n },\n [site, onCart, onAddToCart, mergedText]\n )\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\n */\n const handleCreateNewSession = useCallback(async () => {\n // userId \u4E3A undefined \u8868\u793A\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u7B49\u5F85\u521D\u59CB\u5316\u5B8C\u6210\n if (userId === undefined) return\n\n // \u5982\u679C\u7528\u6237\u6CA1\u6709\u914D\u7F6E\u6B22\u8FCE\u8BED\uFF0C\u663E\u793A loading \u72B6\u6001\n if (!welcomeMessage) {\n setIsInitializing(true)\n }\n\n try {\n const response = await createSession({\n user_id: userId ?? '',\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n\n if (response.success) {\n // \u4FDD\u5B58\u65B0\u4F1A\u8BDD ID\n saveSession(response.sessionId)\n\n // \u4FDD\u5B58\u540E\u7AEF\u8FD4\u56DE\u7684 userId\uFF08\u5982\u679C\u6709\uFF09\n if (response.userId) {\n saveUserId(response.userId)\n setUserId(response.userId)\n }\n\n // \u6E05\u7A7A\u6D88\u606F\u5217\u8868\n clearMessages()\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u6B22\u8FCE\u6D88\u606F\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u9ED8\u8BA4\u503C\n const messageText = response.welcomeMessage || welcomeMessage\n\n if (messageText) {\n const welcomeContent: MessageContent[] = [{ type: 'text', text: messageText }]\n\n // \u4F7F\u7528\u540E\u7AEF\u8FD4\u56DE\u7684\u5FEB\u6377\u95EE\u9898\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u4F7F\u7528 props \u4E2D\u7684\u5FEB\u6377\u56DE\u590D\n const questions = response.quickQuestions\n if (questions && questions.length > 0) {\n // \u5C06\u540E\u7AEF\u7684 quickQuestions (\u5B57\u7B26\u4E32\u6570\u7EC4) \u8F6C\u6362\u4E3A QuickReply \u683C\u5F0F\n const quickRepliesFromBackend = questions.map((question, index) => ({\n id: `quick-${index}`,\n label: question,\n value: question,\n }))\n\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickRepliesFromBackend,\n },\n })\n } else if (quickReplies && quickReplies.length > 0) {\n // \u5982\u679C\u540E\u7AEF\u6CA1\u6709\u8FD4\u56DE\uFF0C\u4F7F\u7528 props \u4E2D\u7684\u5FEB\u6377\u56DE\u590D\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickReplies,\n },\n })\n }\n\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n })\n }\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to create new session:', error)\n onError?.(error as Error)\n\n // Check if it's a reCAPTCHA error\n const isRecaptcha = (error as any)?.type === 'GoogleRecaptchaError'\n\n // \u6DFB\u52A0\u9519\u8BEF\u6D88\u606F\u5230\u754C\u9762\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: isRecaptcha\n ? 'Your session has expired. Please refresh the page and try again.'\n : 'Failed to create session. Please refresh the page and try again.',\n code: isRecaptcha ? 'RECAPTCHA_ERROR' : 'SESSION_CREATE_ERROR',\n },\n },\n ],\n timestamp: Date.now(),\n })\n } finally {\n // \u63A5\u53E3\u8FD4\u56DE\u540E\u5173\u95ED loading \u72B6\u6001\n setIsInitializing(false)\n }\n }, [\n userId,\n site,\n channelCode,\n loginUserId,\n createSession,\n saveSession,\n clearMessages,\n welcomeMessage,\n quickReplies,\n addMessage,\n onError,\n ])\n\n /**\n * \u6062\u590D\u4F1A\u8BDD\u548C\u5386\u53F2\u6D88\u606F\uFF08\u4F7F\u7528\u65B0\u7684 API v2.0.0\uFF09\n */\n const handleResumeSession = useCallback(\n async (existingSessionId: string) => {\n // \u5982\u679C\u7528\u6237\u6CA1\u6709\u914D\u7F6E\u6B22\u8FCE\u8BED\uFF0C\u663E\u793A loading \u72B6\u6001\n if (!welcomeMessage) {\n setIsInitializing(true)\n }\n\n try {\n const response = await createSession({\n user_id: userId ?? '',\n session_id: existingSessionId,\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n\n if (response.success && response.resumed) {\n // \u4F1A\u8BDD\u6062\u590D\u6210\u529F\n\n // \u4FDD\u5B58\u540E\u7AEF\u8FD4\u56DE\u7684 userId\uFF08\u5982\u679C\u6709\uFF09\n if (response.userId) {\n saveUserId(response.userId)\n setUserId(response.userId)\n }\n\n // \u51C6\u5907\u6B22\u8FCE\u6D88\u606F\uFF08\u65E0\u8BBA\u662F\u5426\u6709\u5386\u53F2\u6D88\u606F\u90FD\u9700\u8981\uFF09\n const messageText = response.welcomeMessage || welcomeMessage\n const welcomeContent: MessageContent[] = messageText ? [{ type: 'text', text: messageText }] : []\n\n // \u6DFB\u52A0\u5FEB\u6377\u56DE\u590D\u5230\u6B22\u8FCE\u6D88\u606F\n const questions = response.quickQuestions\n if (questions && questions.length > 0) {\n const quickRepliesFromBackend = questions.map((question, index) => ({\n id: `quick-${index}`,\n label: question,\n value: question,\n }))\n\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickRepliesFromBackend,\n },\n })\n } else if (quickReplies && quickReplies.length > 0) {\n welcomeContent.push({\n type: 'quick_replies',\n data: {\n replies: quickReplies,\n },\n })\n }\n\n if (response.messages && response.messages.length > 0) {\n // \u6709\u5386\u53F2\u6D88\u606F\uFF0C\u89C4\u8303\u5316\u5E76\u52A0\u8F7D\uFF08\u8FC7\u6EE4\u6389 null/undefined \u503C\u548C\u7A7A\u5185\u5BB9\u6D88\u606F\uFF09\n const normalizedMessages = response.messages\n .filter((msg: any) => msg != null)\n .map(normalizeMessage)\n .filter((msg: Message) => msg.content && msg.content.length > 0 && !(msg.content.length === 1 && msg.content[0].type === 'text' && !msg.content[0].text))\n\n // \u5982\u679C\u6709\u6B22\u8FCE\u6D88\u606F\uFF0C\u5C06\u5176\u6DFB\u52A0\u5230\u5386\u53F2\u6D88\u606F\u7684\u5F00\u5934\n if (welcomeContent.length > 0) {\n const welcomeMsg: Message = {\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n }\n setMessages([welcomeMsg, ...normalizedMessages])\n } else {\n setMessages(normalizedMessages)\n }\n } else {\n // \u6CA1\u6709\u5386\u53F2\u6D88\u606F\uFF0C\u4EC5\u663E\u793A\u6B22\u8FCE\u6D88\u606F\n clearMessages()\n\n if (welcomeContent.length > 0) {\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: welcomeContent,\n timestamp: Date.now(),\n })\n }\n }\n } else if (!response.resumed) {\n // \u4F1A\u8BDD\u65E0\u6548\u6216\u8FC7\u671F\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n clearSession()\n handleCreateNewSession()\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to resume session:', error)\n\n // Check if it's a reCAPTCHA error\n const isRecaptcha = (error as any)?.type === 'GoogleRecaptchaError'\n\n if (isRecaptcha) {\n // reCAPTCHA error - show refresh page message, don't retry\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: 'Your session has expired. Please refresh the page and try again.',\n code: 'RECAPTCHA_ERROR',\n },\n },\n ],\n timestamp: Date.now(),\n })\n } else {\n // Other errors - show message and try to create new session\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: 'Failed to resume session. Creating a new session...',\n code: 'SESSION_RESUME_ERROR',\n },\n },\n ],\n timestamp: Date.now(),\n })\n\n // \u6062\u590D\u5931\u8D25\uFF0C\u6E05\u7A7A\u4F1A\u8BDD\u5E76\u521B\u5EFA\u65B0\u7684\n clearSession()\n handleCreateNewSession()\n }\n } finally {\n // \u63A5\u53E3\u8FD4\u56DE\u540E\u5173\u95ED loading \u72B6\u6001\n setIsInitializing(false)\n }\n },\n [\n userId,\n site,\n channelCode,\n loginUserId,\n createSession,\n setMessages,\n clearSession,\n clearMessages,\n normalizeMessage,\n handleCreateNewSession,\n welcomeMessage,\n quickReplies,\n addMessage,\n ]\n )\n\n /**\n * \u53D1\u9001\u6D88\u606F\n */\n const handleSendMessage = useCallback(\n async (message?: string, isRetry: boolean = false) => {\n const textToSend = message || inputValue.trim()\n\n if (!textToSend) return\n\n // \u6E05\u7A7A\u8F93\u5165\u6846\uFF08\u4EC5\u5728\u975E\u91CD\u8BD5\u65F6\uFF09\n if (!message && !isRetry) {\n setInputValue('')\n }\n\n // \u8F93\u5165\u9A8C\u8BC1\n const sanitized = sanitizeInput(textToSend)\n if (!sanitized) {\n onError?.(new Error('Invalid message'))\n return\n }\n\n // \u6DFB\u52A0\u7528\u6237\u6D88\u606F\u5230\u754C\u9762\uFF08\u4EC5\u5728\u975E\u91CD\u8BD5\u65F6\uFF09\n if (!isRetry) {\n const userMessage = {\n id: `user-${Date.now()}`,\n role: 'user' as const,\n content: [{ type: 'text' as const, text: sanitized }],\n timestamp: Date.now(),\n }\n addMessage(userMessage)\n }\n\n // \u7ACB\u5373\u6DFB\u52A0\u601D\u8003\u72B6\u6001\u6D88\u606F\uFF0C\u63D0\u5347\u7528\u6237\u4F53\u9A8C\n const thinkingMessage = {\n id: `thinking-${Date.now()}`,\n role: 'assistant' as const,\n content: [{ type: 'thinking' as const, data: { status: 'thinking' } }],\n timestamp: Date.now(),\n }\n addMessage(thinkingMessage)\n\n // \u89E6\u53D1\u6D88\u606F\u53D1\u9001\u56DE\u8C03\uFF08\u4EC5\u5728\u975E\u91CD\u8BD5\u65F6\uFF09\n if (!isRetry) {\n onMessageSend?.(sanitized)\n }\n\n // \u6807\u8BB0\u662F\u5426\u68C0\u6D4B\u5230\u4F1A\u8BDD\u8FC7\u671F\n let sessionExpiredDetected = false\n\n try {\n // \u786E\u4FDD\u6709 sessionId\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u5148\u521B\u5EFA\u4F1A\u8BDD\n let currentSessionId = sessionId\n if (!currentSessionId) {\n // \u6CA1\u6709\u4F1A\u8BDD\uFF0C\u521B\u5EFA\u65B0\u4F1A\u8BDD\n const response = await createSession({\n user_id: userId ?? '',\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n if (response.success) {\n currentSessionId = response.sessionId\n saveSession(currentSessionId)\n } else {\n throw new Error('Failed to create session')\n }\n }\n\n // \u6784\u5EFA\u8BF7\u6C42\u53C2\u6570\uFF08session_id \u73B0\u5728\u662F\u5FC5\u586B\u7684\uFF09\n const requestPayload: ChatStreamRequest = {\n message: sanitized,\n user_id: userId ?? '',\n session_id: currentSessionId,\n context: {\n cartId: cartId,\n accessToken: accessToken,\n real_user_id: loginUserId,\n },\n }\n\n // \u521B\u5EFA\u7ED1\u5B9A\u4E86\u5F53\u524D streamId \u7684\u4E8B\u4EF6\u5904\u7406\u5668\uFF0C\u9632\u6B62\u5E76\u53D1 stream \u6C61\u67D3\u5171\u4EAB buffer\n const streamEventHandler = startStream()\n\n // \u53D1\u9001\u6D88\u606F\u5230\u540E\u7AEF\n await sendMessageStream(requestPayload, event => {\n streamEventHandler(event)\n\n // \u7279\u6B8A\u5904\u7406\uFF1A\u4F1A\u8BDD\u8FC7\u671F\uFF08error \u4E8B\u4EF6\u4E14 type \u4E3A validation_error\uFF09\n if (event.event === 'error' && event.data.type === 'validation_error') {\n sessionExpiredDetected = true\n clearSession()\n }\n })\n\n // \u5982\u679C\u68C0\u6D4B\u5230\u4F1A\u8BDD\u8FC7\u671F\u4E14\u4E0D\u662F\u91CD\u8BD5\uFF0C\u81EA\u52A8\u521B\u5EFA\u65B0\u4F1A\u8BDD\u5E76\u91CD\u8BD5\n if (sessionExpiredDetected && !isRetry) {\n console.log('[LiveChatWidget] Session expired (validation_error), creating new session and retrying...')\n\n // \u79FB\u9664 thinking \u6D88\u606F\n const messagesWithoutThinking = messages.filter(msg => msg.id !== thinkingMessage.id)\n setMessages(messagesWithoutThinking)\n\n // \u521B\u5EFA\u65B0\u4F1A\u8BDD\n const response = await createSession({\n user_id: userId ?? '',\n site: site,\n channel_code: channelCode,\n real_user_id: loginUserId,\n page_url: typeof window !== 'undefined' ? window.location.href : undefined,\n })\n\n if (response.success) {\n saveSession(response.sessionId)\n // \u91CD\u8BD5\u53D1\u9001\u6D88\u606F\n await handleSendMessage(sanitized, true)\n } else {\n throw new Error('Failed to recreate session after expiration')\n }\n }\n } catch (error) {\n console.error('[LiveChatWidget] Failed to send message:', error)\n onError?.(error as Error)\n\n // Check if it's a reCAPTCHA error\n const isRecaptcha = (error as any)?.type === 'GoogleRecaptchaError'\n\n // Determine error message based on error type\n let errorMessage: string\n let errorCode: string\n\n if (isRecaptcha) {\n errorMessage = 'Your session has expired. Please refresh the page and try again.'\n errorCode = 'RECAPTCHA_ERROR'\n } else if (sessionExpiredDetected) {\n errorMessage = 'Your session has expired. We tried to reconnect but failed. Please try again.'\n errorCode = 'SESSION_EXPIRED'\n } else {\n errorMessage = 'Failed to send message. Please check your network connection and try again.'\n errorCode = 'NETWORK_ERROR'\n }\n\n // \u79FB\u9664\u521A\u624D\u6DFB\u52A0\u7684 thinking \u6D88\u606F\uFF0C\u5E76\u6DFB\u52A0\u9519\u8BEF\u6D88\u606F\n const messagesWithoutThinking = messages.filter(msg => msg.id !== thinkingMessage.id)\n setMessages([\n ...messagesWithoutThinking,\n {\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: errorMessage,\n code: errorCode,\n },\n },\n ],\n timestamp: Date.now(),\n },\n ])\n }\n },\n [\n inputValue,\n userId,\n sessionId,\n site,\n channelCode,\n loginUserId,\n cartId,\n accessToken,\n messages,\n setInputValue,\n addMessage,\n setMessages,\n createSession,\n sendMessageStream,\n startStream,\n saveSession,\n clearSession,\n onMessageSend,\n onError,\n ]\n )\n\n // \u66F4\u65B0 ref \u4EE5\u4FDD\u6301\u6700\u65B0\u7684 handleSendMessage\n React.useEffect(() => {\n handleSendMessageRef.current = handleSendMessage\n }, [handleSendMessage])\n\n // \u534F\u8BAE\u5F39\u7A97\u5B9E\u9645\u5C55\u793A\u72B6\u6001\uFF1A\u6C14\u6CE1\u70B9\u51FB\u89E6\u53D1\u7684 showComplianceDialog\uFF0C\n // \u6216\u53D7\u63A7\u6A21\u5F0F\u4E0B\u547D\u4E2D\u62E6\u622A\u65F6\u4E5F\u5E94\u5C55\u793A\n const displayComplianceDialog = showComplianceDialog || shouldInterceptForCompliance\n\n /**\n * \u5904\u7406\u6C14\u6CE1\u6309\u94AE\u70B9\u51FB\n * \u5982\u679C\u914D\u7F6E\u4E86\u6CD5\u89C4\u534F\u8BAE\u4E14\u7528\u6237\u672A\u540C\u610F\uFF0C\u5148\u663E\u793A\u6CD5\u89C4\u5F39\u7A97\n * \u5426\u5219\u76F4\u63A5\u6253\u5F00\u804A\u5929\u7A97\u53E3\n */\n const handleBubbleClick = useCallback(() => {\n if (requiresCompliance) {\n // \u663E\u793A\u6CD5\u89C4\u534F\u8BAE\u5F39\u7A97\n setShowComplianceDialog(true)\n } else {\n // \u76F4\u63A5\u6253\u5F00\u804A\u5929\u7A97\u53E3\n openChat()\n }\n }, [requiresCompliance, openChat])\n\n /**\n * \u53D7\u63A7\u6A21\u5F0F\u4E0B\uFF0C\u547D\u4E2D\u534F\u8BAE\u62E6\u622A\u65F6\u540C\u6B65\u5C06\u5916\u90E8\u72B6\u6001\u6253\u56DE false\uFF0C\n * \u9632\u6B62\u7236\u7EC4\u4EF6\u7684 open \u72B6\u6001\u957F\u671F\u505C\u7559\u5728 true\uFF08\u4F8B\u5982\u5F71\u54CD\u5176\u4ED6\u4F9D\u8D56\u8BE5\u72B6\u6001\u7684\u4E1A\u52A1\u903B\u8F91\uFF09\n * \u6CE8\u610F\uFF1A\u8FD9\u91CC\u53EA\u505A\u5916\u90E8\u72B6\u6001\u540C\u6B65\uFF0C\u804A\u5929\u7A97\u53E3\u662F\u5426\u5C55\u793A\u5DF2\u7ECF\u5728\u6E32\u67D3\u9636\u6BB5\u7531\n * displayChatOpen \u76F4\u63A5\u51B3\u5B9A\uFF0C\u4E0D\u4F9D\u8D56\u8FD9\u4E2A effect \u7684\u6267\u884C\u65F6\u673A\n */\n useEffect(() => {\n if (shouldInterceptForCompliance) {\n onOpenChange?.(false)\n }\n }, [shouldInterceptForCompliance, onOpenChange])\n\n /**\n * \u5904\u7406\u7528\u6237\u540C\u610F\u6CD5\u89C4\u534F\u8BAE\n */\n const handleComplianceAgree = useCallback(() => {\n // \u8BBE\u7F6E\u540C\u610F\u72B6\u6001\n setHasAgreedCompliance(true)\n setShowComplianceDialog(false)\n\n // \u4FDD\u5B58\u5230 Cookie\uFF08\u6709\u6548\u671F 365 \u5929\uFF09\n Cookies.set(cookieName, 'true', { expires: 365 })\n\n // \u540C\u610F\u540E\u7ACB\u5373\u6253\u5F00\u804A\u5929\u7A97\u53E3\n openChat()\n }, [openChat, cookieName])\n\n /**\n * \u5904\u7406\u6CD5\u89C4\u5F39\u7A97\u5173\u95ED\n */\n const handleComplianceClose = useCallback(() => {\n setShowComplianceDialog(false)\n }, [])\n\n return (\n <>\n {/* \u6CD5\u89C4\u534F\u8BAE\u5F39\u7A97 */}\n {complianceConfig && (\n <ComplianceDialog\n open={displayComplianceDialog}\n config={complianceConfig}\n onAgree={handleComplianceAgree}\n onClose={handleComplianceClose}\n />\n )}\n\n {/* \u6C14\u6CE1\u6309\u94AE */}\n <ChatBubble\n position={position}\n onClick={handleBubbleClick}\n visible={!displayChatOpen && !displayComplianceDialog}\n iconImageUrl={chatBubbleIcon}\n />\n\n {/* \u804A\u5929\u7A97\u53E3\uFF08\u4F7F\u7528 Radix UI Dialog\uFF09 */}\n <Dialog.Root open={displayChatOpen} onOpenChange={open => (open ? openChat() : closeChat())}>\n <Dialog.Portal>\n <Dialog.Content\n className=\"livechat-window-enter\"\n style={{\n position: 'fixed',\n zIndex: 9998,\n }}\n >\n <ChatWindow\n messages={messages}\n inputValue={inputValue}\n onInputChange={setInputValue}\n onSend={() => handleSendMessage()}\n onClose={closeChat}\n onNewSession={handleCreateNewSession}\n title={title}\n logoUrl={logoUrl}\n isSending={isStreaming}\n isLoadingHistory={isInitializing}\n rendererRegistry={rendererRegistry}\n inputPlaceholder=\"\"\n onAddToCart={onAddToCart}\n showNewSessionButton={showNewSessionButton}\n bottomTips={bottomTips}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["LiveChatWidget_exports", "__export", "LiveChatWidget", "__toCommonJS", "import_jsx_runtime", "import_react", "Dialog", "import_constants", "import_ChatBubble", "import_ChatWindow", "import_ComplianceDialog", "import_useChatState", "import_useChatAPI", "import_messageRenderers", "import_validation", "import_userId", "import_productTransformers", "import_cartTransformers", "import_js_cookie", "import_MessageContent", "apiBaseUrl", "headers", "recaptchaSitekey", "recaptchaAction", "site", "channelCode", "loginUserId", "cartId", "accessToken", "position", "welcomeMessage", "quickReplies", "customRenderers", "logoUrl", "title", "chatBubbleIcon", "open", "onOpenChange", "onOpen", "onClose", "onMessageSend", "onError", "onTextMessage", "onProductList", "onPromotionList", "onAddToCart", "onCart", "showNewSessionButton", "commonText", "productCardRender", "productComparisonRender", "bottomTips", "complianceConfig", "cookieName", "showComplianceDialog", "setShowComplianceDialog", "React", "hasAgreedCompliance", "setHasAgreedCompliance", "Cookies", "mergedText", "chatState", "messages", "isOpen", "userId", "sessionId", "inputValue", "isStreaming", "openChat", "closeChat", "setInputValue", "setUserId", "addMessage", "setMessages", "clearMessages", "startStream", "saveSession", "clearSession", "requiresCompliance", "shouldInterceptForCompliance", "displayChatOpen", "isInitializing", "setIsInitializing", "sendMessageStream", "createSession", "handleSendMessageRef", "_message", "rendererRegistry", "registry", "quickRepliesRenderer", "reply", "sessionInitializedRef", "currentSessionId", "handleResumeSession", "handleCreateNewSession", "normalizeMessage", "message", "contentBlocks", "structuredData", "block", "transformedData", "response", "messageText", "welcomeContent", "questions", "quickRepliesFromBackend", "question", "index", "error", "isRecaptcha", "existingSessionId", "normalizedMessages", "msg", "welcomeMsg", "handleSendMessage", "isRetry", "textToSend", "sanitized", "userMessage", "thinkingMessage", "sessionExpiredDetected", "requestPayload", "streamEventHandler", "event", "messagesWithoutThinking", "errorMessage", "errorCode", "displayComplianceDialog", "handleBubbleClick", "handleComplianceAgree", "handleComplianceClose"]
7
7
  }
@@ -0,0 +1 @@
1
+ export declare function useSendEmailValidation(): import("swr/mutation").SWRMutationResponse<any, any, "send-email-validation", never>;
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.create;var a=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var v=(e,t)=>{for(var o in t)a(e,o,{get:t[o],enumerable:!0})},r=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of f(t))!S.call(e,i)&&i!==o&&a(e,i,{get:()=>t[i],enumerable:!(n=d(t,i))||n.enumerable});return e};var m=(e,t,o)=>(o=e!=null?c(h(e)):{},r(t||!e||!e.__esModule?a(o,"default",{value:e,enumerable:!0}):o,e)),x=e=>r(a({},"__esModule",{value:!0}),e);var C={};v(C,{useSendEmailValidation:()=>y});module.exports=x(C);var p=m(require("../../../../helpers/fetcher.js")),l=m(require("swr/mutation")),s=require("../provider.js"),u=require("../../../../shopify/context/ShopifyProvider");function y(){const{profile:e}=(0,s.useCreditsContext)(),{appName:t,locale:o}=(0,u.useShopifyContext)();return(0,l.default)("send-email-validation",()=>(0,p.default)({locale:o,url:"/api/multipass/account/users/send_validation_email",method:"POST",body:{email:e?.email,app:t},needRecaptcha:!0,action:"verifyAccount"}))}
2
+ //# sourceMappingURL=useSendEmailValidation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/credits/context/hooks/useSendEmailValidation.ts"],
4
+ "sourcesContent": ["import fetcher from '../../../../helpers/fetcher.js'\nimport useSWRMutation from 'swr/mutation'\nimport { useCreditsContext } from '../provider.js'\nimport { useShopifyContext } from '../../../../shopify/context/ShopifyProvider'\n\nexport function useSendEmailValidation() {\n const { profile } = useCreditsContext()\n const { appName, locale } = useShopifyContext()\n\n return useSWRMutation('send-email-validation', () =>\n fetcher({\n locale,\n url: '/api/multipass/account/users/send_validation_email',\n method: 'POST',\n body: { email: profile?.email, app: appName },\n needRecaptcha: true,\n action: 'verifyAccount',\n })\n )\n}\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAoB,6CACpBC,EAA2B,2BAC3BC,EAAkC,0BAClCC,EAAkC,uDAE3B,SAASL,GAAyB,CACvC,KAAM,CAAE,QAAAM,CAAQ,KAAI,qBAAkB,EAChC,CAAE,QAAAC,EAAS,OAAAC,CAAO,KAAI,qBAAkB,EAE9C,SAAO,EAAAC,SAAe,wBAAyB,OAC7C,EAAAC,SAAQ,CACN,OAAAF,EACA,IAAK,qDACL,OAAQ,OACR,KAAM,CAAE,MAAOF,GAAS,MAAO,IAAKC,CAAQ,EAC5C,cAAe,GACf,OAAQ,eACV,CAAC,CACH,CACF",
6
+ "names": ["useSendEmailValidation_exports", "__export", "useSendEmailValidation", "__toCommonJS", "import_fetcher", "import_mutation", "import_provider", "import_ShopifyProvider", "profile", "appName", "locale", "useSWRMutation", "fetcher"]
7
+ }
@@ -0,0 +1,5 @@
1
+ import type { Subscription } from '../../type';
2
+ declare function useSubscriptions(email?: string): {
3
+ subscriptionData: Subscription | undefined;
4
+ };
5
+ export default useSubscriptions;
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.create;var i=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var d=(t,r)=>{for(var e in r)i(t,e,{get:r[e],enumerable:!0})},a=(t,r,e,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of m(r))!S.call(t,o)&&o!==e&&i(t,o,{get:()=>r[o],enumerable:!(n=b(r,o))||n.enumerable});return t};var h=(t,r,e)=>(e=t!=null?l(y(t)):{},a(r||!t||!t.__esModule?i(e,"default",{value:t,enumerable:!0}):e,t)),g=t=>a(i({},"__esModule",{value:!0}),t);var R={};d(R,{default:()=>E});module.exports=g(R);var p=require("next/router"),s=require("react"),f=h(require("../../../../helpers/fetcher.js"));function D(t){const r=(0,s.useRef)(!1),[e,n]=(0,s.useState)(),{locale:o}=(0,p.useRouter)(),u=(0,s.useCallback)(async()=>{if(t&&!r.current){r.current=!0;try{const c=await(0,f.default)({method:"GET",url:"/api/multipass/account/subscriptions",body:{email:t},action:"login",locale:o,headers:{},type:""});c&&n(c)}catch(c){console.error(c)}finally{r.current=!1}}},[t,o,r]);return(0,s.useEffect)(()=>{u()},[u]),{subscriptionData:e}}var E=D;
2
+ //# sourceMappingURL=useSubscriptions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/components/credits/context/hooks/useSubscriptions.ts"],
4
+ "sourcesContent": ["import { useRouter } from 'next/router'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { Subscription } from '../../type'\nimport fetcher from '../../../../helpers/fetcher.js'\n\nfunction useSubscriptions(email?: string) {\n const loading = useRef(false)\n const [subscriptionData, setSubscriptionData] = useState<Subscription>()\n const { locale } = useRouter()\n\n const fetchSubscription = useCallback(async () => {\n if (!email) {\n return\n }\n\n if (loading.current) {\n return\n }\n\n loading.current = true\n\n try {\n const response = await fetcher({\n method: 'GET',\n url: '/api/multipass/account/subscriptions',\n body: {\n email,\n },\n action: 'login',\n locale,\n headers: {},\n type: '',\n })\n\n if (response) {\n setSubscriptionData(response)\n }\n } catch (error) {\n console.error(error)\n } finally {\n loading.current = false\n }\n }, [email, locale, loading])\n\n useEffect(() => {\n fetchSubscription()\n }, [fetchSubscription])\n\n return {\n subscriptionData,\n }\n}\n\nexport default useSubscriptions\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA0B,uBAC1BC,EAAyD,iBAEzDC,EAAoB,6CAEpB,SAASC,EAAiBC,EAAgB,CACxC,MAAMC,KAAU,UAAO,EAAK,EACtB,CAACC,EAAkBC,CAAmB,KAAI,YAAuB,EACjE,CAAE,OAAAC,CAAO,KAAI,aAAU,EAEvBC,KAAoB,eAAY,SAAY,CAChD,GAAKL,GAID,CAAAC,EAAQ,QAIZ,CAAAA,EAAQ,QAAU,GAElB,GAAI,CACF,MAAMK,EAAW,QAAM,EAAAC,SAAQ,CAC7B,OAAQ,MACR,IAAK,uCACL,KAAM,CACJ,MAAAP,CACF,EACA,OAAQ,QACR,OAAAI,EACA,QAAS,CAAC,EACV,KAAM,EACR,CAAC,EAEGE,GACFH,EAAoBG,CAAQ,CAEhC,OAASE,EAAO,CACd,QAAQ,MAAMA,CAAK,CACrB,QAAE,CACAP,EAAQ,QAAU,EACpB,EACF,EAAG,CAACD,EAAOI,EAAQH,CAAO,CAAC,EAE3B,sBAAU,IAAM,CACdI,EAAkB,CACpB,EAAG,CAACA,CAAiB,CAAC,EAEf,CACL,iBAAAH,CACF,CACF,CAEA,IAAOR,EAAQK",
6
+ "names": ["useSubscriptions_exports", "__export", "useSubscriptions_default", "__toCommonJS", "import_router", "import_react", "import_fetcher", "useSubscriptions", "email", "loading", "subscriptionData", "setSubscriptionData", "locale", "fetchSubscription", "response", "fetcher", "error"]
7
+ }
@@ -8,6 +8,7 @@ type Context = {
8
8
  isLoadingProfile: boolean;
9
9
  removeProfile: () => void;
10
10
  taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>;
11
+ taskNameMapping: Record<string, string>;
11
12
  openSignInPopup: () => void;
12
13
  openSignUpPopup: () => void;
13
14
  creditInfo?: CreditInfoResponse;
@@ -43,6 +44,6 @@ type Context = {
43
44
  apiBaseUrl?: string;
44
45
  };
45
46
  export declare const CreditsContext: import("react").Context<Context>;
46
- export declare function CreditsProvider({ children, profile, removeProfile, isLoadingProfile, openSignInPopup, openSignUpPopup, taskIdToTypeMapping, creditInfo, customer, customerLoading, fetchCreditInfo, gtm, pageCommon, memberPriceDiscount, alpcBrand, alpcCountry, cartConfig, apiBaseUrl, }: PropsWithChildren<Omit<Context, 'openMyRewardsModal' | 'setOpenMyRewardsModal' | 'openActivitiesModal' | 'setOpenActivitiesModal'>>): import("react/jsx-runtime").JSX.Element;
47
+ export declare function CreditsProvider({ children, profile, removeProfile, isLoadingProfile, openSignInPopup, openSignUpPopup, taskIdToTypeMapping, taskNameMapping, creditInfo, customer, customerLoading, fetchCreditInfo, gtm, pageCommon, memberPriceDiscount, alpcBrand, alpcCountry, cartConfig, apiBaseUrl, }: PropsWithChildren<Omit<Context, 'openMyRewardsModal' | 'setOpenMyRewardsModal' | 'openActivitiesModal' | 'setOpenActivitiesModal'>>): import("react/jsx-runtime").JSX.Element;
47
48
  export declare function useCreditsContext(): Context;
48
49
  export {};
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var h=(e,o)=>{for(var i in o)s(e,i,{get:o[i],enumerable:!0})},S=(e,o,i,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of I(o))!O.call(e,t)&&t!==i&&s(e,t,{get:()=>o[t],enumerable:!(r=T(o,t))||r.enumerable});return e};var _=e=>S(s({},"__esModule",{value:!0}),e);var D={};h(D,{CreditsContext:()=>a,CreditsProvider:()=>L,useCreditsContext:()=>B});module.exports=_(D);var d=require("react/jsx-runtime"),n=require("react");const a=(0,n.createContext)({profile:null,isLoadingProfile:!1,taskIdToTypeMapping:{},removeProfile:()=>{},openSignInPopup:()=>{},openSignUpPopup:()=>{},creditInfo:void 0,customerLoading:!1,fetchCreditInfo:e=>{},gtm:{pageGroup:"",pageHandle:""},pageCommon:{},memberPriceDiscount:void 0,alpcBrand:void 0,alpcCountry:void 0,cartConfig:void 0,openMyRewardsModal:!1,setOpenMyRewardsModal:()=>{},openActivitiesModal:!1,setOpenActivitiesModal:()=>{},apiBaseUrl:void 0});function L({children:e,profile:o,removeProfile:i,isLoadingProfile:r,openSignInPopup:t,openSignUpPopup:p,taskIdToTypeMapping:l,creditInfo:c,customer:u,customerLoading:f,fetchCreditInfo:g,gtm:C,pageCommon:m,memberPriceDiscount:M,alpcBrand:v,alpcCountry:y,cartConfig:P,apiBaseUrl:b}){const[A,x]=(0,n.useState)(!1),[R,w]=(0,n.useState)(!1);return(0,d.jsx)(a.Provider,{value:{profile:o,isLoadingProfile:r,removeProfile:i,openSignInPopup:t,openSignUpPopup:p,taskIdToTypeMapping:l,creditInfo:c,fetchCreditInfo:g,customer:u,customerLoading:f,gtm:C,pageCommon:m,memberPriceDiscount:M,alpcBrand:v,alpcCountry:y,cartConfig:P,apiBaseUrl:b,openMyRewardsModal:A,setOpenMyRewardsModal:x,openActivitiesModal:R,setOpenActivitiesModal:w},children:e})}function B(){const e=(0,n.useContext)(a);if(!e)throw new Error("useCreditsContext must be used within a CreditsProvider");return e}
1
+ "use strict";var a=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var S=(e,o)=>{for(var i in o)a(e,i,{get:o[i],enumerable:!0})},_=(e,o,i,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of O(o))!h.call(e,t)&&t!==i&&a(e,t,{get:()=>o[t],enumerable:!(r=I(o,t))||r.enumerable});return e};var k=e=>_(a({},"__esModule",{value:!0}),e);var D={};S(D,{CreditsContext:()=>s,CreditsProvider:()=>L,useCreditsContext:()=>B});module.exports=k(D);var d=require("react/jsx-runtime"),n=require("react");const s=(0,n.createContext)({profile:null,isLoadingProfile:!1,taskIdToTypeMapping:{},taskNameMapping:{},removeProfile:()=>{},openSignInPopup:()=>{},openSignUpPopup:()=>{},creditInfo:void 0,customerLoading:!1,fetchCreditInfo:e=>{},gtm:{pageGroup:"",pageHandle:""},pageCommon:{},memberPriceDiscount:void 0,alpcBrand:void 0,alpcCountry:void 0,cartConfig:void 0,openMyRewardsModal:!1,setOpenMyRewardsModal:()=>{},openActivitiesModal:!1,setOpenActivitiesModal:()=>{},apiBaseUrl:void 0});function L({children:e,profile:o,removeProfile:i,isLoadingProfile:r,openSignInPopup:t,openSignUpPopup:p,taskIdToTypeMapping:l,taskNameMapping:c,creditInfo:g,customer:u,customerLoading:f,fetchCreditInfo:m,gtm:C,pageCommon:M,memberPriceDiscount:v,alpcBrand:y,alpcCountry:P,cartConfig:b,apiBaseUrl:A}){const[R,x]=(0,n.useState)(!1),[w,T]=(0,n.useState)(!1);return(0,d.jsx)(s.Provider,{value:{profile:o,isLoadingProfile:r,removeProfile:i,openSignInPopup:t,openSignUpPopup:p,taskIdToTypeMapping:l,taskNameMapping:c,creditInfo:g,fetchCreditInfo:m,customer:u,customerLoading:f,gtm:C,pageCommon:M,memberPriceDiscount:v,alpcBrand:y,alpcCountry:P,cartConfig:b,apiBaseUrl:A,openMyRewardsModal:R,setOpenMyRewardsModal:x,openActivitiesModal:w,setOpenActivitiesModal:T},children:e})}function B(){const e=(0,n.useContext)(s);if(!e)throw new Error("useCreditsContext must be used within a CreditsProvider");return e}
2
2
  //# sourceMappingURL=provider.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/components/credits/context/provider.tsx"],
4
- "sourcesContent": ["import { createContext, PropsWithChildren, useContext, useState } from 'react'\nimport type { DTC_TASK_TYPE } from './const'\nimport type { CreditInfoResponse } from './response'\nimport { CreditsPageCommon } from '../type'\nimport { FunctionMemberPriceConfig } from './memberPriceTypes'\n\ntype Context = {\n profile: any\n isLoadingProfile: boolean\n removeProfile: () => void\n taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>\n openSignInPopup: () => void\n openSignUpPopup: () => void\n creditInfo?: CreditInfoResponse\n customer?: any\n customerLoading: boolean\n fetchCreditInfo: (user_id: string) => void\n gtm: {\n pageGroup: string\n pageHandle?: string\n }\n pageCommon: CreditsPageCommon\n memberPriceDiscount?: FunctionMemberPriceConfig[]\n alpcBrand?: string\n alpcCountry?: string\n cartConfig?: {\n addToCart: (params: {\n variantList: Array<{\n variant: any\n quantity: number\n attributes?: Array<{ key: string; value: string }>\n }>\n cartAttributes?: Record<string, string>\n discountCodes?: string[]\n }) => void | Promise<any>\n }\n openMyRewardsModal: boolean\n setOpenMyRewardsModal: (open: boolean) => void\n openActivitiesModal: boolean\n setOpenActivitiesModal: (open: boolean) => void\n apiBaseUrl?: string\n}\n\nexport const CreditsContext = createContext<Context>({\n profile: null,\n isLoadingProfile: false,\n taskIdToTypeMapping: {},\n removeProfile: () => {},\n openSignInPopup: () => {},\n openSignUpPopup: () => {},\n creditInfo: undefined,\n customerLoading: false,\n fetchCreditInfo: (user_id: string) => {},\n gtm: {\n pageGroup: '',\n pageHandle: '',\n },\n pageCommon: {},\n memberPriceDiscount: undefined,\n alpcBrand: undefined,\n alpcCountry: undefined,\n cartConfig: undefined,\n openMyRewardsModal: false,\n setOpenMyRewardsModal: () => {},\n openActivitiesModal: false,\n setOpenActivitiesModal: () => {},\n apiBaseUrl: undefined,\n})\n\nexport function CreditsProvider({\n children,\n profile,\n removeProfile,\n isLoadingProfile,\n openSignInPopup,\n openSignUpPopup,\n taskIdToTypeMapping,\n creditInfo,\n customer,\n customerLoading,\n fetchCreditInfo,\n gtm,\n pageCommon,\n memberPriceDiscount,\n alpcBrand,\n alpcCountry,\n cartConfig,\n apiBaseUrl,\n}: PropsWithChildren<Omit<Context, 'openMyRewardsModal' | 'setOpenMyRewardsModal' | 'openActivitiesModal' | 'setOpenActivitiesModal'>>) {\n const [openMyRewardsModal, setOpenMyRewardsModal] = useState(false)\n const [openActivitiesModal, setOpenActivitiesModal] = useState(false)\n\n return (\n <CreditsContext.Provider\n value={{\n profile,\n isLoadingProfile,\n removeProfile,\n openSignInPopup,\n openSignUpPopup,\n taskIdToTypeMapping,\n creditInfo,\n fetchCreditInfo,\n customer,\n customerLoading,\n gtm,\n pageCommon,\n memberPriceDiscount,\n alpcBrand,\n alpcCountry,\n cartConfig,\n apiBaseUrl,\n openMyRewardsModal,\n setOpenMyRewardsModal,\n openActivitiesModal,\n setOpenActivitiesModal,\n }}\n >\n {children}\n </CreditsContext.Provider>\n )\n}\n\nexport function useCreditsContext() {\n const context = useContext(CreditsContext)\n if (!context) {\n throw new Error('useCreditsContext must be used within a CreditsProvider')\n }\n return context\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,oBAAAC,EAAA,sBAAAC,IAAA,eAAAC,EAAAL,GA6FI,IAAAM,EAAA,6BA7FJC,EAAuE,iBA2ChE,MAAML,KAAiB,iBAAuB,CACnD,QAAS,KACT,iBAAkB,GAClB,oBAAqB,CAAC,EACtB,cAAe,IAAM,CAAC,EACtB,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,WAAY,OACZ,gBAAiB,GACjB,gBAAkBM,GAAoB,CAAC,EACvC,IAAK,CACH,UAAW,GACX,WAAY,EACd,EACA,WAAY,CAAC,EACb,oBAAqB,OACrB,UAAW,OACX,YAAa,OACb,WAAY,OACZ,mBAAoB,GACpB,sBAAuB,IAAM,CAAC,EAC9B,oBAAqB,GACrB,uBAAwB,IAAM,CAAC,EAC/B,WAAY,MACd,CAAC,EAEM,SAASL,EAAgB,CAC9B,SAAAM,EACA,QAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,oBAAAC,EACA,WAAAC,EACA,SAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,IAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,YAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAwI,CACtI,KAAM,CAACC,EAAoBC,CAAqB,KAAI,YAAS,EAAK,EAC5D,CAACC,EAAqBC,CAAsB,KAAI,YAAS,EAAK,EAEpE,SACE,OAAC5B,EAAe,SAAf,CACC,MAAO,CACL,QAAAQ,EACA,iBAAAE,EACA,cAAAD,EACA,gBAAAE,EACA,gBAAAC,EACA,oBAAAC,EACA,WAAAC,EACA,gBAAAG,EACA,SAAAF,EACA,gBAAAC,EACA,IAAAE,EACA,WAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,YAAAC,EACA,WAAAC,EACA,WAAAC,EACA,mBAAAC,EACA,sBAAAC,EACA,oBAAAC,EACA,uBAAAC,CACF,EAEC,SAAArB,EACH,CAEJ,CAEO,SAASL,GAAoB,CAClC,MAAM2B,KAAU,cAAW7B,CAAc,EACzC,GAAI,CAAC6B,EACH,MAAM,IAAI,MAAM,yDAAyD,EAE3E,OAAOA,CACT",
6
- "names": ["provider_exports", "__export", "CreditsContext", "CreditsProvider", "useCreditsContext", "__toCommonJS", "import_jsx_runtime", "import_react", "user_id", "children", "profile", "removeProfile", "isLoadingProfile", "openSignInPopup", "openSignUpPopup", "taskIdToTypeMapping", "creditInfo", "customer", "customerLoading", "fetchCreditInfo", "gtm", "pageCommon", "memberPriceDiscount", "alpcBrand", "alpcCountry", "cartConfig", "apiBaseUrl", "openMyRewardsModal", "setOpenMyRewardsModal", "openActivitiesModal", "setOpenActivitiesModal", "context"]
4
+ "sourcesContent": ["import { createContext, PropsWithChildren, useContext, useState } from 'react'\nimport type { DTC_TASK_TYPE } from './const'\nimport type { CreditInfoResponse } from './response'\nimport { CreditsPageCommon } from '../type'\nimport { FunctionMemberPriceConfig } from './memberPriceTypes'\n\ntype Context = {\n profile: any\n isLoadingProfile: boolean\n removeProfile: () => void\n taskIdToTypeMapping: Record<string, DTC_TASK_TYPE>\n taskNameMapping: Record<string, string>\n openSignInPopup: () => void\n openSignUpPopup: () => void\n creditInfo?: CreditInfoResponse\n customer?: any\n customerLoading: boolean\n fetchCreditInfo: (user_id: string) => void\n gtm: {\n pageGroup: string\n pageHandle?: string\n }\n pageCommon: CreditsPageCommon\n memberPriceDiscount?: FunctionMemberPriceConfig[]\n alpcBrand?: string\n alpcCountry?: string\n cartConfig?: {\n addToCart: (params: {\n variantList: Array<{\n variant: any\n quantity: number\n attributes?: Array<{ key: string; value: string }>\n }>\n cartAttributes?: Record<string, string>\n discountCodes?: string[]\n }) => void | Promise<any>\n }\n openMyRewardsModal: boolean\n setOpenMyRewardsModal: (open: boolean) => void\n openActivitiesModal: boolean\n setOpenActivitiesModal: (open: boolean) => void\n apiBaseUrl?: string\n}\n\nexport const CreditsContext = createContext<Context>({\n profile: null,\n isLoadingProfile: false,\n taskIdToTypeMapping: {},\n taskNameMapping: {},\n removeProfile: () => {},\n openSignInPopup: () => {},\n openSignUpPopup: () => {},\n creditInfo: undefined,\n customerLoading: false,\n fetchCreditInfo: (user_id: string) => {},\n gtm: {\n pageGroup: '',\n pageHandle: '',\n },\n pageCommon: {},\n memberPriceDiscount: undefined,\n alpcBrand: undefined,\n alpcCountry: undefined,\n cartConfig: undefined,\n openMyRewardsModal: false,\n setOpenMyRewardsModal: () => {},\n openActivitiesModal: false,\n setOpenActivitiesModal: () => {},\n apiBaseUrl: undefined,\n})\n\nexport function CreditsProvider({\n children,\n profile,\n removeProfile,\n isLoadingProfile,\n openSignInPopup,\n openSignUpPopup,\n taskIdToTypeMapping,\n taskNameMapping,\n creditInfo,\n customer,\n customerLoading,\n fetchCreditInfo,\n gtm,\n pageCommon,\n memberPriceDiscount,\n alpcBrand,\n alpcCountry,\n cartConfig,\n apiBaseUrl,\n}: PropsWithChildren<Omit<Context, 'openMyRewardsModal' | 'setOpenMyRewardsModal' | 'openActivitiesModal' | 'setOpenActivitiesModal'>>) {\n const [openMyRewardsModal, setOpenMyRewardsModal] = useState(false)\n const [openActivitiesModal, setOpenActivitiesModal] = useState(false)\n\n return (\n <CreditsContext.Provider\n value={{\n profile,\n isLoadingProfile,\n removeProfile,\n openSignInPopup,\n openSignUpPopup,\n taskIdToTypeMapping,\n taskNameMapping,\n creditInfo,\n fetchCreditInfo,\n customer,\n customerLoading,\n gtm,\n pageCommon,\n memberPriceDiscount,\n alpcBrand,\n alpcCountry,\n cartConfig,\n apiBaseUrl,\n openMyRewardsModal,\n setOpenMyRewardsModal,\n openActivitiesModal,\n setOpenActivitiesModal,\n }}\n >\n {children}\n </CreditsContext.Provider>\n )\n}\n\nexport function useCreditsContext() {\n const context = useContext(CreditsContext)\n if (!context) {\n throw new Error('useCreditsContext must be used within a CreditsProvider')\n }\n return context\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,oBAAAC,EAAA,sBAAAC,IAAA,eAAAC,EAAAL,GAgGI,IAAAM,EAAA,6BAhGJC,EAAuE,iBA4ChE,MAAML,KAAiB,iBAAuB,CACnD,QAAS,KACT,iBAAkB,GAClB,oBAAqB,CAAC,EACtB,gBAAiB,CAAC,EAClB,cAAe,IAAM,CAAC,EACtB,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,WAAY,OACZ,gBAAiB,GACjB,gBAAkBM,GAAoB,CAAC,EACvC,IAAK,CACH,UAAW,GACX,WAAY,EACd,EACA,WAAY,CAAC,EACb,oBAAqB,OACrB,UAAW,OACX,YAAa,OACb,WAAY,OACZ,mBAAoB,GACpB,sBAAuB,IAAM,CAAC,EAC9B,oBAAqB,GACrB,uBAAwB,IAAM,CAAC,EAC/B,WAAY,MACd,CAAC,EAEM,SAASL,EAAgB,CAC9B,SAAAM,EACA,QAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,oBAAAC,EACA,gBAAAC,EACA,WAAAC,EACA,SAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,IAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,YAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAwI,CACtI,KAAM,CAACC,EAAoBC,CAAqB,KAAI,YAAS,EAAK,EAC5D,CAACC,EAAqBC,CAAsB,KAAI,YAAS,EAAK,EAEpE,SACE,OAAC7B,EAAe,SAAf,CACC,MAAO,CACL,QAAAQ,EACA,iBAAAE,EACA,cAAAD,EACA,gBAAAE,EACA,gBAAAC,EACA,oBAAAC,EACA,gBAAAC,EACA,WAAAC,EACA,gBAAAG,EACA,SAAAF,EACA,gBAAAC,EACA,IAAAE,EACA,WAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,YAAAC,EACA,WAAAC,EACA,WAAAC,EACA,mBAAAC,EACA,sBAAAC,EACA,oBAAAC,EACA,uBAAAC,CACF,EAEC,SAAAtB,EACH,CAEJ,CAEO,SAASL,GAAoB,CAClC,MAAM4B,KAAU,cAAW9B,CAAc,EACzC,GAAI,CAAC8B,EACH,MAAM,IAAI,MAAM,yDAAyD,EAE3E,OAAOA,CACT",
6
+ "names": ["provider_exports", "__export", "CreditsContext", "CreditsProvider", "useCreditsContext", "__toCommonJS", "import_jsx_runtime", "import_react", "user_id", "children", "profile", "removeProfile", "isLoadingProfile", "openSignInPopup", "openSignUpPopup", "taskIdToTypeMapping", "taskNameMapping", "creditInfo", "customer", "customerLoading", "fetchCreditInfo", "gtm", "pageCommon", "memberPriceDiscount", "alpcBrand", "alpcCountry", "cartConfig", "apiBaseUrl", "openMyRewardsModal", "setOpenMyRewardsModal", "openActivitiesModal", "setOpenActivitiesModal", "context"]
7
7
  }
@@ -0,0 +1,32 @@
1
+ import { type ModalContainerProps } from './modalContainer';
2
+ export interface MyRewardsMetafields {
3
+ title: string;
4
+ orderNumberLabel: string;
5
+ valueLabel: string;
6
+ receivedLabel: string;
7
+ failedLabel: string;
8
+ approveSuccessLabel: string;
9
+ couponTab: string;
10
+ productTab: string;
11
+ pendingLabel: string;
12
+ unfulfilledLabel: string;
13
+ fulfilledLabel: string;
14
+ confirmedTip: string;
15
+ pendingTip: string;
16
+ processingTip: string;
17
+ ShippedTip: string;
18
+ emptyListLabel: string;
19
+ pointUnit: string;
20
+ code: string;
21
+ copied: string;
22
+ copy: string;
23
+ emptyListImage: {
24
+ url: string;
25
+ alt?: string;
26
+ };
27
+ }
28
+ interface MyRewardsModalProps extends ModalContainerProps {
29
+ data: MyRewardsMetafields;
30
+ }
31
+ declare function MyRewardsModal({ data, ...props }: MyRewardsModalProps): import("react/jsx-runtime").JSX.Element;
32
+ export default MyRewardsModal;
@@ -0,0 +1,2 @@
1
+ "use strict";var V=Object.create;var m=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var X=(o,n)=>{for(var i in n)m(o,i,{get:n[i],enumerable:!0})},F=(o,n,i,u)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of J(n))!W.call(o,a)&&a!==i&&m(o,a,{get:()=>n[a],enumerable:!(u=G(n,a))||u.enumerable});return o};var d=(o,n,i)=>(i=o!=null?V(Q(o)):{},F(n||!o||!o.__esModule?m(i,"default",{value:o,enumerable:!0}):i,o)),Z=o=>F(m({},"__esModule",{value:!0}),o);var te={};X(te,{default:()=>oe});module.exports=Z(te);var s=require("react/jsx-runtime"),p=require("@anker-in/headless-ui"),g=d(require("classnames")),_=d(require("copy-to-clipboard")),h=d(require("dayjs")),r=require("react"),e=require("../context/const"),D=require("./modalContainer"),A=d(require("./tip")),O=d(require("./loadingDots")),x=d(require("../context/hooks/useMyRewards")),b=require("@anker-in/lib");function ee({data:o,...n}){const[i,u]=(0,r.useState)(e.AlpcConsumeType.Coupon),{brand:a}=(0,b.useHeadlessContext)(),y=b.ROUNDED_BRANDS.includes(a),[c,I]=(0,r.useState)(1),[f,U]=(0,r.useState)(1),[k,C]=(0,r.useState)(-1),E=(0,r.useMemo)(()=>{const t=[];return o.couponTab&&t.push({title:o.couponTab,type:e.AlpcConsumeType.Coupon}),o.productTab&&t.push({title:o.productTab,type:e.AlpcConsumeType.Product}),t},[o.couponTab,o.productTab]),Y=(0,r.useMemo)(()=>({page:n.isOpen?f:0,pageSize:1e3,consumeType:e.AlpcConsumeType.Product}),[n.isOpen,f]),j=(0,r.useMemo)(()=>({page:n.isOpen?c:0,pageSize:1e3,consumeType:e.AlpcConsumeType.Coupon}),[n.isOpen,c]),{myRewards:N=[],canNext:T,isLoading:H}=(0,x.default)(j),{myRewards:L=[],canNext:P,isLoading:$}=(0,x.default)(Y),M=(0,r.useMemo)(()=>i===e.AlpcConsumeType.Coupon?N.map(t=>({title:t.goods_title,value:t.consume_credits,type:e.RewardType.Received,date:new Date(t.create_time*1e3),couponCode:t.coupon_code,orderNumber:""})):i===e.AlpcConsumeType.Product?L.map(t=>{let l=e.RewardType.Pending;return t.fulfillment_status&&t.fulfillment_status!=="null"?t.fulfillment_status==="fulfilled"?l=e.RewardType.Fulfilled:l=e.RewardType.Unfulfilled:t.approval_status===e.ApprovalStatus.Success||t.approval_status===e.ApprovalStatus.DoubleConfirm?l=e.RewardType.ApproveSuccess:t.approval_status===e.ApprovalStatus.Failed&&(l=e.RewardType.Failed),{title:t.goods_title,value:t.consume_credits,type:l,date:new Date(t.create_time*1e3),orderNumber:t.order_number,couponCode:""}}):[],[i,L,N]),w=(0,r.useMemo)(()=>i===e.AlpcConsumeType.Coupon?T:i===e.AlpcConsumeType.Product?P:!1,[i,T,P]),z=(0,r.useMemo)(()=>({[e.RewardType.Received]:o.receivedLabel,[e.RewardType.Pending]:o.pendingLabel,[e.RewardType.ApproveFail]:o.failedLabel,[e.RewardType.ApproveSuccess]:o.approveSuccessLabel,[e.RewardType.Unfulfilled]:o.unfulfilledLabel,[e.RewardType.Fulfilled]:o.fulfilledLabel,[e.RewardType.Failed]:o.failedLabel}),[o]),R=(0,r.useMemo)(()=>({[e.RewardType.Received]:"",[e.RewardType.Pending]:o.pendingTip,[e.RewardType.ApproveFail]:"",[e.RewardType.ApproveSuccess]:o.confirmedTip,[e.RewardType.Unfulfilled]:o.processingTip,[e.RewardType.Fulfilled]:o.ShippedTip,[e.RewardType.Failed]:""}),[o]),q=(0,r.useMemo)(()=>({[e.RewardType.Received]:"#52C41A",[e.RewardType.Pending]:"#999",[e.RewardType.ApproveFail]:"#F84D4F",[e.RewardType.ApproveSuccess]:"#999",[e.RewardType.Unfulfilled]:"#999",[e.RewardType.Fulfilled]:"#999",[e.RewardType.Failed]:"#F84D4F"}),[]),B=(0,r.useCallback)(()=>{w&&(i===e.AlpcConsumeType.Coupon?I(c+1):i===e.AlpcConsumeType.Product&&U(f+1))},[i,f,c,w]),K=(0,r.useCallback)((t,l)=>{C(l),(0,_.default)(t),setTimeout(()=>{C(-1)},2e3)},[]),S=i===e.AlpcConsumeType.Coupon?H:$;return(0,s.jsxs)(D.CreditsModalContainer,{title:o.title,className:(0,g.default)("h-[800px] w-[640px]"),useAnimation:!0,animationClassName:"md:translate-y-[100vh]",scrollClassName:"md:mb-0",...n,onScrollEnd:B,children:[(0,s.jsx)("div",{className:"",children:(0,s.jsx)(p.Tabs,{align:"left",shape:y?"rounded":"square",value:i.toString(),onValueChange:t=>{u(Number(t))},children:(0,s.jsx)(p.TabsList,{children:E.map(t=>(0,s.jsx)(p.TabsTrigger,{value:t.type.toString(),children:t.title},t.type))})})}),S&&(0,s.jsx)("div",{className:"flex h-full flex-col items-center justify-center",children:(0,s.jsx)(O.default,{})}),!S&&(0,s.jsx)("div",{className:"mt-[24px] overflow-auto overscroll-contain",children:M.length>0?(0,s.jsx)("div",{className:"grid gap-[18px] md:gap-[12px]",children:M.map((t,l)=>(0,s.jsxs)("div",{className:"grid gap-[8px]",children:[t?.orderNumber&&(0,s.jsxs)("div",{className:"text-[15px] font-semibold leading-[1.4] text-[#777]",children:[o.orderNumberLabel,": ",t.orderNumber]}),(0,s.jsxs)("div",{className:(0,g.default)("flex items-center justify-between rounded-[8px] bg-[#f7f8f9] px-[16px] py-[20px]",!y&&"rounded-none"),children:[(0,s.jsxs)("div",{className:"grid gap-[4px]",children:[(0,s.jsx)("div",{className:"text-[16px] font-bold leading-[1.4]",children:t.title}),(0,s.jsxs)("div",{className:"text-[14px] font-semibold text-[#999]",children:[o.valueLabel,": ",t.value," ",o?.pointUnit]}),(0,s.jsxs)("div",{className:"text-[14px] font-semibold text-[#999]",children:[t?.couponCode?`${o?.code||"Code"}: ${t.couponCode} `:"",t?.couponCode&&(0,s.jsx)("span",{className:"cursor-pointer text-[14px] font-semibold text-brand underline",onClick:()=>{K(t.couponCode,l)},role:"button",tabIndex:0,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&v.preventDefault()},children:k===l?o?.copied||"COPIED":o?.copy||"COPY"})]})]}),(0,s.jsxs)("div",{className:"grid gap-[4px] text-right",children:[(0,s.jsxs)("div",{className:(0,g.default)("flex items-center justify-end text-[16px] font-bold leading-[1.4]",`text-[${q[t.type]}]`),children:[(0,s.jsx)("span",{children:z[t.type]}),R[t.type]&&(0,s.jsx)(A.default,{info:R[t.type],index:l})]}),(0,s.jsx)("div",{className:"text-[14px] font-semibold text-[#999]",children:(0,h.default)(t.date).format("YYYY-MM-DD HH:mm").toString()})]})]})]},l))}):(0,s.jsxs)("div",{className:"flex h-full flex-col items-center justify-center",children:[(0,s.jsx)(p.Picture,{className:"mb-[12px] w-[160px]",source:o?.emptyListImage?.url,alt:o?.emptyListImage?.alt||"empty list image"}),(0,s.jsx)("div",{className:"text-[16px] font-semibold leading-[1.4]",children:o?.emptyListLabel})]})})]})}var oe=ee;
2
+ //# sourceMappingURL=MyRewardsModal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/credits/modal/MyRewardsModal.tsx"],
4
+ "sourcesContent": ["import { Tabs, TabsList, TabsTrigger, Picture } from '@anker-in/headless-ui'\nimport classNames from 'classnames'\nimport clipboard from 'copy-to-clipboard'\nimport dayjs from 'dayjs'\nimport { useCallback, useMemo, useState } from 'react'\n\nimport { ApprovalStatus, AlpcConsumeType, RewardType } from '../context/const'\nimport { CreditsModalContainer, type ModalContainerProps } from './modalContainer'\nimport Tip from './tip'\nimport LoadingDots from './loadingDots'\nimport useMyRewards from '../context/hooks/useMyRewards'\nimport { useHeadlessContext, ROUNDED_BRANDS } from '@anker-in/lib'\n\nexport interface MyRewardsMetafields {\n title: string\n orderNumberLabel: string\n valueLabel: string\n receivedLabel: string\n failedLabel: string\n approveSuccessLabel: string\n couponTab: string\n productTab: string\n pendingLabel: string\n unfulfilledLabel: string\n fulfilledLabel: string\n confirmedTip: string\n pendingTip: string\n processingTip: string\n ShippedTip: string\n emptyListLabel: string\n pointUnit: string\n code: string\n copied: string\n copy: string\n emptyListImage: {\n url: string\n alt?: string\n }\n}\ninterface MyRewardsModalProps extends ModalContainerProps {\n data: MyRewardsMetafields\n}\n\nfunction MyRewardsModal({ data, ...props }: MyRewardsModalProps) {\n const [activeTab, setActiveTab] = useState(AlpcConsumeType.Coupon)\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const [couponPage, setCouponPage] = useState(1)\n const [productPage, setProductPage] = useState(1)\n const [copied, setCopied] = useState(-1)\n\n const tabs = useMemo(() => {\n const availableTabs: { title: string; type: number }[] = []\n\n if (data.couponTab) {\n availableTabs.push({\n title: data.couponTab,\n type: AlpcConsumeType.Coupon,\n })\n }\n\n if (data.productTab) {\n availableTabs.push({\n title: data.productTab,\n type: AlpcConsumeType.Product,\n })\n }\n\n return availableTabs\n }, [data.couponTab, data.productTab])\n\n const myProductRewardsOptions = useMemo(() => {\n return {\n page: props.isOpen ? productPage : 0,\n pageSize: 1000,\n consumeType: AlpcConsumeType.Product,\n }\n }, [props.isOpen, productPage])\n const myCouponRewardsOptions = useMemo(() => {\n return {\n page: props.isOpen ? couponPage : 0,\n pageSize: 1000,\n consumeType: AlpcConsumeType.Coupon,\n }\n }, [props.isOpen, couponPage])\n\n const {\n myRewards: myCouponRewards = [],\n canNext: couponCanNext,\n isLoading: couponIsLoading,\n } = useMyRewards(myCouponRewardsOptions)\n const {\n myRewards: myProductRewards = [],\n canNext: productCanNext,\n isLoading: productIsLoading,\n } = useMyRewards(myProductRewardsOptions)\n\n const list = useMemo(() => {\n if (activeTab === AlpcConsumeType.Coupon) {\n return myCouponRewards.map(item => ({\n title: item.goods_title,\n value: item.consume_credits,\n type: RewardType.Received,\n date: new Date(item.create_time * 1000),\n couponCode: item.coupon_code,\n orderNumber: '',\n }))\n }\n\n if (activeTab === AlpcConsumeType.Product) {\n return myProductRewards.map(item => {\n let type = RewardType.Pending\n\n if (item.fulfillment_status && item.fulfillment_status !== 'null') {\n // \u7269\u6D41\u72B6\u6001\n if (item.fulfillment_status === 'fulfilled') {\n type = RewardType.Fulfilled\n } else {\n type = RewardType.Unfulfilled\n }\n } else {\n if (\n item.approval_status === ApprovalStatus.Success ||\n item.approval_status === ApprovalStatus.DoubleConfirm\n ) {\n type = RewardType.ApproveSuccess\n } else if (item.approval_status === ApprovalStatus.Failed) {\n type = RewardType.Failed\n }\n }\n\n return {\n title: item.goods_title,\n value: item.consume_credits,\n type,\n date: new Date(item.create_time * 1000),\n orderNumber: item.order_number,\n couponCode: '',\n }\n })\n }\n\n return []\n }, [activeTab, myProductRewards, myCouponRewards])\n\n const canNext = useMemo(() => {\n if (activeTab === AlpcConsumeType.Coupon) {\n return couponCanNext\n }\n\n if (activeTab === AlpcConsumeType.Product) {\n return productCanNext\n }\n\n return false\n }, [activeTab, couponCanNext, productCanNext])\n\n const TypeMap = useMemo(() => {\n return {\n [RewardType.Received]: data.receivedLabel,\n [RewardType.Pending]: data.pendingLabel,\n [RewardType.ApproveFail]: data.failedLabel,\n [RewardType.ApproveSuccess]: data.approveSuccessLabel,\n [RewardType.Unfulfilled]: data.unfulfilledLabel,\n [RewardType.Fulfilled]: data.fulfilledLabel,\n [RewardType.Failed]: data.failedLabel,\n }\n }, [data])\n\n const TipMap = useMemo(() => {\n return {\n [RewardType.Received]: '',\n [RewardType.Pending]: data.pendingTip,\n [RewardType.ApproveFail]: '',\n [RewardType.ApproveSuccess]: data.confirmedTip,\n [RewardType.Unfulfilled]: data.processingTip,\n [RewardType.Fulfilled]: data.ShippedTip,\n [RewardType.Failed]: '',\n }\n }, [data])\n\n const ColorMap = useMemo(() => {\n return {\n [RewardType.Received]: '#52C41A',\n [RewardType.Pending]: '#999',\n [RewardType.ApproveFail]: '#F84D4F',\n [RewardType.ApproveSuccess]: '#999',\n [RewardType.Unfulfilled]: '#999',\n [RewardType.Fulfilled]: '#999',\n [RewardType.Failed]: '#F84D4F',\n }\n }, [])\n\n const handleScrollEnd = useCallback(() => {\n if (!canNext) {\n return\n }\n\n if (activeTab === AlpcConsumeType.Coupon) {\n setCouponPage(couponPage + 1)\n } else if (activeTab === AlpcConsumeType.Product) {\n setProductPage(productPage + 1)\n }\n }, [activeTab, productPage, couponPage, canNext])\n\n const handleCopy = useCallback((code: string, idx: number) => {\n setCopied(idx)\n clipboard(code)\n setTimeout(() => {\n setCopied(-1)\n }, 2000)\n }, [])\n\n const isLoading = activeTab === AlpcConsumeType.Coupon ? couponIsLoading : productIsLoading\n\n return (\n <CreditsModalContainer\n title={data.title}\n className={classNames('h-[800px] w-[640px]')}\n useAnimation\n animationClassName=\"md:translate-y-[100vh]\"\n scrollClassName=\"md:mb-0\"\n {...props}\n onScrollEnd={handleScrollEnd}\n >\n <div className=\"\">\n <Tabs\n align=\"left\"\n shape={rounded ? 'rounded' : 'square'}\n value={activeTab.toString()}\n onValueChange={value => {\n setActiveTab(Number(value))\n }}\n >\n <TabsList>\n {tabs.map(tab => (\n <TabsTrigger key={tab.type} value={tab.type.toString()}>\n {tab.title}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n </div>\n\n {isLoading && (\n <div className=\"flex h-full flex-col items-center justify-center\">\n <LoadingDots />\n </div>\n )}\n\n {!isLoading && (\n <div className=\"mt-[24px] overflow-auto overscroll-contain\">\n {list.length > 0 ? (\n <div className=\"grid gap-[18px] md:gap-[12px]\">\n {list.map((item, index) => (\n <div key={index} className=\"grid gap-[8px]\">\n {item?.orderNumber && (\n <div className=\"text-[15px] font-semibold leading-[1.4] text-[#777]\">\n {data.orderNumberLabel}: {item.orderNumber}\n </div>\n )}\n <div\n className={classNames(\n 'flex items-center justify-between rounded-[8px] bg-[#f7f8f9] px-[16px] py-[20px]',\n !rounded && 'rounded-none'\n )}\n >\n <div className=\"grid gap-[4px]\">\n <div className=\"text-[16px] font-bold leading-[1.4]\">{item.title}</div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {data.valueLabel}: {item.value} {data?.pointUnit}\n </div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {item?.couponCode ? `${data?.code || 'Code'}: ${item.couponCode} ` : ''}\n {item?.couponCode && (\n <span\n className=\"cursor-pointer text-[14px] font-semibold text-brand underline\"\n onClick={() => {\n handleCopy(item.couponCode, index)\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }}\n >\n {copied === index ? data?.copied || 'COPIED' : data?.copy || 'COPY'}\n </span>\n )}\n </div>\n </div>\n <div className=\"grid gap-[4px] text-right\">\n <div\n className={classNames(\n 'flex items-center justify-end text-[16px] font-bold leading-[1.4]',\n `text-[${ColorMap[item.type]}]`\n )}\n >\n <span>{TypeMap[item.type]}</span>\n {TipMap[item.type] && <Tip info={TipMap[item.type]} index={index} />}\n </div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {dayjs(item.date).format('YYYY-MM-DD HH:mm').toString()}\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center\">\n <Picture\n className=\"mb-[12px] w-[160px]\"\n source={data?.emptyListImage?.url}\n alt={data?.emptyListImage?.alt || 'empty list image'}\n ></Picture>\n <div className=\"text-[16px] font-semibold leading-[1.4]\">{data?.emptyListLabel}</div>\n </div>\n )}\n </div>\n )}\n </CreditsModalContainer>\n )\n}\n\nexport default MyRewardsModal\n"],
5
+ "mappings": "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",
6
+ "names": ["MyRewardsModal_exports", "__export", "MyRewardsModal_default", "__toCommonJS", "import_jsx_runtime", "import_headless_ui", "import_classnames", "import_copy_to_clipboard", "import_dayjs", "import_react", "import_const", "import_modalContainer", "import_tip", "import_loadingDots", "import_useMyRewards", "import_lib", "MyRewardsModal", "data", "props", "activeTab", "setActiveTab", "brand", "rounded", "couponPage", "setCouponPage", "productPage", "setProductPage", "copied", "setCopied", "tabs", "availableTabs", "myProductRewardsOptions", "myCouponRewardsOptions", "myCouponRewards", "couponCanNext", "couponIsLoading", "useMyRewards", "myProductRewards", "productCanNext", "productIsLoading", "list", "item", "type", "canNext", "TypeMap", "TipMap", "ColorMap", "handleScrollEnd", "handleCopy", "code", "idx", "clipboard", "isLoading", "classNames", "value", "tab", "LoadingDots", "index", "e", "Tip", "dayjs"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var B=Object.create;var x=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var j=(e,n)=>{for(var r in n)x(e,r,{get:n[r],enumerable:!0})},M=(e,n,r,g)=>{if(n&&typeof n=="object"||typeof n=="function")for(let l of I(n))!V.call(e,l)&&l!==r&&x(e,l,{get:()=>n[l],enumerable:!(g=z(n,l))||g.enumerable});return e};var k=(e,n,r)=>(r=e!=null?B(O(e)):{},M(n||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e)),F=e=>M(x({},"__esModule",{value:!0}),e);var K={};j(K,{default:()=>q});module.exports=F(K);var t=require("react/jsx-runtime"),o=require("react"),C=require("../context/provider"),s=require("../context/const"),P=k(require("../context/hooks/useActivities")),S=require("./ModalContainer"),c=require("@anker-in/lib"),d=require("@anker-in/headless-ui"),D=k(require("./LoadingDots")),f=require("@anker-in/headless-ui"),L=require("../../../constants"),v=k(require("dayjs"));function H({data:e,...n}){const[r,g]=(0,o.useState)(1),{taskIdToTypeMapping:l,taskNameMapping:b}=(0,C.useCreditsContext)(),{brand:U}=(0,c.useHeadlessContext)(),N=L.ROUNDED_BRANDS.includes(U),R=(0,o.useMemo)(()=>({page:n.isOpen?r:0,pageSize:1e3}),[n.isOpen,r]),y=(0,o.useMemo)(()=>{const i=[{title:e.allTab,type:s.CreditType.All},{title:e.earnedTab,type:s.CreditType.Earned},{title:e.deductedTab,type:s.CreditType.Deducted}];return e.expiredTab&&i.push({title:e.expiredTab,type:s.CreditType.Expired}),i},[e]),{activities:h=[],canNext:_,isLoading:A}=(0,P.default)(R),u=(0,o.useMemo)(()=>{const i={[s.TaskSubType.Activation]:e.activationTask,[s.TaskSubType.UpdateName]:e.updateNameTask,[s.TaskSubType.UpdatePhone]:e.updatePhoneTask,[s.TaskSubType.UpdateBirthday]:e.updateBirthdayTask,[s.TaskSubType.Subscription]:e.subscriptionTask,[s.TaskSubType.UpadteAppName]:e.updateAppNameTask,[s.TaskSubType.Refund]:e.refundTask,[s.TaskSubType.ProductUnApproved]:e.productUnApprovedTask},p={[s.DTC_TASK_TYPE.FirstPurchase]:e.firstPurchaseTask,[s.DTC_TASK_TYPE.UploadReceipt]:e.uploadReceiptTask,[s.DTC_TASK_TYPE.Shopping]:e.shoppingTask};function T(a){return b?.[a.task_name]?b?.[a.task_name]:a.task_type===s.TaskType.Redeem&&a.task_sub_type===s.TaskSubType.ProductUnApproved&&e.productUnApprovedTask?a.task_name.replace("Refund",e.productUnApprovedTask):l?.[String(a.task_rule_id)]?p[l?.[String(a.task_rule_id)]]||a.task_name:i[a.task_sub_type]||a.task_name}return h.map(a=>({title:T(a),date:new Date(a.create_time*1e3),value:a.credit,type:a.credit_type,pending_time:a.pending_time,credit_type:a.credit_type,status:a.status}))},[e.activationTask,e.updateNameTask,e.updatePhoneTask,e.updateBirthdayTask,e.subscriptionTask,e.updateAppNameTask,e.refundTask,e.productUnApprovedTask,e.firstPurchaseTask,e.uploadReceiptTask,e.shoppingTask,h,l]),m=(0,o.useCallback)(i=>{let{value:p,...T}=i;return i.type===s.CreditType.Deducted&&p>0&&(p=-p),{value:p,...T}},[]),w=(0,o.useMemo)(()=>{const i=new Map;return i.set(s.CreditType.All,u.map(m)),i.set(s.CreditType.Earned,u.filter(p=>p.type===1).map(m)),i.set(s.CreditType.Deducted,u.filter(p=>p.type===2&&p.status!==3).map(m)),i.set(s.CreditType.Expired,u.filter(p=>p.type===2&&p.status===3).map(m)),i},[u,m]),E=(0,o.useCallback)(()=>{_&&g(r+1)},[r,_]),Y=i=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"flex-1 overflow-auto overscroll-contain",children:(0,t.jsxs)("div",{className:"grid gap-[18px] md:gap-[12px]",children:[A&&(0,t.jsx)("div",{className:"flex flex-1 flex-col items-center justify-center",children:(0,t.jsx)(D.default,{})}),!A&&(0,t.jsx)(t.Fragment,{children:i.length>0?i.map((p,T)=>(0,t.jsxs)("div",{className:(0,c.classNames)("flex h-fit items-center justify-between rounded-[8px] bg-[#f2f0f1] px-[16px] py-[20px] text-[16px]",!N&&"rounded-none"),children:[(0,t.jsxs)("div",{className:"grid gap-[6px]",children:[(0,t.jsx)("div",{className:"font-bold",children:p.title}),(0,t.jsx)("div",{className:"text-[14px] font-semibold text-[#999]",children:(0,v.default)(p.date).format("YYYY-MM-DD HH:mm").toString()}),!e.pendingTips&&(0,t.jsxs)("div",{className:`hidden text-[14px] font-semibold text-[#777] ${p.status===2&&p.credit_type===1?"!flex":""}`,children:[(0,t.jsx)(f.Text,{html:e.pendingTips}),(0,t.jsx)("span",{children:v.default.unix(p.pending_time).add(1,"day").format("YYYY-MM-DD")}),e.pendingTips2&&(0,t.jsx)(f.Text,{html:e.pendingTips2})]})]}),(0,t.jsxs)("div",{className:(0,c.classNames)("font-bold",p.value>=0||p.credit_type===s.CreditType.Expired?"text-[#52C41A]":"text-[#F84D4F]"),children:[p.value>=0&&"+",p.value]})]},T)):(0,t.jsxs)("div",{className:"flex flex-col items-center justify-center py-[40px]",children:[(0,t.jsx)(f.Picture,{className:"mb-[16px] h-[120px] w-[160px]",source:e?.emptyListImage?.url,alt:e?.emptyListImage?.alt||"empty list image"}),(0,t.jsx)("div",{className:"leading-1.4 text-[16px] font-semibold",children:e?.emptyListLabel})]})})]})}),i.length>0&&(0,t.jsx)("div",{className:"mt-[12px] pb-[24px] text-[14px] font-semibold text-[#999]",children:e.tips})]});return(0,t.jsx)(S.CreditsModalContainer,{title:e.title,className:(0,c.classNames)("h-[800px] w-[640px]"),useAnimation:!0,animationClassName:"md:translate-y-[100vh]",scrollClassName:"flex flex-col",...n,onScrollEnd:E,children:(0,t.jsxs)(d.Tabs,{align:"left",shape:N?"rounded":"square",defaultValue:y[0]?.type?.toString(),className:"flex-1 flex flex-col",children:[(0,t.jsx)("div",{className:"w-full sticky top-0 bg-white z-10 pb-[24px] overflow-x-auto",children:(0,t.jsx)(d.TabsList,{children:y.map(i=>(0,t.jsx)(d.TabsTrigger,{value:i.type.toString(),children:i.title},i.type))})}),y.map(i=>(0,t.jsx)(d.TabsContent,{value:i.type.toString(),className:"flex-1 flex flex-col",children:Y(w.get(i.type)||[])},i.type))]})})}var q=H;
2
+ //# sourceMappingURL=ActivitiesModal.js.map