@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,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
|
+
"use strict";var f=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var L=(r,o)=>{for(var a in o)f(r,a,{get:o[a],enumerable:!0})},k=(r,o,a,c)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of M(o))!C.call(r,s)&&s!==a&&f(r,s,{get:()=>o[s],enumerable:!(c=w(o,s))||c.enumerable});return r};var B=r=>k(f({},"__esModule",{value:!0}),r);var z={};L(z,{MessageList:()=>S});module.exports=B(z);var e=require("react/jsx-runtime"),n=require("react"),v=require("./ChatMessage"),h=require("./ScrollAnchor");const E=()=>(0,e.jsx)("div",{className:"flex h-full items-center justify-center text-gray-400",children:(0,e.jsx)("p",{className:"text-sm",children:"\u6682\u65E0\u6D88\u606F"})}),H=()=>(0,e.jsx)("div",{className:"flex justify-center py-4",children:(0,e.jsxs)("div",{className:"flex gap-1",children:[(0,e.jsx)("div",{className:"size-2 animate-bounce rounded-full bg-gray-400"}),(0,e.jsx)("div",{className:"size-2 animate-bounce rounded-full bg-gray-400",style:{animationDelay:"0.1s"}}),(0,e.jsx)("div",{className:"size-2 animate-bounce rounded-full bg-gray-400",style:{animationDelay:"0.2s"}})]})}),S=({messages:r,rendererRegistry:o,defaultRenderer:a,showTimestamp:c=!0,autoScroll:s=!0,isLoadingHistory:p=!1,emptyPlaceholder:y,className:g="",onAddToCart:b})=>{const i=(0,n.useRef)(null),[u,m]=(0,n.useState)(!1),d=(0,n.useCallback)((t=100)=>{const l=i.current;if(!l)return!0;const{scrollTop:R,scrollHeight:N,clientHeight:T}=l;return N-R-T<t},[]),x=(0,n.useCallback)(()=>{const t=i.current;t&&t.scrollTo({top:t.scrollHeight,behavior:"smooth"})},[]);return(0,n.useEffect)(()=>{const t=i.current;if(!t)return;const l=()=>{m(!d())};return l(),t.addEventListener("scroll",l,{passive:!0}),()=>t.removeEventListener("scroll",l)},[d]),(0,n.useEffect)(()=>{if(s)return;const t=setTimeout(()=>{m(!d())},150);return()=>clearTimeout(t)},[r,s,d]),(0,n.useEffect)(()=>{if(!s||!i.current)return;const t=setTimeout(()=>{i.current&&(i.current.scrollTop=i.current.scrollHeight,m(!1))},100);return()=>clearTimeout(t)},[r,s]),r.length===0&&!p?(0,e.jsx)("div",{className:`flex-1 overflow-hidden ${g}`,children:y||(0,e.jsx)(E,{})}):(0,e.jsxs)("div",{className:"relative flex-1 overflow-hidden",children:[(0,e.jsxs)("div",{ref:i,className:`
|
|
2
|
+
livechat-message-list absolute inset-0 overflow-y-auto p-4
|
|
3
|
+
${g}
|
|
4
|
+
`,children:[p&&(0,e.jsx)(H,{}),(0,e.jsx)("div",{className:"flex flex-col gap-1",children:r.map(t=>(0,e.jsx)(v.ChatMessage,{message:t,rendererRegistry:o,defaultRenderer:a,showTimestamp:c,onAddToCart:b},t.id))}),s&&(0,e.jsx)(h.ScrollAnchor,{dependencies:[r]})]}),(0,e.jsx)("button",{onClick:x,className:`flex -translate-x-1/2 items-center justify-center ${u?"":"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:u?1:0,cursor:"pointer",border:"none"},"aria-label":"Scroll to bottom","aria-hidden":!u,children:(0,e.jsx)("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:(0,e.jsx)("polyline",{points:"6 9 12 15 18 9"})})})]})};
|
|
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": "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",
|
|
6
|
+
"names": ["MessageList_exports", "__export", "MessageList", "__toCommonJS", "import_jsx_runtime", "import_react", "import_ChatMessage", "import_ScrollAnchor", "DefaultEmptyPlaceholder", "LoadingIndicator", "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
|
+
"use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var h=(o,e)=>{for(var t in e)l(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of a(e))!f.call(o,r)&&r!==t&&l(o,r,{get:()=>e[r],enumerable:!(n=u(e,r))||n.enumerable});return o};var p=o=>m(l({},"__esModule",{value:!0}),o);var R={};h(R,{ScrollAnchor:()=>d});module.exports=p(R);var i=require("react/jsx-runtime"),c=require("react");const d=({autoScroll:o=!0,behavior:e="smooth",dependencies:t=[]})=>{const n=(0,c.useRef)(null);return(0,c.useEffect)(()=>{if(!o)return;const r=n.current;if(!r)return;const s=setTimeout(()=>{r.scrollIntoView({behavior:e,block:"end",inline:"nearest"})},100);return()=>clearTimeout(s)},[o,e,...t]),(0,i.jsx)("div",{ref:n,style:{height:0}})};
|
|
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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAyES,IAAAI,EAAA,6BAnETC,EAAyC,iBA0ClC,MAAMH,EAA4C,CAAC,CACxD,WAAAI,EAAa,GACb,SAAAC,EAAW,SACX,aAAAC,EAAe,CAAC,CAClB,IAAM,CACJ,MAAMC,KAAY,UAAuB,IAAI,EAE7C,sBAAU,IAAM,CACd,GAAI,CAACH,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,KAEnC,OAAC,OAAI,IAAKC,EAAW,MAAO,CAAE,OAAQ,CAAE,EAAG,CACpD",
|
|
6
|
+
"names": ["ScrollAnchor_exports", "__export", "ScrollAnchor", "__toCommonJS", "import_jsx_runtime", "import_react", "autoScroll", "behavior", "dependencies", "anchorRef", "anchor", "timeoutId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var U=(t,r)=>{for(var Y in r)n(t,Y,{get:r[Y],enumerable:!0})},c=(t,r,Y,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let R of C(r))!S.call(t,R)&&R!==Y&&n(t,R,{get:()=>r[R],enumerable:!(o=s(r,R))||o.enumerable});return t};var e=t=>c(n({},"__esModule",{value:!0}),t);var i={};U(i,{CURRENCY_SYMBOLS:()=>g});module.exports=e(i);const g={USD:"$",EUR:"\u20AC",GBP:"\xA3",JPY:"\xA5",CNY:"\xA5"};
|
|
2
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAQO,MAAME,EAA2C,CACtD,IAAK,IACL,IAAK,SACL,IAAK,OACL,IAAK,OACL,IAAK,MACP",
|
|
6
|
+
"names": ["constants_exports", "__export", "CURRENCY_SYMBOLS", "__toCommonJS"]
|
|
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
|
+
"use strict";var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var E=(s,e)=>{for(var o in e)l(s,o,{get:e[o],enumerable:!0})},R=(s,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of C(e))!h.call(s,t)&&t!==o&&l(s,t,{get:()=>e[t],enumerable:!(r=p(e,t))||r.enumerable});return s};var w=s=>R(l({},"__esModule",{value:!0}),s);var v={};E(v,{useChatAPI:()=>d});module.exports=w(v);var n=require("react"),u=require("../api/chat");function d(s){const{apiBaseUrl:e,onError:o}=s,r=(0,n.useRef)(null),t=(0,n.useRef)(!1),S=(0,n.useCallback)(async(c,a)=>{r.current&&r.current.abort(),r.current=new AbortController,t.current=!0;try{await(0,u.sendMessage)(e,c,a)}catch(i){if(i instanceof Error&&i.name==="AbortError")return;throw console.error("[useChatAPI] Stream error:",i),o?.(i),i}finally{t.current=!1,r.current=null}},[e,o]),m=(0,n.useCallback)(async c=>{try{return await(0,u.createNewSession)(e,c)}catch(a){throw console.error("[useChatAPI] Create session error:",a),o?.(a),a}},[e,o]),f=(0,n.useCallback)(()=>{r.current&&(r.current.abort(),r.current=null,t.current=!1)},[]);return{sendMessageStream:S,createSession:m,abortStream:f,isSending:t.current}}
|
|
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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EAAoC,iBAEpCC,EAA8C,uBAoDvC,SAASH,EAAWI,EAA8C,CACvE,KAAM,CAAE,WAAAC,EAAY,QAAAC,CAAQ,EAAIF,EAG1BG,KAAqB,UAA+B,IAAI,EAGxDC,KAAe,UAAO,EAAK,EAK3BC,KAAoB,eACxB,MAAOC,EAA4BC,IAAuC,CAEpEJ,EAAmB,SACrBA,EAAmB,QAAQ,MAAM,EAInCA,EAAmB,QAAU,IAAI,gBACjCC,EAAa,QAAU,GAEvB,GAAI,CACF,QAAM,eAAYH,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,KAAgB,eACpB,MAAOH,GAA4D,CACjE,GAAI,CACF,OAAO,QAAM,oBAAiBL,EAAYK,CAAO,CACnD,OAASE,EAAO,CACd,cAAQ,MAAM,qCAAsCA,CAAK,EACzDN,IAAUM,CAAc,EAClBA,CACR,CACF,EACA,CAACP,EAAYC,CAAO,CACtB,EAKMQ,KAAc,eAAY,IAAM,CAChCP,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": ["useChatAPI_exports", "__export", "useChatAPI", "__toCommonJS", "import_react", "import_chat", "options", "apiBaseUrl", "onError", "abortControllerRef", "isSendingRef", "sendMessageStream", "request", "onEvent", "error", "createSession", "abortStream"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 聊天状态管理 Hook
|
|
3
|
+
* 管理消息列表、窗口状态、输入框状态、流式消息累积
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的状态管理策略
|
|
5
|
+
*/
|
|
6
|
+
import type { Message, SSEEvent } from '../types';
|
|
7
|
+
export interface UseChatStateOptions {
|
|
8
|
+
/**
|
|
9
|
+
* 初始欢迎消息
|
|
10
|
+
*/
|
|
11
|
+
welcomeMessage?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Shopify 店铺域名
|
|
14
|
+
*/
|
|
15
|
+
site?: string;
|
|
16
|
+
/**
|
|
17
|
+
* 窗口打开回调
|
|
18
|
+
*/
|
|
19
|
+
onOpen?: () => void;
|
|
20
|
+
/**
|
|
21
|
+
* 窗口关闭回调
|
|
22
|
+
*/
|
|
23
|
+
onClose?: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* 消息发送回调
|
|
26
|
+
*/
|
|
27
|
+
onMessageSend?: (message: string) => void;
|
|
28
|
+
/**
|
|
29
|
+
* 错误处理回调
|
|
30
|
+
*/
|
|
31
|
+
onError?: (error: Error) => void;
|
|
32
|
+
/**
|
|
33
|
+
* 商品添加到购物车回调
|
|
34
|
+
*/
|
|
35
|
+
onAddToCart?: (product: any) => void;
|
|
36
|
+
/**
|
|
37
|
+
* 购物车按钮点击回调
|
|
38
|
+
*/
|
|
39
|
+
onCart?: (cartId: string, checkoutUrl?: string) => void;
|
|
40
|
+
}
|
|
41
|
+
export interface UseChatStateReturn {
|
|
42
|
+
/**
|
|
43
|
+
* 消息列表
|
|
44
|
+
*/
|
|
45
|
+
messages: Message[];
|
|
46
|
+
/**
|
|
47
|
+
* 聊天窗口是否打开
|
|
48
|
+
*/
|
|
49
|
+
isOpen: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* 用户 ID
|
|
52
|
+
*/
|
|
53
|
+
userId: string;
|
|
54
|
+
/**
|
|
55
|
+
* 会话 ID
|
|
56
|
+
*/
|
|
57
|
+
sessionId: string | null;
|
|
58
|
+
/**
|
|
59
|
+
* 输入框内容
|
|
60
|
+
*/
|
|
61
|
+
inputValue: string;
|
|
62
|
+
/**
|
|
63
|
+
* 是否正在接收流式消息
|
|
64
|
+
*/
|
|
65
|
+
isStreaming: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* 打开聊天窗口
|
|
68
|
+
*/
|
|
69
|
+
openChat: () => void;
|
|
70
|
+
/**
|
|
71
|
+
* 关闭聊天窗口
|
|
72
|
+
*/
|
|
73
|
+
closeChat: () => void;
|
|
74
|
+
/**
|
|
75
|
+
* 切换聊天窗口状态
|
|
76
|
+
*/
|
|
77
|
+
toggleChat: () => void;
|
|
78
|
+
/**
|
|
79
|
+
* 设置输入框内容
|
|
80
|
+
*/
|
|
81
|
+
setInputValue: (value: string) => void;
|
|
82
|
+
/**
|
|
83
|
+
* 添加消息到列表
|
|
84
|
+
*/
|
|
85
|
+
addMessage: (message: Message) => void;
|
|
86
|
+
/**
|
|
87
|
+
* 批量设置消息列表(用于加载历史)
|
|
88
|
+
*/
|
|
89
|
+
setMessages: (messages: Message[]) => void;
|
|
90
|
+
/**
|
|
91
|
+
* 清空消息列表
|
|
92
|
+
*/
|
|
93
|
+
clearMessages: () => void;
|
|
94
|
+
/**
|
|
95
|
+
* 处理 SSE 事件
|
|
96
|
+
*/
|
|
97
|
+
handleSSEEvent: (event: SSEEvent) => void;
|
|
98
|
+
/**
|
|
99
|
+
* 保存会话 ID
|
|
100
|
+
*/
|
|
101
|
+
saveSession: (id: string) => void;
|
|
102
|
+
/**
|
|
103
|
+
* 清空会话
|
|
104
|
+
*/
|
|
105
|
+
clearSession: () => void;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 聊天状态管理 Hook
|
|
109
|
+
*
|
|
110
|
+
* 功能:
|
|
111
|
+
* 1. 管理消息列表(添加、清空、批量设置)
|
|
112
|
+
* 2. 管理窗口状态(打开、关闭、切换)
|
|
113
|
+
* 3. 管理输入框状态
|
|
114
|
+
* 4. 处理 SSE 流式消息事件
|
|
115
|
+
* 5. 累积流式文本内容
|
|
116
|
+
*
|
|
117
|
+
* @param options Hook 配置选项
|
|
118
|
+
* @returns 状态管理工具对象
|
|
119
|
+
*/
|
|
120
|
+
export declare function useChatState(options?: UseChatStateOptions): UseChatStateReturn;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var _=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var Q=(d,a)=>{for(var p in a)_(d,p,{get:a[p],enumerable:!0})},W=(d,a,p,g)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of L(a))!N.call(d,i)&&i!==p&&_(d,i,{get:()=>a[i],enumerable:!(g=K(a,i))||g.enumerable});return d};var X=d=>W(_({},"__esModule",{value:!0}),d);var Z={};Q(Z,{useChatState:()=>Y});module.exports=X(Z);var s=require("react"),O=require("../utils/userId"),U=require("./useSession"),E=require("../utils/productTransformers"),A=require("../utils/cartTransformers");function Y(d={}){const{welcomeMessage:a,site:p,onOpen:g,onClose:i,onMessageSend:ee,onError:b,onAddToCart:w,onCart:T}=d,{sessionId:h,saveSession:v,clearSession:D}=(0,U.useSession)(),[P,q]=(0,s.useState)("");(0,s.useEffect)(()=>{(0,O.getUserId)().then(u=>q(u))},[]);const[R,f]=(0,s.useState)(()=>a?[{id:`welcome-${Date.now()}`,role:"assistant",content:[{type:"text",text:a}],timestamp:Date.now()}]:[]),[V,k]=(0,s.useState)(!1),[$,B]=(0,s.useState)(""),[j,M]=(0,s.useState)(!1),t=(0,s.useRef)(null),z=(0,s.useCallback)(()=>{k(!0),g?.()},[g]),F=(0,s.useCallback)(()=>{k(!1),i?.()},[i]),G=(0,s.useCallback)(()=>{k(u=>{const m=!u;return m?g?.():i?.(),m})},[g,i]),y=(0,s.useCallback)(u=>{f(m=>[...m,u])},[]),H=(0,s.useCallback)(u=>{f(u)},[]),x=(0,s.useCallback)(()=>{f([])},[]),J=(0,s.useCallback)(u=>{const{event:m,data:C}=u;switch(m){case"message_start":{M(!0);const n=C;n.sessionId&&n.sessionId!==h&&v(n.sessionId);const o=`msg-${Date.now()}`;t.current={id:o,role:"assistant",content:[{type:"thinking",data:{status:"thinking"}}],timestamp:Date.now()},f(e=>[...e,t.current]);break}case"content_delta":{const n=C,o=n.delta||n.text||"";if(t.current&&o){t.current.content.some(c=>c.type==="thinking")&&(t.current.content=t.current.content.filter(c=>c.type!=="thinking"));const r=t.current.content[t.current.content.length-1];r&&r.type==="text"?r.text+=o:t.current.content.push({type:"text",text:o}),f(c=>{const l=[...c],S=l.findIndex(I=>I.id===t.current.id);return S>=0?l[S]={...t.current}:l.push({...t.current}),l})}break}case"content_block":{const n=C;if(t.current){const o=n.type||n.data?.type,e=n.data;if(!o||!e){console.warn("[useChatState] Invalid content_block:",n);break}let r;o==="product_list"&&Array.isArray(e)?r={type:"product_list",data:{products:(0,E.transformProducts)(e,p),title:void 0,onAddToCart:w}}:o==="product_comparison"&&e.products?r={type:"product_comparison",data:{products:(0,E.transformProducts)(e.products,p),dimensions:e.dimensions||{}}}:o==="faq_list"&&e.found!==void 0?r={type:"faq_list",data:e}:o==="quick_replies"&&e.replies?r={type:"quick_replies",data:{replies:e.replies}}:o==="policy"&&e.title&&e.content?r={type:"policy",data:{title:e.title,content:e.content}}:o==="promotion_list"&&e.found!==void 0?r={type:"promotion_list",data:e}:o==="cart"&&e.id!==void 0?r={type:"cart",data:{...(0,A.transformCartData)(e),onCart:T}}:r={type:o,data:e},t.current.content.push(r),f(c=>{const l=[...c],S=l.findIndex(I=>I.id===t.current.id);return S>=0?l[S]={...t.current}:l.push({...t.current}),l})}break}case"tool_start":case"tool_end":break;case"message_end":{M(!1),t.current=null;break}case"status":{C.type==="session_expired"&&(x(),D(),a&&y({id:`welcome-${Date.now()}`,role:"assistant",content:[{type:"text",text:a}],timestamp:Date.now()}));break}case"error":{const n=C;M(!1),t.current=null,y({id:`error-${Date.now()}`,role:"system",content:[{type:"error",data:{message:n.message,code:n.code}}],timestamp:Date.now()}),b?.(new Error(n.message));break}case"done":{M(!1),t.current=null;break}default:break}},[a,p,y,x,D,v,h,b,w,T]);return{messages:R,isOpen:V,userId:P,sessionId:h,inputValue:$,isStreaming:j,openChat:z,closeChat:F,toggleChat:G,setInputValue:B,addMessage:y,setMessages:H,clearMessages:x,handleSSEEvent:J,saveSession:v,clearSession:D}}
|
|
2
|
+
//# sourceMappingURL=useChatState.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/LiveChatWidget/hooks/useChatState.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u804A\u5929\u72B6\u6001\u7BA1\u7406 Hook\n * \u7BA1\u7406\u6D88\u606F\u5217\u8868\u3001\u7A97\u53E3\u72B6\u6001\u3001\u8F93\u5165\u6846\u72B6\u6001\u3001\u6D41\u5F0F\u6D88\u606F\u7D2F\u79EF\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u72B6\u6001\u7BA1\u7406\u7B56\u7565\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport type { Message, MessageContent, SSEEvent, StatusData, ErrorData, MessageStartData, BackendCartData } from '../types'\nimport { getUserId } from '../utils/userId'\nimport { useSession } from './useSession'\nimport { transformProducts } from '../utils/productTransformers'\nimport { transformCartData } from '../utils/cartTransformers'\n\nexport interface UseChatStateOptions {\n /**\n * \u521D\u59CB\u6B22\u8FCE\u6D88\u606F\n */\n welcomeMessage?: string\n\n /**\n * Shopify \u5E97\u94FA\u57DF\u540D\n */\n site?: string\n\n /**\n * \u7A97\u53E3\u6253\u5F00\u56DE\u8C03\n */\n onOpen?: () => void\n\n /**\n * \u7A97\u53E3\u5173\u95ED\u56DE\u8C03\n */\n onClose?: () => void\n\n /**\n * \u6D88\u606F\u53D1\u9001\u56DE\u8C03\n */\n onMessageSend?: (message: string) => void\n\n /**\n * \u9519\u8BEF\u5904\u7406\u56DE\u8C03\n */\n onError?: (error: Error) => void\n\n /**\n * \u5546\u54C1\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u56DE\u8C03\n */\n onAddToCart?: (product: any) => void\n\n /**\n * \u8D2D\u7269\u8F66\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\n */\n onCart?: (cartId: string, checkoutUrl?: string) => void\n}\n\nexport interface UseChatStateReturn {\n /**\n * \u6D88\u606F\u5217\u8868\n */\n messages: Message[]\n\n /**\n * \u804A\u5929\u7A97\u53E3\u662F\u5426\u6253\u5F00\n */\n isOpen: boolean\n\n /**\n * \u7528\u6237 ID\n */\n userId: string\n\n /**\n * \u4F1A\u8BDD ID\n */\n sessionId: string | null\n\n /**\n * \u8F93\u5165\u6846\u5185\u5BB9\n */\n inputValue: string\n\n /**\n * \u662F\u5426\u6B63\u5728\u63A5\u6536\u6D41\u5F0F\u6D88\u606F\n */\n isStreaming: boolean\n\n /**\n * \u6253\u5F00\u804A\u5929\u7A97\u53E3\n */\n openChat: () => void\n\n /**\n * \u5173\u95ED\u804A\u5929\u7A97\u53E3\n */\n closeChat: () => void\n\n /**\n * \u5207\u6362\u804A\u5929\u7A97\u53E3\u72B6\u6001\n */\n toggleChat: () => void\n\n /**\n * \u8BBE\u7F6E\u8F93\u5165\u6846\u5185\u5BB9\n */\n setInputValue: (value: string) => void\n\n /**\n * \u6DFB\u52A0\u6D88\u606F\u5230\u5217\u8868\n */\n addMessage: (message: Message) => void\n\n /**\n * \u6279\u91CF\u8BBE\u7F6E\u6D88\u606F\u5217\u8868\uFF08\u7528\u4E8E\u52A0\u8F7D\u5386\u53F2\uFF09\n */\n setMessages: (messages: Message[]) => void\n\n /**\n * \u6E05\u7A7A\u6D88\u606F\u5217\u8868\n */\n clearMessages: () => void\n\n /**\n * \u5904\u7406 SSE \u4E8B\u4EF6\n */\n handleSSEEvent: (event: SSEEvent) => void\n\n /**\n * \u4FDD\u5B58\u4F1A\u8BDD ID\n */\n saveSession: (id: string) => void\n\n /**\n * \u6E05\u7A7A\u4F1A\u8BDD\n */\n clearSession: () => void\n}\n\n/**\n * \u804A\u5929\u72B6\u6001\u7BA1\u7406 Hook\n *\n * \u529F\u80FD\uFF1A\n * 1. \u7BA1\u7406\u6D88\u606F\u5217\u8868\uFF08\u6DFB\u52A0\u3001\u6E05\u7A7A\u3001\u6279\u91CF\u8BBE\u7F6E\uFF09\n * 2. \u7BA1\u7406\u7A97\u53E3\u72B6\u6001\uFF08\u6253\u5F00\u3001\u5173\u95ED\u3001\u5207\u6362\uFF09\n * 3. \u7BA1\u7406\u8F93\u5165\u6846\u72B6\u6001\n * 4. \u5904\u7406 SSE \u6D41\u5F0F\u6D88\u606F\u4E8B\u4EF6\n * 5. \u7D2F\u79EF\u6D41\u5F0F\u6587\u672C\u5185\u5BB9\n *\n * @param options Hook \u914D\u7F6E\u9009\u9879\n * @returns \u72B6\u6001\u7BA1\u7406\u5DE5\u5177\u5BF9\u8C61\n */\nexport function useChatState(options: UseChatStateOptions = {}): UseChatStateReturn {\n const { welcomeMessage, site, onOpen, onClose, onMessageSend, onError, onAddToCart, onCart } = options\n\n // \u4F1A\u8BDD\u7BA1\u7406\n const { sessionId, saveSession, clearSession } = useSession()\n\n // \u7528\u6237 ID (\u521D\u59CB\u5316\u65F6\u5F02\u6B65\u751F\u6210)\n const [userId, setUserId] = useState<string>('')\n\n // \u521D\u59CB\u5316 userId\n useEffect(() => {\n getUserId().then(id => setUserId(id))\n }, [])\n\n // \u6D88\u606F\u5217\u8868\n const [messages, setMessagesState] = useState<Message[]>(() => {\n // \u5982\u679C\u6709\u6B22\u8FCE\u6D88\u606F\uFF0C\u521D\u59CB\u5316\u65F6\u6DFB\u52A0\n if (welcomeMessage) {\n return [\n {\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: [{ type: 'text', text: welcomeMessage }],\n timestamp: Date.now(),\n },\n ]\n }\n return []\n })\n\n // \u804A\u5929\u7A97\u53E3\u662F\u5426\u6253\u5F00\n const [isOpen, setIsOpen] = useState(false)\n\n // \u8F93\u5165\u6846\u5185\u5BB9\n const [inputValue, setInputValue] = useState('')\n\n // \u662F\u5426\u6B63\u5728\u63A5\u6536\u6D41\u5F0F\u6D88\u606F\n const [isStreaming, setIsStreaming] = useState(false)\n\n // \u5F53\u524D\u6B63\u5728\u7D2F\u79EF\u7684\u6D41\u5F0F\u6D88\u606F (\u4E34\u65F6\u5B58\u50A8)\n const currentMessageRef = useRef<Message | null>(null)\n\n /**\n * \u6253\u5F00\u804A\u5929\u7A97\u53E3\n */\n const openChat = useCallback(() => {\n setIsOpen(true)\n onOpen?.()\n }, [onOpen])\n\n /**\n * \u5173\u95ED\u804A\u5929\u7A97\u53E3\n */\n const closeChat = useCallback(() => {\n setIsOpen(false)\n onClose?.()\n }, [onClose])\n\n /**\n * \u5207\u6362\u804A\u5929\u7A97\u53E3\u72B6\u6001\n */\n const toggleChat = useCallback(() => {\n setIsOpen(prev => {\n const newState = !prev\n if (newState) {\n onOpen?.()\n } else {\n onClose?.()\n }\n return newState\n })\n }, [onOpen, onClose])\n\n /**\n * \u6DFB\u52A0\u6D88\u606F\u5230\u5217\u8868\n */\n const addMessage = useCallback((message: Message) => {\n setMessagesState(prev => [...prev, message])\n }, [])\n\n /**\n * \u6279\u91CF\u8BBE\u7F6E\u6D88\u606F\u5217\u8868\uFF08\u7528\u4E8E\u52A0\u8F7D\u5386\u53F2\uFF09\n */\n const setMessages = useCallback((newMessages: Message[]) => {\n setMessagesState(newMessages)\n }, [])\n\n /**\n * \u6E05\u7A7A\u6D88\u606F\u5217\u8868\n */\n const clearMessages = useCallback(() => {\n setMessagesState([])\n }, [])\n\n /**\n * \u5904\u7406 SSE \u4E8B\u4EF6\n * \u6839\u636E\u4E8B\u4EF6\u7C7B\u578B\u8FDB\u884C\u4E0D\u540C\u7684\u5904\u7406\n */\n const handleSSEEvent = useCallback(\n (event: SSEEvent) => {\n const { event: eventType, data } = event\n\n switch (eventType) {\n case 'message_start': {\n // \u5F00\u59CB\u63A5\u6536\u65B0\u6D88\u606F\uFF0C\u663E\u793A\u601D\u8003\u6C14\u6CE1\n setIsStreaming(true)\n\n // T039: \u4FDD\u5B58 sessionId\uFF08\u5982\u679C\u540E\u7AEF\u8FD4\u56DE\uFF09\n const messageStartData = data as MessageStartData\n if (messageStartData.sessionId && messageStartData.sessionId !== sessionId) {\n saveSession(messageStartData.sessionId)\n }\n\n const messageId = `msg-${Date.now()}`\n currentMessageRef.current = {\n id: messageId,\n role: 'assistant',\n content: [{ type: 'thinking', data: { status: 'thinking' } }], // \u6DFB\u52A0\u601D\u8003\u72B6\u6001\n timestamp: Date.now(),\n }\n\n // \u7ACB\u5373\u6DFB\u52A0\u5230\u6D88\u606F\u5217\u8868\u4EE5\u663E\u793A\u601D\u8003\u52A8\u753B\n setMessagesState(prev => [...prev, currentMessageRef.current!])\n break\n }\n\n case 'content_delta': {\n // \u7D2F\u79EF\u6D41\u5F0F\u6587\u672C\u5185\u5BB9\n // \u5B9E\u9645 API \u8FD4\u56DE\u7684\u662F {index: 0, delta: \"\u6587\u672C\"} \u800C\u4E0D\u662F {text: \"\u6587\u672C\"}\n const deltaData = data as any\n const deltaText = deltaData.delta || deltaData.text || ''\n\n if (currentMessageRef.current && deltaText) {\n // \u79FB\u9664\u601D\u8003\u6C14\u6CE1\uFF08\u5982\u679C\u5B58\u5728\uFF09\n const hasThinking = currentMessageRef.current.content.some(c => c.type === 'thinking')\n if (hasThinking) {\n currentMessageRef.current.content = currentMessageRef.current.content.filter(c => c.type !== 'thinking')\n }\n\n const lastContent = currentMessageRef.current.content[currentMessageRef.current.content.length - 1] as\n | MessageContent\n | undefined\n\n if (lastContent && lastContent.type === 'text') {\n // \u8FFD\u52A0\u5230\u73B0\u6709\u6587\u672C\u5757\n lastContent.text += deltaText\n } else {\n // \u521B\u5EFA\u65B0\u6587\u672C\u5757\n currentMessageRef.current.content.push({\n type: 'text',\n text: deltaText,\n })\n }\n\n // \u66F4\u65B0\u6D88\u606F\u5217\u8868\u4EE5\u89E6\u53D1\u6E32\u67D3\n setMessagesState(prev => {\n const updated = [...prev]\n const existingIndex = updated.findIndex(m => m.id === currentMessageRef.current!.id)\n\n if (existingIndex >= 0) {\n updated[existingIndex] = { ...currentMessageRef.current! }\n } else {\n updated.push({ ...currentMessageRef.current! })\n }\n\n return updated\n })\n }\n break\n }\n\n case 'content_block': {\n // \u63A5\u6536\u7ED3\u6784\u5316\u5185\u5BB9\u5757\uFF08\u5546\u54C1\u3001\u653F\u7B56\u7B49\uFF09\n // API \u8FD4\u56DE\u683C\u5F0F\u53D8\u66F4:\n // \u65B0\u683C\u5F0F: {index: number, type: string, data: {...}} <- type \u5728\u5916\u5C42\n // \u65E7\u683C\u5F0F: {index: number, data: {type: string, ...}} <- type \u5728 data \u5185\n const blockData = data as any\n if (currentMessageRef.current) {\n // \u83B7\u53D6 type \u548C data\n // \u4F18\u5148\u4ECE\u5916\u5C42\u83B7\u53D6 type\uFF0C\u517C\u5BB9\u65E7\u683C\u5F0F\u4ECE data \u5185\u83B7\u53D6\n const contentType = blockData.type || blockData.data?.type\n const contentData = blockData.data\n\n if (!contentType || !contentData) {\n console.warn('[useChatState] Invalid content_block:', blockData)\n break\n }\n\n // ============================================================\n // \u8F6C\u6362\u6570\u636E\u7ED3\u6784\u4EE5\u5339\u914D\u7C7B\u578B\u5B9A\u4E49\n // \u6839\u636E\u540E\u7AEF\u6570\u636E\u7ED3\u6784\u89C4\u8303\uFF08\u98DE\u4E66\u6587\u6863\uFF09\u8FDB\u884C\u8F6C\u6362\n // ============================================================\n let messageContent: MessageContent\n\n // ========== 1. \u4EA7\u54C1\u5217\u8868\u5361\u7247 (Product List) ==========\n // \u540E\u7AEF\u683C\u5F0F: {type: \"product_list\", data: [product1, product2, ...]}\n // data \u76F4\u63A5\u662F\u4EA7\u54C1\u6570\u7EC4\uFF0C\u4E0D\u662F {products: [...]}\n if (contentType === 'product_list' && Array.isArray(contentData)) {\n // \u4F7F\u7528\u7EDF\u4E00\u7684\u4EA7\u54C1\u8F6C\u6362\u5DE5\u5177\u51FD\u6570\n const transformedProducts = transformProducts(contentData, site)\n\n messageContent = {\n type: 'product_list',\n data: {\n products: transformedProducts,\n title: undefined, // \u540E\u7AEF\u65B0\u89C4\u8303\u4E0D\u8FD4\u56DE title\n onAddToCart: onAddToCart, // \u6CE8\u5165\u8D2D\u7269\u8F66\u56DE\u8C03\n },\n } as MessageContent\n }\n // ========== 2. \u4EA7\u54C1\u5BF9\u6BD4\u5361\u7247 (Product Comparison) ==========\n // \u540E\u7AEF\u683C\u5F0F: {type: \"product_comparison\", data: {products: [...], dimensions: {...}}}\n else if (contentType === 'product_comparison' && contentData.products) {\n // \u4F7F\u7528\u7EDF\u4E00\u7684\u4EA7\u54C1\u8F6C\u6362\u5DE5\u5177\u51FD\u6570\n const transformedProducts = transformProducts(contentData.products, site)\n\n messageContent = {\n type: 'product_comparison',\n data: {\n products: transformedProducts,\n dimensions: contentData.dimensions || {},\n },\n } as MessageContent\n }\n // ========== 3. FAQ \u5217\u8868\u5361\u7247 (FAQ List) ==========\n // \u540E\u7AEF\u683C\u5F0F: {type: \"faq_list\", data: {found, count, total, results: [...]}}\n else if (contentType === 'faq_list' && contentData.found !== undefined) {\n messageContent = {\n type: 'faq_list',\n data: contentData, // \u76F4\u63A5\u4F7F\u7528\uFF0C\u7ED3\u6784\u5DF2\u5339\u914D\n } as MessageContent\n }\n // ========== 4. \u5FEB\u6377\u56DE\u590D (Quick Replies) ==========\n else if (contentType === 'quick_replies' && contentData.replies) {\n messageContent = {\n type: 'quick_replies',\n data: {\n replies: contentData.replies,\n },\n } as MessageContent\n }\n // ========== 5. \u653F\u7B56\u5185\u5BB9 (Policy) ==========\n else if (contentType === 'policy' && contentData.title && contentData.content) {\n messageContent = {\n type: 'policy',\n data: {\n title: contentData.title,\n content: contentData.content,\n },\n } as MessageContent\n }\n // ========== 6. \u4FC3\u9500\u6D3B\u52A8\u5217\u8868 (Promotion List) ==========\n // \u540E\u7AEF\u683C\u5F0F: {type: \"promotion_list\", data: {found, count, total, results: [...]}}\n else if (contentType === 'promotion_list' && contentData.found !== undefined) {\n messageContent = {\n type: 'promotion_list',\n data: contentData, // \u76F4\u63A5\u4F7F\u7528\uFF0C\u7ED3\u6784\u5DF2\u5339\u914D\n } as MessageContent\n }\n // ========== 7. \u8D2D\u7269\u8F66 (Cart) ==========\n // \u540E\u7AEF\u683C\u5F0F: {type: \"cart\", data: {id, lines: {edges: [...]}, cost, ...}} (Shopify GraphQL)\n // \u9700\u8981\u8F6C\u6362\u4E3A\u524D\u7AEF\u683C\u5F0F: {cartId, lines: [...], cost, ...}\n else if (contentType === 'cart' && contentData.id !== undefined) {\n // \u8F6C\u6362\u540E\u7AEF Shopify GraphQL \u683C\u5F0F\u4E3A\u524D\u7AEF\u6807\u51C6\u683C\u5F0F\n const transformedData = transformCartData(contentData as BackendCartData)\n messageContent = {\n type: 'cart',\n data: {\n ...transformedData,\n onCart: onCart, // \u6CE8\u5165\u8D2D\u7269\u8F66\u6309\u94AE\u56DE\u8C03\n },\n } as MessageContent\n }\n // ========== 8. \u5176\u4ED6\u7C7B\u578B\uFF08\u901A\u7528\u5904\u7406\uFF09 ==========\n else {\n messageContent = {\n type: contentType,\n data: contentData,\n } as MessageContent\n }\n\n currentMessageRef.current.content.push(messageContent)\n\n setMessagesState(prev => {\n const updated = [...prev]\n const existingIndex = updated.findIndex(m => m.id === currentMessageRef.current!.id)\n\n if (existingIndex >= 0) {\n updated[existingIndex] = { ...currentMessageRef.current! }\n } else {\n updated.push({ ...currentMessageRef.current! })\n }\n\n return updated\n })\n }\n break\n }\n\n case 'tool_start':\n case 'tool_end': {\n // \u5DE5\u5177\u8C03\u7528\u4E8B\u4EF6\uFF0C\u6682\u65F6\u5FFD\u7565\n // \u53EF\u4EE5\u5728\u672A\u6765\u7528\u4E8E\u663E\u793A\u5DE5\u5177\u8C03\u7528\u72B6\u6001\n break\n }\n\n case 'message_end': {\n // \u6D88\u606F\u63A5\u6536\u5B8C\u6210\n setIsStreaming(false)\n currentMessageRef.current = null\n break\n }\n\n case 'status': {\n // T040: \u72B6\u6001\u66F4\u65B0\uFF08\u5982\u4F1A\u8BDD\u8FC7\u671F\uFF09\n const statusData = data as StatusData\n if (statusData.type === 'session_expired') {\n // \u4F1A\u8BDD\u8FC7\u671F\uFF0C\u6E05\u7A7A\u6D88\u606F\u5217\u8868\u548C\u4F1A\u8BDD\n clearMessages()\n clearSession()\n if (welcomeMessage) {\n addMessage({\n id: `welcome-${Date.now()}`,\n role: 'assistant',\n content: [{ type: 'text', text: welcomeMessage }],\n timestamp: Date.now(),\n })\n }\n }\n break\n }\n\n case 'error': {\n // \u9519\u8BEF\u5904\u7406\n const errorData = data as ErrorData\n setIsStreaming(false)\n currentMessageRef.current = null\n\n // \u6DFB\u52A0\u9519\u8BEF\u6D88\u606F\u5230\u754C\u9762\n addMessage({\n id: `error-${Date.now()}`,\n role: 'system',\n content: [\n {\n type: 'error',\n data: {\n message: errorData.message,\n code: errorData.code,\n },\n },\n ],\n timestamp: Date.now(),\n })\n\n onError?.(new Error(errorData.message))\n break\n }\n\n case 'done': {\n // \u6D41\u7ED3\u675F\n setIsStreaming(false)\n currentMessageRef.current = null\n break\n }\n\n default:\n // \u5176\u4ED6\u4E8B\u4EF6\u7C7B\u578B\uFF08tool_start, tool_end \u7B49\uFF09\n break\n }\n },\n [welcomeMessage, site, addMessage, clearMessages, clearSession, saveSession, sessionId, onError, onAddToCart, onCart]\n )\n\n return {\n messages,\n isOpen,\n userId,\n sessionId,\n inputValue,\n isStreaming,\n openChat,\n closeChat,\n toggleChat,\n setInputValue,\n addMessage,\n setMessages,\n clearMessages,\n handleSSEEvent,\n saveSession,\n clearSession,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useChatState_exports", "__export", "useChatState", "__toCommonJS", "import_react", "import_userId", "import_useSession", "import_productTransformers", "import_cartTransformers", "options", "welcomeMessage", "site", "onOpen", "onClose", "onMessageSend", "onError", "onAddToCart", "onCart", "sessionId", "saveSession", "clearSession", "userId", "setUserId", "id", "messages", "setMessagesState", "isOpen", "setIsOpen", "inputValue", "setInputValue", "isStreaming", "setIsStreaming", "currentMessageRef", "openChat", "closeChat", "toggleChat", "prev", "newState", "addMessage", "message", "setMessages", "newMessages", "clearMessages", "handleSSEEvent", "event", "eventType", "data", "messageStartData", "messageId", "deltaData", "deltaText", "lastContent", "updated", "existingIndex", "m", "blockData", "contentType", "contentData", "messageContent", "errorData"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话管理 Hook
|
|
3
|
+
* 负责 sessionId 的持久化和生命周期管理
|
|
4
|
+
* 基于 specs/livechat-widget/plan.md 的会话管理策略
|
|
5
|
+
*/
|
|
6
|
+
export interface UseSessionReturn {
|
|
7
|
+
/**
|
|
8
|
+
* 当前会话 ID
|
|
9
|
+
*/
|
|
10
|
+
sessionId: string | null;
|
|
11
|
+
/**
|
|
12
|
+
* 保存会话 ID 到 localStorage 和状态
|
|
13
|
+
* @param id 会话 ID (UUID 格式)
|
|
14
|
+
*/
|
|
15
|
+
saveSession: (id: string) => void;
|
|
16
|
+
/**
|
|
17
|
+
* 清空会话 ID (会话过期或新会话)
|
|
18
|
+
*/
|
|
19
|
+
clearSession: () => void;
|
|
20
|
+
/**
|
|
21
|
+
* 检查是否有活动会话
|
|
22
|
+
*/
|
|
23
|
+
hasSession: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 会话管理 Hook
|
|
27
|
+
*
|
|
28
|
+
* 会话管理策略:
|
|
29
|
+
* 1. 首次对话: 不传 session_id,后端从 message_start 事件返回
|
|
30
|
+
* 2. 存储位置: localStorage.livechat_session_id
|
|
31
|
+
* 3. 会话恢复: 打开聊天窗口时自动加载历史消息
|
|
32
|
+
* 4. 会话过期: 监听 status 事件 (type: "session_expired"),清空消息列表和 sessionId
|
|
33
|
+
* 5. 新会话按钮: 调用 POST /api/chat/new-session,更新 sessionId
|
|
34
|
+
*
|
|
35
|
+
* @returns 会话管理工具对象
|
|
36
|
+
*/
|
|
37
|
+
export declare function useSession(): UseSessionReturn;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var d=(s,o)=>{for(var r in o)l(s,r,{get:o[r],enumerable:!0})},f=(s,o,r,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!S.call(s,e)&&e!==r&&l(s,e,{get:()=>o[e],enumerable:!(t=u(o,e))||t.enumerable});return s};var g=s=>f(l({},"__esModule",{value:!0}),s);var v={};d(v,{useSession:()=>w});module.exports=g(v);var n=require("react");const a="livechat_session_id";function w(){const[s,o]=(0,n.useState)(()=>{if(typeof window>"u")return null;try{return localStorage.getItem(a)}catch(e){return console.error("[useSession] Failed to read from localStorage:",e),null}}),r=(0,n.useCallback)(e=>{if(!e||typeof e!="string"){console.warn("[useSession] Invalid session ID:",e);return}if(o(e),typeof window<"u")try{localStorage.setItem(a,e)}catch(i){console.error("[useSession] Failed to save to localStorage:",i)}},[]),t=(0,n.useCallback)(()=>{if(o(null),typeof window<"u")try{localStorage.removeItem(a)}catch(e){console.error("[useSession] Failed to remove from localStorage:",e)}},[]);return(0,n.useEffect)(()=>{if(typeof window>"u")return;const e=i=>{i.key===a&&o(i.newValue)};return window.addEventListener("storage",e),()=>{window.removeEventListener("storage",e)}},[]),{sessionId:s,saveSession:r,clearSession:t,hasSession:s!==null}}
|
|
2
|
+
//# sourceMappingURL=useSession.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/components/LiveChatWidget/hooks/useSession.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \u4F1A\u8BDD\u7BA1\u7406 Hook\n * \u8D1F\u8D23 sessionId \u7684\u6301\u4E45\u5316\u548C\u751F\u547D\u5468\u671F\u7BA1\u7406\n * \u57FA\u4E8E specs/livechat-widget/plan.md \u7684\u4F1A\u8BDD\u7BA1\u7406\u7B56\u7565\n */\n\nimport { useState, useCallback, useEffect } from 'react'\n\nconst SESSION_KEY = 'livechat_session_id'\n\nexport interface UseSessionReturn {\n /**\n * \u5F53\u524D\u4F1A\u8BDD ID\n */\n sessionId: string | null\n\n /**\n * \u4FDD\u5B58\u4F1A\u8BDD ID \u5230 localStorage \u548C\u72B6\u6001\n * @param id \u4F1A\u8BDD ID (UUID \u683C\u5F0F)\n */\n saveSession: (id: string) => void\n\n /**\n * \u6E05\u7A7A\u4F1A\u8BDD ID (\u4F1A\u8BDD\u8FC7\u671F\u6216\u65B0\u4F1A\u8BDD)\n */\n clearSession: () => void\n\n /**\n * \u68C0\u67E5\u662F\u5426\u6709\u6D3B\u52A8\u4F1A\u8BDD\n */\n hasSession: boolean\n}\n\n/**\n * \u4F1A\u8BDD\u7BA1\u7406 Hook\n *\n * \u4F1A\u8BDD\u7BA1\u7406\u7B56\u7565\uFF1A\n * 1. \u9996\u6B21\u5BF9\u8BDD: \u4E0D\u4F20 session_id,\u540E\u7AEF\u4ECE message_start \u4E8B\u4EF6\u8FD4\u56DE\n * 2. \u5B58\u50A8\u4F4D\u7F6E: localStorage.livechat_session_id\n * 3. \u4F1A\u8BDD\u6062\u590D: \u6253\u5F00\u804A\u5929\u7A97\u53E3\u65F6\u81EA\u52A8\u52A0\u8F7D\u5386\u53F2\u6D88\u606F\n * 4. \u4F1A\u8BDD\u8FC7\u671F: \u76D1\u542C status \u4E8B\u4EF6 (type: \"session_expired\"),\u6E05\u7A7A\u6D88\u606F\u5217\u8868\u548C sessionId\n * 5. \u65B0\u4F1A\u8BDD\u6309\u94AE: \u8C03\u7528 POST /api/chat/new-session,\u66F4\u65B0 sessionId\n *\n * @returns \u4F1A\u8BDD\u7BA1\u7406\u5DE5\u5177\u5BF9\u8C61\n */\nexport function useSession(): UseSessionReturn {\n // \u4ECE localStorage \u521D\u59CB\u5316\u4F1A\u8BDD ID\n const [sessionId, setSessionId] = useState<string | null>(() => {\n if (typeof window === 'undefined') return null\n\n try {\n return localStorage.getItem(SESSION_KEY)\n } catch (error) {\n console.error('[useSession] Failed to read from localStorage:', error)\n return null\n }\n })\n\n /**\n * \u4FDD\u5B58\u4F1A\u8BDD ID\n * \u540C\u65F6\u66F4\u65B0\u72B6\u6001\u548C localStorage\n */\n const saveSession = useCallback((id: string) => {\n if (!id || typeof id !== 'string') {\n console.warn('[useSession] Invalid session ID:', id)\n return\n }\n\n setSessionId(id)\n\n if (typeof window !== 'undefined') {\n try {\n localStorage.setItem(SESSION_KEY, id)\n } catch (error) {\n console.error('[useSession] Failed to save to localStorage:', error)\n }\n }\n }, [])\n\n /**\n * \u6E05\u7A7A\u4F1A\u8BDD ID\n * \u7528\u4E8E\u4F1A\u8BDD\u8FC7\u671F\u6216\u5F00\u59CB\u65B0\u4F1A\u8BDD\n */\n const clearSession = useCallback(() => {\n setSessionId(null)\n\n if (typeof window !== 'undefined') {\n try {\n localStorage.removeItem(SESSION_KEY)\n } catch (error) {\n console.error('[useSession] Failed to remove from localStorage:', error)\n }\n }\n }, [])\n\n /**\n * \u76D1\u542C localStorage \u53D8\u5316\uFF08\u8DE8\u6807\u7B7E\u9875\u540C\u6B65\uFF09\n * \u6CE8\u610F\uFF1A\u6839\u636E\u8BA1\u5212\u6587\u6863\uFF0C\u591A\u6807\u7B7E\u9875\u4E0D\u652F\u6301\u5B9E\u65F6\u540C\u6B65\n * \u8FD9\u91CC\u4EC5\u76D1\u542C\u662F\u4E3A\u4E86\u9632\u6B62\u540C\u4E00\u6D4F\u89C8\u5668\u591A\u6807\u7B7E\u9875\u5BFC\u81F4\u7684\u72B6\u6001\u4E0D\u4E00\u81F4\n */\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === SESSION_KEY) {\n setSessionId(event.newValue)\n }\n }\n\n window.addEventListener('storage', handleStorageChange)\n\n return () => {\n window.removeEventListener('storage', handleStorageChange)\n }\n }, [])\n\n return {\n sessionId,\n saveSession,\n clearSession,\n hasSession: sessionId !== null,\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EAAiD,iBAEjD,MAAMC,EAAc,sBAqCb,SAASH,GAA+B,CAE7C,KAAM,CAACI,EAAWC,CAAY,KAAI,YAAwB,IAAM,CAC9D,GAAI,OAAO,OAAW,IAAa,OAAO,KAE1C,GAAI,CACF,OAAO,aAAa,QAAQF,CAAW,CACzC,OAASG,EAAO,CACd,eAAQ,MAAM,iDAAkDA,CAAK,EAC9D,IACT,CACF,CAAC,EAMKC,KAAc,eAAaC,GAAe,CAC9C,GAAI,CAACA,GAAM,OAAOA,GAAO,SAAU,CACjC,QAAQ,KAAK,mCAAoCA,CAAE,EACnD,MACF,CAIA,GAFAH,EAAaG,CAAE,EAEX,OAAO,OAAW,IACpB,GAAI,CACF,aAAa,QAAQL,EAAaK,CAAE,CACtC,OAASF,EAAO,CACd,QAAQ,MAAM,+CAAgDA,CAAK,CACrE,CAEJ,EAAG,CAAC,CAAC,EAMCG,KAAe,eAAY,IAAM,CAGrC,GAFAJ,EAAa,IAAI,EAEb,OAAO,OAAW,IACpB,GAAI,CACF,aAAa,WAAWF,CAAW,CACrC,OAASG,EAAO,CACd,QAAQ,MAAM,mDAAoDA,CAAK,CACzE,CAEJ,EAAG,CAAC,CAAC,EAOL,sBAAU,IAAM,CACd,GAAI,OAAO,OAAW,IAAa,OAEnC,MAAMI,EAAuBC,GAAwB,CAC/CA,EAAM,MAAQR,GAChBE,EAAaM,EAAM,QAAQ,CAE/B,EAEA,cAAO,iBAAiB,UAAWD,CAAmB,EAE/C,IAAM,CACX,OAAO,oBAAoB,UAAWA,CAAmB,CAC3D,CACF,EAAG,CAAC,CAAC,EAEE,CACL,UAAAN,EACA,YAAAG,EACA,aAAAE,EACA,WAAYL,IAAc,IAC5B,CACF",
|
|
6
|
+
"names": ["useSession_exports", "__export", "useSession", "__toCommonJS", "import_react", "SESSION_KEY", "sessionId", "setSessionId", "error", "saveSession", "id", "clearSession", "handleStorageChange", "event"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LiveChatWidget 组件入口
|
|
3
|
+
*/
|
|
4
|
+
export { LiveChatWidget } from './LiveChatWidget';
|
|
5
|
+
export type { LiveChatWidgetProps, Message, MessageContent, MessageRole, MessageContentType, MessageMetadata, Product, QuickReply, Session, BubblePosition, MessageRenderer, ProductCardContent, ProductListContent, PolicyContent, QuickRepliesContent, ThinkingContent, ErrorContent, FAQListContent, FAQItem, FAQCategory, PromotionListContent, PromotionItem, CartContent, CartData, CartLine, CartCost, CartAmount, CartDiscountCode, SSEEvent, ChatStreamRequest, } from './types';
|
|
6
|
+
export { useChatState } from './hooks/useChatState';
|
|
7
|
+
export { useChatAPI } from './hooks/useChatAPI';
|
|
8
|
+
export { useSession } from './hooks/useSession';
|
|
9
|
+
export { MessageRendererRegistry } from './utils/messageRenderers';
|
|
10
|
+
export { getUserId } from './utils/userId';
|
|
11
|
+
export { sanitizeInput, isValidUrl, isValidUUID, isValidMessageContent, escapeHtml } from './utils/validation';
|
|
12
|
+
export { TextBlock, ProductCard, ProductList, PolicyBlock, QuickReplies, ThinkingBlock, ErrorBlock, FAQList, PromotionList, CartCard, createQuickRepliesRenderer, } from './components/MessageContent/index.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var k=(r,o)=>{for(var n in o)i(r,n,{get:o[n],enumerable:!0})},x=(r,o,n,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of g(o))!P.call(r,s)&&s!==n&&i(r,s,{get:()=>o[s],enumerable:!(a=u(o,s))||a.enumerable});return r};var R=r=>x(i({},"__esModule",{value:!0}),r);var f={};k(f,{CartCard:()=>e.CartCard,ErrorBlock:()=>e.ErrorBlock,FAQList:()=>e.FAQList,LiveChatWidget:()=>C.LiveChatWidget,MessageRendererRegistry:()=>l.MessageRendererRegistry,PolicyBlock:()=>e.PolicyBlock,ProductCard:()=>e.ProductCard,ProductList:()=>e.ProductList,PromotionList:()=>e.PromotionList,QuickReplies:()=>e.QuickReplies,TextBlock:()=>e.TextBlock,ThinkingBlock:()=>e.ThinkingBlock,createQuickRepliesRenderer:()=>e.createQuickRepliesRenderer,escapeHtml:()=>t.escapeHtml,getUserId:()=>m.getUserId,isValidMessageContent:()=>t.isValidMessageContent,isValidUUID:()=>t.isValidUUID,isValidUrl:()=>t.isValidUrl,sanitizeInput:()=>t.sanitizeInput,useChatAPI:()=>p.useChatAPI,useChatState:()=>d.useChatState,useSession:()=>c.useSession});module.exports=R(f);var C=require("./LiveChatWidget"),d=require("./hooks/useChatState"),p=require("./hooks/useChatAPI"),c=require("./hooks/useSession"),l=require("./utils/messageRenderers"),m=require("./utils/userId"),t=require("./utils/validation"),e=require("./components/MessageContent/index.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/LiveChatWidget/index.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * LiveChatWidget \u7EC4\u4EF6\u5165\u53E3\n */\n\nexport { LiveChatWidget } from './LiveChatWidget'\nexport type {\n LiveChatWidgetProps,\n Message,\n MessageContent,\n MessageRole,\n MessageContentType,\n MessageMetadata,\n Product,\n QuickReply,\n Session,\n BubblePosition,\n MessageRenderer,\n ProductCardContent,\n ProductListContent,\n PolicyContent,\n QuickRepliesContent,\n ThinkingContent,\n ErrorContent,\n FAQListContent,\n FAQItem,\n FAQCategory,\n PromotionListContent,\n PromotionItem,\n CartContent,\n CartData,\n CartLine,\n CartCost,\n CartAmount,\n CartDiscountCode,\n SSEEvent,\n ChatStreamRequest,\n} from './types'\n\n// \u5BFC\u51FA Hook (\u4F9B\u9AD8\u7EA7\u7528\u6237\u81EA\u5B9A\u4E49\u4F7F\u7528)\nexport { useChatState } from './hooks/useChatState'\nexport { useChatAPI } from './hooks/useChatAPI'\nexport { useSession } from './hooks/useSession'\n\n// \u5BFC\u51FA\u5DE5\u5177\u7C7B\nexport { MessageRendererRegistry } from './utils/messageRenderers'\nexport { getUserId } from './utils/userId'\nexport { sanitizeInput, isValidUrl, isValidUUID, isValidMessageContent, escapeHtml } from './utils/validation'\n\n// \u5BFC\u51FA\u6D88\u606F\u6E32\u67D3\u5668\uFF08\u4F9B\u81EA\u5B9A\u4E49\u4F7F\u7528\uFF09\nexport {\n TextBlock,\n ProductCard,\n ProductList,\n PolicyBlock,\n QuickReplies,\n ThinkingBlock,\n ErrorBlock,\n FAQList,\n PromotionList,\n CartCard,\n createQuickRepliesRenderer,\n} from './components/MessageContent/index.js'\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,suBAAAE,EAAAF,GAIA,IAAAG,EAA+B,4BAmC/BC,EAA6B,gCAC7BC,EAA2B,8BAC3BC,EAA2B,8BAG3BC,EAAwC,oCACxCC,EAA0B,0BAC1BC,EAA0F,8BAG1FC,EAYO",
|
|
6
|
+
"names": ["LiveChatWidget_exports", "__export", "__toCommonJS", "import_LiveChatWidget", "import_useChatState", "import_useChatAPI", "import_useSession", "import_messageRenderers", "import_userId", "import_validation", "import_MessageContent"]
|
|
7
|
+
}
|