@anker-in/campaign-ui 0.2.11-beta.2 → 0.2.11-beta.21
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.
- package/dist/cjs/components/LiveChatWidget/LiveChatWidget.d.ts +43 -0
- package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js +2 -0
- package/dist/cjs/components/LiveChatWidget/LiveChatWidget.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/api/chat.d.ts +25 -0
- package/dist/cjs/components/LiveChatWidget/api/chat.js +3 -0
- package/dist/cjs/components/LiveChatWidget/api/chat.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatBubble.d.ts +68 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatBubble.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatBubble.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatHeader.d.ts +57 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatHeader.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatHeader.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatInput.d.ts +70 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatInput.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatInput.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatMessage.d.ts +59 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatMessage.js +5 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatMessage.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatWindow.d.ts +127 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatWindow.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/ChatWindow.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.d.ts +54 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/CartCard.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.d.ts +33 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.d.ts +16 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/FAQList.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.d.ts +45 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +5 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +48 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js +5 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +70 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.d.ts +47 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ProductList.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +78 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.d.ts +54 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.d.ts +31 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ThinkingBlock.d.ts +31 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/index.d.ts +15 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/index.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent/index.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent.d.ts +63 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageContent.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageList.d.ts +74 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageList.js +5 -0
- package/dist/cjs/components/LiveChatWidget/components/MessageList.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/components/ScrollAnchor.d.ts +44 -0
- package/dist/cjs/components/LiveChatWidget/components/ScrollAnchor.js +2 -0
- package/dist/cjs/components/LiveChatWidget/components/ScrollAnchor.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/constants.d.ts +8 -0
- package/dist/cjs/components/LiveChatWidget/constants.js +2 -0
- package/dist/cjs/components/LiveChatWidget/constants.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.d.ts +51 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.js +2 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useChatAPI.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useChatState.d.ts +120 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useChatState.js +2 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useChatState.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useSession.d.ts +37 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useSession.js +2 -0
- package/dist/cjs/components/LiveChatWidget/hooks/useSession.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/index.d.ts +12 -0
- package/dist/cjs/components/LiveChatWidget/index.js +2 -0
- package/dist/cjs/components/LiveChatWidget/index.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/types.d.ts +609 -0
- package/dist/cjs/components/LiveChatWidget/types.js +2 -0
- package/dist/cjs/components/LiveChatWidget/types.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/utils/cartTransformers.d.ts +25 -0
- package/dist/cjs/components/LiveChatWidget/utils/cartTransformers.js +2 -0
- package/dist/cjs/components/LiveChatWidget/utils/cartTransformers.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.d.ts +64 -0
- package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.js +2 -0
- package/dist/cjs/components/LiveChatWidget/utils/messageRenderers.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/utils/productTransformers.d.ts +43 -0
- package/dist/cjs/components/LiveChatWidget/utils/productTransformers.js +2 -0
- package/dist/cjs/components/LiveChatWidget/utils/productTransformers.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/utils/userId.d.ts +18 -0
- package/dist/cjs/components/LiveChatWidget/utils/userId.js +2 -0
- package/dist/cjs/components/LiveChatWidget/utils/userId.js.map +7 -0
- package/dist/cjs/components/LiveChatWidget/utils/validation.d.ts +37 -0
- package/dist/cjs/components/LiveChatWidget/utils/validation.js +2 -0
- package/dist/cjs/components/LiveChatWidget/utils/validation.js.map +7 -0
- package/dist/cjs/components/chat/markdown.js +1 -1
- package/dist/cjs/components/chat/markdown.js.map +2 -2
- package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.d.ts +2 -2
- package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useFunctionMemberPrice.js.map +2 -2
- package/dist/cjs/components/credits/context/hooks/useRedeemableList.js +1 -1
- package/dist/cjs/components/credits/context/hooks/useRedeemableList.js.map +2 -2
- package/dist/cjs/components/credits/context/memberPriceConst.d.ts +0 -5
- package/dist/cjs/components/credits/context/memberPriceConst.js +1 -1
- package/dist/cjs/components/credits/context/memberPriceConst.js.map +3 -3
- package/dist/cjs/components/credits/context/memberPriceTypes.d.ts +1 -22
- package/dist/cjs/components/credits/context/memberPriceTypes.js +1 -1
- package/dist/cjs/components/credits/context/memberPriceTypes.js.map +1 -1
- package/dist/cjs/components/credits/context/provider.d.ts +16 -1
- package/dist/cjs/components/credits/context/provider.js +1 -1
- package/dist/cjs/components/credits/context/provider.js.map +3 -3
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.d.ts +2 -2
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js +1 -1
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPrice.js.map +1 -1
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +2 -2
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +1 -1
- package/dist/cjs/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +1 -1
- package/dist/cjs/components/credits/context/utils/variantGetCoupon.d.ts +2 -2
- package/dist/cjs/components/credits/context/utils/variantGetCoupon.js +1 -1
- package/dist/cjs/components/credits/context/utils/variantGetCoupon.js.map +1 -1
- package/dist/cjs/components/credits/context/utils.d.ts +4 -0
- package/dist/cjs/components/credits/context/utils.js +1 -1
- package/dist/cjs/components/credits/context/utils.js.map +3 -3
- package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
- package/dist/cjs/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
- package/dist/cjs/components/credits/creditsBanner/index.d.ts +2 -0
- package/dist/cjs/components/credits/creditsBanner/index.js +12 -1
- package/dist/cjs/components/credits/creditsBanner/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js +1 -1
- package/dist/cjs/components/credits/creditsBenefits/BenefitItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsBenefits/IconInfo.js +1 -1
- package/dist/cjs/components/credits/creditsBenefits/IconInfo.js.map +1 -1
- package/dist/cjs/components/credits/creditsBenefits/index.js +3 -3
- package/dist/cjs/components/credits/creditsBenefits/index.js.map +2 -2
- package/dist/cjs/components/credits/creditsCash/CreditsCash.js +1 -1
- package/dist/cjs/components/credits/creditsCash/CreditsCash.js.map +3 -3
- package/dist/cjs/components/credits/creditsCash/RedeemableItem.js +1 -1
- package/dist/cjs/components/credits/creditsCash/RedeemableItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsCash/type.d.ts +1 -0
- package/dist/cjs/components/credits/creditsCash/type.js +1 -1
- package/dist/cjs/components/credits/creditsCash/type.js.map +1 -1
- package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
- package/dist/cjs/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsFaq/index.js +1 -1
- package/dist/cjs/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsInfoCard/index.js +1 -1
- package/dist/cjs/components/credits/creditsInfoCard/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
- package/dist/cjs/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
- package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
- package/dist/cjs/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsMemberPrice/Pagination.d.ts +7 -0
- package/dist/cjs/components/credits/creditsMemberPrice/Pagination.js +2 -0
- package/dist/cjs/components/credits/creditsMemberPrice/Pagination.js.map +7 -0
- package/dist/cjs/components/credits/creditsMemberPrice/type.d.ts +3 -5
- package/dist/cjs/components/credits/creditsMemberPrice/type.js +1 -1
- package/dist/cjs/components/credits/creditsMemberPrice/type.js.map +1 -1
- package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
- package/dist/cjs/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/AddressForm/index.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +3 -3
- package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
- package/dist/cjs/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
- package/dist/cjs/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
- package/dist/cjs/components/credits/modal/MyRewardsModal.js +1 -1
- package/dist/cjs/components/credits/modal/MyRewardsModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/activitiesModal.js +1 -1
- package/dist/cjs/components/credits/modal/activitiesModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js +1 -1
- package/dist/cjs/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/modalContainer.js +1 -1
- package/dist/cjs/components/credits/modal/modalContainer.js.map +3 -3
- package/dist/cjs/components/credits/modal/subscribeModal.js +1 -1
- package/dist/cjs/components/credits/modal/subscribeModal.js.map +3 -3
- package/dist/cjs/components/credits/modal/tip.js +1 -1
- package/dist/cjs/components/credits/modal/tip.js.map +3 -3
- package/dist/cjs/components/index.d.ts +3 -1
- package/dist/cjs/components/index.js +1 -1
- package/dist/cjs/components/index.js.map +3 -3
- package/dist/cjs/components/registration/authCodeActivate/index.js +1 -1
- package/dist/cjs/components/registration/authCodeActivate/index.js.map +3 -3
- package/dist/cjs/components/registration/modalContainer.js +1 -1
- package/dist/cjs/components/registration/modalContainer.js.map +3 -3
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +2 -0
- package/dist/cjs/constants.js.map +7 -0
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/stories/CartCard.stories.d.ts +33 -0
- package/dist/cjs/stories/CartCard.stories.js +21 -0
- package/dist/cjs/stories/CartCard.stories.js.map +7 -0
- package/dist/cjs/stories/LiveChatWidget.stories.d.ts +92 -0
- package/dist/cjs/stories/LiveChatWidget.stories.js +98 -0
- package/dist/cjs/stories/LiveChatWidget.stories.js.map +7 -0
- package/dist/cjs/templates/Credits.d.ts +15 -1
- package/dist/cjs/templates/Credits.js +1 -1
- package/dist/cjs/templates/Credits.js.map +3 -3
- package/dist/esm/components/LiveChatWidget/LiveChatWidget.d.ts +43 -0
- package/dist/esm/components/LiveChatWidget/LiveChatWidget.js +2 -0
- package/dist/esm/components/LiveChatWidget/LiveChatWidget.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/api/chat.d.ts +25 -0
- package/dist/esm/components/LiveChatWidget/api/chat.js +3 -0
- package/dist/esm/components/LiveChatWidget/api/chat.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/ChatBubble.d.ts +68 -0
- package/dist/esm/components/LiveChatWidget/components/ChatBubble.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/ChatBubble.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/ChatHeader.d.ts +57 -0
- package/dist/esm/components/LiveChatWidget/components/ChatHeader.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/ChatHeader.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/ChatInput.d.ts +70 -0
- package/dist/esm/components/LiveChatWidget/components/ChatInput.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/ChatInput.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/ChatMessage.d.ts +59 -0
- package/dist/esm/components/LiveChatWidget/components/ChatMessage.js +5 -0
- package/dist/esm/components/LiveChatWidget/components/ChatMessage.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/ChatWindow.d.ts +127 -0
- package/dist/esm/components/LiveChatWidget/components/ChatWindow.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/ChatWindow.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.d.ts +54 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/CartCard.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.d.ts +33 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ErrorBlock.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.d.ts +16 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/FAQList.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.d.ts +45 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js +5 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/PolicyBlock.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.d.ts +48 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js +5 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductCard.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.d.ts +70 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductComparison.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.d.ts +47 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ProductList.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.d.ts +78 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/PromotionList.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.d.ts +54 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/QuickReplies.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.d.ts +31 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/TextBlock.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.d.ts +31 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/ThinkingBlock.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/index.d.ts +15 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/index.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent/index.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent.d.ts +63 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/MessageContent.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/MessageList.d.ts +74 -0
- package/dist/esm/components/LiveChatWidget/components/MessageList.js +5 -0
- package/dist/esm/components/LiveChatWidget/components/MessageList.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.d.ts +44 -0
- package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.js +2 -0
- package/dist/esm/components/LiveChatWidget/components/ScrollAnchor.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/constants.d.ts +8 -0
- package/dist/esm/components/LiveChatWidget/constants.js +2 -0
- package/dist/esm/components/LiveChatWidget/constants.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.d.ts +51 -0
- package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js +2 -0
- package/dist/esm/components/LiveChatWidget/hooks/useChatAPI.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/hooks/useChatState.d.ts +120 -0
- package/dist/esm/components/LiveChatWidget/hooks/useChatState.js +2 -0
- package/dist/esm/components/LiveChatWidget/hooks/useChatState.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/hooks/useSession.d.ts +37 -0
- package/dist/esm/components/LiveChatWidget/hooks/useSession.js +2 -0
- package/dist/esm/components/LiveChatWidget/hooks/useSession.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/index.d.ts +12 -0
- package/dist/esm/components/LiveChatWidget/index.js +2 -0
- package/dist/esm/components/LiveChatWidget/index.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/types.d.ts +609 -0
- package/dist/esm/components/LiveChatWidget/types.js +1 -0
- package/dist/esm/components/LiveChatWidget/types.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/utils/cartTransformers.d.ts +25 -0
- package/dist/esm/components/LiveChatWidget/utils/cartTransformers.js +2 -0
- package/dist/esm/components/LiveChatWidget/utils/cartTransformers.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/utils/messageRenderers.d.ts +64 -0
- package/dist/esm/components/LiveChatWidget/utils/messageRenderers.js +2 -0
- package/dist/esm/components/LiveChatWidget/utils/messageRenderers.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/utils/productTransformers.d.ts +43 -0
- package/dist/esm/components/LiveChatWidget/utils/productTransformers.js +2 -0
- package/dist/esm/components/LiveChatWidget/utils/productTransformers.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/utils/userId.d.ts +18 -0
- package/dist/esm/components/LiveChatWidget/utils/userId.js +2 -0
- package/dist/esm/components/LiveChatWidget/utils/userId.js.map +7 -0
- package/dist/esm/components/LiveChatWidget/utils/validation.d.ts +37 -0
- package/dist/esm/components/LiveChatWidget/utils/validation.js +2 -0
- package/dist/esm/components/LiveChatWidget/utils/validation.js.map +7 -0
- package/dist/esm/components/chat/markdown.js +1 -1
- package/dist/esm/components/chat/markdown.js.map +2 -2
- package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.d.ts +2 -2
- package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js +1 -1
- package/dist/esm/components/credits/context/hooks/useFunctionMemberPrice.js.map +2 -2
- package/dist/esm/components/credits/context/hooks/useRedeemableList.js +1 -1
- package/dist/esm/components/credits/context/hooks/useRedeemableList.js.map +2 -2
- package/dist/esm/components/credits/context/memberPriceConst.d.ts +0 -5
- package/dist/esm/components/credits/context/memberPriceConst.js +1 -1
- package/dist/esm/components/credits/context/memberPriceConst.js.map +3 -3
- package/dist/esm/components/credits/context/memberPriceTypes.d.ts +1 -22
- package/dist/esm/components/credits/context/provider.d.ts +16 -1
- package/dist/esm/components/credits/context/provider.js +1 -1
- package/dist/esm/components/credits/context/provider.js.map +3 -3
- package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.d.ts +2 -2
- package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js +1 -1
- package/dist/esm/components/credits/context/utils/getFunctionMemberPrice.js.map +1 -1
- package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.d.ts +2 -2
- package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js +1 -1
- package/dist/esm/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.js.map +1 -1
- package/dist/esm/components/credits/context/utils/variantGetCoupon.d.ts +2 -2
- package/dist/esm/components/credits/context/utils/variantGetCoupon.js +1 -1
- package/dist/esm/components/credits/context/utils/variantGetCoupon.js.map +1 -1
- package/dist/esm/components/credits/context/utils.d.ts +4 -0
- package/dist/esm/components/credits/context/utils.js +1 -1
- package/dist/esm/components/credits/context/utils.js.map +3 -3
- package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js +1 -1
- package/dist/esm/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.js.map +3 -3
- package/dist/esm/components/credits/creditsBanner/index.d.ts +2 -0
- package/dist/esm/components/credits/creditsBanner/index.js +12 -1
- package/dist/esm/components/credits/creditsBanner/index.js.map +3 -3
- package/dist/esm/components/credits/creditsBenefits/BenefitItem.js +1 -1
- package/dist/esm/components/credits/creditsBenefits/BenefitItem.js.map +3 -3
- package/dist/esm/components/credits/creditsBenefits/IconInfo.js +1 -1
- package/dist/esm/components/credits/creditsBenefits/IconInfo.js.map +1 -1
- package/dist/esm/components/credits/creditsBenefits/index.js +3 -3
- package/dist/esm/components/credits/creditsBenefits/index.js.map +2 -2
- package/dist/esm/components/credits/creditsCash/CreditsCash.js +1 -1
- package/dist/esm/components/credits/creditsCash/CreditsCash.js.map +3 -3
- package/dist/esm/components/credits/creditsCash/RedeemableItem.js +1 -1
- package/dist/esm/components/credits/creditsCash/RedeemableItem.js.map +3 -3
- package/dist/esm/components/credits/creditsCash/type.d.ts +1 -0
- package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js +1 -1
- package/dist/esm/components/credits/creditsFaq/faqItem/FaqItem.js.map +3 -3
- package/dist/esm/components/credits/creditsFaq/index.js +1 -1
- package/dist/esm/components/credits/creditsFaq/index.js.map +3 -3
- package/dist/esm/components/credits/creditsInfoCard/index.js +1 -1
- package/dist/esm/components/credits/creditsInfoCard/index.js.map +2 -2
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js +1 -1
- package/dist/esm/components/credits/creditsMemberPrice/CreditsMemberPrice.js.map +3 -3
- package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js +1 -1
- package/dist/esm/components/credits/creditsMemberPrice/MemberPriceItem.js.map +3 -3
- package/dist/esm/components/credits/creditsMemberPrice/Pagination.d.ts +7 -0
- package/dist/esm/components/credits/creditsMemberPrice/Pagination.js +2 -0
- package/dist/esm/components/credits/creditsMemberPrice/Pagination.js.map +7 -0
- package/dist/esm/components/credits/creditsMemberPrice/type.d.ts +3 -5
- package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js +1 -1
- package/dist/esm/components/credits/creditsNavigation/CreditsNavigation.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/CountrySelect.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/StateSelect.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/AddressForm/index.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/CreditsRedeemList.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Address.js.map +3 -3
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemProductModal/Success.js.map +2 -2
- package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js +1 -1
- package/dist/esm/components/credits/creditsRedeemList/RedeemableItem.js.map +3 -3
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js +1 -1
- package/dist/esm/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.js.map +3 -3
- package/dist/esm/components/credits/modal/MyRewardsModal.js +1 -1
- package/dist/esm/components/credits/modal/MyRewardsModal.js.map +2 -2
- package/dist/esm/components/credits/modal/activitiesModal.js +1 -1
- package/dist/esm/components/credits/modal/activitiesModal.js.map +3 -3
- package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js +1 -1
- package/dist/esm/components/credits/modal/creditsUploadReceiptModal.js.map +3 -3
- package/dist/esm/components/credits/modal/modalContainer.js +1 -1
- package/dist/esm/components/credits/modal/modalContainer.js.map +3 -3
- package/dist/esm/components/credits/modal/subscribeModal.js +1 -1
- package/dist/esm/components/credits/modal/subscribeModal.js.map +3 -3
- package/dist/esm/components/credits/modal/tip.js +1 -1
- package/dist/esm/components/credits/modal/tip.js.map +3 -3
- package/dist/esm/components/index.d.ts +3 -1
- package/dist/esm/components/index.js +1 -1
- package/dist/esm/components/index.js.map +3 -3
- package/dist/esm/components/registration/authCodeActivate/index.js +1 -1
- package/dist/esm/components/registration/authCodeActivate/index.js.map +3 -3
- package/dist/esm/components/registration/modalContainer.js +1 -1
- package/dist/esm/components/registration/modalContainer.js.map +3 -3
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +2 -0
- package/dist/esm/constants.js.map +7 -0
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/stories/CartCard.stories.d.ts +33 -0
- package/dist/esm/stories/CartCard.stories.js +21 -0
- package/dist/esm/stories/CartCard.stories.js.map +7 -0
- package/dist/esm/stories/LiveChatWidget.stories.d.ts +92 -0
- package/dist/esm/stories/LiveChatWidget.stories.js +98 -0
- package/dist/esm/stories/LiveChatWidget.stories.js.map +7 -0
- package/dist/esm/templates/Credits.d.ts +15 -1
- package/dist/esm/templates/Credits.js +1 -1
- package/dist/esm/templates/Credits.js.map +3 -3
- package/package.json +7 -3
- package/src/components/LiveChatWidget/LiveChatWidget.tsx +599 -0
- package/src/components/LiveChatWidget/api/chat.ts +136 -0
- package/src/components/LiveChatWidget/components/ChatBubble.tsx +152 -0
- package/src/components/LiveChatWidget/components/ChatHeader.tsx +151 -0
- package/src/components/LiveChatWidget/components/ChatInput.tsx +216 -0
- package/src/components/LiveChatWidget/components/ChatMessage.tsx +182 -0
- package/src/components/LiveChatWidget/components/ChatWindow.tsx +304 -0
- package/src/components/LiveChatWidget/components/MessageContent/CartCard.tsx +198 -0
- package/src/components/LiveChatWidget/components/MessageContent/ErrorBlock.tsx +75 -0
- package/src/components/LiveChatWidget/components/MessageContent/FAQList.tsx +127 -0
- package/src/components/LiveChatWidget/components/MessageContent/PolicyBlock.tsx +150 -0
- package/src/components/LiveChatWidget/components/MessageContent/ProductCard.tsx +139 -0
- package/src/components/LiveChatWidget/components/MessageContent/ProductComparison.tsx +348 -0
- package/src/components/LiveChatWidget/components/MessageContent/ProductList.tsx +275 -0
- package/src/components/LiveChatWidget/components/MessageContent/PromotionList.tsx +207 -0
- package/src/components/LiveChatWidget/components/MessageContent/QuickReplies.tsx +91 -0
- package/src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx +89 -0
- package/src/components/LiveChatWidget/components/MessageContent/ThinkingBlock.tsx +53 -0
- package/src/components/LiveChatWidget/components/MessageContent/index.ts +16 -0
- package/src/components/LiveChatWidget/components/MessageContent.tsx +110 -0
- package/src/components/LiveChatWidget/components/MessageList.tsx +261 -0
- package/src/components/LiveChatWidget/components/ScrollAnchor.tsx +75 -0
- package/src/components/LiveChatWidget/constants.ts +15 -0
- package/src/components/LiveChatWidget/hooks/useChatAPI.ts +136 -0
- package/src/components/LiveChatWidget/hooks/useChatState.ts +542 -0
- package/src/components/LiveChatWidget/hooks/useSession.ts +123 -0
- package/src/components/LiveChatWidget/index.tsx +62 -0
- package/src/components/LiveChatWidget/types.ts +769 -0
- package/src/components/LiveChatWidget/utils/cartTransformers.ts +72 -0
- package/src/components/LiveChatWidget/utils/messageRenderers.ts +120 -0
- package/src/components/LiveChatWidget/utils/productTransformers.ts +149 -0
- package/src/components/LiveChatWidget/utils/userId.ts +140 -0
- package/src/components/LiveChatWidget/utils/validation.ts +99 -0
- package/src/components/chat/markdown.tsx +1 -1
- package/src/components/credits/context/hooks/useRedeemableList.ts +1 -1
- package/src/components/credits/context/memberPriceConst.ts +0 -7
- package/src/components/credits/context/memberPriceTypes.ts +1 -26
- package/src/components/credits/context/provider.tsx +16 -0
- package/src/components/credits/context/utils.ts +9 -0
- package/src/components/credits/creditsAnkersolixTask/CreditsAnkersolixTask.tsx +44 -41
- package/src/components/credits/creditsBanner/index.tsx +31 -3
- package/src/components/credits/creditsBenefits/BenefitItem.tsx +13 -5
- package/src/components/credits/creditsBenefits/IconInfo.tsx +1 -1
- package/src/components/credits/creditsBenefits/index.tsx +1 -1
- package/src/components/credits/creditsCash/CreditsCash.tsx +6 -3
- package/src/components/credits/creditsCash/RedeemableItem.tsx +29 -11
- package/src/components/credits/creditsCash/type.ts +1 -0
- package/src/components/credits/creditsFaq/faqItem/FaqItem.tsx +25 -23
- package/src/components/credits/creditsFaq/index.tsx +2 -1
- package/src/components/credits/creditsInfoCard/index.tsx +10 -3
- package/src/components/credits/creditsMemberPrice/CreditsMemberPrice.tsx +160 -136
- package/src/components/credits/creditsMemberPrice/MemberPriceItem.tsx +134 -29
- package/src/components/credits/creditsMemberPrice/Pagination.tsx +113 -0
- package/src/components/credits/creditsMemberPrice/type.ts +3 -5
- package/src/components/credits/creditsNavigation/CreditsNavigation.tsx +3 -3
- package/src/components/credits/creditsRedeemList/AddressForm/CountrySelect.tsx +2 -1
- package/src/components/credits/creditsRedeemList/AddressForm/StateSelect.tsx +2 -1
- package/src/components/credits/creditsRedeemList/AddressForm/index.tsx +2 -1
- package/src/components/credits/creditsRedeemList/CreditsRedeemList.tsx +32 -18
- package/src/components/credits/creditsRedeemList/RedeemProductModal/Address.tsx +2 -1
- package/src/components/credits/creditsRedeemList/RedeemProductModal/ProductInfo.tsx +6 -4
- package/src/components/credits/creditsRedeemList/RedeemProductModal/Success.tsx +2 -1
- package/src/components/credits/creditsRedeemList/RedeemableItem.tsx +21 -7
- package/src/components/credits/creditsWaysToGetCredits/CreditsWaysToGetCredits.tsx +34 -20
- package/src/components/credits/modal/MyRewardsModal.tsx +2 -1
- package/src/components/credits/modal/activitiesModal.tsx +2 -1
- package/src/components/credits/modal/creditsUploadReceiptModal.tsx +2 -1
- package/src/components/credits/modal/modalContainer.tsx +2 -1
- package/src/components/credits/modal/subscribeModal.tsx +2 -1
- package/src/components/credits/modal/tip.tsx +2 -1
- package/src/components/index.ts +23 -1
- package/src/components/registration/authCodeActivate/index.tsx +3 -1
- package/src/components/registration/modalContainer.tsx +2 -1
- package/src/constants.ts +1 -0
- package/src/index.ts +3 -2
- package/src/stories/CartCard.stories.tsx +459 -0
- package/src/stories/LiveChatWidget.stories.tsx +461 -0
- package/src/styles/livechat.css +263 -0
- package/src/templates/Credits.tsx +26 -9
- package/src/components/credits/context/hooks/useFunctionMemberPrice.ts +0 -33
- package/src/components/credits/context/utils/atobID.ts +0 -8
- package/src/components/credits/context/utils/functionDiscountCalculate.ts +0 -57
- package/src/components/credits/context/utils/getFunctionMemberPrice.ts +0 -135
- package/src/components/credits/context/utils/getFunctionMemberPriceDiscountConfig.ts +0 -51
- package/src/components/credits/context/utils/variantGetCoupon.ts +0 -34
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单条聊天消息组件
|
|
3
|
+
* 显示消息气泡、发送者、时间戳
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的消息展示设计
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import React from 'react'
|
|
8
|
+
import type { Message, MessageRenderer } from '../types'
|
|
9
|
+
import { MessageContent } from './MessageContent'
|
|
10
|
+
import { MessageRendererRegistry } from '../utils/messageRenderers'
|
|
11
|
+
|
|
12
|
+
export interface ChatMessageProps {
|
|
13
|
+
/**
|
|
14
|
+
* 消息数据
|
|
15
|
+
*/
|
|
16
|
+
message: Message
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 自定义渲染器注册表
|
|
20
|
+
*/
|
|
21
|
+
rendererRegistry?: MessageRendererRegistry
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 默认渲染器
|
|
25
|
+
*/
|
|
26
|
+
defaultRenderer?: MessageRenderer
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 是否显示时间戳
|
|
30
|
+
* @default true
|
|
31
|
+
*/
|
|
32
|
+
showTimestamp?: boolean
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 自定义样式类名
|
|
36
|
+
*/
|
|
37
|
+
className?: string
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 商品添加到购物车回调
|
|
41
|
+
*/
|
|
42
|
+
onAddToCart?: (product: any) => void
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 格式化时间戳为可读格式
|
|
47
|
+
* @param timestamp Unix 时间戳(毫秒)
|
|
48
|
+
* @returns 格式化后的时间字符串 (如 "14:30")
|
|
49
|
+
*/
|
|
50
|
+
function formatTimestamp(timestamp: number): string {
|
|
51
|
+
const date = new Date(timestamp)
|
|
52
|
+
const hours = date.getHours().toString().padStart(2, '0')
|
|
53
|
+
const minutes = date.getMinutes().toString().padStart(2, '0')
|
|
54
|
+
return `${hours}:${minutes}`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 单条聊天消息组件
|
|
59
|
+
*
|
|
60
|
+
* 功能:
|
|
61
|
+
* - 显示消息气泡(用户 vs AI 助手不同样式)
|
|
62
|
+
* - 支持多个 content 块(一条消息可包含多种内容类型)
|
|
63
|
+
* - 显示时间戳
|
|
64
|
+
* - 系统消息居中显示
|
|
65
|
+
*
|
|
66
|
+
* 样式规则:
|
|
67
|
+
* - 用户消息:右对齐,灰色背景
|
|
68
|
+
* - AI 助手消息:左对齐,白色背景
|
|
69
|
+
* - 系统消息:居中,黄色背景
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```tsx
|
|
73
|
+
* <ChatMessage
|
|
74
|
+
* message={message}
|
|
75
|
+
* rendererRegistry={customRegistry}
|
|
76
|
+
* showTimestamp={true}
|
|
77
|
+
* />
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export const ChatMessage: React.FC<ChatMessageProps> = ({
|
|
81
|
+
message,
|
|
82
|
+
rendererRegistry,
|
|
83
|
+
defaultRenderer,
|
|
84
|
+
showTimestamp = true,
|
|
85
|
+
className = '',
|
|
86
|
+
onAddToCart,
|
|
87
|
+
}) => {
|
|
88
|
+
const isUser = message.role === 'user'
|
|
89
|
+
const isAssistant = message.role === 'assistant'
|
|
90
|
+
const isSystem = message.role === 'system'
|
|
91
|
+
const isTool = message.role === 'tool'
|
|
92
|
+
|
|
93
|
+
// 系统消息特殊处理(居中显示)
|
|
94
|
+
if (isSystem) {
|
|
95
|
+
return (
|
|
96
|
+
<div className={`flex justify-center py-2 ${className}`}>
|
|
97
|
+
<div className="max-w-xs rounded-lg border border-yellow-200 bg-yellow-50 px-4 py-2">
|
|
98
|
+
{message.content.map((content, index) => (
|
|
99
|
+
<MessageContent
|
|
100
|
+
key={index}
|
|
101
|
+
content={content}
|
|
102
|
+
isUser={false}
|
|
103
|
+
isSystem={true}
|
|
104
|
+
rendererRegistry={rendererRegistry}
|
|
105
|
+
defaultRenderer={defaultRenderer}
|
|
106
|
+
/>
|
|
107
|
+
))}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 工具消息(通常不显示,或显示为系统消息)
|
|
114
|
+
if (isTool) {
|
|
115
|
+
return null
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 分离内容类型:需要独立渲染的结构化内容
|
|
119
|
+
const structuredContentTypes = ['product_list', 'product_comparison', 'faq_list', 'promotion_list', 'cart']
|
|
120
|
+
|
|
121
|
+
// 将内容分为两组:气泡内容 和 独立内容
|
|
122
|
+
const bubbleContent = message.content.filter(c => !structuredContentTypes.includes(c.type))
|
|
123
|
+
const standaloneContent = message.content.filter(c => structuredContentTypes.includes(c.type))
|
|
124
|
+
|
|
125
|
+
// 用户/助手消息
|
|
126
|
+
return (
|
|
127
|
+
<div className={`flex ${isUser ? 'justify-end' : 'justify-start'} py-2 ${className}`}>
|
|
128
|
+
<div className="flex w-fit max-w-full flex-col gap-2">
|
|
129
|
+
{/* 消息气泡(仅包含文本和快捷回复等) */}
|
|
130
|
+
{bubbleContent.length > 0 && (
|
|
131
|
+
<div
|
|
132
|
+
className={`w-full min-w-0 overflow-hidden rounded-2xl px-4 py-2 ${isUser ? 'rounded-br-sm text-white' : 'rounded-bl-sm text-[#1D1D1F]'}`}
|
|
133
|
+
style={{
|
|
134
|
+
backgroundColor: isUser ? '#005D8E' : '#F5F6F7',
|
|
135
|
+
}}
|
|
136
|
+
>
|
|
137
|
+
{/* 渲染气泡内的内容块 */}
|
|
138
|
+
<div className="flex w-full min-w-0 flex-col gap-2">
|
|
139
|
+
{bubbleContent.map((content, index) => (
|
|
140
|
+
<MessageContent
|
|
141
|
+
key={index}
|
|
142
|
+
content={content}
|
|
143
|
+
isUser={isUser}
|
|
144
|
+
isSystem={false}
|
|
145
|
+
rendererRegistry={rendererRegistry}
|
|
146
|
+
defaultRenderer={defaultRenderer}
|
|
147
|
+
onAddToCart={onAddToCart}
|
|
148
|
+
/>
|
|
149
|
+
))}
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
)}
|
|
153
|
+
|
|
154
|
+
{/* 独立渲染的结构化内容(不在气泡内) */}
|
|
155
|
+
{standaloneContent.map((content, index) => (
|
|
156
|
+
<div key={`standalone-${index}`} className="w-full">
|
|
157
|
+
<MessageContent
|
|
158
|
+
content={content}
|
|
159
|
+
isUser={isUser}
|
|
160
|
+
isSystem={false}
|
|
161
|
+
rendererRegistry={rendererRegistry}
|
|
162
|
+
defaultRenderer={defaultRenderer}
|
|
163
|
+
onAddToCart={onAddToCart}
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
))}
|
|
167
|
+
|
|
168
|
+
{/* 时间戳 */}
|
|
169
|
+
{showTimestamp && (
|
|
170
|
+
<span
|
|
171
|
+
className={`
|
|
172
|
+
px-2 text-xs text-gray-400
|
|
173
|
+
${isUser ? 'text-right' : 'text-left'}
|
|
174
|
+
`}
|
|
175
|
+
>
|
|
176
|
+
{formatTimestamp(message.timestamp)}
|
|
177
|
+
</span>
|
|
178
|
+
)}
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
)
|
|
182
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 聊天窗口容器组件
|
|
3
|
+
* 包含头部、消息列表、输入框的完整聊天界面
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的窗口设计
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import React, { useState, useRef, useEffect } from 'react'
|
|
8
|
+
import type { Message, MessageRenderer } from '../types'
|
|
9
|
+
import { ChatHeader } from './ChatHeader'
|
|
10
|
+
import { MessageList } from './MessageList'
|
|
11
|
+
import { ChatInput } from './ChatInput'
|
|
12
|
+
import { MessageRendererRegistry } from '../utils/messageRenderers'
|
|
13
|
+
|
|
14
|
+
export interface ChatWindowProps {
|
|
15
|
+
/**
|
|
16
|
+
* 消息列表
|
|
17
|
+
*/
|
|
18
|
+
messages: Message[]
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 输入框当前值
|
|
22
|
+
*/
|
|
23
|
+
inputValue: string
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 输入框值变化回调
|
|
27
|
+
*/
|
|
28
|
+
onInputChange: (value: string) => void
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 发送消息回调
|
|
32
|
+
*/
|
|
33
|
+
onSend: () => void
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 关闭窗口回调
|
|
37
|
+
*/
|
|
38
|
+
onClose?: () => void
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 新会话回调
|
|
42
|
+
*/
|
|
43
|
+
onNewSession?: () => void
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 头部标题
|
|
47
|
+
*/
|
|
48
|
+
title?: string
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Logo URL
|
|
52
|
+
*/
|
|
53
|
+
logoUrl?: string
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 是否正在发送消息
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
isSending?: boolean
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 是否正在加载历史消息
|
|
63
|
+
* @default false
|
|
64
|
+
*/
|
|
65
|
+
isLoadingHistory?: boolean
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 是否显示时间戳
|
|
69
|
+
* @default true
|
|
70
|
+
*/
|
|
71
|
+
showTimestamp?: boolean
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 是否自动滚动
|
|
75
|
+
* @default true
|
|
76
|
+
*/
|
|
77
|
+
autoScroll?: boolean
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 自定义渲染器注册表
|
|
81
|
+
*/
|
|
82
|
+
rendererRegistry?: MessageRendererRegistry
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 默认渲染器
|
|
86
|
+
*/
|
|
87
|
+
defaultRenderer?: MessageRenderer
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 输入框占位符
|
|
91
|
+
*/
|
|
92
|
+
inputPlaceholder?: string
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 自定义样式类名
|
|
96
|
+
*/
|
|
97
|
+
className?: string
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 商品添加到购物车回调
|
|
101
|
+
*/
|
|
102
|
+
onAddToCart?: (product: any) => void
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 是否显示新会话按钮
|
|
106
|
+
* @default true
|
|
107
|
+
*/
|
|
108
|
+
showNewSessionButton?: boolean
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 聊天窗口容器组件
|
|
113
|
+
*
|
|
114
|
+
* 功能:
|
|
115
|
+
* - 组合头部、消息列表、输入框
|
|
116
|
+
* - 响应式布局(移动端全屏,桌面端固定尺寸)
|
|
117
|
+
* - 动画进入/退出效果
|
|
118
|
+
*
|
|
119
|
+
* 布局结构:
|
|
120
|
+
* ```
|
|
121
|
+
* ┌─────────────────────┐
|
|
122
|
+
* │ ChatHeader │ (固定顶部)
|
|
123
|
+
* ├─────────────────────┤
|
|
124
|
+
* │ MessageList │ (可滚动区域)
|
|
125
|
+
* │ (flex-1) │
|
|
126
|
+
* ├─────────────────────┤
|
|
127
|
+
* │ ChatInput │ (固定底部)
|
|
128
|
+
* └─────────────────────┘
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* 响应式设计:
|
|
132
|
+
* - 移动端 (< 768px): 全屏显示
|
|
133
|
+
* - 平板及以上 (>= 768px): 固定尺寸弹窗
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```tsx
|
|
137
|
+
* <ChatWindow
|
|
138
|
+
* messages={messages}
|
|
139
|
+
* inputValue={inputValue}
|
|
140
|
+
* onInputChange={setInputValue}
|
|
141
|
+
* onSend={handleSend}
|
|
142
|
+
* onClose={() => setIsOpen(false)}
|
|
143
|
+
* onNewSession={handleNewSession}
|
|
144
|
+
* isSending={isStreaming}
|
|
145
|
+
* title="AI 助手"
|
|
146
|
+
* logoUrl="/logo.png"
|
|
147
|
+
* />
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export const ChatWindow: React.FC<ChatWindowProps> = ({
|
|
151
|
+
messages,
|
|
152
|
+
inputValue,
|
|
153
|
+
onInputChange,
|
|
154
|
+
onSend,
|
|
155
|
+
onClose,
|
|
156
|
+
onNewSession,
|
|
157
|
+
title,
|
|
158
|
+
logoUrl,
|
|
159
|
+
isSending = false,
|
|
160
|
+
isLoadingHistory = false,
|
|
161
|
+
showTimestamp = true,
|
|
162
|
+
autoScroll = true,
|
|
163
|
+
rendererRegistry,
|
|
164
|
+
defaultRenderer,
|
|
165
|
+
inputPlaceholder,
|
|
166
|
+
className = '',
|
|
167
|
+
onAddToCart,
|
|
168
|
+
showNewSessionButton = true,
|
|
169
|
+
}) => {
|
|
170
|
+
// 移动端高度调节状态(默认375px)
|
|
171
|
+
const [mobileHeight, setMobileHeight] = useState(375)
|
|
172
|
+
const [isDragging, setIsDragging] = useState(false)
|
|
173
|
+
const dragStartY = useRef(0)
|
|
174
|
+
const dragStartHeight = useRef(375)
|
|
175
|
+
const windowRef = useRef<HTMLDivElement>(null)
|
|
176
|
+
|
|
177
|
+
// 检测是否为移动端(初始化时立即检测)
|
|
178
|
+
const [isMobile, setIsMobile] = useState(() => {
|
|
179
|
+
if (typeof window !== 'undefined') {
|
|
180
|
+
return window.innerWidth < 768
|
|
181
|
+
}
|
|
182
|
+
return false
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
const checkMobile = () => {
|
|
187
|
+
setIsMobile(window.innerWidth < 768)
|
|
188
|
+
}
|
|
189
|
+
window.addEventListener('resize', checkMobile)
|
|
190
|
+
return () => window.removeEventListener('resize', checkMobile)
|
|
191
|
+
}, [])
|
|
192
|
+
|
|
193
|
+
// 拖拽开始
|
|
194
|
+
const handleDragStart = (e: React.MouseEvent | React.TouchEvent) => {
|
|
195
|
+
if (!isMobile) return
|
|
196
|
+
|
|
197
|
+
setIsDragging(true)
|
|
198
|
+
const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY
|
|
199
|
+
dragStartY.current = clientY
|
|
200
|
+
dragStartHeight.current = mobileHeight
|
|
201
|
+
|
|
202
|
+
// 阻止默认行为
|
|
203
|
+
e.preventDefault()
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 拖拽中
|
|
207
|
+
useEffect(() => {
|
|
208
|
+
if (!isDragging) return
|
|
209
|
+
|
|
210
|
+
const handleDragMove = (e: MouseEvent | TouchEvent) => {
|
|
211
|
+
const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY
|
|
212
|
+
const deltaY = dragStartY.current - clientY // 向上拖动为正值
|
|
213
|
+
const newHeight = Math.max(375, Math.min(window.innerHeight * 0.9, dragStartHeight.current + deltaY))
|
|
214
|
+
|
|
215
|
+
setMobileHeight(newHeight)
|
|
216
|
+
|
|
217
|
+
// 更新CSS变量
|
|
218
|
+
if (windowRef.current) {
|
|
219
|
+
windowRef.current.style.setProperty('--livechat-mobile-height', `${newHeight}px`)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const handleDragEnd = () => {
|
|
224
|
+
setIsDragging(false)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
document.addEventListener('mousemove', handleDragMove)
|
|
228
|
+
document.addEventListener('mouseup', handleDragEnd)
|
|
229
|
+
document.addEventListener('touchmove', handleDragMove, { passive: false })
|
|
230
|
+
document.addEventListener('touchend', handleDragEnd)
|
|
231
|
+
|
|
232
|
+
return () => {
|
|
233
|
+
document.removeEventListener('mousemove', handleDragMove)
|
|
234
|
+
document.removeEventListener('mouseup', handleDragEnd)
|
|
235
|
+
document.removeEventListener('touchmove', handleDragMove)
|
|
236
|
+
document.removeEventListener('touchend', handleDragEnd)
|
|
237
|
+
}
|
|
238
|
+
}, [isDragging])
|
|
239
|
+
|
|
240
|
+
return (
|
|
241
|
+
<div
|
|
242
|
+
ref={windowRef}
|
|
243
|
+
className={`livechat-window flex flex-col overflow-hidden bg-white ${className}`}
|
|
244
|
+
style={
|
|
245
|
+
{
|
|
246
|
+
borderRadius: '16px',
|
|
247
|
+
'--livechat-mobile-height': `${mobileHeight}px`,
|
|
248
|
+
} as React.CSSProperties
|
|
249
|
+
}
|
|
250
|
+
>
|
|
251
|
+
{/* 移动端拖拽手柄 */}
|
|
252
|
+
{isMobile && (
|
|
253
|
+
<div
|
|
254
|
+
className="flex cursor-ns-resize items-center justify-center"
|
|
255
|
+
style={{
|
|
256
|
+
touchAction: 'none',
|
|
257
|
+
backgroundColor: '#ffffff',
|
|
258
|
+
paddingTop: '8px',
|
|
259
|
+
}}
|
|
260
|
+
onMouseDown={handleDragStart}
|
|
261
|
+
onTouchStart={handleDragStart}
|
|
262
|
+
>
|
|
263
|
+
<div
|
|
264
|
+
style={{
|
|
265
|
+
width: '64px',
|
|
266
|
+
height: '6px',
|
|
267
|
+
borderRadius: '999px',
|
|
268
|
+
backgroundColor: '#DADCE0',
|
|
269
|
+
}}
|
|
270
|
+
/>
|
|
271
|
+
</div>
|
|
272
|
+
)}
|
|
273
|
+
|
|
274
|
+
{/* 头部 */}
|
|
275
|
+
<ChatHeader
|
|
276
|
+
title={title}
|
|
277
|
+
logoUrl={logoUrl}
|
|
278
|
+
onClose={onClose}
|
|
279
|
+
onNewSession={onNewSession}
|
|
280
|
+
showNewSessionButton={showNewSessionButton}
|
|
281
|
+
/>
|
|
282
|
+
|
|
283
|
+
{/* 消息列表(可滚动区域) */}
|
|
284
|
+
<MessageList
|
|
285
|
+
messages={messages}
|
|
286
|
+
rendererRegistry={rendererRegistry}
|
|
287
|
+
defaultRenderer={defaultRenderer}
|
|
288
|
+
showTimestamp={showTimestamp}
|
|
289
|
+
autoScroll={autoScroll}
|
|
290
|
+
isLoadingHistory={isLoadingHistory}
|
|
291
|
+
onAddToCart={onAddToCart}
|
|
292
|
+
/>
|
|
293
|
+
|
|
294
|
+
{/* 输入框 */}
|
|
295
|
+
<ChatInput
|
|
296
|
+
value={inputValue}
|
|
297
|
+
onChange={onInputChange}
|
|
298
|
+
onSend={onSend}
|
|
299
|
+
placeholder={inputPlaceholder}
|
|
300
|
+
disabled={isSending}
|
|
301
|
+
/>
|
|
302
|
+
</div>
|
|
303
|
+
)
|
|
304
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 购物车卡片渲染器
|
|
3
|
+
* 显示购物车内容、价格汇总和结账按钮
|
|
4
|
+
* 基于后端返回的购物车数据结构
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import React from 'react'
|
|
8
|
+
import type { MessageRenderer, CartContent, CartLine, CartAmount } from '../../types'
|
|
9
|
+
import { CURRENCY_SYMBOLS } from '../../constants.js'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 格式化金额
|
|
13
|
+
* @param amount 金额对象
|
|
14
|
+
* @returns 格式化后的金额字符串(如 "$99.99")
|
|
15
|
+
*/
|
|
16
|
+
function formatAmount(amount: CartAmount): string {
|
|
17
|
+
const { amount: value, currencyCode } = amount
|
|
18
|
+
|
|
19
|
+
const symbol = CURRENCY_SYMBOLS[currencyCode] || currencyCode
|
|
20
|
+
const numValue = parseFloat(value)
|
|
21
|
+
|
|
22
|
+
return `${symbol}${numValue.toFixed(2)}`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 购物车商品行组件
|
|
27
|
+
*/
|
|
28
|
+
const CartLineItem: React.FC<{
|
|
29
|
+
line: CartLine
|
|
30
|
+
}> = ({ line }) => {
|
|
31
|
+
const { quantity, merchandise, cost } = line
|
|
32
|
+
const { product, title: variantTitle, image } = merchandise
|
|
33
|
+
|
|
34
|
+
// 商品图片 URL
|
|
35
|
+
const imageUrl = image?.url || ''
|
|
36
|
+
|
|
37
|
+
// 判断是否有折扣(总价 < 原价)
|
|
38
|
+
const hasDiscount =
|
|
39
|
+
parseFloat(cost.totalAmount.amount) < parseFloat(cost.subtotalAmount.amount) &&
|
|
40
|
+
cost.totalAmount.currencyCode === cost.subtotalAmount.currencyCode
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<div className="flex gap-4">
|
|
44
|
+
{/* 商品图片 */}
|
|
45
|
+
<div className="shrink-0 overflow-hidden rounded-md" style={{ width: '72px', height: '72px' }}>
|
|
46
|
+
<img src={imageUrl} alt={product.title} className="size-full object-cover" loading="lazy" />
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
{/* 商品信息 */}
|
|
50
|
+
<div className="flex flex-1 flex-col">
|
|
51
|
+
<div className="flex items-end justify-between gap-2">
|
|
52
|
+
{/* 左侧:标题、变体、数量 */}
|
|
53
|
+
<div className="flex-1">
|
|
54
|
+
<h4 className="line-clamp-2 text-base font-bold leading-[1.4] tracking-[-0.02em] text-[#080A0F]">
|
|
55
|
+
{product.title}
|
|
56
|
+
</h4>
|
|
57
|
+
{variantTitle && (
|
|
58
|
+
<p className="mt-0.5 text-sm font-bold leading-[1.4] tracking-[-0.02em] text-[#4A4C56]">{variantTitle}</p>
|
|
59
|
+
)}
|
|
60
|
+
<p className="mt-1 text-base font-bold leading-[1.4] tracking-[-0.02em] text-[#080A0F]">×{quantity}</p>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
{/* 右侧:价格 */}
|
|
64
|
+
<div className="flex gap-1 text-right">
|
|
65
|
+
<div className="text-base font-bold leading-[1.4] tracking-[-0.02em] text-gray-900">
|
|
66
|
+
{formatAmount(cost.totalAmount)}
|
|
67
|
+
</div>
|
|
68
|
+
{hasDiscount && (
|
|
69
|
+
<div className="text-base font-bold leading-[1.4] tracking-[-0.02em] text-[#4A4C56] line-through">
|
|
70
|
+
{formatAmount(cost.subtotalAmount)}
|
|
71
|
+
</div>
|
|
72
|
+
)}
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 价格汇总组件(简化版)
|
|
82
|
+
*/
|
|
83
|
+
const CartSummary: React.FC<{
|
|
84
|
+
total: CartAmount
|
|
85
|
+
}> = ({ total }) => {
|
|
86
|
+
return (
|
|
87
|
+
<div className="border-t border-gray-200 p-4">
|
|
88
|
+
<div className="flex items-center justify-between">
|
|
89
|
+
<span className="text-base font-bold leading-[1.4] tracking-[-0.02em] text-gray-900">Total</span>
|
|
90
|
+
<span className="text-base font-bold leading-[1.4] tracking-[-0.02em] text-gray-900">
|
|
91
|
+
{formatAmount(total)}
|
|
92
|
+
</span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 购物车卡片渲染器
|
|
100
|
+
*
|
|
101
|
+
* 功能:
|
|
102
|
+
* - 显示购物车商品列表
|
|
103
|
+
* - 显示价格汇总(小计、折扣、总计)
|
|
104
|
+
* - 显示折扣码
|
|
105
|
+
* - 提供 Checkout 按钮
|
|
106
|
+
* - 空购物车状态
|
|
107
|
+
*
|
|
108
|
+
* 布局:
|
|
109
|
+
* ```
|
|
110
|
+
* ┌─────────────────────────────────┐
|
|
111
|
+
* │ 购物车 (3 件商品) │
|
|
112
|
+
* ├─────────────────────────────────┤
|
|
113
|
+
* │ [图] 商品1 │
|
|
114
|
+
* │ 变体: Black │
|
|
115
|
+
* │ 数量: 2 $199.98 │
|
|
116
|
+
* ├─────────────────────────────────┤
|
|
117
|
+
* │ [图] 商品2 │
|
|
118
|
+
* │ 变体: White │
|
|
119
|
+
* │ 数量: 1 $99.99 │
|
|
120
|
+
* ├─────────────────────────────────┤
|
|
121
|
+
* │ 小计 $299.97 │
|
|
122
|
+
* │ 折扣 [SPRING20] -$30.00 │
|
|
123
|
+
* │ 总计 $269.97 │
|
|
124
|
+
* ├─────────────────────────────────┤
|
|
125
|
+
* │ [Checkout 按钮] │
|
|
126
|
+
* └─────────────────────────────────┘
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```tsx
|
|
131
|
+
* const content: CartContent = {
|
|
132
|
+
* type: 'cart',
|
|
133
|
+
* data: {
|
|
134
|
+
* isEmpty: false,
|
|
135
|
+
* cartId: "gid://...",
|
|
136
|
+
* totalQuantity: 3,
|
|
137
|
+
* lines: [...],
|
|
138
|
+
* cost: {...},
|
|
139
|
+
* checkoutUrl: "https://..."
|
|
140
|
+
* }
|
|
141
|
+
* }
|
|
142
|
+
* <CartCard.render(content, false, false) />
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export const CartCard: MessageRenderer = {
|
|
146
|
+
render: content => {
|
|
147
|
+
const cartContent = content as CartContent
|
|
148
|
+
const { data } = cartContent
|
|
149
|
+
|
|
150
|
+
if (!data) {
|
|
151
|
+
return null
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const { isEmpty, lines, cost, checkoutUrl, onCart, cartId } = data
|
|
155
|
+
|
|
156
|
+
// 处理购物车按钮点击
|
|
157
|
+
const handleCart = () => {
|
|
158
|
+
if (onCart) {
|
|
159
|
+
onCart(cartId, checkoutUrl)
|
|
160
|
+
} else if (checkoutUrl) {
|
|
161
|
+
window.open(checkoutUrl, '_blank', 'noopener,noreferrer')
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// 空购物车状态 - 不展示组件
|
|
166
|
+
if (isEmpty || !lines || lines.length === 0) {
|
|
167
|
+
return null
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<div className="w-full max-w-md overflow-hidden rounded-2xl shadow-sm" style={{ backgroundColor: '#F5F6F7' }}>
|
|
172
|
+
{/* 商品列表 */}
|
|
173
|
+
<div className="flex max-h-[400px] flex-col gap-4 overflow-y-auto p-3">
|
|
174
|
+
{lines.map(line => (
|
|
175
|
+
<CartLineItem key={line.id} line={line} />
|
|
176
|
+
))}
|
|
177
|
+
</div>
|
|
178
|
+
|
|
179
|
+
{/* 价格汇总 */}
|
|
180
|
+
<CartSummary total={cost.totalAmount} />
|
|
181
|
+
|
|
182
|
+
{/* Checkout 按钮 */}
|
|
183
|
+
{(checkoutUrl || onCart) && (
|
|
184
|
+
<div className="px-4 pb-4">
|
|
185
|
+
<button
|
|
186
|
+
type="button"
|
|
187
|
+
onClick={handleCart}
|
|
188
|
+
className="w-full rounded-full py-[10px] text-center text-sm font-bold leading-[1.4] tracking-[-0.02em] text-white"
|
|
189
|
+
style={{ backgroundColor: '#1D1D1F' }}
|
|
190
|
+
>
|
|
191
|
+
View More
|
|
192
|
+
</button>
|
|
193
|
+
</div>
|
|
194
|
+
)}
|
|
195
|
+
</div>
|
|
196
|
+
)
|
|
197
|
+
},
|
|
198
|
+
}
|