@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/components/LiveChatWidget/components/MessageContent/QuickReplies.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u5FEB\u6377\u56DE\u590D\u6309\u94AE\u6E32\u67D3\u5668\n * \u663E\u793A\u53EF\u70B9\u51FB\u7684\u5FEB\u6377\u56DE\u590D\u9009\u9879\n * \u57FA\u4E8E specs/livechat-widget/data-model.md \u7684\u5FEB\u6377\u56DE\u590D\u6570\u636E\u6A21\u578B\n */\n\nimport React from 'react'\nimport type { MessageRenderer, QuickRepliesContent, QuickReply } from '../../types'\n\nexport interface QuickRepliesProps {\n /**\n * \u5FEB\u6377\u56DE\u590D\u70B9\u51FB\u56DE\u8C03\n */\n onReplyClick?: (reply: QuickReply) => void\n}\n\n/**\n * \u5FEB\u6377\u56DE\u590D\u6309\u94AE\u6E32\u67D3\u5668\n *\n * \u529F\u80FD\uFF1A\n * - \u663E\u793A\u591A\u4E2A\u5FEB\u6377\u56DE\u590D\u6309\u94AE\n * - \u652F\u6301\u56FE\u6807\uFF08\u53EF\u9009\uFF09\n * - \u70B9\u51FB\u540E\u53D1\u9001\u5BF9\u5E94\u7684\u6D88\u606F\n *\n * \u4F7F\u7528\u573A\u666F\uFF1A\n * - \u6B22\u8FCE\u6D88\u606F\u540E\u7684\u5E38\u89C1\u95EE\u9898\n * - \u5F15\u5BFC\u7528\u6237\u9009\u62E9\n * - \u5FEB\u901F\u64CD\u4F5C\u6309\u94AE\n *\n * \u5E03\u5C40\uFF1A\n * ```\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \uD83D\uDED2 \u67E5\u4EF7\u683C \u2502 \u2502 \uD83D\uDCE6 \u67E5\u7269\u6D41 \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \uD83D\uDCDE \u8054\u7CFB\u5BA2\u670D\u2502 \u2502 \uD83D\uDCAC \u5176\u4ED6\u95EE\u9898\u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * ```\n *\n * @example\n * ```tsx\n * const content: QuickRepliesContent = {\n * type: 'quick_replies',\n * data: {\n * replies: [\n * { id: '1', label: '\u67E5\u4EF7\u683C', value: '\u6211\u60F3\u67E5\u8BE2\u5546\u54C1\u4EF7\u683C', icon: '\uD83D\uDED2' },\n * { id: '2', label: '\u67E5\u7269\u6D41', value: '\u6211\u60F3\u67E5\u8BE2\u7269\u6D41\u4FE1\u606F', icon: '\uD83D\uDCE6' }\n * ]\n * }\n * }\n * <QuickReplies.render(content, false, false) />\n * ```\n */\nexport const createQuickRepliesRenderer = (onReplyClick?: (reply: QuickReply) => void): MessageRenderer => ({\n render: (content, isUser, isSystem) => {\n const quickRepliesContent = content as QuickRepliesContent\n const { replies } = quickRepliesContent.data\n\n if (!replies || replies.length === 0) {\n return null\n }\n\n const handleClick = (reply: QuickReply) => {\n onReplyClick?.(reply)\n }\n\n return (\n <div className=\"flex flex-wrap gap-2\">\n {replies.map(reply => (\n <button\n key={reply.id}\n type=\"button\"\n onClick={() => handleClick(reply)}\n className=\"livechat-quick-reply-button inline-flex items-center gap-1 rounded-[19px] px-3 py-[6px] text-sm leading-[140%] tracking-[-0.02em] transition-transform hover:scale-105 active:scale-95\"\n >\n {/* \u56FE\u6807\uFF08\u53EF\u9009\uFF09 */}\n {reply.icon && <span className=\"text-base\">{reply.icon}</span>}\n\n {/* \u6807\u7B7E */}\n <span>{reply.label}</span>\n </button>\n ))}\n </div>\n )\n },\n})\n\n/**\n * \u9ED8\u8BA4\u5FEB\u6377\u56DE\u590D\u6E32\u67D3\u5668\uFF08\u65E0\u56DE\u8C03\uFF09\n */\nexport const QuickReplies: MessageRenderer = createQuickRepliesRenderer()\n"],
|
|
5
|
+
"mappings": "AAqEU,OAOiB,OAAAA,EAPjB,QAAAC,MAAA,oBAhBH,MAAMC,EAA8BC,IAAiE,CAC1G,OAAQ,CAACC,EAASC,EAAQC,IAAa,CACrC,MAAMC,EAAsBH,EACtB,CAAE,QAAAI,CAAQ,EAAID,EAAoB,KAExC,GAAI,CAACC,GAAWA,EAAQ,SAAW,EACjC,OAAO,KAGT,MAAMC,EAAeC,GAAsB,CACzCP,IAAeO,CAAK,CACtB,EAEA,OACEV,EAAC,OAAI,UAAU,uBACZ,SAAAQ,EAAQ,IAAIE,GACXT,EAAC,UAEC,KAAK,SACL,QAAS,IAAMQ,EAAYC,CAAK,EAChC,UAAU,yLAGT,UAAAA,EAAM,MAAQV,EAAC,QAAK,UAAU,YAAa,SAAAU,EAAM,KAAK,EAGvDV,EAAC,QAAM,SAAAU,EAAM,MAAM,IATdA,EAAM,EAUb,CACD,EACH,CAEJ,CACF,GAKaC,EAAgCT,EAA2B",
|
|
6
|
+
"names": ["jsx", "jsxs", "createQuickRepliesRenderer", "onReplyClick", "content", "isUser", "isSystem", "quickRepliesContent", "replies", "handleClick", "reply", "QuickReplies"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文本消息内容渲染器
|
|
3
|
+
* 支持 Markdown 格式
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的文本消息设计
|
|
5
|
+
*/
|
|
6
|
+
import type { MessageRenderer } from '../../types';
|
|
7
|
+
/**
|
|
8
|
+
* 文本消息渲染器
|
|
9
|
+
*
|
|
10
|
+
* 功能:
|
|
11
|
+
* - 支持 Markdown 语法(粗体、斜体、链接、列表等)
|
|
12
|
+
* - 安全渲染(React Markdown 自动防护 XSS)
|
|
13
|
+
* - 响应式文本样式
|
|
14
|
+
*
|
|
15
|
+
* Markdown 支持:
|
|
16
|
+
* - 粗体:**text** 或 __text__
|
|
17
|
+
* - 斜体:*text* 或 _text_
|
|
18
|
+
* - 链接:[text](url)
|
|
19
|
+
* - 列表:- item 或 1. item
|
|
20
|
+
* - 代码:`code` 或 ```code block```
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* const content: TextContent = {
|
|
25
|
+
* type: 'text',
|
|
26
|
+
* text: '您好!**这是粗体**,*这是斜体*。'
|
|
27
|
+
* }
|
|
28
|
+
* <TextBlock.render(content, false, false) />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const TextBlock: MessageRenderer;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as t}from"react/jsx-runtime";import s from"react-markdown";const x={render:(l,a,m)=>{const n=l;return n.text?t("div",{className:"livechat-markdown text-sm leading-relaxed",children:t(s,{components:{a:({node:o,...e})=>t("a",{...e,className:`underline ${a?"text-blue-200 hover:text-blue-100":"text-blue-600 hover:text-blue-700"}`,target:"_blank",rel:"noopener noreferrer"}),code:({node:o,...e})=>e.inline?t("code",{...e,className:`rounded px-1.5 py-0.5 font-mono text-xs ${a?"bg-[#004A6E] text-white":"bg-gray-200 text-gray-800"}`}):t("code",{...e,className:`block overflow-x-auto rounded px-3 py-2 font-mono text-xs ${a?"bg-[#004A6E] text-white":"bg-gray-200 text-gray-800"}`}),p:({node:o,...e})=>t("p",{...e,className:"last:mb-0"}),ul:({node:o,...e})=>t("ul",{...e,className:"mb-2 ml-4 list-disc"}),ol:({node:o,...e})=>t("ol",{...e,className:"mb-2 ml-4 list-decimal"}),li:({node:o,...e})=>t("li",{...e,className:"mb-1"}),h1:({node:o,...e})=>t("h1",{...e,className:"mb-2 text-lg font-bold"}),h2:({node:o,...e})=>t("h2",{...e,className:"mb-2 text-base font-bold"}),h3:({node:o,...e})=>t("h3",{...e,className:"mb-1 text-sm font-bold"}),strong:({node:o,...e})=>t("strong",{...e,className:"font-semibold"}),em:({node:o,...e})=>t("em",{...e,className:"italic"})},children:n.text})}):null}};export{x as TextBlock};
|
|
2
|
+
//# sourceMappingURL=TextBlock.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/components/LiveChatWidget/components/MessageContent/TextBlock.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u6587\u672C\u6D88\u606F\u5185\u5BB9\u6E32\u67D3\u5668\n * \u652F\u6301 Markdown \u683C\u5F0F\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6587\u672C\u6D88\u606F\u8BBE\u8BA1\n */\n\nimport React from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport type { MessageRenderer, TextContent } from '../../types'\n\n/**\n * \u6587\u672C\u6D88\u606F\u6E32\u67D3\u5668\n *\n * \u529F\u80FD\uFF1A\n * - \u652F\u6301 Markdown \u8BED\u6CD5\uFF08\u7C97\u4F53\u3001\u659C\u4F53\u3001\u94FE\u63A5\u3001\u5217\u8868\u7B49\uFF09\n * - \u5B89\u5168\u6E32\u67D3\uFF08React Markdown \u81EA\u52A8\u9632\u62A4 XSS\uFF09\n * - \u54CD\u5E94\u5F0F\u6587\u672C\u6837\u5F0F\n *\n * Markdown \u652F\u6301\uFF1A\n * - \u7C97\u4F53\uFF1A**text** \u6216 __text__\n * - \u659C\u4F53\uFF1A*text* \u6216 _text_\n * - \u94FE\u63A5\uFF1A[text](url)\n * - \u5217\u8868\uFF1A- item \u6216 1. item\n * - \u4EE3\u7801\uFF1A`code` \u6216 ```code block```\n *\n * @example\n * ```tsx\n * const content: TextContent = {\n * type: 'text',\n * text: '\u60A8\u597D\uFF01**\u8FD9\u662F\u7C97\u4F53**\uFF0C*\u8FD9\u662F\u659C\u4F53*\u3002'\n * }\n * <TextBlock.render(content, false, false) />\n * ```\n */\nexport const TextBlock: MessageRenderer = {\n render: (content, isUser, isSystem) => {\n const textContent = content as TextContent\n\n if (!textContent.text) {\n return null\n }\n\n return (\n <div className=\"livechat-markdown text-sm leading-relaxed\">\n <ReactMarkdown\n components={{\n // \u81EA\u5B9A\u4E49\u94FE\u63A5\u6837\u5F0F\n a: ({ node, ...props }) => (\n <a\n {...props}\n className={`underline ${isUser ? 'text-blue-200 hover:text-blue-100' : 'text-blue-600 hover:text-blue-700'}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n ),\n // \u81EA\u5B9A\u4E49\u4EE3\u7801\u5757\u6837\u5F0F\n code: ({ node, ...props }: any) =>\n props.inline ? (\n <code\n {...props}\n className={`rounded px-1.5 py-0.5 font-mono text-xs ${isUser ? 'bg-[#004A6E] text-white' : 'bg-gray-200 text-gray-800'}`}\n />\n ) : (\n <code\n {...props}\n className={`block overflow-x-auto rounded px-3 py-2 font-mono text-xs ${isUser ? 'bg-[#004A6E] text-white' : 'bg-gray-200 text-gray-800'}`}\n />\n ),\n // \u81EA\u5B9A\u4E49\u6BB5\u843D\u6837\u5F0F\n p: ({ node, ...props }) => <p {...props} className=\"last:mb-0\" />,\n // \u81EA\u5B9A\u4E49\u5217\u8868\u6837\u5F0F\n ul: ({ node, ...props }) => <ul {...props} className=\"mb-2 ml-4 list-disc\" />,\n ol: ({ node, ...props }) => <ol {...props} className=\"mb-2 ml-4 list-decimal\" />,\n li: ({ node, ...props }) => <li {...props} className=\"mb-1\" />,\n // \u81EA\u5B9A\u4E49\u6807\u9898\u6837\u5F0F\n h1: ({ node, ...props }) => <h1 {...props} className=\"mb-2 text-lg font-bold\" />,\n h2: ({ node, ...props }) => <h2 {...props} className=\"mb-2 text-base font-bold\" />,\n h3: ({ node, ...props }) => <h3 {...props} className=\"mb-1 text-sm font-bold\" />,\n // \u81EA\u5B9A\u4E49\u5F3A\u8C03\u6837\u5F0F\n strong: ({ node, ...props }) => <strong {...props} className=\"font-semibold\" />,\n em: ({ node, ...props }) => <em {...props} className=\"italic\" />,\n }}\n >\n {textContent.text}\n </ReactMarkdown>\n </div>\n )\n },\n}\n"],
|
|
5
|
+
"mappings": "AAgDc,cAAAA,MAAA,oBAzCd,OAAOC,MAAmB,iBA2BnB,MAAMC,EAA6B,CACxC,OAAQ,CAACC,EAASC,EAAQC,IAAa,CACrC,MAAMC,EAAcH,EAEpB,OAAKG,EAAY,KAKfN,EAAC,OAAI,UAAU,4CACb,SAAAA,EAACC,EAAA,CACC,WAAY,CAEV,EAAG,CAAC,CAAE,KAAAM,EAAM,GAAGC,CAAM,IACnBR,EAAC,KACE,GAAGQ,EACJ,UAAW,aAAaJ,EAAS,oCAAsC,mCAAmC,GAC1G,OAAO,SACP,IAAI,sBACN,EAGF,KAAM,CAAC,CAAE,KAAAG,EAAM,GAAGC,CAAM,IACtBA,EAAM,OACJR,EAAC,QACE,GAAGQ,EACJ,UAAW,2CAA2CJ,EAAS,0BAA4B,2BAA2B,GACxH,EAEAJ,EAAC,QACE,GAAGQ,EACJ,UAAW,6DAA6DJ,EAAS,0BAA4B,2BAA2B,GAC1I,EAGJ,EAAG,CAAC,CAAE,KAAAG,EAAM,GAAGC,CAAM,IAAMR,EAAC,KAAG,GAAGQ,EAAO,UAAU,YAAY,EAE/D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,sBAAsB,EAC3E,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,yBAAyB,EAC9E,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,OAAO,EAE5D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,yBAAyB,EAC9E,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,2BAA2B,EAChF,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,yBAAyB,EAE9E,OAAQ,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,UAAQ,GAAGQ,EAAO,UAAU,gBAAgB,EAC7E,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAMR,EAAC,MAAI,GAAGQ,EAAO,UAAU,SAAS,CAChE,EAEC,SAAAF,EAAY,KACf,EACF,EA9CO,IAgDX,CACF",
|
|
6
|
+
"names": ["jsx", "ReactMarkdown", "TextBlock", "content", "isUser", "isSystem", "textContent", "node", "props"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考状态消息渲染器
|
|
3
|
+
* 显示 AI 助手正在思考的动画
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的思考状态设计
|
|
5
|
+
*/
|
|
6
|
+
import type { MessageRenderer } from '../../types';
|
|
7
|
+
/**
|
|
8
|
+
* 思考状态渲染器
|
|
9
|
+
*
|
|
10
|
+
* 功能:
|
|
11
|
+
* - 显示"正在思考..."动画
|
|
12
|
+
* - 三个跳动的圆点
|
|
13
|
+
* - 黄色背景提示
|
|
14
|
+
*
|
|
15
|
+
* 动画效果:
|
|
16
|
+
* - 使用 CSS 动画(livechat.css 中定义)
|
|
17
|
+
* - 三个圆点依次跳动
|
|
18
|
+
* - 循环播放
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* const content: ThinkingContent = {
|
|
23
|
+
* type: 'thinking',
|
|
24
|
+
* data: {
|
|
25
|
+
* status: '正在查询商品信息...'
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* <ThinkingBlock.render(content, false, false) />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const ThinkingBlock: MessageRenderer;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as e,jsxs as n}from"react/jsx-runtime";const d={render:(s,t,a)=>{const r=s.data.status||"";return e("div",{className:"flex items-center gap-2 py-1",children:n("div",{className:"livechat-thinking-dots flex gap-1",children:[e("span",{className:"size-2 rounded-full",style:{backgroundColor:"rgba(0, 93, 142, 1)"}}),e("span",{className:"size-2 rounded-full",style:{backgroundColor:"rgba(0, 93, 142, 0.6)"}}),e("span",{className:"size-2 rounded-full",style:{backgroundColor:"rgba(0, 93, 142, 0.2)"}})]})})}};export{d as ThinkingBlock};
|
|
2
|
+
//# sourceMappingURL=ThinkingBlock.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/components/LiveChatWidget/components/MessageContent/ThinkingBlock.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u601D\u8003\u72B6\u6001\u6D88\u606F\u6E32\u67D3\u5668\n * \u663E\u793A AI \u52A9\u624B\u6B63\u5728\u601D\u8003\u7684\u52A8\u753B\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u601D\u8003\u72B6\u6001\u8BBE\u8BA1\n */\n\nimport React from 'react'\nimport type { MessageRenderer, ThinkingContent } from '../../types'\n\n/**\n * \u601D\u8003\u72B6\u6001\u6E32\u67D3\u5668\n *\n * \u529F\u80FD\uFF1A\n * - \u663E\u793A\"\u6B63\u5728\u601D\u8003...\"\u52A8\u753B\n * - \u4E09\u4E2A\u8DF3\u52A8\u7684\u5706\u70B9\n * - \u9EC4\u8272\u80CC\u666F\u63D0\u793A\n *\n * \u52A8\u753B\u6548\u679C\uFF1A\n * - \u4F7F\u7528 CSS \u52A8\u753B\uFF08livechat.css \u4E2D\u5B9A\u4E49\uFF09\n * - \u4E09\u4E2A\u5706\u70B9\u4F9D\u6B21\u8DF3\u52A8\n * - \u5FAA\u73AF\u64AD\u653E\n *\n * @example\n * ```tsx\n * const content: ThinkingContent = {\n * type: 'thinking',\n * data: {\n * status: '\u6B63\u5728\u67E5\u8BE2\u5546\u54C1\u4FE1\u606F...'\n * }\n * }\n * <ThinkingBlock.render(content, false, false) />\n * ```\n */\nexport const ThinkingBlock: MessageRenderer = {\n render: (content, isUser, isSystem) => {\n const thinkingContent = content as ThinkingContent\n const status = thinkingContent.data.status || ''\n\n return (\n <div className=\"flex items-center gap-2 py-1\">\n {/* \u601D\u8003\u52A8\u753B - \u4E09\u4E2A\u8DF3\u52A8\u7684\u70B9 */}\n <div className=\"livechat-thinking-dots flex gap-1\">\n <span className=\"size-2 rounded-full\" style={{ backgroundColor: 'rgba(0, 93, 142, 1)' }} />\n <span className=\"size-2 rounded-full\" style={{ backgroundColor: 'rgba(0, 93, 142, 0.6)' }} />\n <span className=\"size-2 rounded-full\" style={{ backgroundColor: 'rgba(0, 93, 142, 0.2)' }} />\n </div>\n\n {/* \u72B6\u6001\u6587\u672C\uFF08\u53EF\u9009\uFF09 */}\n {/* {status && <span className=\"text-sm text-gray-500\">{status}</span>} */}\n </div>\n )\n },\n}\n"],
|
|
5
|
+
"mappings": "AAyCQ,OACE,OAAAA,EADF,QAAAC,MAAA,oBARD,MAAMC,EAAiC,CAC5C,OAAQ,CAACC,EAASC,EAAQC,IAAa,CAErC,MAAMC,EADkBH,EACO,KAAK,QAAU,GAE9C,OACEH,EAAC,OAAI,UAAU,+BAEb,SAAAC,EAAC,OAAI,UAAU,oCACb,UAAAD,EAAC,QAAK,UAAU,sBAAsB,MAAO,CAAE,gBAAiB,qBAAsB,EAAG,EACzFA,EAAC,QAAK,UAAU,sBAAsB,MAAO,CAAE,gBAAiB,uBAAwB,EAAG,EAC3FA,EAAC,QAAK,UAAU,sBAAsB,MAAO,CAAE,gBAAiB,uBAAwB,EAAG,GAC7F,EAIF,CAEJ,CACF",
|
|
6
|
+
"names": ["jsx", "jsxs", "ThinkingBlock", "content", "isUser", "isSystem", "status"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息内容渲染器统一导出
|
|
3
|
+
*/
|
|
4
|
+
export { MessageContent } from '../MessageContent';
|
|
5
|
+
export { TextBlock } from './TextBlock';
|
|
6
|
+
export { ProductCard } from './ProductCard';
|
|
7
|
+
export { ProductList } from './ProductList';
|
|
8
|
+
export { ProductComparison, ProductComparisonRenderer } from './ProductComparison';
|
|
9
|
+
export { PolicyBlock } from './PolicyBlock';
|
|
10
|
+
export { QuickReplies, createQuickRepliesRenderer } from './QuickReplies';
|
|
11
|
+
export { ThinkingBlock } from './ThinkingBlock';
|
|
12
|
+
export { ErrorBlock } from './ErrorBlock';
|
|
13
|
+
export { FAQList, FAQListRenderer } from './FAQList.js';
|
|
14
|
+
export { PromotionList, PromotionListRenderer } from './PromotionList.js';
|
|
15
|
+
export { CartCard } from './CartCard.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{MessageContent as e}from"../MessageContent";import{TextBlock as i}from"./TextBlock";import{ProductCard as p}from"./ProductCard";import{ProductList as c}from"./ProductList";import{ProductComparison as n,ProductComparisonRenderer as s}from"./ProductComparison";import{PolicyBlock as a}from"./PolicyBlock";import{QuickReplies as l,createQuickRepliesRenderer as P}from"./QuickReplies";import{ThinkingBlock as C}from"./ThinkingBlock";import{ErrorBlock as L}from"./ErrorBlock";import{FAQList as Q,FAQListRenderer as g}from"./FAQList.js";import{PromotionList as F,PromotionListRenderer as T}from"./PromotionList.js";import{CartCard as y}from"./CartCard.js";export{y as CartCard,L as ErrorBlock,Q as FAQList,g as FAQListRenderer,e as MessageContent,a as PolicyBlock,p as ProductCard,n as ProductComparison,s as ProductComparisonRenderer,c as ProductList,F as PromotionList,T as PromotionListRenderer,l as QuickReplies,i as TextBlock,C as ThinkingBlock,P as createQuickRepliesRenderer};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/components/LiveChatWidget/components/MessageContent/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u6D88\u606F\u5185\u5BB9\u6E32\u67D3\u5668\u7EDF\u4E00\u5BFC\u51FA\n */\n\nexport { MessageContent } from '../MessageContent'\nexport { TextBlock } from './TextBlock'\nexport { ProductCard } from './ProductCard'\nexport { ProductList } from './ProductList'\nexport { ProductComparison, ProductComparisonRenderer } from './ProductComparison'\nexport { PolicyBlock } from './PolicyBlock'\nexport { QuickReplies, createQuickRepliesRenderer } from './QuickReplies'\nexport { ThinkingBlock } from './ThinkingBlock'\nexport { ErrorBlock } from './ErrorBlock'\nexport { FAQList, FAQListRenderer } from './FAQList.js'\nexport { PromotionList, PromotionListRenderer } from './PromotionList.js'\nexport { CartCard } from './CartCard.js'\n"],
|
|
5
|
+
"mappings": "AAIA,OAAS,kBAAAA,MAAsB,oBAC/B,OAAS,aAAAC,MAAiB,cAC1B,OAAS,eAAAC,MAAmB,gBAC5B,OAAS,eAAAC,MAAmB,gBAC5B,OAAS,qBAAAC,EAAmB,6BAAAC,MAAiC,sBAC7D,OAAS,eAAAC,MAAmB,gBAC5B,OAAS,gBAAAC,EAAc,8BAAAC,MAAkC,iBACzD,OAAS,iBAAAC,MAAqB,kBAC9B,OAAS,cAAAC,MAAkB,eAC3B,OAAS,WAAAC,EAAS,mBAAAC,MAAuB,eACzC,OAAS,iBAAAC,EAAe,yBAAAC,MAA6B,qBACrD,OAAS,YAAAC,MAAgB",
|
|
6
|
+
"names": ["MessageContent", "TextBlock", "ProductCard", "ProductList", "ProductComparison", "ProductComparisonRenderer", "PolicyBlock", "QuickReplies", "createQuickRepliesRenderer", "ThinkingBlock", "ErrorBlock", "FAQList", "FAQListRenderer", "PromotionList", "PromotionListRenderer", "CartCard"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息内容容器组件
|
|
3
|
+
* 根据消息内容类型分发到对应的渲染器
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的消息内容渲染设计
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { MessageContent as MessageContentType, MessageRenderer } from '../types';
|
|
8
|
+
import { MessageRendererRegistry } from '../utils/messageRenderers';
|
|
9
|
+
export interface MessageContentProps {
|
|
10
|
+
/**
|
|
11
|
+
* 消息内容
|
|
12
|
+
*/
|
|
13
|
+
content: MessageContentType;
|
|
14
|
+
/**
|
|
15
|
+
* 是否为用户消息
|
|
16
|
+
*/
|
|
17
|
+
isUser: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 是否为系统消息
|
|
20
|
+
*/
|
|
21
|
+
isSystem: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 自定义渲染器注册表
|
|
24
|
+
*/
|
|
25
|
+
rendererRegistry?: MessageRendererRegistry;
|
|
26
|
+
/**
|
|
27
|
+
* 默认渲染器(当找不到对应渲染器时使用)
|
|
28
|
+
*/
|
|
29
|
+
defaultRenderer?: MessageRenderer;
|
|
30
|
+
/**
|
|
31
|
+
* 自定义样式类名
|
|
32
|
+
*/
|
|
33
|
+
className?: string;
|
|
34
|
+
/**
|
|
35
|
+
* 商品添加到购物车回调
|
|
36
|
+
*/
|
|
37
|
+
onAddToCart?: (product: any) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 消息内容容器组件
|
|
41
|
+
*
|
|
42
|
+
* 功能:
|
|
43
|
+
* - 根据 content.type 分发到对应的渲染器
|
|
44
|
+
* - 支持自定义渲染器注册表
|
|
45
|
+
* - 提供默认兜底渲染器
|
|
46
|
+
*
|
|
47
|
+
* 渲染流程:
|
|
48
|
+
* 1. 检查自定义渲染器注册表是否有对应类型
|
|
49
|
+
* 2. 如果有,使用自定义渲染器
|
|
50
|
+
* 3. 如果没有,使用默认渲染器
|
|
51
|
+
* 4. 如果默认渲染器也没有,显示未知类型提示
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <MessageContent
|
|
56
|
+
* content={content}
|
|
57
|
+
* isUser={message.role === 'user'}
|
|
58
|
+
* isSystem={message.role === 'system'}
|
|
59
|
+
* rendererRegistry={customRegistry}
|
|
60
|
+
* />
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare const MessageContent: React.FC<MessageContentProps>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as c,jsxs as p}from"react/jsx-runtime";const g={render:e=>p("div",{className:"text-sm italic text-gray-500",children:["\u672A\u77E5\u6D88\u606F\u7C7B\u578B: ",e.type]})},f=({content:e,isUser:t,isSystem:n,rendererRegistry:a,defaultRenderer:o,className:d="",onAddToCart:s})=>{let r=e;e.type==="product_list"&&s&&(r={...e,data:{...e.data,onAddToCart:s}});const i=(a?.get(r.type)||o||g).render(r,t,n);return c("div",{className:d,children:i})};export{f as MessageContent};
|
|
2
|
+
//# sourceMappingURL=MessageContent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/LiveChatWidget/components/MessageContent.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u6D88\u606F\u5185\u5BB9\u5BB9\u5668\u7EC4\u4EF6\n * \u6839\u636E\u6D88\u606F\u5185\u5BB9\u7C7B\u578B\u5206\u53D1\u5230\u5BF9\u5E94\u7684\u6E32\u67D3\u5668\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6D88\u606F\u5185\u5BB9\u6E32\u67D3\u8BBE\u8BA1\n */\n\nimport React from 'react'\nimport type { MessageContent as MessageContentType, MessageRenderer } from '../types'\nimport { MessageRendererRegistry } from '../utils/messageRenderers'\n\nexport interface MessageContentProps {\n /**\n * \u6D88\u606F\u5185\u5BB9\n */\n content: MessageContentType\n\n /**\n * \u662F\u5426\u4E3A\u7528\u6237\u6D88\u606F\n */\n isUser: boolean\n\n /**\n * \u662F\u5426\u4E3A\u7CFB\u7EDF\u6D88\u606F\n */\n isSystem: boolean\n\n /**\n * \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n */\n rendererRegistry?: MessageRendererRegistry\n\n /**\n * \u9ED8\u8BA4\u6E32\u67D3\u5668\uFF08\u5F53\u627E\u4E0D\u5230\u5BF9\u5E94\u6E32\u67D3\u5668\u65F6\u4F7F\u7528\uFF09\n */\n defaultRenderer?: MessageRenderer\n\n /**\n * \u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u5546\u54C1\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u56DE\u8C03\n */\n onAddToCart?: (product: any) => void\n}\n\n/**\n * \u9ED8\u8BA4\u6E32\u67D3\u5668 - \u663E\u793A\u672A\u77E5\u7C7B\u578B\u63D0\u793A\n */\nconst defaultFallbackRenderer: MessageRenderer = {\n render: content => <div className=\"text-sm italic text-gray-500\">\u672A\u77E5\u6D88\u606F\u7C7B\u578B: {content.type}</div>,\n}\n\n/**\n * \u6D88\u606F\u5185\u5BB9\u5BB9\u5668\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u6839\u636E content.type \u5206\u53D1\u5230\u5BF9\u5E94\u7684\u6E32\u67D3\u5668\n * - \u652F\u6301\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n * - \u63D0\u4F9B\u9ED8\u8BA4\u515C\u5E95\u6E32\u67D3\u5668\n *\n * \u6E32\u67D3\u6D41\u7A0B\uFF1A\n * 1. \u68C0\u67E5\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\u662F\u5426\u6709\u5BF9\u5E94\u7C7B\u578B\n * 2. \u5982\u679C\u6709\uFF0C\u4F7F\u7528\u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\n * 3. \u5982\u679C\u6CA1\u6709\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u6E32\u67D3\u5668\n * 4. \u5982\u679C\u9ED8\u8BA4\u6E32\u67D3\u5668\u4E5F\u6CA1\u6709\uFF0C\u663E\u793A\u672A\u77E5\u7C7B\u578B\u63D0\u793A\n *\n * @example\n * ```tsx\n * <MessageContent\n * content={content}\n * isUser={message.role === 'user'}\n * isSystem={message.role === 'system'}\n * rendererRegistry={customRegistry}\n * />\n * ```\n */\nexport const MessageContent: React.FC<MessageContentProps> = ({\n content,\n isUser,\n isSystem,\n rendererRegistry,\n defaultRenderer,\n className = '',\n onAddToCart,\n}) => {\n // \u52A8\u6001\u6CE8\u5165 onAddToCart \u5230 product_list \u7C7B\u578B\u7684\u5185\u5BB9\u4E2D\n let processedContent = content\n if (content.type === 'product_list' && onAddToCart) {\n processedContent = {\n ...content,\n data: {\n ...(content as any).data,\n onAddToCart,\n },\n }\n }\n\n // \u5C1D\u8BD5\u4ECE\u6CE8\u518C\u8868\u83B7\u53D6\u6E32\u67D3\u5668\n const customRenderer = rendererRegistry?.get(processedContent.type)\n\n // \u786E\u5B9A\u6700\u7EC8\u4F7F\u7528\u7684\u6E32\u67D3\u5668\n const renderer = customRenderer || defaultRenderer || defaultFallbackRenderer\n\n // \u6E32\u67D3\u5185\u5BB9\n const rendered = renderer.render(processedContent, isUser, isSystem)\n\n return <div className={className}>{rendered}</div>\n}\n"],
|
|
5
|
+
"mappings": "AAmDqB,OAyDZ,OAAAA,EAzDY,QAAAC,MAAA,oBADrB,MAAMC,EAA2C,CAC/C,OAAQC,GAAWF,EAAC,OAAI,UAAU,+BAA+B,mDAASE,EAAQ,MAAK,CACzF,EA0BaC,EAAgD,CAAC,CAC5D,QAAAD,EACA,OAAAE,EACA,SAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,UAAAC,EAAY,GACZ,YAAAC,CACF,IAAM,CAEJ,IAAIC,EAAmBR,EACnBA,EAAQ,OAAS,gBAAkBO,IACrCC,EAAmB,CACjB,GAAGR,EACH,KAAM,CACJ,GAAIA,EAAgB,KACpB,YAAAO,CACF,CACF,GAUF,MAAME,GANiBL,GAAkB,IAAII,EAAiB,IAAI,GAG/BH,GAAmBN,GAG5B,OAAOS,EAAkBN,EAAQC,CAAQ,EAEnE,OAAON,EAAC,OAAI,UAAWS,EAAY,SAAAG,EAAS,CAC9C",
|
|
6
|
+
"names": ["jsx", "jsxs", "defaultFallbackRenderer", "content", "MessageContent", "isUser", "isSystem", "rendererRegistry", "defaultRenderer", "className", "onAddToCart", "processedContent", "rendered"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息列表组件
|
|
3
|
+
* 显示所有聊天消息,支持滚动
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的消息列表设计
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { Message, MessageRenderer } from '../types';
|
|
8
|
+
import { MessageRendererRegistry } from '../utils/messageRenderers';
|
|
9
|
+
export interface MessageListProps {
|
|
10
|
+
/**
|
|
11
|
+
* 消息列表
|
|
12
|
+
*/
|
|
13
|
+
messages: Message[];
|
|
14
|
+
/**
|
|
15
|
+
* 自定义渲染器注册表
|
|
16
|
+
*/
|
|
17
|
+
rendererRegistry?: MessageRendererRegistry;
|
|
18
|
+
/**
|
|
19
|
+
* 默认渲染器
|
|
20
|
+
*/
|
|
21
|
+
defaultRenderer?: MessageRenderer;
|
|
22
|
+
/**
|
|
23
|
+
* 是否显示时间戳
|
|
24
|
+
* @default true
|
|
25
|
+
*/
|
|
26
|
+
showTimestamp?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* 是否自动滚动到底部
|
|
29
|
+
* @default true
|
|
30
|
+
*/
|
|
31
|
+
autoScroll?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 是否正在加载历史消息
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
isLoadingHistory?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 空状态占位内容
|
|
39
|
+
*/
|
|
40
|
+
emptyPlaceholder?: React.ReactNode;
|
|
41
|
+
/**
|
|
42
|
+
* 自定义样式类名
|
|
43
|
+
*/
|
|
44
|
+
className?: string;
|
|
45
|
+
/**
|
|
46
|
+
* 商品添加到购物车回调
|
|
47
|
+
*/
|
|
48
|
+
onAddToCart?: (product: any) => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 消息列表组件
|
|
52
|
+
*
|
|
53
|
+
* 功能:
|
|
54
|
+
* - 显示所有消息(用户、助手、系统)
|
|
55
|
+
* - 自动滚动到最新消息
|
|
56
|
+
* - 加载历史消息时显示指示器
|
|
57
|
+
* - 空状态占位
|
|
58
|
+
*
|
|
59
|
+
* 样式:
|
|
60
|
+
* - 使用自定义滚动条样式(livechat.css)
|
|
61
|
+
* - 内容间距合理
|
|
62
|
+
* - 支持响应式布局
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```tsx
|
|
66
|
+
* <MessageList
|
|
67
|
+
* messages={messages}
|
|
68
|
+
* rendererRegistry={customRegistry}
|
|
69
|
+
* autoScroll={true}
|
|
70
|
+
* isLoadingHistory={isLoading}
|
|
71
|
+
* />
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare const MessageList: React.FC<MessageListProps>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{jsx as t,jsxs as d}from"react/jsx-runtime";import{useRef as T,useEffect as c,useState as w,useCallback as f}from"react";import{ChatMessage as M}from"./ChatMessage";import{ScrollAnchor as C}from"./ScrollAnchor";const L=()=>t("div",{className:"flex h-full items-center justify-center text-gray-400",children:t("p",{className:"text-sm",children:"\u6682\u65E0\u6D88\u606F"})}),k=()=>t("div",{className:"flex justify-center py-4",children:d("div",{className:"flex gap-1",children:[t("div",{className:"size-2 animate-bounce rounded-full bg-gray-400"}),t("div",{className:"size-2 animate-bounce rounded-full bg-gray-400",style:{animationDelay:"0.1s"}}),t("div",{className:"size-2 animate-bounce rounded-full bg-gray-400",style:{animationDelay:"0.2s"}})]})}),I=({messages:s,rendererRegistry:p,defaultRenderer:g,showTimestamp:v=!0,autoScroll:n=!0,isLoadingHistory:u=!1,emptyPlaceholder:h,className:m="",onAddToCart:y})=>{const r=T(null),[a,l]=w(!1),i=f((e=100)=>{const o=r.current;if(!o)return!0;const{scrollTop:x,scrollHeight:R,clientHeight:N}=o;return R-x-N<e},[]),b=f(()=>{const e=r.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]);return c(()=>{const e=r.current;if(!e)return;const o=()=>{l(!i())};return o(),e.addEventListener("scroll",o,{passive:!0}),()=>e.removeEventListener("scroll",o)},[i]),c(()=>{if(n)return;const e=setTimeout(()=>{l(!i())},150);return()=>clearTimeout(e)},[s,n,i]),c(()=>{if(!n||!r.current)return;const e=setTimeout(()=>{r.current&&(r.current.scrollTop=r.current.scrollHeight,l(!1))},100);return()=>clearTimeout(e)},[s,n]),s.length===0&&!u?t("div",{className:`flex-1 overflow-hidden ${m}`,children:h||t(L,{})}):d("div",{className:"relative flex-1 overflow-hidden",children:[d("div",{ref:r,className:`
|
|
2
|
+
livechat-message-list absolute inset-0 overflow-y-auto p-4
|
|
3
|
+
${m}
|
|
4
|
+
`,children:[u&&t(k,{}),t("div",{className:"flex flex-col gap-1",children:s.map(e=>t(M,{message:e,rendererRegistry:p,defaultRenderer:g,showTimestamp:v,onAddToCart:y},e.id))}),n&&t(C,{dependencies:[s]})]}),t("button",{onClick:b,className:`flex -translate-x-1/2 items-center justify-center ${a?"":"pointer-events-none"}`,style:{position:"absolute",bottom:"24px",left:"50%",zIndex:10,width:"40px",height:"40px",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.95)",boxShadow:"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",transition:"all 300ms ease-in-out",opacity:a?1:0,cursor:"pointer",border:"none"},"aria-label":"Scroll to bottom","aria-hidden":!a,children:t("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-gray-700",children:t("polyline",{points:"6 9 12 15 18 9"})})})]})};export{I as MessageList};
|
|
5
|
+
//# sourceMappingURL=MessageList.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/LiveChatWidget/components/MessageList.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u6D88\u606F\u5217\u8868\u7EC4\u4EF6\n * \u663E\u793A\u6240\u6709\u804A\u5929\u6D88\u606F\uFF0C\u652F\u6301\u6EDA\u52A8\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6D88\u606F\u5217\u8868\u8BBE\u8BA1\n */\n\nimport React, { useRef, useEffect, useState, useCallback } from 'react'\nimport type { Message, MessageRenderer } from '../types'\nimport { ChatMessage } from './ChatMessage'\nimport { ScrollAnchor } from './ScrollAnchor'\nimport { MessageRendererRegistry } from '../utils/messageRenderers'\n\nexport interface MessageListProps {\n /**\n * \u6D88\u606F\u5217\u8868\n */\n messages: Message[]\n\n /**\n * \u81EA\u5B9A\u4E49\u6E32\u67D3\u5668\u6CE8\u518C\u8868\n */\n rendererRegistry?: MessageRendererRegistry\n\n /**\n * \u9ED8\u8BA4\u6E32\u67D3\u5668\n */\n defaultRenderer?: MessageRenderer\n\n /**\n * \u662F\u5426\u663E\u793A\u65F6\u95F4\u6233\n * @default true\n */\n showTimestamp?: boolean\n\n /**\n * \u662F\u5426\u81EA\u52A8\u6EDA\u52A8\u5230\u5E95\u90E8\n * @default true\n */\n autoScroll?: boolean\n\n /**\n * \u662F\u5426\u6B63\u5728\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\n * @default false\n */\n isLoadingHistory?: boolean\n\n /**\n * \u7A7A\u72B6\u6001\u5360\u4F4D\u5185\u5BB9\n */\n emptyPlaceholder?: React.ReactNode\n\n /**\n * \u81EA\u5B9A\u4E49\u6837\u5F0F\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u5546\u54C1\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u56DE\u8C03\n */\n onAddToCart?: (product: any) => void\n}\n\n/**\n * \u9ED8\u8BA4\u7A7A\u72B6\u6001\u5360\u4F4D\n */\nconst DefaultEmptyPlaceholder: React.FC = () => (\n <div className=\"flex h-full items-center justify-center text-gray-400\">\n <p className=\"text-sm\">\u6682\u65E0\u6D88\u606F</p>\n </div>\n)\n\n/**\n * \u52A0\u8F7D\u6307\u793A\u5668\n */\nconst LoadingIndicator: React.FC = () => (\n <div className=\"flex justify-center py-4\">\n <div className=\"flex gap-1\">\n <div className=\"size-2 animate-bounce rounded-full bg-gray-400\" />\n <div className=\"size-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '0.1s' }} />\n <div className=\"size-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '0.2s' }} />\n </div>\n </div>\n)\n\n/**\n * \u6D88\u606F\u5217\u8868\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u663E\u793A\u6240\u6709\u6D88\u606F\uFF08\u7528\u6237\u3001\u52A9\u624B\u3001\u7CFB\u7EDF\uFF09\n * - \u81EA\u52A8\u6EDA\u52A8\u5230\u6700\u65B0\u6D88\u606F\n * - \u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u65F6\u663E\u793A\u6307\u793A\u5668\n * - \u7A7A\u72B6\u6001\u5360\u4F4D\n *\n * \u6837\u5F0F\uFF1A\n * - \u4F7F\u7528\u81EA\u5B9A\u4E49\u6EDA\u52A8\u6761\u6837\u5F0F\uFF08livechat.css\uFF09\n * - \u5185\u5BB9\u95F4\u8DDD\u5408\u7406\n * - \u652F\u6301\u54CD\u5E94\u5F0F\u5E03\u5C40\n *\n * @example\n * ```tsx\n * <MessageList\n * messages={messages}\n * rendererRegistry={customRegistry}\n * autoScroll={true}\n * isLoadingHistory={isLoading}\n * />\n * ```\n */\nexport const MessageList: React.FC<MessageListProps> = ({\n messages,\n rendererRegistry,\n defaultRenderer,\n showTimestamp = true,\n autoScroll = true,\n isLoadingHistory = false,\n emptyPlaceholder,\n className = '',\n onAddToCart,\n}) => {\n const listRef = useRef<HTMLDivElement>(null)\n const [showScrollButton, setShowScrollButton] = useState(false)\n\n // \u68C0\u67E5\u662F\u5426\u63A5\u8FD1\u5E95\u90E8\n const isNearBottom = useCallback((threshold = 100) => {\n const container = listRef.current\n if (!container) return true\n\n const { scrollTop, scrollHeight, clientHeight } = container\n return scrollHeight - scrollTop - clientHeight < threshold\n }, [])\n\n // \u5E73\u6ED1\u6EDA\u52A8\u5230\u5E95\u90E8\n const scrollToBottom = useCallback(() => {\n const container = listRef.current\n if (!container) return\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth',\n })\n }, [])\n\n // \u76D1\u542C\u6EDA\u52A8\u4E8B\u4EF6\uFF0C\u63A7\u5236\u6309\u94AE\u663E\u793A\n useEffect(() => {\n const container = listRef.current\n if (!container) return\n\n const handleScroll = () => {\n setShowScrollButton(!isNearBottom())\n }\n\n // \u521D\u59CB\u68C0\u67E5\n handleScroll()\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n return () => container.removeEventListener('scroll', handleScroll)\n }, [isNearBottom])\n\n // \u5F53\u6D88\u606F\u5217\u8868\u53D8\u5316\u65F6\uFF0C\u91CD\u65B0\u68C0\u67E5\u6309\u94AE\u72B6\u6001\uFF08\u4F46\u4E0D\u5728\u81EA\u52A8\u6EDA\u52A8\u65F6\uFF09\n useEffect(() => {\n if (autoScroll) return // \u81EA\u52A8\u6EDA\u52A8\u4F1A\u5728\u53E6\u4E00\u4E2A effect \u4E2D\u5904\u7406\n\n const timeoutId = setTimeout(() => {\n setShowScrollButton(!isNearBottom())\n }, 150)\n\n return () => clearTimeout(timeoutId)\n }, [messages, autoScroll, isNearBottom])\n\n // \u76D1\u542C\u6D88\u606F\u5217\u8868\u53D8\u5316\uFF0C\u81EA\u52A8\u6EDA\u52A8\n useEffect(() => {\n if (!autoScroll || !listRef.current) return\n\n // \u5EF6\u8FDF\u6EDA\u52A8\u4EE5\u786E\u4FDD DOM \u5DF2\u66F4\u65B0\n const timeoutId = setTimeout(() => {\n if (listRef.current) {\n listRef.current.scrollTop = listRef.current.scrollHeight\n // \u81EA\u52A8\u6EDA\u52A8\u5230\u5E95\u90E8\u540E\uFF0C\u9690\u85CF\u6309\u94AE\n setShowScrollButton(false)\n }\n }, 100)\n\n return () => clearTimeout(timeoutId)\n }, [messages, autoScroll])\n\n // \u7A7A\u72B6\u6001\n if (messages.length === 0 && !isLoadingHistory) {\n return (\n <div className={`flex-1 overflow-hidden ${className}`}>{emptyPlaceholder || <DefaultEmptyPlaceholder />}</div>\n )\n }\n\n return (\n <div className=\"relative flex-1 overflow-hidden\">\n <div\n ref={listRef}\n className={`\n livechat-message-list absolute inset-0 overflow-y-auto p-4\n ${className}\n `}\n >\n {/* \u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u6307\u793A\u5668 */}\n {isLoadingHistory && <LoadingIndicator />}\n\n {/* \u6D88\u606F\u5217\u8868 */}\n <div className=\"flex flex-col gap-1\">\n {messages.map(message => (\n <ChatMessage\n key={message.id}\n message={message}\n rendererRegistry={rendererRegistry}\n defaultRenderer={defaultRenderer}\n showTimestamp={showTimestamp}\n onAddToCart={onAddToCart}\n />\n ))}\n </div>\n\n {/* \u6EDA\u52A8\u951A\u70B9 */}\n {autoScroll && <ScrollAnchor dependencies={[messages]} />}\n </div>\n\n {/* \u56DE\u5230\u5E95\u90E8\u6309\u94AE */}\n <button\n onClick={scrollToBottom}\n className={`flex -translate-x-1/2 items-center justify-center ${showScrollButton ? '' : 'pointer-events-none'}`}\n style={{\n position: 'absolute',\n bottom: '24px',\n left: '50%',\n zIndex: 10,\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n boxShadow: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n transition: 'all 300ms ease-in-out',\n opacity: showScrollButton ? 1 : 0,\n cursor: 'pointer',\n border: 'none',\n }}\n aria-label=\"Scroll to bottom\"\n aria-hidden={!showScrollButton}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-gray-700\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAmEI,cAAAA,EASA,QAAAC,MATA,oBA7DJ,OAAgB,UAAAC,EAAQ,aAAAC,EAAW,YAAAC,EAAU,eAAAC,MAAmB,QAEhE,OAAS,eAAAC,MAAmB,gBAC5B,OAAS,gBAAAC,MAAoB,iBAwD7B,MAAMC,EAAoC,IACxCR,EAAC,OAAI,UAAU,wDACb,SAAAA,EAAC,KAAE,UAAU,UAAU,oCAAI,EAC7B,EAMIS,EAA6B,IACjCT,EAAC,OAAI,UAAU,2BACb,SAAAC,EAAC,OAAI,UAAU,aACb,UAAAD,EAAC,OAAI,UAAU,iDAAiD,EAChEA,EAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,MAAO,EAAG,EACnGA,EAAC,OAAI,UAAU,iDAAiD,MAAO,CAAE,eAAgB,MAAO,EAAG,GACrG,EACF,EA2BWU,EAA0C,CAAC,CACtD,SAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAC,EAAgB,GAChB,WAAAC,EAAa,GACb,iBAAAC,EAAmB,GACnB,iBAAAC,EACA,UAAAC,EAAY,GACZ,YAAAC,CACF,IAAM,CACJ,MAAMC,EAAUlB,EAAuB,IAAI,EACrC,CAACmB,EAAkBC,CAAmB,EAAIlB,EAAS,EAAK,EAGxDmB,EAAelB,EAAY,CAACmB,EAAY,MAAQ,CACpD,MAAMC,EAAYL,EAAQ,QAC1B,GAAI,CAACK,EAAW,MAAO,GAEvB,KAAM,CAAE,UAAAC,EAAW,aAAAC,EAAc,aAAAC,CAAa,EAAIH,EAClD,OAAOE,EAAeD,EAAYE,EAAeJ,CACnD,EAAG,CAAC,CAAC,EAGCK,EAAiBxB,EAAY,IAAM,CACvC,MAAMoB,EAAYL,EAAQ,QACrBK,GAELA,EAAU,SAAS,CACjB,IAAKA,EAAU,aACf,SAAU,QACZ,CAAC,CACH,EAAG,CAAC,CAAC,EA8CL,OA3CAtB,EAAU,IAAM,CACd,MAAMsB,EAAYL,EAAQ,QAC1B,GAAI,CAACK,EAAW,OAEhB,MAAMK,EAAe,IAAM,CACzBR,EAAoB,CAACC,EAAa,CAAC,CACrC,EAGA,OAAAO,EAAa,EAEbL,EAAU,iBAAiB,SAAUK,EAAc,CAAE,QAAS,EAAK,CAAC,EAC7D,IAAML,EAAU,oBAAoB,SAAUK,CAAY,CACnE,EAAG,CAACP,CAAY,CAAC,EAGjBpB,EAAU,IAAM,CACd,GAAIY,EAAY,OAEhB,MAAMgB,EAAY,WAAW,IAAM,CACjCT,EAAoB,CAACC,EAAa,CAAC,CACrC,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaQ,CAAS,CACrC,EAAG,CAACpB,EAAUI,EAAYQ,CAAY,CAAC,EAGvCpB,EAAU,IAAM,CACd,GAAI,CAACY,GAAc,CAACK,EAAQ,QAAS,OAGrC,MAAMW,EAAY,WAAW,IAAM,CAC7BX,EAAQ,UACVA,EAAQ,QAAQ,UAAYA,EAAQ,QAAQ,aAE5CE,EAAoB,EAAK,EAE7B,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaS,CAAS,CACrC,EAAG,CAACpB,EAAUI,CAAU,CAAC,EAGrBJ,EAAS,SAAW,GAAK,CAACK,EAE1BhB,EAAC,OAAI,UAAW,0BAA0BkB,CAAS,GAAK,SAAAD,GAAoBjB,EAACQ,EAAA,EAAwB,EAAG,EAK1GP,EAAC,OAAI,UAAU,kCACb,UAAAA,EAAC,OACC,IAAKmB,EACL,UAAW;AAAA;AAAA,YAEPF,CAAS;AAAA,UAIZ,UAAAF,GAAoBhB,EAACS,EAAA,EAAiB,EAGvCT,EAAC,OAAI,UAAU,sBACZ,SAAAW,EAAS,IAAIqB,GACZhC,EAACM,EAAA,CAEC,QAAS0B,EACT,iBAAkBpB,EAClB,gBAAiBC,EACjB,cAAeC,EACf,YAAaK,GALRa,EAAQ,EAMf,CACD,EACH,EAGCjB,GAAcf,EAACO,EAAA,CAAa,aAAc,CAACI,CAAQ,EAAG,GACzD,EAGAX,EAAC,UACC,QAAS6B,EACT,UAAW,qDAAqDR,EAAmB,GAAK,qBAAqB,GAC7G,MAAO,CACL,SAAU,WACV,OAAQ,OACR,KAAM,MACN,OAAQ,GACR,MAAO,OACP,OAAQ,OACR,aAAc,MACd,gBAAiB,4BACjB,UAAW,qEACX,WAAY,wBACZ,QAASA,EAAmB,EAAI,EAChC,OAAQ,UACR,OAAQ,MACV,EACA,aAAW,mBACX,cAAa,CAACA,EAEd,SAAArB,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,UAAU,gBAEV,SAAAA,EAAC,YAAS,OAAO,iBAAiB,EACpC,EACF,GACF,CAEJ",
|
|
6
|
+
"names": ["jsx", "jsxs", "useRef", "useEffect", "useState", "useCallback", "ChatMessage", "ScrollAnchor", "DefaultEmptyPlaceholder", "LoadingIndicator", "MessageList", "messages", "rendererRegistry", "defaultRenderer", "showTimestamp", "autoScroll", "isLoadingHistory", "emptyPlaceholder", "className", "onAddToCart", "listRef", "showScrollButton", "setShowScrollButton", "isNearBottom", "threshold", "container", "scrollTop", "scrollHeight", "clientHeight", "scrollToBottom", "handleScroll", "timeoutId", "message"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 滚动锚点组件
|
|
3
|
+
* 用于自动滚动到消息列表底部
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的滚动行为设计
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export interface ScrollAnchorProps {
|
|
8
|
+
/**
|
|
9
|
+
* 是否自动滚动
|
|
10
|
+
* @default true
|
|
11
|
+
*/
|
|
12
|
+
autoScroll?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* 滚动行为
|
|
15
|
+
* @default "smooth"
|
|
16
|
+
*/
|
|
17
|
+
behavior?: ScrollBehavior;
|
|
18
|
+
/**
|
|
19
|
+
* 依赖项(当依赖项变化时触发滚动)
|
|
20
|
+
*/
|
|
21
|
+
dependencies?: any[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 滚动锚点组件
|
|
25
|
+
*
|
|
26
|
+
* 功能:
|
|
27
|
+
* - 放置在消息列表底部
|
|
28
|
+
* - 当新消息到达时自动滚动到此位置
|
|
29
|
+
* - 支持平滑滚动动画
|
|
30
|
+
*
|
|
31
|
+
* 使用场景:
|
|
32
|
+
* - 接收新消息时自动滚动
|
|
33
|
+
* - 发送消息后自动滚动
|
|
34
|
+
* - 加载历史消息后保持位置
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <MessageList>
|
|
39
|
+
* {messages.map(msg => <ChatMessage key={msg.id} message={msg} />)}
|
|
40
|
+
* <ScrollAnchor dependencies={[messages]} />
|
|
41
|
+
* </MessageList>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const ScrollAnchor: React.FC<ScrollAnchorProps>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as s}from"react/jsx-runtime";import{useEffect as l,useRef as i}from"react";const f=({autoScroll:e=!0,behavior:o="smooth",dependencies:n=[]})=>{const r=i(null);return l(()=>{if(!e)return;const t=r.current;if(!t)return;const c=setTimeout(()=>{t.scrollIntoView({behavior:o,block:"end",inline:"nearest"})},100);return()=>clearTimeout(c)},[e,o,...n]),s("div",{ref:r,style:{height:0}})};export{f as ScrollAnchor};
|
|
2
|
+
//# sourceMappingURL=ScrollAnchor.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/LiveChatWidget/components/ScrollAnchor.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u6EDA\u52A8\u951A\u70B9\u7EC4\u4EF6\n * \u7528\u4E8E\u81EA\u52A8\u6EDA\u52A8\u5230\u6D88\u606F\u5217\u8868\u5E95\u90E8\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u6EDA\u52A8\u884C\u4E3A\u8BBE\u8BA1\n */\n\nimport React, { useEffect, useRef } from 'react'\n\nexport interface ScrollAnchorProps {\n /**\n * \u662F\u5426\u81EA\u52A8\u6EDA\u52A8\n * @default true\n */\n autoScroll?: boolean\n\n /**\n * \u6EDA\u52A8\u884C\u4E3A\n * @default \"smooth\"\n */\n behavior?: ScrollBehavior\n\n /**\n * \u4F9D\u8D56\u9879\uFF08\u5F53\u4F9D\u8D56\u9879\u53D8\u5316\u65F6\u89E6\u53D1\u6EDA\u52A8\uFF09\n */\n dependencies?: any[]\n}\n\n/**\n * \u6EDA\u52A8\u951A\u70B9\u7EC4\u4EF6\n *\n * \u529F\u80FD\uFF1A\n * - \u653E\u7F6E\u5728\u6D88\u606F\u5217\u8868\u5E95\u90E8\n * - \u5F53\u65B0\u6D88\u606F\u5230\u8FBE\u65F6\u81EA\u52A8\u6EDA\u52A8\u5230\u6B64\u4F4D\u7F6E\n * - \u652F\u6301\u5E73\u6ED1\u6EDA\u52A8\u52A8\u753B\n *\n * \u4F7F\u7528\u573A\u666F\uFF1A\n * - \u63A5\u6536\u65B0\u6D88\u606F\u65F6\u81EA\u52A8\u6EDA\u52A8\n * - \u53D1\u9001\u6D88\u606F\u540E\u81EA\u52A8\u6EDA\u52A8\n * - \u52A0\u8F7D\u5386\u53F2\u6D88\u606F\u540E\u4FDD\u6301\u4F4D\u7F6E\n *\n * @example\n * ```tsx\n * <MessageList>\n * {messages.map(msg => <ChatMessage key={msg.id} message={msg} />)}\n * <ScrollAnchor dependencies={[messages]} />\n * </MessageList>\n * ```\n */\nexport const ScrollAnchor: React.FC<ScrollAnchorProps> = ({\n autoScroll = true,\n behavior = 'smooth',\n dependencies = [],\n}) => {\n const anchorRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!autoScroll) return\n\n const anchor = anchorRef.current\n if (!anchor) return\n\n // \u4F7F\u7528 setTimeout \u786E\u4FDD DOM \u5DF2\u66F4\u65B0\n const timeoutId = setTimeout(() => {\n anchor.scrollIntoView({\n behavior,\n block: 'end',\n inline: 'nearest',\n })\n }, 100)\n\n return () => clearTimeout(timeoutId)\n }, [autoScroll, behavior, ...dependencies])\n\n return <div ref={anchorRef} style={{ height: 0 }} />\n}\n"],
|
|
5
|
+
"mappings": "AAyES,cAAAA,MAAA,oBAnET,OAAgB,aAAAC,EAAW,UAAAC,MAAc,QA0ClC,MAAMC,EAA4C,CAAC,CACxD,WAAAC,EAAa,GACb,SAAAC,EAAW,SACX,aAAAC,EAAe,CAAC,CAClB,IAAM,CACJ,MAAMC,EAAYL,EAAuB,IAAI,EAE7C,OAAAD,EAAU,IAAM,CACd,GAAI,CAACG,EAAY,OAEjB,MAAMI,EAASD,EAAU,QACzB,GAAI,CAACC,EAAQ,OAGb,MAAMC,EAAY,WAAW,IAAM,CACjCD,EAAO,eAAe,CACpB,SAAAH,EACA,MAAO,MACP,OAAQ,SACV,CAAC,CACH,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaI,CAAS,CACrC,EAAG,CAACL,EAAYC,EAAU,GAAGC,CAAY,CAAC,EAEnCN,EAAC,OAAI,IAAKO,EAAW,MAAO,CAAE,OAAQ,CAAE,EAAG,CACpD",
|
|
6
|
+
"names": ["jsx", "useEffect", "useRef", "ScrollAnchor", "autoScroll", "behavior", "dependencies", "anchorRef", "anchor", "timeoutId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/LiveChatWidget/constants.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * LiveChat \u7EC4\u4EF6\u5E38\u91CF\u5B9A\u4E49\n */\n\n/**\n * \u8D27\u5E01\u7B26\u53F7\u6620\u5C04\u8868\n * \u7528\u4E8E\u5C06\u8D27\u5E01\u4EE3\u7801\u8F6C\u6362\u4E3A\u5BF9\u5E94\u7684\u7B26\u53F7\n */\nexport const CURRENCY_SYMBOLS: Record<string, string> = {\n USD: '$',\n EUR: '\u20AC',\n GBP: '\u00A3',\n JPY: '\u00A5',\n CNY: '\u00A5',\n}\n"],
|
|
5
|
+
"mappings": "AAQO,MAAMA,EAA2C,CACtD,IAAK,IACL,IAAK,SACL,IAAK,OACL,IAAK,OACL,IAAK,MACP",
|
|
6
|
+
"names": ["CURRENCY_SYMBOLS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 聊天 API 调用 Hook
|
|
3
|
+
* 封装 SSE 流式消息接收、历史消息加载、新会话创建
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的 API 调用策略
|
|
5
|
+
*/
|
|
6
|
+
import type { ChatStreamRequest, SSEEvent, NewSessionRequest, NewSessionResponse } from '../types';
|
|
7
|
+
export interface UseChatAPIOptions {
|
|
8
|
+
/**
|
|
9
|
+
* API 基础 URL
|
|
10
|
+
*/
|
|
11
|
+
apiBaseUrl: string;
|
|
12
|
+
/**
|
|
13
|
+
* 错误处理回调
|
|
14
|
+
*/
|
|
15
|
+
onError?: (error: Error) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface UseChatAPIReturn {
|
|
18
|
+
/**
|
|
19
|
+
* 发送消息并接收 SSE 流式响应
|
|
20
|
+
* @param request 请求参数
|
|
21
|
+
* @param onEvent SSE 事件回调
|
|
22
|
+
* @returns Promise<void>
|
|
23
|
+
*/
|
|
24
|
+
sendMessageStream: (request: ChatStreamRequest, onEvent: (event: SSEEvent) => void) => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* 创建新会话或恢复现有会话
|
|
27
|
+
* @param request 请求参数
|
|
28
|
+
* @returns 新会话信息,可能包含历史消息
|
|
29
|
+
*/
|
|
30
|
+
createSession: (request: NewSessionRequest) => Promise<NewSessionResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* 中断当前的 SSE 流
|
|
33
|
+
*/
|
|
34
|
+
abortStream: () => void;
|
|
35
|
+
/**
|
|
36
|
+
* 是否正在发送消息
|
|
37
|
+
*/
|
|
38
|
+
isSending: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 聊天 API 调用 Hook
|
|
42
|
+
*
|
|
43
|
+
* 功能:
|
|
44
|
+
* 1. sendMessageStream: 发送消息并接收 SSE 流式响应
|
|
45
|
+
* 2. createSession: 创建新会话或恢复现有会话
|
|
46
|
+
* 3. abortStream: 中断当前流
|
|
47
|
+
*
|
|
48
|
+
* @param options Hook 配置选项
|
|
49
|
+
* @returns API 调用工具对象
|
|
50
|
+
*/
|
|
51
|
+
export declare function useChatAPI(options: UseChatAPIOptions): UseChatAPIReturn;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useCallback as i,useRef as u}from"react";import{sendMessage as f,createNewSession as p}from"../api/chat";function E(c){const{apiBaseUrl:s,onError:o}=c,e=u(null),n=u(!1),l=i(async(a,r)=>{e.current&&e.current.abort(),e.current=new AbortController,n.current=!0;try{await f(s,a,r)}catch(t){if(t instanceof Error&&t.name==="AbortError")return;throw console.error("[useChatAPI] Stream error:",t),o?.(t),t}finally{n.current=!1,e.current=null}},[s,o]),S=i(async a=>{try{return await p(s,a)}catch(r){throw console.error("[useChatAPI] Create session error:",r),o?.(r),r}},[s,o]),m=i(()=>{e.current&&(e.current.abort(),e.current=null,n.current=!1)},[]);return{sendMessageStream:l,createSession:S,abortStream:m,isSending:n.current}}export{E as useChatAPI};
|
|
2
|
+
//# sourceMappingURL=useChatAPI.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/LiveChatWidget/hooks/useChatAPI.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u804A\u5929 API \u8C03\u7528 Hook\n * \u5C01\u88C5 SSE \u6D41\u5F0F\u6D88\u606F\u63A5\u6536\u3001\u5386\u53F2\u6D88\u606F\u52A0\u8F7D\u3001\u65B0\u4F1A\u8BDD\u521B\u5EFA\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684 API \u8C03\u7528\u7B56\u7565\n */\n\nimport { useCallback, useRef } from 'react'\nimport type { ChatStreamRequest, SSEEvent, NewSessionRequest, NewSessionResponse } from '../types'\nimport { sendMessage, createNewSession } from '../api/chat'\n\nexport interface UseChatAPIOptions {\n /**\n * API \u57FA\u7840 URL\n */\n apiBaseUrl: string\n\n /**\n * \u9519\u8BEF\u5904\u7406\u56DE\u8C03\n */\n onError?: (error: Error) => void\n}\n\nexport interface UseChatAPIReturn {\n /**\n * \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n * @param request \u8BF7\u6C42\u53C2\u6570\n * @param onEvent SSE \u4E8B\u4EF6\u56DE\u8C03\n * @returns Promise<void>\n */\n sendMessageStream: (request: ChatStreamRequest, onEvent: (event: SSEEvent) => void) => Promise<void>\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n * @param request \u8BF7\u6C42\u53C2\u6570\n * @returns \u65B0\u4F1A\u8BDD\u4FE1\u606F\uFF0C\u53EF\u80FD\u5305\u542B\u5386\u53F2\u6D88\u606F\n */\n createSession: (request: NewSessionRequest) => Promise<NewSessionResponse>\n\n /**\n * \u4E2D\u65AD\u5F53\u524D\u7684 SSE \u6D41\n */\n abortStream: () => void\n\n /**\n * \u662F\u5426\u6B63\u5728\u53D1\u9001\u6D88\u606F\n */\n isSending: boolean\n}\n\n/**\n * \u804A\u5929 API \u8C03\u7528 Hook\n *\n * \u529F\u80FD\uFF1A\n * 1. sendMessageStream: \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n * 2. createSession: \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n * 3. abortStream: \u4E2D\u65AD\u5F53\u524D\u6D41\n *\n * @param options Hook \u914D\u7F6E\u9009\u9879\n * @returns API \u8C03\u7528\u5DE5\u5177\u5BF9\u8C61\n */\nexport function useChatAPI(options: UseChatAPIOptions): UseChatAPIReturn {\n const { apiBaseUrl, onError } = options\n\n // \u7528\u4E8E\u4E2D\u65AD\u5F53\u524D\u8BF7\u6C42\u7684 AbortController\n const abortControllerRef = useRef<AbortController | null>(null)\n\n // \u53D1\u9001\u72B6\u6001\u6807\u8BB0\n const isSendingRef = useRef(false)\n\n /**\n * \u53D1\u9001\u6D88\u606F\u5E76\u63A5\u6536 SSE \u6D41\u5F0F\u54CD\u5E94\n */\n const sendMessageStream = useCallback(\n async (request: ChatStreamRequest, onEvent: (event: SSEEvent) => void) => {\n // \u5982\u679C\u6B63\u5728\u53D1\u9001\uFF0C\u5148\u4E2D\u65AD\u4E4B\u524D\u7684\u8BF7\u6C42\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n }\n\n // \u521B\u5EFA\u65B0\u7684 AbortController\n abortControllerRef.current = new AbortController()\n isSendingRef.current = true\n\n try {\n await sendMessage(apiBaseUrl, request, onEvent)\n } catch (error) {\n // \u5FFD\u7565\u624B\u52A8\u4E2D\u65AD\u7684\u9519\u8BEF\n if (error instanceof Error && error.name === 'AbortError') {\n return\n }\n\n console.error('[useChatAPI] Stream error:', error)\n onError?.(error as Error)\n throw error\n } finally {\n isSendingRef.current = false\n abortControllerRef.current = null\n }\n },\n [apiBaseUrl, onError]\n )\n\n /**\n * \u521B\u5EFA\u65B0\u4F1A\u8BDD\u6216\u6062\u590D\u73B0\u6709\u4F1A\u8BDD\n */\n const createSession = useCallback(\n async (request: NewSessionRequest): Promise<NewSessionResponse> => {\n try {\n return await createNewSession(apiBaseUrl, request)\n } catch (error) {\n console.error('[useChatAPI] Create session error:', error)\n onError?.(error as Error)\n throw error\n }\n },\n [apiBaseUrl, onError]\n )\n\n /**\n * \u4E2D\u65AD\u5F53\u524D\u7684 SSE \u6D41\n */\n const abortStream = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n isSendingRef.current = false\n }\n }, [])\n\n return {\n sendMessageStream,\n createSession,\n abortStream,\n isSending: isSendingRef.current,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAMA,OAAS,eAAAA,EAAa,UAAAC,MAAc,QAEpC,OAAS,eAAAC,EAAa,oBAAAC,MAAwB,cAoDvC,SAASC,EAAWC,EAA8C,CACvE,KAAM,CAAE,WAAAC,EAAY,QAAAC,CAAQ,EAAIF,EAG1BG,EAAqBP,EAA+B,IAAI,EAGxDQ,EAAeR,EAAO,EAAK,EAK3BS,EAAoBV,EACxB,MAAOW,EAA4BC,IAAuC,CAEpEJ,EAAmB,SACrBA,EAAmB,QAAQ,MAAM,EAInCA,EAAmB,QAAU,IAAI,gBACjCC,EAAa,QAAU,GAEvB,GAAI,CACF,MAAMP,EAAYI,EAAYK,EAASC,CAAO,CAChD,OAASC,EAAO,CAEd,GAAIA,aAAiB,OAASA,EAAM,OAAS,aAC3C,OAGF,cAAQ,MAAM,6BAA8BA,CAAK,EACjDN,IAAUM,CAAc,EAClBA,CACR,QAAE,CACAJ,EAAa,QAAU,GACvBD,EAAmB,QAAU,IAC/B,CACF,EACA,CAACF,EAAYC,CAAO,CACtB,EAKMO,EAAgBd,EACpB,MAAOW,GAA4D,CACjE,GAAI,CACF,OAAO,MAAMR,EAAiBG,EAAYK,CAAO,CACnD,OAASE,EAAO,CACd,cAAQ,MAAM,qCAAsCA,CAAK,EACzDN,IAAUM,CAAc,EAClBA,CACR,CACF,EACA,CAACP,EAAYC,CAAO,CACtB,EAKMQ,EAAcf,EAAY,IAAM,CAChCQ,EAAmB,UACrBA,EAAmB,QAAQ,MAAM,EACjCA,EAAmB,QAAU,KAC7BC,EAAa,QAAU,GAE3B,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,kBAAAC,EACA,cAAAI,EACA,YAAAC,EACA,UAAWN,EAAa,OAC1B,CACF",
|
|
6
|
+
"names": ["useCallback", "useRef", "sendMessage", "createNewSession", "useChatAPI", "options", "apiBaseUrl", "onError", "abortControllerRef", "isSendingRef", "sendMessageStream", "request", "onEvent", "error", "createSession", "abortStream"]
|
|
7
|
+
}
|