@anker-in/campaign-ui 0.3.3 → 0.3.5

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 (224) hide show
  1. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.d.ts +21 -1
  2. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js +1 -1
  3. package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js.map +3 -3
  4. package/dist/cjs/components/LiveChatWidget/api/chat.d.ts +23 -2
  5. package/dist/cjs/components/LiveChatWidget/api/chat.js +2 -2
  6. package/dist/cjs/components/LiveChatWidget/api/chat.js.map +3 -3
  7. package/dist/cjs/components/LiveChatWidget/components/ChatHeader.js +1 -1
  8. package/dist/cjs/components/LiveChatWidget/components/ChatHeader.js.map +2 -2
  9. package/dist/cjs/components/LiveChatWidget/components/ChatInput.d.ts +5 -0
  10. package/dist/cjs/components/LiveChatWidget/components/ChatInput.js +1 -1
  11. package/dist/cjs/components/LiveChatWidget/components/ChatInput.js.map +3 -3
  12. package/dist/cjs/components/LiveChatWidget/components/ChatMessage.js +2 -2
  13. package/dist/cjs/components/LiveChatWidget/components/ChatMessage.js.map +3 -3
  14. package/dist/cjs/components/LiveChatWidget/components/ChatWindow.d.ts +5 -0
  15. package/dist/cjs/components/LiveChatWidget/components/ChatWindow.js +1 -1
  16. package/dist/cjs/components/LiveChatWidget/components/ChatWindow.js.map +3 -3
  17. package/dist/cjs/components/LiveChatWidget/components/ComplianceDialog.d.ts +51 -0
  18. package/dist/cjs/components/LiveChatWidget/components/ComplianceDialog.js +33 -0
  19. package/dist/cjs/components/LiveChatWidget/components/ComplianceDialog.js.map +7 -0
  20. package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.js +1 -1
  21. package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.js.map +3 -3
  22. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +1 -1
  23. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +2 -2
  24. package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.js +1 -1
  25. package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.js.map +3 -3
  26. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +2 -2
  27. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +3 -3
  28. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +17 -24
  29. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js +1 -4
  30. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +3 -3
  31. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +7 -1
  32. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.js +1 -1
  33. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +3 -3
  34. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.js +1 -1
  35. package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.js.map +3 -3
  36. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +4 -1
  37. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.js +1 -1
  38. package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +3 -3
  39. package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.js +1 -1
  40. package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +2 -2
  41. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  42. package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  43. package/dist/cjs/components/LiveChatWidget/components/MessageContent.js +1 -1
  44. package/dist/cjs/components/LiveChatWidget/components/MessageContent.js.map +2 -2
  45. package/dist/cjs/components/LiveChatWidget/components/MessageList.js +3 -3
  46. package/dist/cjs/components/LiveChatWidget/components/MessageList.js.map +3 -3
  47. package/dist/cjs/components/LiveChatWidget/constants.d.ts +5 -0
  48. package/dist/cjs/components/LiveChatWidget/constants.js +1 -1
  49. package/dist/cjs/components/LiveChatWidget/constants.js.map +3 -3
  50. package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.d.ts +9 -0
  51. package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.js +1 -1
  52. package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.js.map +3 -3
  53. package/dist/cjs/components/LiveChatWidget/hooks/useChatState.d.ts +36 -2
  54. package/dist/cjs/components/LiveChatWidget/hooks/useChatState.js +1 -1
  55. package/dist/cjs/components/LiveChatWidget/hooks/useChatState.js.map +3 -3
  56. package/dist/cjs/components/LiveChatWidget/index.d.ts +1 -1
  57. package/dist/cjs/components/LiveChatWidget/index.js +1 -1
  58. package/dist/cjs/components/LiveChatWidget/index.js.map +2 -2
  59. package/dist/cjs/components/LiveChatWidget/types.d.ts +213 -3
  60. package/dist/cjs/components/LiveChatWidget/types.js +1 -1
  61. package/dist/cjs/components/LiveChatWidget/types.js.map +1 -1
  62. package/dist/cjs/components/LiveChatWidget/utils/fetcher.d.ts +42 -0
  63. package/dist/cjs/components/LiveChatWidget/utils/fetcher.js +2 -0
  64. package/dist/cjs/components/LiveChatWidget/utils/fetcher.js.map +7 -0
  65. package/dist/cjs/components/chat/markdown.js +1 -1
  66. package/dist/cjs/components/chat/markdown.js.map +2 -2
  67. package/dist/cjs/components/index.d.ts +2 -0
  68. package/dist/cjs/components/index.js +1 -1
  69. package/dist/cjs/components/index.js.map +3 -3
  70. package/dist/cjs/stories/LiveChatWidget.stories.d.ts +1 -79
  71. package/dist/cjs/stories/LiveChatWidget.stories.js +3 -49
  72. package/dist/cjs/stories/LiveChatWidget.stories.js.map +3 -3
  73. package/dist/esm/components/LiveChatWidget/LiveChatWidget.d.ts +21 -1
  74. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js +1 -1
  75. package/dist/esm/components/LiveChatWidget/LiveChatWidget.js.map +3 -3
  76. package/dist/esm/components/LiveChatWidget/api/chat.d.ts +23 -2
  77. package/dist/esm/components/LiveChatWidget/api/chat.js +2 -2
  78. package/dist/esm/components/LiveChatWidget/api/chat.js.map +3 -3
  79. package/dist/esm/components/LiveChatWidget/components/ChatHeader.js +1 -1
  80. package/dist/esm/components/LiveChatWidget/components/ChatHeader.js.map +2 -2
  81. package/dist/esm/components/LiveChatWidget/components/ChatInput.d.ts +5 -0
  82. package/dist/esm/components/LiveChatWidget/components/ChatInput.js +1 -1
  83. package/dist/esm/components/LiveChatWidget/components/ChatInput.js.map +3 -3
  84. package/dist/esm/components/LiveChatWidget/components/ChatMessage.js +2 -2
  85. package/dist/esm/components/LiveChatWidget/components/ChatMessage.js.map +3 -3
  86. package/dist/esm/components/LiveChatWidget/components/ChatWindow.d.ts +5 -0
  87. package/dist/esm/components/LiveChatWidget/components/ChatWindow.js +1 -1
  88. package/dist/esm/components/LiveChatWidget/components/ChatWindow.js.map +3 -3
  89. package/dist/esm/components/LiveChatWidget/components/ComplianceDialog.d.ts +51 -0
  90. package/dist/esm/components/LiveChatWidget/components/ComplianceDialog.js +33 -0
  91. package/dist/esm/components/LiveChatWidget/components/ComplianceDialog.js.map +7 -0
  92. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js +1 -1
  93. package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js.map +3 -3
  94. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +1 -1
  95. package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +2 -2
  96. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js +1 -1
  97. package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js.map +3 -3
  98. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +2 -2
  99. package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +3 -3
  100. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +17 -24
  101. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js +1 -4
  102. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +3 -3
  103. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +7 -1
  104. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js +1 -1
  105. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +3 -3
  106. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js +1 -1
  107. package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js.map +3 -3
  108. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +4 -1
  109. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js +1 -1
  110. package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +3 -3
  111. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js +1 -1
  112. package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +2 -2
  113. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +1 -1
  114. package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +3 -3
  115. package/dist/esm/components/LiveChatWidget/components/MessageContent.js +1 -1
  116. package/dist/esm/components/LiveChatWidget/components/MessageContent.js.map +2 -2
  117. package/dist/esm/components/LiveChatWidget/components/MessageList.js +3 -3
  118. package/dist/esm/components/LiveChatWidget/components/MessageList.js.map +3 -3
  119. package/dist/esm/components/LiveChatWidget/constants.d.ts +5 -0
  120. package/dist/esm/components/LiveChatWidget/constants.js +1 -1
  121. package/dist/esm/components/LiveChatWidget/constants.js.map +3 -3
  122. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.d.ts +9 -0
  123. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js +1 -1
  124. package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js.map +3 -3
  125. package/dist/esm/components/LiveChatWidget/hooks/useChatState.d.ts +36 -2
  126. package/dist/esm/components/LiveChatWidget/hooks/useChatState.js +1 -1
  127. package/dist/esm/components/LiveChatWidget/hooks/useChatState.js.map +3 -3
  128. package/dist/esm/components/LiveChatWidget/index.d.ts +1 -1
  129. package/dist/esm/components/LiveChatWidget/index.js +1 -1
  130. package/dist/esm/components/LiveChatWidget/index.js.map +2 -2
  131. package/dist/esm/components/LiveChatWidget/types.d.ts +213 -3
  132. package/dist/esm/components/LiveChatWidget/utils/fetcher.d.ts +42 -0
  133. package/dist/esm/components/LiveChatWidget/utils/fetcher.js +2 -0
  134. package/dist/esm/components/LiveChatWidget/utils/fetcher.js.map +7 -0
  135. package/dist/esm/components/chat/markdown.js +1 -1
  136. package/dist/esm/components/chat/markdown.js.map +2 -2
  137. package/dist/esm/components/index.d.ts +2 -0
  138. package/dist/esm/components/index.js +1 -1
  139. package/dist/esm/components/index.js.map +3 -3
  140. package/dist/esm/stories/LiveChatWidget.stories.d.ts +1 -79
  141. package/dist/esm/stories/LiveChatWidget.stories.js +3 -49
  142. package/dist/esm/stories/LiveChatWidget.stories.js.map +3 -3
  143. package/dist/index.d.mts +1305 -0
  144. package/dist/index.d.ts +1305 -0
  145. package/dist/index.js +26656 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/index.mjs +26641 -0
  148. package/dist/index.mjs.map +1 -0
  149. package/package.json +8 -1
  150. package/src/components/LiveChatWidget/LiveChatWidget.tsx +907 -0
  151. package/src/components/LiveChatWidget/api/chat.ts +175 -0
  152. package/src/components/LiveChatWidget/components/ChatBubble.tsx +152 -0
  153. package/src/components/LiveChatWidget/components/ChatHeader.tsx +150 -0
  154. package/src/components/LiveChatWidget/components/ChatInput.tsx +253 -0
  155. package/src/components/LiveChatWidget/components/ChatMessage.tsx +190 -0
  156. package/src/components/LiveChatWidget/components/ChatWindow.tsx +363 -0
  157. package/src/components/LiveChatWidget/components/ComplianceDialog.tsx +216 -0
  158. package/src/components/LiveChatWidget/components/MessageContent/CartCard.tsx +202 -0
  159. package/src/components/LiveChatWidget/components/MessageContent/ErrorBlock.tsx +75 -0
  160. package/src/components/LiveChatWidget/components/MessageContent/FAQList.tsx +128 -0
  161. package/src/components/LiveChatWidget/components/MessageContent/PolicyBlock.tsx +152 -0
  162. package/src/components/LiveChatWidget/components/MessageContent/ProductCard.tsx +227 -0
  163. package/src/components/LiveChatWidget/components/MessageContent/ProductComparison.tsx +377 -0
  164. package/src/components/LiveChatWidget/components/MessageContent/ProductList.tsx +293 -0
  165. package/src/components/LiveChatWidget/components/MessageContent/PromotionList.tsx +170 -0
  166. package/src/components/LiveChatWidget/components/MessageContent/QuickReplies.tsx +91 -0
  167. package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +110 -0
  168. package/src/components/LiveChatWidget/components/MessageContent/ThinkingBlock.tsx +53 -0
  169. package/src/components/LiveChatWidget/components/MessageContent/index.ts +16 -0
  170. package/src/components/LiveChatWidget/components/MessageContent.tsx +113 -0
  171. package/src/components/LiveChatWidget/components/MessageList.tsx +256 -0
  172. package/src/components/LiveChatWidget/components/ScrollAnchor.tsx +75 -0
  173. package/src/components/LiveChatWidget/constants.ts +36 -0
  174. package/src/components/LiveChatWidget/hooks/useChatAPI.ts +146 -0
  175. package/src/components/LiveChatWidget/hooks/useChatState.ts +1091 -0
  176. package/src/components/LiveChatWidget/hooks/useSession.ts +123 -0
  177. package/src/components/LiveChatWidget/index.tsx +63 -0
  178. package/src/components/LiveChatWidget/types.ts +1012 -0
  179. package/src/components/LiveChatWidget/utils/cartTransformers.ts +72 -0
  180. package/src/components/LiveChatWidget/utils/fetcher.ts +131 -0
  181. package/src/components/LiveChatWidget/utils/messageRenderers.ts +120 -0
  182. package/src/components/LiveChatWidget/utils/productTransformers.ts +149 -0
  183. package/src/components/LiveChatWidget/utils/userId.ts +140 -0
  184. package/src/components/LiveChatWidget/utils/validation.ts +99 -0
  185. package/src/components/chat/markdown.tsx +1 -1
  186. package/src/components/index.ts +23 -0
  187. package/src/stories/LiveChatWidget.stories.tsx +317 -0
  188. package/src/styles/livechat.css +346 -0
  189. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +0 -7
  190. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +0 -2
  191. package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +0 -7
  192. package/dist/cjs/components/credits/context/utils/atobID.d.ts +0 -1
  193. package/dist/cjs/components/credits/context/utils/atobID.js +0 -2
  194. package/dist/cjs/components/credits/context/utils/atobID.js.map +0 -7
  195. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.d.ts +0 -5
  196. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js +0 -2
  197. package/dist/cjs/components/credits/context/utils/functionDiscountCalculate.js.map +0 -7
  198. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +0 -8
  199. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +0 -2
  200. package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +0 -7
  201. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +0 -9
  202. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +0 -2
  203. package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +0 -7
  204. package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +0 -6
  205. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +0 -2
  206. package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +0 -7
  207. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +0 -7
  208. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +0 -2
  209. package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +0 -7
  210. package/dist/esm/components/credits/context/utils/atobID.d.ts +0 -1
  211. package/dist/esm/components/credits/context/utils/atobID.js +0 -2
  212. package/dist/esm/components/credits/context/utils/atobID.js.map +0 -7
  213. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.d.ts +0 -5
  214. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js +0 -2
  215. package/dist/esm/components/credits/context/utils/functionDiscountCalculate.js.map +0 -7
  216. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +0 -8
  217. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +0 -2
  218. package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +0 -7
  219. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +0 -9
  220. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +0 -2
  221. package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +0 -7
  222. package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +0 -6
  223. package/dist/esm/components/credits/context/utils/variantGetCoupon.js +0 -2
  224. package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +0 -7
