@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,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": ["Fragment", "jsx", "jsxs", "React", "useEffect", "useCallback", "Dialog", "DEFAULT_COMMON_TEXT", "ChatBubble", "ChatWindow", "ComplianceDialog", "useChatState", "useChatAPI", "MessageRendererRegistry", "sanitizeInput", "saveUserId", "transformProducts", "transformCartData", "Cookies", "TextBlock", "ProductCard", "ProductList", "ProductComparisonRenderer", "PolicyBlock", "createQuickRepliesRenderer", "ThinkingBlock", "ErrorBlock", "FAQListRenderer", "PromotionListRenderer", "CartCard", "LiveChatWidget", "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", "hasAgreedCompliance", "setHasAgreedCompliance", "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": ["Fragment", "jsx", "jsxs", "React", "useEffect", "useCallback", "Dialog", "DEFAULT_COMMON_TEXT", "ChatBubble", "ChatWindow", "ComplianceDialog", "useChatState", "useChatAPI", "MessageRendererRegistry", "sanitizeInput", "saveUserId", "transformProducts", "transformCartData", "Cookies", "TextBlock", "ProductCard", "ProductList", "ProductComparisonRenderer", "PolicyBlock", "createQuickRepliesRenderer", "ThinkingBlock", "ErrorBlock", "FAQListRenderer", "PromotionListRenderer", "CartCard", "LiveChatWidget", "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", "hasAgreedCompliance", "setHasAgreedCompliance", "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
+ import i from"../../../../helpers/fetcher.js";import a from"swr/mutation";import{useCreditsContext as n}from"../provider.js";import{useShopifyContext as r}from"../../../../shopify/context/ShopifyProvider";function u(){const{profile:e}=n(),{appName:t,locale:o}=r();return a("send-email-validation",()=>i({locale:o,url:"/api/multipass/account/users/send_validation_email",method:"POST",body:{email:e?.email,app:t},needRecaptcha:!0,action:"verifyAccount"}))}export{u as useSendEmailValidation};
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": "AAAA,OAAOA,MAAa,iCACpB,OAAOC,MAAoB,eAC3B,OAAS,qBAAAC,MAAyB,iBAClC,OAAS,qBAAAC,MAAyB,8CAE3B,SAASC,GAAyB,CACvC,KAAM,CAAE,QAAAC,CAAQ,EAAIH,EAAkB,EAChC,CAAE,QAAAI,EAAS,OAAAC,CAAO,EAAIJ,EAAkB,EAE9C,OAAOF,EAAe,wBAAyB,IAC7CD,EAAQ,CACN,OAAAO,EACA,IAAK,qDACL,OAAQ,OACR,KAAM,CAAE,MAAOF,GAAS,MAAO,IAAKC,CAAQ,EAC5C,cAAe,GACf,OAAQ,eACV,CAAC,CACH,CACF",
6
+ "names": ["fetcher", "useSWRMutation", "useCreditsContext", "useShopifyContext", "useSendEmailValidation", "profile", "appName", "locale"]
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
+ import{useRouter as i}from"next/router";import{useCallback as u,useEffect as a,useRef as p,useState as f}from"react";import l from"../../../../helpers/fetcher.js";function b(e){const t=p(!1),[n,c]=f(),{locale:o}=i(),s=u(async()=>{if(e&&!t.current){t.current=!0;try{const r=await l({method:"GET",url:"/api/multipass/account/subscriptions",body:{email:e},action:"login",locale:o,headers:{},type:""});r&&c(r)}catch(r){console.error(r)}finally{t.current=!1}}},[e,o,t]);return a(()=>{s()},[s]),{subscriptionData:n}}var d=b;export{d as default};
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": "AAAA,OAAS,aAAAA,MAAiB,cAC1B,OAAS,eAAAC,EAAa,aAAAC,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAEzD,OAAOC,MAAa,iCAEpB,SAASC,EAAiBC,EAAgB,CACxC,MAAMC,EAAUL,EAAO,EAAK,EACtB,CAACM,EAAkBC,CAAmB,EAAIN,EAAuB,EACjE,CAAE,OAAAO,CAAO,EAAIX,EAAU,EAEvBY,EAAoBX,EAAY,SAAY,CAChD,GAAKM,GAID,CAAAC,EAAQ,QAIZ,CAAAA,EAAQ,QAAU,GAElB,GAAI,CACF,MAAMK,EAAW,MAAMR,EAAQ,CAC7B,OAAQ,MACR,IAAK,uCACL,KAAM,CACJ,MAAAE,CACF,EACA,OAAQ,QACR,OAAAI,EACA,QAAS,CAAC,EACV,KAAM,EACR,CAAC,EAEGE,GACFH,EAAoBG,CAAQ,CAEhC,OAASC,EAAO,CACd,QAAQ,MAAMA,CAAK,CACrB,QAAE,CACAN,EAAQ,QAAU,EACpB,EACF,EAAG,CAACD,EAAOI,EAAQH,CAAO,CAAC,EAE3B,OAAAN,EAAU,IAAM,CACdU,EAAkB,CACpB,EAAG,CAACA,CAAiB,CAAC,EAEf,CACL,iBAAAH,CACF,CACF,CAEA,IAAOM,EAAQT",
6
+ "names": ["useRouter", "useCallback", "useEffect", "useRef", "useState", "fetcher", "useSubscriptions", "email", "loading", "subscriptionData", "setSubscriptionData", "locale", "fetchSubscription", "response", "error", "useSubscriptions_default"]
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
- import{jsx as T}from"react/jsx-runtime";import{createContext as R,useContext as w,useState as o}from"react";const t=R({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 B({children:e,profile:n,removeProfile:i,isLoadingProfile:r,openSignInPopup:s,openSignUpPopup:a,taskIdToTypeMapping:d,creditInfo:p,customer:l,customerLoading:c,fetchCreditInfo:u,gtm:f,pageCommon:g,memberPriceDiscount:C,alpcBrand:m,alpcCountry:M,cartConfig:v,apiBaseUrl:y}){const[P,b]=o(!1),[A,x]=o(!1);return T(t.Provider,{value:{profile:n,isLoadingProfile:r,removeProfile:i,openSignInPopup:s,openSignUpPopup:a,taskIdToTypeMapping:d,creditInfo:p,fetchCreditInfo:u,customer:l,customerLoading:c,gtm:f,pageCommon:g,memberPriceDiscount:C,alpcBrand:m,alpcCountry:M,cartConfig:v,apiBaseUrl:y,openMyRewardsModal:P,setOpenMyRewardsModal:b,openActivitiesModal:A,setOpenActivitiesModal:x},children:e})}function D(){const e=w(t);if(!e)throw new Error("useCreditsContext must be used within a CreditsProvider");return e}export{t as CreditsContext,B as CreditsProvider,D as useCreditsContext};
1
+ import{jsx as I}from"react/jsx-runtime";import{createContext as w,useContext as T,useState as o}from"react";const t=w({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 B({children:e,profile:n,removeProfile:i,isLoadingProfile:r,openSignInPopup:a,openSignUpPopup:s,taskIdToTypeMapping:d,taskNameMapping:p,creditInfo:l,customer:c,customerLoading:g,fetchCreditInfo:u,gtm:f,pageCommon:m,memberPriceDiscount:C,alpcBrand:M,alpcCountry:v,cartConfig:y,apiBaseUrl:P}){const[b,A]=o(!1),[R,x]=o(!1);return I(t.Provider,{value:{profile:n,isLoadingProfile:r,removeProfile:i,openSignInPopup:a,openSignUpPopup:s,taskIdToTypeMapping:d,taskNameMapping:p,creditInfo:l,fetchCreditInfo:u,customer:c,customerLoading:g,gtm:f,pageCommon:m,memberPriceDiscount:C,alpcBrand:M,alpcCountry:v,cartConfig:y,apiBaseUrl:P,openMyRewardsModal:b,setOpenMyRewardsModal:A,openActivitiesModal:R,setOpenActivitiesModal:x},children:e})}function D(){const e=T(t);if(!e)throw new Error("useCreditsContext must be used within a CreditsProvider");return e}export{t as CreditsContext,B as CreditsProvider,D as useCreditsContext};
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": "AA6FI,cAAAA,MAAA,oBA7FJ,OAAS,iBAAAC,EAAkC,cAAAC,EAAY,YAAAC,MAAgB,QA2ChE,MAAMC,EAAiBH,EAAuB,CACnD,QAAS,KACT,iBAAkB,GAClB,oBAAqB,CAAC,EACtB,cAAe,IAAM,CAAC,EACtB,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,WAAY,OACZ,gBAAiB,GACjB,gBAAkBI,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,SAASC,EAAgB,CAC9B,SAAAC,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,EAAIvB,EAAS,EAAK,EAC5D,CAACwB,EAAqBC,CAAsB,EAAIzB,EAAS,EAAK,EAEpE,OACEH,EAACI,EAAe,SAAf,CACC,MAAO,CACL,QAAAI,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,SAASsB,GAAoB,CAClC,MAAMC,EAAU5B,EAAWE,CAAc,EACzC,GAAI,CAAC0B,EACH,MAAM,IAAI,MAAM,yDAAyD,EAE3E,OAAOA,CACT",
6
- "names": ["jsx", "createContext", "useContext", "useState", "CreditsContext", "user_id", "CreditsProvider", "children", "profile", "removeProfile", "isLoadingProfile", "openSignInPopup", "openSignUpPopup", "taskIdToTypeMapping", "creditInfo", "customer", "customerLoading", "fetchCreditInfo", "gtm", "pageCommon", "memberPriceDiscount", "alpcBrand", "alpcCountry", "cartConfig", "apiBaseUrl", "openMyRewardsModal", "setOpenMyRewardsModal", "openActivitiesModal", "setOpenActivitiesModal", "useCreditsContext", "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": "AAgGI,cAAAA,MAAA,oBAhGJ,OAAS,iBAAAC,EAAkC,cAAAC,EAAY,YAAAC,MAAgB,QA4ChE,MAAMC,EAAiBH,EAAuB,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,gBAAkBI,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,SAASC,EAAgB,CAC9B,SAAAC,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,EAAIxB,EAAS,EAAK,EAC5D,CAACyB,EAAqBC,CAAsB,EAAI1B,EAAS,EAAK,EAEpE,OACEH,EAACI,EAAe,SAAf,CACC,MAAO,CACL,QAAAI,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,SAASuB,GAAoB,CAClC,MAAMC,EAAU7B,EAAWE,CAAc,EACzC,GAAI,CAAC2B,EACH,MAAM,IAAI,MAAM,yDAAyD,EAE3E,OAAOA,CACT",
6
+ "names": ["jsx", "createContext", "useContext", "useState", "CreditsContext", "user_id", "CreditsProvider", "children", "profile", "removeProfile", "isLoadingProfile", "openSignInPopup", "openSignUpPopup", "taskIdToTypeMapping", "taskNameMapping", "creditInfo", "customer", "customerLoading", "fetchCreditInfo", "gtm", "pageCommon", "memberPriceDiscount", "alpcBrand", "alpcCountry", "cartConfig", "apiBaseUrl", "openMyRewardsModal", "setOpenMyRewardsModal", "openActivitiesModal", "setOpenActivitiesModal", "useCreditsContext", "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
+ import{jsx as s,jsxs as l}from"react/jsx-runtime";import{Tabs as $,TabsList as z,TabsTrigger as q,Picture as B}from"@anker-in/headless-ui";import m from"classnames";import K from"copy-to-clipboard";import V from"dayjs";import{useCallback as w,useMemo as p,useState as c}from"react";import{ApprovalStatus as g,AlpcConsumeType as n,RewardType as t}from"../context/const";import{CreditsModalContainer as G}from"./modalContainer";import J from"./tip";import Q from"./loadingDots";import R from"../context/hooks/useMyRewards";import{useHeadlessContext as W,ROUNDED_BRANDS as X}from"@anker-in/lib";function Z({data:o,...a}){const[r,S]=c(n.Coupon),{brand:F}=W(),b=X.includes(F),[d,_]=c(1),[u,h]=c(1),[D,v]=c(-1),A=p(()=>{const e=[];return o.couponTab&&e.push({title:o.couponTab,type:n.Coupon}),o.productTab&&e.push({title:o.productTab,type:n.Product}),e},[o.couponTab,o.productTab]),O=p(()=>({page:a.isOpen?u:0,pageSize:1e3,consumeType:n.Product}),[a.isOpen,u]),I=p(()=>({page:a.isOpen?d:0,pageSize:1e3,consumeType:n.Coupon}),[a.isOpen,d]),{myRewards:x=[],canNext:y,isLoading:U}=R(I),{myRewards:C=[],canNext:N,isLoading:k}=R(O),T=p(()=>r===n.Coupon?x.map(e=>({title:e.goods_title,value:e.consume_credits,type:t.Received,date:new Date(e.create_time*1e3),couponCode:e.coupon_code,orderNumber:""})):r===n.Product?C.map(e=>{let i=t.Pending;return e.fulfillment_status&&e.fulfillment_status!=="null"?e.fulfillment_status==="fulfilled"?i=t.Fulfilled:i=t.Unfulfilled:e.approval_status===g.Success||e.approval_status===g.DoubleConfirm?i=t.ApproveSuccess:e.approval_status===g.Failed&&(i=t.Failed),{title:e.goods_title,value:e.consume_credits,type:i,date:new Date(e.create_time*1e3),orderNumber:e.order_number,couponCode:""}}):[],[r,C,x]),L=p(()=>r===n.Coupon?y:r===n.Product?N:!1,[r,y,N]),E=p(()=>({[t.Received]:o.receivedLabel,[t.Pending]:o.pendingLabel,[t.ApproveFail]:o.failedLabel,[t.ApproveSuccess]:o.approveSuccessLabel,[t.Unfulfilled]:o.unfulfilledLabel,[t.Fulfilled]:o.fulfilledLabel,[t.Failed]:o.failedLabel}),[o]),P=p(()=>({[t.Received]:"",[t.Pending]:o.pendingTip,[t.ApproveFail]:"",[t.ApproveSuccess]:o.confirmedTip,[t.Unfulfilled]:o.processingTip,[t.Fulfilled]:o.ShippedTip,[t.Failed]:""}),[o]),Y=p(()=>({[t.Received]:"#52C41A",[t.Pending]:"#999",[t.ApproveFail]:"#F84D4F",[t.ApproveSuccess]:"#999",[t.Unfulfilled]:"#999",[t.Fulfilled]:"#999",[t.Failed]:"#F84D4F"}),[]),j=w(()=>{L&&(r===n.Coupon?_(d+1):r===n.Product&&h(u+1))},[r,u,d,L]),H=w((e,i)=>{v(i),K(e),setTimeout(()=>{v(-1)},2e3)},[]),M=r===n.Coupon?U:k;return l(G,{title:o.title,className:m("h-[800px] w-[640px]"),useAnimation:!0,animationClassName:"md:translate-y-[100vh]",scrollClassName:"md:mb-0",...a,onScrollEnd:j,children:[s("div",{className:"",children:s($,{align:"left",shape:b?"rounded":"square",value:r.toString(),onValueChange:e=>{S(Number(e))},children:s(z,{children:A.map(e=>s(q,{value:e.type.toString(),children:e.title},e.type))})})}),M&&s("div",{className:"flex h-full flex-col items-center justify-center",children:s(Q,{})}),!M&&s("div",{className:"mt-[24px] overflow-auto overscroll-contain",children:T.length>0?s("div",{className:"grid gap-[18px] md:gap-[12px]",children:T.map((e,i)=>l("div",{className:"grid gap-[8px]",children:[e?.orderNumber&&l("div",{className:"text-[15px] font-semibold leading-[1.4] text-[#777]",children:[o.orderNumberLabel,": ",e.orderNumber]}),l("div",{className:m("flex items-center justify-between rounded-[8px] bg-[#f7f8f9] px-[16px] py-[20px]",!b&&"rounded-none"),children:[l("div",{className:"grid gap-[4px]",children:[s("div",{className:"text-[16px] font-bold leading-[1.4]",children:e.title}),l("div",{className:"text-[14px] font-semibold text-[#999]",children:[o.valueLabel,": ",e.value," ",o?.pointUnit]}),l("div",{className:"text-[14px] font-semibold text-[#999]",children:[e?.couponCode?`${o?.code||"Code"}: ${e.couponCode} `:"",e?.couponCode&&s("span",{className:"cursor-pointer text-[14px] font-semibold text-brand underline",onClick:()=>{H(e.couponCode,i)},role:"button",tabIndex:0,onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&f.preventDefault()},children:D===i?o?.copied||"COPIED":o?.copy||"COPY"})]})]}),l("div",{className:"grid gap-[4px] text-right",children:[l("div",{className:m("flex items-center justify-end text-[16px] font-bold leading-[1.4]",`text-[${Y[e.type]}]`),children:[s("span",{children:E[e.type]}),P[e.type]&&s(J,{info:P[e.type],index:i})]}),s("div",{className:"text-[14px] font-semibold text-[#999]",children:V(e.date).format("YYYY-MM-DD HH:mm").toString()})]})]})]},i))}):l("div",{className:"flex h-full flex-col items-center justify-center",children:[s(B,{className:"mb-[12px] w-[160px]",source:o?.emptyListImage?.url,alt:o?.emptyListImage?.alt||"empty list image"}),s("div",{className:"text-[16px] font-semibold leading-[1.4]",children:o?.emptyListLabel})]})})]})}var ue=Z;export{ue as default};
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": ["jsx", "jsxs", "Tabs", "TabsList", "TabsTrigger", "Picture", "classNames", "clipboard", "dayjs", "useCallback", "useMemo", "useState", "ApprovalStatus", "AlpcConsumeType", "RewardType", "CreditsModalContainer", "Tip", "LoadingDots", "useMyRewards", "useHeadlessContext", "ROUNDED_BRANDS", "MyRewardsModal", "data", "props", "activeTab", "setActiveTab", "brand", "rounded", "couponPage", "setCouponPage", "productPage", "setProductPage", "copied", "setCopied", "tabs", "availableTabs", "myProductRewardsOptions", "myCouponRewardsOptions", "myCouponRewards", "couponCanNext", "couponIsLoading", "myProductRewards", "productCanNext", "productIsLoading", "list", "item", "type", "canNext", "TypeMap", "TipMap", "ColorMap", "handleScrollEnd", "handleCopy", "code", "idx", "isLoading", "value", "tab", "index", "e", "MyRewardsModal_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Fragment as M,jsx as p,jsxs as r}from"react/jsx-runtime";import{useCallback as h,useMemo as u,useState as R}from"react";import{useCreditsContext as w}from"../context/provider";import{CreditType as a,DTC_TASK_TYPE as g,TaskSubType as n,TaskType as E}from"../context/const";import Y from"../context/hooks/useActivities";import{CreditsModalContainer as B}from"./ModalContainer";import{classNames as x,useHeadlessContext as z}from"@anker-in/lib";import{Tabs as I,TabsContent as O,TabsList as V,TabsTrigger as j}from"@anker-in/headless-ui";import F from"./LoadingDots";import{Picture as H,Text as _}from"@anker-in/headless-ui";import{ROUNDED_BRANDS as q}from"../../../constants";import A from"dayjs";function K({data:e,...m}){const[c,C]=R(1),{taskIdToTypeMapping:T,taskNameMapping:y}=w(),{brand:P}=z(),k=q.includes(P),S=u(()=>({page:m.isOpen?c:0,pageSize:1e3}),[m.isOpen,c]),f=u(()=>{const t=[{title:e.allTab,type:a.All},{title:e.earnedTab,type:a.Earned},{title:e.deductedTab,type:a.Deducted}];return e.expiredTab&&t.push({title:e.expiredTab,type:a.Expired}),t},[e]),{activities:v=[],canNext:b,isLoading:N}=Y(S),o=u(()=>{const t={[n.Activation]:e.activationTask,[n.UpdateName]:e.updateNameTask,[n.UpdatePhone]:e.updatePhoneTask,[n.UpdateBirthday]:e.updateBirthdayTask,[n.Subscription]:e.subscriptionTask,[n.UpadteAppName]:e.updateAppNameTask,[n.Refund]:e.refundTask,[n.ProductUnApproved]:e.productUnApprovedTask},s={[g.FirstPurchase]:e.firstPurchaseTask,[g.UploadReceipt]:e.uploadReceiptTask,[g.Shopping]:e.shoppingTask};function d(i){return y?.[i.task_name]?y?.[i.task_name]:i.task_type===E.Redeem&&i.task_sub_type===n.ProductUnApproved&&e.productUnApprovedTask?i.task_name.replace("Refund",e.productUnApprovedTask):T?.[String(i.task_rule_id)]?s[T?.[String(i.task_rule_id)]]||i.task_name:t[i.task_sub_type]||i.task_name}return v.map(i=>({title:d(i),date:new Date(i.create_time*1e3),value:i.credit,type:i.credit_type,pending_time:i.pending_time,credit_type:i.credit_type,status:i.status}))},[e.activationTask,e.updateNameTask,e.updatePhoneTask,e.updateBirthdayTask,e.subscriptionTask,e.updateAppNameTask,e.refundTask,e.productUnApprovedTask,e.firstPurchaseTask,e.uploadReceiptTask,e.shoppingTask,v,T]),l=h(t=>{let{value:s,...d}=t;return t.type===a.Deducted&&s>0&&(s=-s),{value:s,...d}},[]),D=u(()=>{const t=new Map;return t.set(a.All,o.map(l)),t.set(a.Earned,o.filter(s=>s.type===1).map(l)),t.set(a.Deducted,o.filter(s=>s.type===2&&s.status!==3).map(l)),t.set(a.Expired,o.filter(s=>s.type===2&&s.status===3).map(l)),t},[o,l]),L=h(()=>{b&&C(c+1)},[c,b]),U=t=>r(M,{children:[p("div",{className:"flex-1 overflow-auto overscroll-contain",children:r("div",{className:"grid gap-[18px] md:gap-[12px]",children:[N&&p("div",{className:"flex flex-1 flex-col items-center justify-center",children:p(F,{})}),!N&&p(M,{children:t.length>0?t.map((s,d)=>r("div",{className:x("flex h-fit items-center justify-between rounded-[8px] bg-[#f2f0f1] px-[16px] py-[20px] text-[16px]",!k&&"rounded-none"),children:[r("div",{className:"grid gap-[6px]",children:[p("div",{className:"font-bold",children:s.title}),p("div",{className:"text-[14px] font-semibold text-[#999]",children:A(s.date).format("YYYY-MM-DD HH:mm").toString()}),!e.pendingTips&&r("div",{className:`hidden text-[14px] font-semibold text-[#777] ${s.status===2&&s.credit_type===1?"!flex":""}`,children:[p(_,{html:e.pendingTips}),p("span",{children:A.unix(s.pending_time).add(1,"day").format("YYYY-MM-DD")}),e.pendingTips2&&p(_,{html:e.pendingTips2})]})]}),r("div",{className:x("font-bold",s.value>=0||s.credit_type===a.Expired?"text-[#52C41A]":"text-[#F84D4F]"),children:[s.value>=0&&"+",s.value]})]},d)):r("div",{className:"flex flex-col items-center justify-center py-[40px]",children:[p(H,{className:"mb-[16px] h-[120px] w-[160px]",source:e?.emptyListImage?.url,alt:e?.emptyListImage?.alt||"empty list image"}),p("div",{className:"leading-1.4 text-[16px] font-semibold",children:e?.emptyListLabel})]})})]})}),t.length>0&&p("div",{className:"mt-[12px] pb-[24px] text-[14px] font-semibold text-[#999]",children:e.tips})]});return p(B,{title:e.title,className:x("h-[800px] w-[640px]"),useAnimation:!0,animationClassName:"md:translate-y-[100vh]",scrollClassName:"flex flex-col",...m,onScrollEnd:L,children:r(I,{align:"left",shape:k?"rounded":"square",defaultValue:f[0]?.type?.toString(),className:"flex-1 flex flex-col",children:[p("div",{className:"w-full sticky top-0 bg-white z-10 pb-[24px] overflow-x-auto",children:p(V,{children:f.map(t=>p(j,{value:t.type.toString(),children:t.title},t.type))})}),f.map(t=>p(O,{value:t.type.toString(),className:"flex-1 flex flex-col",children:U(D.get(t.type)||[])},t.type))]})})}var pe=K;export{pe as default};
2
+ //# sourceMappingURL=ActivitiesModal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/components/credits/modal/ActivitiesModal.tsx"],
4
+ "sourcesContent": ["import { useCallback, useMemo, useState } from 'react'\nimport { useCreditsContext } from '../context/provider'\nimport { CreditType, DTC_TASK_TYPE, TaskSubType, TaskType } from '../context/const'\nimport useActivities from '../context/hooks/useActivities'\nimport type { Task } from '../context/response'\nimport { CreditsModalContainer, type ModalContainerProps } from './ModalContainer'\nimport { classNames as cn, useHeadlessContext } from '@anker-in/lib'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@anker-in/headless-ui'\nimport LoadingDots from './LoadingDots'\nimport { Picture, Text } from '@anker-in/headless-ui'\nimport { ROUNDED_BRANDS } from '../../../constants'\nimport dayjs from 'dayjs'\n\nexport interface MyActivitiesMetafields {\n title: string\n tips: string\n allTab: string\n earnedTab: string\n deductedTab: string\n expiredTab: string\n activationTask: string\n updateNameTask: string\n updatePhoneTask: string\n updateBirthdayTask: string\n updateAppNameTask: string\n subscriptionTask: string\n refundTask: string\n productUnApprovedTask: string\n pendingTips?: string\n pendingTips2?: string\n firstPurchaseTask: string\n uploadReceiptTask: string\n shoppingTask: string\n emptyListImage: {\n url: string\n alt?: string\n }\n emptyListLabel: string\n}\n\ninterface ActivitiesModalProps extends ModalContainerProps {\n data: MyActivitiesMetafields\n}\n\nfunction ActivitiesModal({ data, ...props }: ActivitiesModalProps) {\n const [page, setPage] = useState(1)\n const { taskIdToTypeMapping, taskNameMapping } = useCreditsContext()\n const { brand } = useHeadlessContext()\n const rounded = ROUNDED_BRANDS.includes(brand)\n\n const myActivitiesOptions = useMemo(() => {\n return {\n page: props.isOpen ? page : 0,\n pageSize: 1000,\n }\n }, [props.isOpen, page])\n\n const tabs = useMemo(() => {\n const tabs = [\n {\n title: data.allTab,\n type: CreditType.All,\n },\n {\n title: data.earnedTab,\n type: CreditType.Earned,\n },\n {\n title: data.deductedTab,\n type: CreditType.Deducted,\n },\n ]\n if (data.expiredTab) {\n tabs.push({\n title: data.expiredTab,\n type: CreditType.Expired,\n })\n }\n return tabs\n }, [data])\n\n const { activities = [], canNext, isLoading } = useActivities(myActivitiesOptions)\n\n const allList = useMemo(() => {\n const taskNameMap = {\n [TaskSubType.Activation]: data.activationTask,\n [TaskSubType.UpdateName]: data.updateNameTask,\n [TaskSubType.UpdatePhone]: data.updatePhoneTask,\n [TaskSubType.UpdateBirthday]: data.updateBirthdayTask,\n [TaskSubType.Subscription]: data.subscriptionTask,\n [TaskSubType.UpadteAppName]: data.updateAppNameTask,\n [TaskSubType.Refund]: data.refundTask,\n [TaskSubType.ProductUnApproved]: data.productUnApprovedTask,\n }\n const dtcTaskTypeToNameMap = {\n [DTC_TASK_TYPE.FirstPurchase]: data.firstPurchaseTask,\n [DTC_TASK_TYPE.UploadReceipt]: data.uploadReceiptTask,\n [DTC_TASK_TYPE.Shopping]: data.shoppingTask,\n }\n\n function getTitle(item: Task) {\n\n if(taskNameMapping?.[item.task_name]) {\n return taskNameMapping?.[item.task_name]\n }\n\n if (\n item.task_type === TaskType.Redeem &&\n item.task_sub_type === TaskSubType.ProductUnApproved &&\n data.productUnApprovedTask\n ) {\n // \u65B0\u589E\u7684\u90E8\u5206\u4EFB\u52A1\u90FD\u4F7F\u7528\u4E86 alpc \u540C\u4E00\u4E2A\u4EFB\u52A1\u7C7B\u578B\uFF0C\u9700\u8981\u7528\u4EFB\u52A1 id \u6765\u533A\u5206\n return item.task_name.replace('Refund', data.productUnApprovedTask)\n } else if (taskIdToTypeMapping?.[String(item.task_rule_id)]) {\n return dtcTaskTypeToNameMap[taskIdToTypeMapping?.[String(item.task_rule_id)]] || item.task_name\n } else {\n return taskNameMap[item.task_sub_type] || item.task_name\n }\n }\n\n return activities.map(item => ({\n title: getTitle(item),\n date: new Date(item.create_time * 1000),\n value: item.credit,\n type: item.credit_type,\n pending_time: item.pending_time,\n credit_type: item.credit_type,\n status: item.status,\n }))\n }, [\n data.activationTask,\n data.updateNameTask,\n data.updatePhoneTask,\n data.updateBirthdayTask,\n data.subscriptionTask,\n data.updateAppNameTask,\n data.refundTask,\n data.productUnApprovedTask,\n data.firstPurchaseTask,\n data.uploadReceiptTask,\n data.shoppingTask,\n activities,\n taskIdToTypeMapping,\n ])\n\n const normalizeValue = useCallback((item: (typeof allList)[number]) => {\n let { value, ...otherItem } = item\n if (item.type === CreditType.Deducted && value > 0) {\n value = -value\n }\n return { value, ...otherItem }\n }, [])\n\n // \u6309 tab \u7C7B\u578B\u9884\u8BA1\u7B97\u5217\u8868\uFF0C\u914D\u5408 TabsContent \u58F0\u660E\u5F0F\u6E32\u67D3\uFF0C\u907F\u514D\u624B\u52A8 activeTab \u6570\u503C\u6BD4\u8F83\n const listByTab = useMemo(() => {\n const map = new Map<CreditType, ReturnType<typeof normalizeValue>[]>()\n map.set(CreditType.All, allList.map(normalizeValue))\n map.set(\n CreditType.Earned,\n allList.filter(item => item.type === 1).map(normalizeValue)\n )\n map.set(\n CreditType.Deducted,\n allList.filter(item => item.type === 2 && item.status !== 3).map(normalizeValue)\n )\n map.set(\n CreditType.Expired,\n allList.filter(item => item.type === 2 && item.status === 3).map(normalizeValue)\n )\n return map\n }, [allList, normalizeValue])\n\n const handleScrollEnd = useCallback(() => {\n if (!canNext) {\n return\n }\n setPage(page + 1)\n }, [page, canNext])\n\n const renderList = (list: ReturnType<typeof normalizeValue>[]) => (\n <>\n <div className=\"flex-1 overflow-auto overscroll-contain\">\n <div className=\"grid gap-[18px] md:gap-[12px]\">\n {isLoading && (\n <div className=\"flex flex-1 flex-col items-center justify-center\">\n <LoadingDots />\n </div>\n )}\n\n {!isLoading && (\n <>\n {list.length > 0 ? (\n list.map((item, index) => (\n <div\n key={index}\n className={cn(\n 'flex h-fit items-center justify-between rounded-[8px] bg-[#f2f0f1] px-[16px] py-[20px] text-[16px]',\n !rounded && 'rounded-none'\n )}\n >\n <div className=\"grid gap-[6px]\">\n <div className=\"font-bold\">{item.title}</div>\n <div className=\"text-[14px] font-semibold text-[#999]\">\n {dayjs(item.date).format('YYYY-MM-DD HH:mm').toString()}\n </div>\n {!data.pendingTips && (\n <div\n className={`hidden text-[14px] font-semibold text-[#777] ${item.status === 2 && item.credit_type === 1 ? '!flex' : ''}`}\n >\n <Text html={data.pendingTips} />\n <span>{dayjs.unix(item.pending_time).add(1, 'day').format('YYYY-MM-DD')}</span>\n {data.pendingTips2 && <Text html={data.pendingTips2} />}\n </div>\n )}\n </div>\n <div\n className={cn(\n 'font-bold',\n item.value >= 0 || item.credit_type === CreditType.Expired ? 'text-[#52C41A]' : 'text-[#F84D4F]'\n )}\n >\n {item.value >= 0 && '+'}\n {item.value}\n </div>\n </div>\n ))\n ) : (\n <div className=\"flex flex-col items-center justify-center py-[40px]\">\n <Picture\n className=\"mb-[16px] h-[120px] w-[160px]\"\n source={data?.emptyListImage?.url}\n alt={data?.emptyListImage?.alt || 'empty list image'}\n ></Picture>\n <div className=\"leading-1.4 text-[16px] font-semibold\">{data?.emptyListLabel}</div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n {/* \u79EF\u5206\u5230\u8D26\u65F6\u95F4\u63D0\u9192 */}\n {list.length > 0 && <div className=\"mt-[12px] pb-[24px] text-[14px] font-semibold text-[#999]\">{data.tips}</div>}\n </>\n )\n\n return (\n <CreditsModalContainer\n title={data.title}\n className={cn('h-[800px] w-[640px]')}\n useAnimation\n animationClassName=\"md:translate-y-[100vh]\"\n scrollClassName=\"flex flex-col\"\n {...props}\n onScrollEnd={handleScrollEnd}\n >\n <Tabs align=\"left\" shape={rounded ? 'rounded' : 'square'} defaultValue={tabs[0]?.type?.toString()} className=\"flex-1 flex flex-col\">\n <div className=\"w-full sticky top-0 bg-white z-10 pb-[24px] overflow-x-auto\">\n <TabsList>\n {tabs.map(tab => (\n <TabsTrigger key={tab.type} value={tab.type.toString()}>\n {tab.title}\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n\n {tabs.map(tab => (\n <TabsContent key={tab.type} value={tab.type.toString()} className=\"flex-1 flex flex-col\">\n {renderList(listByTab.get(tab.type) || [])}\n </TabsContent>\n ))}\n </Tabs>\n </CreditsModalContainer>\n )\n}\n\nexport default ActivitiesModal\n"],
5
+ "mappings": "AAyLc,OAKF,YAAAA,EALE,OAAAC,EAqBU,QAAAC,MArBV,oBAzLd,OAAS,eAAAC,EAAa,WAAAC,EAAS,YAAAC,MAAgB,QAC/C,OAAS,qBAAAC,MAAyB,sBAClC,OAAS,cAAAC,EAAY,iBAAAC,EAAe,eAAAC,EAAa,YAAAC,MAAgB,mBACjE,OAAOC,MAAmB,iCAE1B,OAAS,yBAAAC,MAAuD,mBAChE,OAAS,cAAcC,EAAI,sBAAAC,MAA0B,gBACrD,OAAS,QAAAC,EAAM,eAAAC,EAAa,YAAAC,EAAU,eAAAC,MAAmB,wBACzD,OAAOC,MAAiB,gBACxB,OAAS,WAAAC,EAAS,QAAAC,MAAY,wBAC9B,OAAS,kBAAAC,MAAsB,qBAC/B,OAAOC,MAAW,QAiClB,SAASC,EAAgB,CAAE,KAAAC,EAAM,GAAGC,CAAM,EAAyB,CACjE,KAAM,CAACC,EAAMC,CAAO,EAAIvB,EAAS,CAAC,EAC5B,CAAE,oBAAAwB,EAAqB,gBAAAC,CAAgB,EAAIxB,EAAkB,EAC7D,CAAE,MAAAyB,CAAM,EAAIjB,EAAmB,EAC/BkB,EAAUV,EAAe,SAASS,CAAK,EAEvCE,EAAsB7B,EAAQ,KAC3B,CACL,KAAMsB,EAAM,OAASC,EAAO,EAC5B,SAAU,GACZ,GACC,CAACD,EAAM,OAAQC,CAAI,CAAC,EAEjBO,EAAO9B,EAAQ,IAAM,CACzB,MAAM8B,EAAO,CACX,CACE,MAAOT,EAAK,OACZ,KAAMlB,EAAW,GACnB,EACA,CACE,MAAOkB,EAAK,UACZ,KAAMlB,EAAW,MACnB,EACA,CACE,MAAOkB,EAAK,YACZ,KAAMlB,EAAW,QACnB,CACF,EACA,OAAIkB,EAAK,YACPS,EAAK,KAAK,CACR,MAAOT,EAAK,WACZ,KAAMlB,EAAW,OACnB,CAAC,EAEI2B,CACT,EAAG,CAACT,CAAI,CAAC,EAEH,CAAE,WAAAU,EAAa,CAAC,EAAG,QAAAC,EAAS,UAAAC,CAAU,EAAI1B,EAAcsB,CAAmB,EAE3EK,EAAUlC,EAAQ,IAAM,CAC5B,MAAMmC,EAAc,CAClB,CAAC9B,EAAY,UAAU,EAAGgB,EAAK,eAC/B,CAAChB,EAAY,UAAU,EAAGgB,EAAK,eAC/B,CAAChB,EAAY,WAAW,EAAGgB,EAAK,gBAChC,CAAChB,EAAY,cAAc,EAAGgB,EAAK,mBACnC,CAAChB,EAAY,YAAY,EAAGgB,EAAK,iBACjC,CAAChB,EAAY,aAAa,EAAGgB,EAAK,kBAClC,CAAChB,EAAY,MAAM,EAAGgB,EAAK,WAC3B,CAAChB,EAAY,iBAAiB,EAAGgB,EAAK,qBACxC,EACMe,EAAuB,CAC3B,CAAChC,EAAc,aAAa,EAAGiB,EAAK,kBACpC,CAACjB,EAAc,aAAa,EAAGiB,EAAK,kBACpC,CAACjB,EAAc,QAAQ,EAAGiB,EAAK,YACjC,EAEA,SAASgB,EAASC,EAAY,CAE5B,OAAGZ,IAAkBY,EAAK,SAAS,EAC1BZ,IAAkBY,EAAK,SAAS,EAIvCA,EAAK,YAAchC,EAAS,QAC5BgC,EAAK,gBAAkBjC,EAAY,mBACnCgB,EAAK,sBAGEiB,EAAK,UAAU,QAAQ,SAAUjB,EAAK,qBAAqB,EACzDI,IAAsB,OAAOa,EAAK,YAAY,CAAC,EACjDF,EAAqBX,IAAsB,OAAOa,EAAK,YAAY,CAAC,CAAC,GAAKA,EAAK,UAE/EH,EAAYG,EAAK,aAAa,GAAKA,EAAK,SAEnD,CAEA,OAAOP,EAAW,IAAIO,IAAS,CAC7B,MAAOD,EAASC,CAAI,EACpB,KAAM,IAAI,KAAKA,EAAK,YAAc,GAAI,EACtC,MAAOA,EAAK,OACZ,KAAMA,EAAK,YACX,aAAcA,EAAK,aACnB,YAAaA,EAAK,YAClB,OAAQA,EAAK,MACf,EAAE,CACJ,EAAG,CACDjB,EAAK,eACLA,EAAK,eACLA,EAAK,gBACLA,EAAK,mBACLA,EAAK,iBACLA,EAAK,kBACLA,EAAK,WACLA,EAAK,sBACLA,EAAK,kBACLA,EAAK,kBACLA,EAAK,aACLU,EACAN,CACF,CAAC,EAEKc,EAAiBxC,EAAauC,GAAmC,CACrE,GAAI,CAAE,MAAAE,EAAO,GAAGC,CAAU,EAAIH,EAC9B,OAAIA,EAAK,OAASnC,EAAW,UAAYqC,EAAQ,IAC/CA,EAAQ,CAACA,GAEJ,CAAE,MAAAA,EAAO,GAAGC,CAAU,CAC/B,EAAG,CAAC,CAAC,EAGCC,EAAY1C,EAAQ,IAAM,CAC9B,MAAM2C,EAAM,IAAI,IAChB,OAAAA,EAAI,IAAIxC,EAAW,IAAK+B,EAAQ,IAAIK,CAAc,CAAC,EACnDI,EAAI,IACFxC,EAAW,OACX+B,EAAQ,OAAOI,GAAQA,EAAK,OAAS,CAAC,EAAE,IAAIC,CAAc,CAC5D,EACAI,EAAI,IACFxC,EAAW,SACX+B,EAAQ,OAAOI,GAAQA,EAAK,OAAS,GAAKA,EAAK,SAAW,CAAC,EAAE,IAAIC,CAAc,CACjF,EACAI,EAAI,IACFxC,EAAW,QACX+B,EAAQ,OAAOI,GAAQA,EAAK,OAAS,GAAKA,EAAK,SAAW,CAAC,EAAE,IAAIC,CAAc,CACjF,EACOI,CACT,EAAG,CAACT,EAASK,CAAc,CAAC,EAEtBK,EAAkB7C,EAAY,IAAM,CACnCiC,GAGLR,EAAQD,EAAO,CAAC,CAClB,EAAG,CAACA,EAAMS,CAAO,CAAC,EAEZa,EAAcC,GAClBhD,EAAAF,EAAA,CACE,UAAAC,EAAC,OAAI,UAAU,0CACb,SAAAC,EAAC,OAAI,UAAU,gCACZ,UAAAmC,GACCpC,EAAC,OAAI,UAAU,mDACb,SAAAA,EAACkB,EAAA,EAAY,EACf,EAGD,CAACkB,GACApC,EAAAD,EAAA,CACG,SAAAkD,EAAK,OAAS,EACbA,EAAK,IAAI,CAACR,EAAMS,IACdjD,EAAC,OAEC,UAAWW,EACT,qGACA,CAACmB,GAAW,cACd,EAEA,UAAA9B,EAAC,OAAI,UAAU,iBACb,UAAAD,EAAC,OAAI,UAAU,YAAa,SAAAyC,EAAK,MAAM,EACvCzC,EAAC,OAAI,UAAU,wCACZ,SAAAsB,EAAMmB,EAAK,IAAI,EAAE,OAAO,kBAAkB,EAAE,SAAS,EACxD,EACC,CAACjB,EAAK,aACLvB,EAAC,OACC,UAAW,gDAAgDwC,EAAK,SAAW,GAAKA,EAAK,cAAgB,EAAI,QAAU,EAAE,GAErH,UAAAzC,EAACoB,EAAA,CAAK,KAAMI,EAAK,YAAa,EAC9BxB,EAAC,QAAM,SAAAsB,EAAM,KAAKmB,EAAK,YAAY,EAAE,IAAI,EAAG,KAAK,EAAE,OAAO,YAAY,EAAE,EACvEjB,EAAK,cAAgBxB,EAACoB,EAAA,CAAK,KAAMI,EAAK,aAAc,GACvD,GAEJ,EACAvB,EAAC,OACC,UAAWW,EACT,YACA6B,EAAK,OAAS,GAAKA,EAAK,cAAgBnC,EAAW,QAAU,iBAAmB,gBAClF,EAEC,UAAAmC,EAAK,OAAS,GAAK,IACnBA,EAAK,OACR,IA7BKS,CA8BP,CACD,EAEDjD,EAAC,OAAI,UAAU,sDACb,UAAAD,EAACmB,EAAA,CACC,UAAU,gCACV,OAAQK,GAAM,gBAAgB,IAC9B,IAAKA,GAAM,gBAAgB,KAAO,mBACnC,EACDxB,EAAC,OAAI,UAAU,wCAAyC,SAAAwB,GAAM,eAAe,GAC/E,EAEJ,GAEJ,EACF,EAECyB,EAAK,OAAS,GAAKjD,EAAC,OAAI,UAAU,4DAA6D,SAAAwB,EAAK,KAAK,GAC5G,EAGF,OACExB,EAACW,EAAA,CACC,MAAOa,EAAK,MACZ,UAAWZ,EAAG,qBAAqB,EACnC,aAAY,GACZ,mBAAmB,yBACnB,gBAAgB,gBACf,GAAGa,EACJ,YAAasB,EAEb,SAAA9C,EAACa,EAAA,CAAK,MAAM,OAAO,MAAOiB,EAAU,UAAY,SAAU,aAAcE,EAAK,CAAC,GAAG,MAAM,SAAS,EAAG,UAAU,uBAC3G,UAAAjC,EAAC,OAAI,UAAU,8DACb,SAAAA,EAACgB,EAAA,CACE,SAAAiB,EAAK,IAAIkB,GACRnD,EAACiB,EAAA,CAA2B,MAAOkC,EAAI,KAAK,SAAS,EAClD,SAAAA,EAAI,OADWA,EAAI,IAEtB,CACD,EACH,EACF,EAEClB,EAAK,IAAIkB,GACRnD,EAACe,EAAA,CAA2B,MAAOoC,EAAI,KAAK,SAAS,EAAG,UAAU,uBAC/D,SAAAH,EAAWH,EAAU,IAAIM,EAAI,IAAI,GAAK,CAAC,CAAC,GADzBA,EAAI,IAEtB,CACD,GACH,EACF,CAEJ,CAEA,IAAOC,GAAQ7B",
6
+ "names": ["Fragment", "jsx", "jsxs", "useCallback", "useMemo", "useState", "useCreditsContext", "CreditType", "DTC_TASK_TYPE", "TaskSubType", "TaskType", "useActivities", "CreditsModalContainer", "cn", "useHeadlessContext", "Tabs", "TabsContent", "TabsList", "TabsTrigger", "LoadingDots", "Picture", "Text", "ROUNDED_BRANDS", "dayjs", "ActivitiesModal", "data", "props", "page", "setPage", "taskIdToTypeMapping", "taskNameMapping", "brand", "rounded", "myActivitiesOptions", "tabs", "activities", "canNext", "isLoading", "allList", "taskNameMap", "dtcTaskTypeToNameMap", "getTitle", "item", "normalizeValue", "value", "otherItem", "listByTab", "map", "handleScrollEnd", "renderList", "list", "index", "tab", "ActivitiesModal_default"]
7
+ }
@@ -0,0 +1,14 @@
1
+ export declare function getAsyncError(res: {
2
+ json: () => any;
3
+ status: any;
4
+ statusText: any;
5
+ }): Promise<{
6
+ status: any;
7
+ statusText: any;
8
+ errors: any;
9
+ type: any;
10
+ data: any;
11
+ message: any;
12
+ } | undefined>;
13
+ declare const handleFetchResponse: (res: Response) => Promise<any>;
14
+ export default handleFetchResponse;
@@ -0,0 +1,2 @@
1
+ async function e(a){try{const t=await a.json();return{status:a.status,statusText:a.statusText,errors:t?.data?.error||t?.data?.code||a.statusText||a.status,type:t?.data?.type,data:t?.data,message:t?.data?.message}}catch(t){console.log(t)}}const o=async a=>{if(a.ok)try{const t=await a.json(),{errors:s}=t;return s&&s.length?{errors:s,status:a.status}:t}catch(t){console.log(t)}return await e(a)};var n=o;export{n as default,e as getAsyncError};
2
+ //# sourceMappingURL=fetchResponse.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/helpers/fetchResponse.ts"],
4
+ "sourcesContent": ["export async function getAsyncError(res: { json: () => any; status: any; statusText: any }) {\n try {\n const result = await res.json()\n return {\n status: res.status,\n statusText: res.statusText,\n errors: result?.data?.error || result?.data?.code || res.statusText || res.status,\n type: result?.data?.type,\n data: result?.data,\n message: result?.data?.message,\n }\n } catch (error) {\n console.log(error)\n }\n}\n\nconst handleFetchResponse = async (res: Response) => {\n if (res.ok) {\n try {\n const result = await res.json()\n const { errors } = result\n if (errors && errors.length) {\n return { errors, status: res.status }\n }\n\n return result\n } catch (error) {\n console.log(error)\n }\n }\n\n return await getAsyncError(res)\n}\n\nexport default handleFetchResponse\n"],
5
+ "mappings": "AAAA,eAAsBA,EAAcC,EAAwD,CAC1F,GAAI,CACF,MAAMC,EAAS,MAAMD,EAAI,KAAK,EAC9B,MAAO,CACL,OAAQA,EAAI,OACZ,WAAYA,EAAI,WAChB,OAAQC,GAAQ,MAAM,OAASA,GAAQ,MAAM,MAAQD,EAAI,YAAcA,EAAI,OAC3E,KAAMC,GAAQ,MAAM,KACpB,KAAMA,GAAQ,KACd,QAASA,GAAQ,MAAM,OACzB,CACF,OAASC,EAAO,CACd,QAAQ,IAAIA,CAAK,CACnB,CACF,CAEA,MAAMC,EAAsB,MAAOH,GAAkB,CACnD,GAAIA,EAAI,GACN,GAAI,CACF,MAAMC,EAAS,MAAMD,EAAI,KAAK,EACxB,CAAE,OAAAI,CAAO,EAAIH,EACnB,OAAIG,GAAUA,EAAO,OACZ,CAAE,OAAAA,EAAQ,OAAQJ,EAAI,MAAO,EAG/BC,CACT,OAASC,EAAO,CACd,QAAQ,IAAIA,CAAK,CACnB,CAGF,OAAO,MAAMH,EAAcC,CAAG,CAChC,EAEA,IAAOK,EAAQF",
6
+ "names": ["getAsyncError", "res", "result", "error", "handleFetchResponse", "errors", "fetchResponse_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ declare const fetcher: ({ locale, url, method, headers, repeatKey, body, type, timeout, }: any) => Promise<any>;
2
+ export default fetcher;
@@ -0,0 +1,2 @@
1
+ import f from"./fetchResponse.js";const g=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),y=async({locale:e="en",url:s,method:a="POST",headers:l={},repeatKey:p,body:r,type:c,timeout:t=9e4})=>{let n="";c==="uploadFile"?n=r:n=r?JSON.stringify(r):"";const o=new AbortController;t&&setTimeout(()=>o.abort(),t);const i=await fetch(s,{method:a,mode:"cors",headers:{"current-language":e,...l},...t&&{signal:o.signal},...a!=="GET"&&{body:n}});return f(i)};var u=y;export{u as default};
2
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/helpers/fetcher.ts"],
4
+ "sourcesContent": ["import handleFetchResponse from './fetchResponse.js'\n\nconst isObject = (value: null) => {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nconst fetcher = async ({\n locale = 'en',\n url,\n method = 'POST',\n headers = {},\n repeatKey,\n body,\n type,\n timeout = 90000,\n}: any) => {\n // \u6DFB\u52A0\u8C37\u6B4C\u9A8C\u8BC1\n let bodyData = ''\n if (type === 'uploadFile') {\n bodyData = body\n } else {\n bodyData = body ? JSON.stringify(body) : ''\n }\n\n const controller = new AbortController()\n if (timeout) {\n // \u8D85\u65F6\u62A5\u9519\n setTimeout(() => controller.abort(), timeout)\n }\n\n const data = await fetch(url, {\n method,\n mode: 'cors',\n headers: {\n 'current-language': locale,\n ...headers,\n },\n ...(timeout && { signal: controller.signal }),\n ...(method !== 'GET' && { body: bodyData }),\n })\n return handleFetchResponse(data)\n}\n\nexport default fetcher\n"],
5
+ "mappings": "AAAA,OAAOA,MAAyB,qBAEhC,MAAMC,EAAYC,GACTA,IAAU,MAAQ,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAGtEC,EAAU,MAAO,CACrB,OAAAC,EAAS,KACT,IAAAC,EACA,OAAAC,EAAS,OACT,QAAAC,EAAU,CAAC,EACX,UAAAC,EACA,KAAAC,EACA,KAAAC,EACA,QAAAC,EAAU,GACZ,IAAW,CAET,IAAIC,EAAW,GACXF,IAAS,aACXE,EAAWH,EAEXG,EAAWH,EAAO,KAAK,UAAUA,CAAI,EAAI,GAG3C,MAAMI,EAAa,IAAI,gBACnBF,GAEF,WAAW,IAAME,EAAW,MAAM,EAAGF,CAAO,EAG9C,MAAMG,EAAO,MAAM,MAAMT,EAAK,CAC5B,OAAAC,EACA,KAAM,OACN,QAAS,CACP,mBAAoBF,EACpB,GAAGG,CACL,EACA,GAAII,GAAW,CAAE,OAAQE,EAAW,MAAO,EAC3C,GAAIP,IAAW,OAAS,CAAE,KAAMM,CAAS,CAC3C,CAAC,EACD,OAAOZ,EAAoBc,CAAI,CACjC,EAEA,IAAOC,EAAQZ",
6
+ "names": ["handleFetchResponse", "isObject", "value", "fetcher", "locale", "url", "method", "headers", "repeatKey", "body", "type", "timeout", "bodyData", "controller", "data", "fetcher_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export { cn } from './utils';
2
+ export { noop } from './utils';