@@ -5,7 +5,7 @@ import remarkMath from 'remark-math'
5
5
 
6
6
  const MemoizedReactMarkdown: FC<Options> = memo(
7
7
  ReactMarkdown,
8
- (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
8
+ (prevProps, nextProps) => prevProps.children === nextProps.children
9
9
  )
10
10
 
11
11
  type MarkdownProps = {
@@ -12,3 +12,26 @@ export {
12
12
  export * from './credits/index.js'
13
13
 
14
14
  export * from './registration/index.js'
15
+
16
+
17
+
18
+ // LiveChatWidget 导出
19
+ export { LiveChatWidget } from './LiveChatWidget/index.js'
20
+ export type {
21
+ LiveChatWidgetProps,
22
+ Message,
23
+ MessageContent,
24
+ MessageRole,
25
+ MessageContentType,
26
+ MessageMetadata,
27
+ MessageRenderer,
28
+ QuickReply,
29
+ ProductCardContent,
30
+ ProductListContent,
31
+ PolicyContent,
32
+ QuickRepliesContent,
33
+ ThinkingContent,
34
+ ErrorContent,
35
+ SSEEvent,
36
+ ChatStreamRequest,
37
+ } from './LiveChatWidget/index.js'
@@ -0,0 +1,317 @@
1
+ /**
2
+ * LiveChatWidget Storybook Stories
3
+ * 展示 LiveChat 组件的各种使用场景和配置
4
+ */
5
+
6
+ import type { Meta, StoryObj } from '@storybook/react'
7
+ import { LiveChatWidget } from '../components/LiveChatWidget'
8
+ import type { MessageRenderer, MessageContent } from '../components/LiveChatWidget'
9
+ import '../styles/livechat.css'
10
+
11
+ const meta: Meta<typeof LiveChatWidget> = {
12
+ title: 'Campaign/LiveChatWidget',
13
+ component: LiveChatWidget,
14
+ parameters: {
15
+ layout: 'fullscreen',
16
+ docs: {
17
+ story: {
18
+ inline: false,
19
+ iframeHeight: 500,
20
+ },
21
+ description: {
22
+ component: `
23
+ # LiveChat 聊天组件
24
+
25
+ 可复用的气泡弹窗聊天组件,支持 SSE 流式消息、自定义渲染器和多种消息类型。
26
+
27
+ ## 功能特性
28
+
29
+ - 🎈 **气泡弹窗**: 可自定义位置的悬浮气泡按钮
30
+ - 💬 **流式消息**: 基于 SSE 的实时流式响应
31
+ - 📦 **多种消息类型**: 文本、商品卡片、商品列表、政策、快捷回复等
32
+ - 🎨 **可定制**: 支持自定义品牌颜色、Logo、渲染器
33
+ - 📱 **响应式**: 移动端全屏,桌面端固定尺寸
34
+ - 💾 **会话管理**: 自动管理 userId 和 sessionId
35
+ - 🔒 **安全防护**: 内置 XSS 防护和输入验证
36
+
37
+ ## 基础用法
38
+
39
+ \`\`\`tsx
40
+ import { LiveChatWidget } from '@anker-in/campaign-ui'
41
+ import '@anker-in/campaign-ui/livechat.css'
42
+
43
+ function App() {
44
+ return (
45
+ <LiveChatWidget
46
+ apiBaseUrl="https://beta-api-livechat.anker.com"
47
+ site="www.eufy.com"
48
+ channel_code="web_homepage"
49
+ welcomeMessage="你好!我是 AI 助手"
50
+ />
51
+ )
52
+ }
53
+ \`\`\`
54
+
55
+ ## 自定义渲染器
56
+
57
+ \`\`\`tsx
58
+ const customRenderers = {
59
+ video: {
60
+ render: (content) => (
61
+ <video src={content.url} controls className="w-full rounded" />
62
+ )
63
+ }
64
+ }
65
+
66
+ <LiveChatWidget
67
+ apiBaseUrl="..."
68
+ site="..."
69
+ customRenderers={customRenderers}
70
+ />
71
+ \`\`\`
72
+ `,
73
+ },
74
+ },
75
+ },
76
+ tags: ['autodocs'],
77
+ argTypes: {
78
+ apiBaseUrl: {
79
+ control: 'text',
80
+ description: 'API 基础 URL',
81
+ },
82
+ headers: {
83
+ control: 'object',
84
+ description: '自定义请求头,将在所有 API 请求中添加',
85
+ table: {
86
+ defaultValue: { summary: 'undefined' },
87
+ },
88
+ },
89
+ recaptchaSitekey: {
90
+ control: 'text',
91
+ description: 'Google reCAPTCHA v3 site key,提供此参数将自动启用 reCAPTCHA v3 验证',
92
+ table: {
93
+ defaultValue: { summary: 'undefined' },
94
+ },
95
+ },
96
+ recaptchaAction: {
97
+ control: 'text',
98
+ description: 'reCAPTCHA action 名称,用于区分不同的验证场景',
99
+ table: {
100
+ defaultValue: { summary: '"activity"' },
101
+ },
102
+ },
103
+ site: {
104
+ control: 'text',
105
+ description: 'Shopify 店铺 URL',
106
+ },
107
+ channelCode: {
108
+ control: 'text',
109
+ description: '渠道编码,用于标识来源渠道',
110
+ table: {
111
+ defaultValue: { summary: 'undefined' },
112
+ },
113
+ },
114
+ welcomeMessage: {
115
+ control: 'text',
116
+ description: '欢迎消息',
117
+ table: {
118
+ defaultValue: { summary: '你好!我是 AI 助手,有什么可以帮助你的吗?' },
119
+ },
120
+ },
121
+ logoUrl: {
122
+ control: 'text',
123
+ description: 'Logo URL',
124
+ },
125
+ position: {
126
+ control: 'object',
127
+ description: '气泡按钮位置对象',
128
+ table: {
129
+ defaultValue: { summary: '{ bottom: "1.5rem", right: "1.5rem" }' },
130
+ },
131
+ },
132
+ },
133
+ args: {
134
+ apiBaseUrl: 'http://172.16.38.183:3003',
135
+ site: 'www.eufy.com',
136
+ loginUserId: 'test_test',
137
+ welcomeMessage: '你好!我是 AI 助手,有什么可以帮助你的吗?',
138
+ },
139
+ }
140
+
141
+ export default meta
142
+ type Story = StoryObj<typeof LiveChatWidget>
143
+
144
+ /**
145
+ * 默认配置 - 展示所有功能
146
+ */
147
+ export const Default: Story = {
148
+ args: {
149
+ // 基础配置
150
+ loginUserId: 'test_test1',
151
+ apiBaseUrl: 'http://172.16.38.183:3003',
152
+ site: 'beta.eufy.com',
153
+ channelCode: 'dtc',
154
+ title: 'eufy AI Assistant',
155
+ cartId: 'gid://shopify/Cart/hWN7wB3Pa12gh78d8hPOAUBI?key=0e73db1d3fb5ac21da19099c45033253',
156
+ accessToken: '47b1aa2c0797043f9baba39388029d70',
157
+
158
+ // 自定义位置
159
+ position: { bottom: '24px', right: '30px' },
160
+
161
+ // 欢迎消息
162
+ welcomeMessage: '',
163
+
164
+ // 快捷回复
165
+ quickReplies: [
166
+ { id: '1', label: 'Product Info', value: 'Tell me about your products', icon: '📦' },
167
+ { id: '2', label: 'Track Order', value: 'I want to track my order', icon: '🚚' },
168
+ { id: '3', label: 'Support', value: 'I need help with my device', icon: '🔧' },
169
+ { id: '4', label: 'Recommendations', value: 'Recommend products for me', icon: '⭐' },
170
+ ],
171
+
172
+ // 法规协议弹窗
173
+ complianceConfig: {
174
+ title: "Hi! I'm your eufy AI assistant.",
175
+ content:
176
+ 'AI-generated responses can be inaccurate. Please verify important info. Do not input sensitive personal data.',
177
+ checkboxText:
178
+ 'By starting to use "Live Chat", you agree to Anker\'s <a href="https://www.anker.com/pages/privacy-policy" target="_blank" rel="noopener noreferrer" style="text-decoration: underline;">LIVE CHAT PRIVACY NOTICE</a>.',
179
+ agreeButtonText: 'Agree',
180
+ },
181
+
182
+ // reCAPTCHA 配置(取消注释以启用)
183
+ // recaptchaSitekey: '6LfS4J4pAAAAACX1e_WrxutmxxzCK7FU4WzVqL14',
184
+ recaptchaAction: 'livechat',
185
+
186
+ // 显示新会话按钮
187
+ showNewSessionButton: true,
188
+
189
+ // 自定义文案
190
+ commonText: {
191
+ learnMore: 'Learn More',
192
+ total: 'Total',
193
+ },
194
+
195
+ // 自定义消息渲染器
196
+ customRenderers: {
197
+ video: {
198
+ render: (content: MessageContent) => {
199
+ const videoContent = content as any
200
+ return (
201
+ <div className="w-full">
202
+ <video src={videoContent.url} controls className="w-full rounded-lg" poster={videoContent.poster}>
203
+ Your browser does not support video playback
204
+ </video>
205
+ {videoContent.title && <p className="mt-2 text-sm text-gray-600">{videoContent.title}</p>}
206
+ </div>
207
+ )
208
+ },
209
+ } as MessageRenderer,
210
+ image_gallery: {
211
+ render: (content: MessageContent) => {
212
+ const galleryContent = content as any
213
+ const images = galleryContent.images || []
214
+ return (
215
+ <div className="grid grid-cols-2 gap-2">
216
+ {images.map((image: any, index: number) => (
217
+ <div key={index} className="relative aspect-square">
218
+ <img
219
+ src={image.url}
220
+ alt={image.alt || `Image ${index + 1}`}
221
+ className="size-full rounded-lg object-cover"
222
+ />
223
+ </div>
224
+ ))}
225
+ </div>
226
+ )
227
+ },
228
+ } as MessageRenderer,
229
+ },
230
+
231
+ // 自定义产品卡片渲染
232
+ productCardRender: (product, productHandle) => {
233
+ // product 可能为 undefined,此时可用 productHandle 查询
234
+ if (!product) {
235
+ return (
236
+ <div style={{ padding: '16px', border: '1px dashed #ccc', borderRadius: '8px', textAlign: 'center' }}>
237
+ <p>Product loading... (handle: {productHandle})</p>
238
+ </div>
239
+ )
240
+ }
241
+
242
+ const imageUrl = product?.featured_image || ''
243
+ const title = product?.title || ''
244
+ const description = product?.description || ''
245
+ const averageRating = product?.average_rating
246
+
247
+ return (
248
+ <div
249
+ style={{
250
+ border: '2px solid #4CAF50',
251
+ borderRadius: '16px',
252
+ padding: '16px',
253
+ margin: '12px 0',
254
+ backgroundColor: '#f0f9ff',
255
+ boxShadow: '0 4px 12px rgba(76, 175, 80, 0.15)',
256
+ }}
257
+ >
258
+ <div style={{ display: 'flex', gap: '12px', alignItems: 'center' }}>
259
+ {imageUrl && (
260
+ <img
261
+ src={imageUrl}
262
+ alt={title}
263
+ style={{ width: '60px', height: '60px', borderRadius: '8px', objectFit: 'cover' }}
264
+ />
265
+ )}
266
+ <div style={{ flex: 1 }}>
267
+ <h4 style={{ margin: '0 0 4px 0', fontSize: '16px', fontWeight: 'bold' }}>{title}</h4>
268
+ {description && (
269
+ <p style={{ margin: 0, fontSize: '12px', color: '#666', lineHeight: 1.4 }}>
270
+ {description.slice(0, 80)}...
271
+ </p>
272
+ )}
273
+ {averageRating && (
274
+ <span style={{ fontSize: '12px', color: '#FFB800' }}>Rating: {averageRating.toFixed(1)}</span>
275
+ )}
276
+ </div>
277
+ <button
278
+ style={{
279
+ padding: '8px 16px',
280
+ backgroundColor: '#4CAF50',
281
+ color: 'white',
282
+ borderRadius: '8px',
283
+ border: 'none',
284
+ cursor: 'pointer',
285
+ }}
286
+ onClick={() => console.log('View product:', productHandle, product)}
287
+ >
288
+ View
289
+ </button>
290
+ </div>
291
+ </div>
292
+ )
293
+ },
294
+ },
295
+
296
+ render: args => (
297
+ <LiveChatWidget
298
+ {...args}
299
+ // 所有事件回调
300
+ onOpen={() => console.log('[LiveChat] Chat opened')}
301
+ onClose={() => console.log('[LiveChat] Chat closed')}
302
+ onMessageSend={(message: string) => console.log('[LiveChat] Message sent:', message)}
303
+ onError={(error: Error) => console.error('[LiveChat] Error:', error)}
304
+ onTextMessage={() => console.log('[LiveChat] AI text message received')}
305
+ onProductList={() => console.log('[LiveChat] Product list received')}
306
+ onPromotionList={() => console.log('[LiveChat] Promotion list received')}
307
+ onAddToCart={(product: any) => {
308
+ console.log('[LiveChat] Add to cart:', product)
309
+ alert(`Added "${product.title}" to cart!`)
310
+ }}
311
+ onCart={(cartId: string, checkoutUrl?: string) => {
312
+ console.log('[LiveChat] Cart clicked:', { cartId, checkoutUrl })
313
+ alert(`Cart ID: ${cartId}`)
314
+ }}
315
+ />
316
+ ),
317
+ }
@@ -0,0 +1,346 @@
1
+ /**
2
+ * LiveChat Widget Styles
3
+ *
4
+ * 这个文件包含 LiveChat 组件的基础样式
5
+ * 使用 CSS 变量支持主题定制
6
+ */
7
+
8
+ :root {
9
+ /* 品牌颜色 */
10
+ --livechat-primary: #005D8E;
11
+ --livechat-primary-hover: #005D8E;
12
+ --livechat-background: #ffffff;
13
+ --livechat-text: #111827;
14
+ --livechat-text-secondary: #6b7280;
15
+ --livechat-border: #e5e7eb;
16
+
17
+ /* 消息颜色 */
18
+ --livechat-user-message-bg: #f3f4f6;
19
+ --livechat-assistant-message-bg: #ffffff;
20
+ --livechat-thinking-bg: #fef3c7;
21
+ --livechat-error-bg: #fee2e2;
22
+
23
+ /* 尺寸 */
24
+ --livechat-bubble-size: 48px;
25
+ --livechat-window-width: 390px;
26
+ --livechat-window-height: 80%;
27
+ --livechat-border-radius: 1rem;
28
+
29
+ /* 阴影 */
30
+ --livechat-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
31
+ --livechat-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
32
+ --livechat-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
33
+ --livechat-shadow-xl: 0 0 24px rgba(0, 0, 0, 0.15);
34
+ }
35
+
36
+ /* 气泡按钮基础样式 */
37
+ .livechat-bubble {
38
+ position: fixed;
39
+ width: var(--livechat-bubble-size);
40
+ height: var(--livechat-bubble-size);
41
+ border-radius: 50%;
42
+ background: var(--livechat-primary);
43
+ color: white;
44
+ box-shadow: var(--livechat-shadow-xl);
45
+ transition: all 0.2s ease-in-out;
46
+ z-index: 9999;
47
+ }
48
+
49
+ .livechat-bubble:hover {
50
+ background: var(--livechat-primary-hover);
51
+ transform: scale(1.05);
52
+ }
53
+
54
+ .livechat-bubble:active {
55
+ transform: scale(0.95);
56
+ }
57
+
58
+ /* 移动端固定底部样式 */
59
+ @media (max-width: 767px) {
60
+ .livechat-window {
61
+ position: fixed;
62
+ bottom: 0;
63
+ left: 0;
64
+ right: 0;
65
+ width: 100vw;
66
+ height: var(--livechat-mobile-height, 680px); /* 默认高度680px,可通过拖拽调整(最小30%,最大80%) */
67
+ max-height: 80%;
68
+ border-radius: 16px 16px 0 0; /* 上方圆角 */
69
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
70
+ }
71
+ }
72
+
73
+ /* 平板及以上固定尺寸弹窗样式 */
74
+ @media (min-width: 768px) {
75
+ .livechat-window {
76
+ position: fixed;
77
+ bottom: 1rem;
78
+ right: 1rem;
79
+ width: var(--livechat-window-width);
80
+ height: 70vh;
81
+ border-radius: var(--livechat-border-radius);
82
+ box-shadow: var(--livechat-shadow-xl);
83
+ }
84
+ }
85
+
86
+ /* 大屏幕固定高度 */
87
+ @media (min-width: 1920px) {
88
+ .livechat-window {
89
+ height: 720px;
90
+ }
91
+ }
92
+
93
+ /* 聊天窗口动画 */
94
+ .livechat-window-enter {
95
+ animation: livechat-slide-in 0.3s ease-out;
96
+ }
97
+
98
+ .livechat-window-exit {
99
+ animation: livechat-slide-out 0.3s ease-in;
100
+ }
101
+
102
+ @keyframes livechat-slide-in {
103
+ from {
104
+ opacity: 0;
105
+ transform: translateY(1rem);
106
+ }
107
+ to {
108
+ opacity: 1;
109
+ transform: translateY(0);
110
+ }
111
+ }
112
+
113
+ @keyframes livechat-slide-out {
114
+ from {
115
+ opacity: 1;
116
+ transform: translateY(0);
117
+ }
118
+ to {
119
+ opacity: 0;
120
+ transform: translateY(1rem);
121
+ }
122
+ }
123
+
124
+ /* 消息列表滚动样式 */
125
+ .livechat-message-list {
126
+ scrollbar-width: thin;
127
+ scrollbar-color: var(--livechat-border) transparent;
128
+ }
129
+
130
+ .livechat-message-list::-webkit-scrollbar {
131
+ width: 6px;
132
+ }
133
+
134
+ .livechat-message-list::-webkit-scrollbar-track {
135
+ background: transparent;
136
+ }
137
+
138
+ .livechat-message-list::-webkit-scrollbar-thumb {
139
+ background: var(--livechat-border);
140
+ border-radius: 3px;
141
+ }
142
+
143
+ .livechat-message-list::-webkit-scrollbar-thumb:hover {
144
+ background: var(--livechat-text-secondary);
145
+ }
146
+
147
+ /* 回到底部按钮样式 */
148
+ .livechat-scroll-to-bottom {
149
+ position: absolute;
150
+ bottom: 24px;
151
+ left: 50%;
152
+ transform: translateX(-50%);
153
+ z-index: 10;
154
+ width: 40px;
155
+ height: 40px;
156
+ border-radius: 50%;
157
+ background-color: rgba(255, 255, 255, 0.95);
158
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
159
+ transition: opacity 300ms ease-in-out;
160
+ cursor: pointer;
161
+ border: none;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ }
166
+
167
+ .livechat-scroll-to-bottom.hidden {
168
+ opacity: 0 !important;
169
+ pointer-events: none;
170
+ }
171
+
172
+ .livechat-scroll-to-bottom.visible {
173
+ opacity: 1 !important;
174
+ }
175
+
176
+ /* 思考状态动画 */
177
+ .livechat-thinking-dots {
178
+ display: inline-flex;
179
+ gap: 0.25rem;
180
+ }
181
+
182
+ .livechat-thinking-dots span {
183
+ width: 0.5rem;
184
+ height: 0.5rem;
185
+ border-radius: 50%;
186
+ animation: livechat-thinking 1.4s infinite ease-in-out;
187
+ }
188
+
189
+ .livechat-thinking-dots span:nth-child(1) {
190
+ animation-delay: -0.32s;
191
+ }
192
+
193
+ .livechat-thinking-dots span:nth-child(2) {
194
+ animation-delay: -0.16s;
195
+ }
196
+
197
+ @keyframes livechat-thinking {
198
+ 0%, 80%, 100% {
199
+ transform: scale(0);
200
+ opacity: 0.5;
201
+ }
202
+ 40% {
203
+ transform: scale(1);
204
+ opacity: 1;
205
+ }
206
+ }
207
+
208
+ /* 商品卡片基础样式 */
209
+ .livechat-product-card {
210
+ border: 1px solid var(--livechat-border);
211
+ border-radius: 0.5rem;
212
+ overflow: hidden;
213
+ transition: all 0.2s ease-in-out;
214
+ }
215
+
216
+ .livechat-product-card:hover {
217
+ box-shadow: var(--livechat-shadow-md);
218
+ transform: translateY(-2px);
219
+ }
220
+
221
+ /* 产品列表横向滚动样式 */
222
+ .livechat-product-scroll {
223
+ scrollbar-width: thin;
224
+ scrollbar-color: var(--livechat-border) transparent;
225
+ }
226
+
227
+ .livechat-product-scroll::-webkit-scrollbar {
228
+ height: 8px;
229
+ }
230
+
231
+ .livechat-product-scroll::-webkit-scrollbar-track {
232
+ background: var(--livechat-user-message-bg);
233
+ border-radius: 4px;
234
+ }
235
+
236
+ .livechat-product-scroll::-webkit-scrollbar-thumb {
237
+ background: var(--livechat-border);
238
+ border-radius: 4px;
239
+ }
240
+
241
+ .livechat-product-scroll::-webkit-scrollbar-thumb:hover {
242
+ background: var(--livechat-text-secondary);
243
+ }
244
+
245
+ /* 快捷回复按钮样式 */
246
+ .livechat-quick-reply-button {
247
+ background-color: #EAEAEC;
248
+ color: #1D1D1F;
249
+ border: none;
250
+ border-radius: 19px;
251
+ transition: all 0.2s ease-in-out;
252
+ }
253
+
254
+ .livechat-quick-reply-button:hover {
255
+ background-color: #005D8E;
256
+ color: #ffffff;
257
+ }
258
+
259
+ /* Markdown 内容样式 */
260
+ .livechat-markdown {
261
+ line-height: 1.4;
262
+ font-weight: 700;
263
+ }
264
+
265
+ .livechat-markdown ul,
266
+ .livechat-markdown ol {
267
+ margin-left: 1.5rem;
268
+ }
269
+
270
+ .livechat-markdown li {
271
+ margin-bottom: 0.25rem;
272
+ }
273
+
274
+ .livechat-markdown a {
275
+ color: var(--livechat-primary);
276
+ text-decoration: underline;
277
+ }
278
+
279
+ .livechat-markdown a:hover {
280
+ color: var(--livechat-primary-hover);
281
+ }
282
+
283
+ .livechat-markdown code {
284
+ background: var(--livechat-user-message-bg);
285
+ padding: 0.125rem 0.25rem;
286
+ border-radius: 0.25rem;
287
+ font-family: ui-monospace, monospace;
288
+ font-size: 0.875em;
289
+ }
290
+
291
+ .livechat-markdown strong {
292
+ font-weight: 700;
293
+ }
294
+
295
+ .livechat-markdown em {
296
+ font-style: italic;
297
+ }
298
+
299
+ /* ============================================================================
300
+ 法规协议弹窗样式(与聊天窗口保持一致)
301
+ ============================================================================ */
302
+
303
+ /* 基础样式 */
304
+ .livechat-compliance-dialog {
305
+ background: white;
306
+ display: flex;
307
+ flex-direction: column;
308
+ overflow: hidden;
309
+ animation: livechat-slide-in 0.3s ease-out;
310
+ }
311
+
312
+ /* 移动端固定底部样式 */
313
+ @media (max-width: 767px) {
314
+ .livechat-compliance-dialog {
315
+ position: fixed !important; /* 防止被覆盖 */
316
+ bottom: 0 !important;
317
+ left: 0 !important;
318
+ right: 0 !important;
319
+ width: 100vw;
320
+ max-height: 80%;
321
+ border-radius: 16px 16px 0 0; /* 上方圆角,与聊天窗口一致 */
322
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
323
+ z-index: 9998;
324
+ }
325
+ }
326
+
327
+ /* 平板及以上固定尺寸弹窗样式 */
328
+ @media (min-width: 768px) {
329
+ .livechat-compliance-dialog {
330
+ position: fixed !important; /* 防止被覆盖 */
331
+ bottom: 1rem !important;
332
+ right: 1rem !important;
333
+ width: var(--livechat-window-width); /* 390px,与聊天窗口一致 */
334
+ max-height: 70vh;
335
+ border-radius: var(--livechat-border-radius); /* 1rem */
336
+ box-shadow: var(--livechat-shadow-xl);
337
+ z-index: 9998;
338
+ }
339
+ }
340
+
341
+ /* 大屏幕适配 */
342
+ @media (min-width: 1920px) {
343
+ .livechat-compliance-dialog {
344
+ max-height: 720px;
345
+ }
346
+ }
@@ -1,7 +0,0 @@
1
- import { NormalizedProductVariant } from '@anker-in/shopify-react';
2
- import { FunctionMemberPriceResult } from '../memberPriceTypes';
3
- export declare const useFunctionMemberPrice: ({ variant }: {
4
- variant?: NormalizedProductVariant;
5
- }) => FunctionMemberPriceResult | (Partial<FunctionMemberPriceResult> & {
6
- hasMemberPrice: false;
7
- });
@@ -1,2 +0,0 @@
1
- "use strict";var i=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var b=(r,e)=>{for(var o in e)i(r,o,{get:e[o],enumerable:!0})},f=(r,e,o,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(r,t)&&t!==o&&i(r,t,{get:()=>e[t],enumerable:!(c=P(e,t))||c.enumerable});return r};var M=r=>f(i({},"__esModule",{value:!0}),r);var p={};b(p,{useFunctionMemberPrice:()=>d});module.exports=M(p);var m=require("../utils/getFunctionMemberPrice"),n=require("react"),s=require("../provider"),u=require("@anker-in/lib");const d=({variant:r})=>{const{memberPriceDiscount:e}=(0,s.useCreditsContext)(),{locale:o=""}=(0,u.useHeadlessContext)();return(0,n.useMemo)(()=>{const t=(0,m.getFunctionMemberPrice)({memberPriceDiscount:e,currencyCode:r?.price.currencyCode,variant:r,locale:o});return t||{hasMemberPrice:!1}},[o,e,r])};
2
- //# sourceMappingURL=useFunctionMemberPrice.js.map