k2-im 0.1.58 → 0.2.0
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/README.md +3 -1
- package/dist/browser.js +1 -1
- package/dist/chat-kit-pinia.d.ts +225 -170
- package/dist/chat-kit-pinia.js +1 -1
- package/dist/chat-kit-vue.d.ts +64 -44
- package/dist/chat-kit-vue.js +1 -1
- package/dist/chat-kit.d.ts +226 -171
- package/dist/chat-kit.js +1 -1
- package/dist/crypto.worker.js +17 -25
- package/dist/i18n.d.ts +61 -41
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +241 -186
- package/dist/index.js +1 -1
- package/dist/modules/api-protocol-client/src/bi-feedback.js +1 -0
- package/dist/modules/api-protocol-client/src/browser.js +1 -0
- package/dist/modules/api-protocol-client/src/client.js +1 -0
- package/dist/modules/api-protocol-client/src/config.js +1 -0
- package/dist/modules/api-protocol-client/src/constants.js +1 -0
- package/dist/modules/api-protocol-client/src/json.js +1 -0
- package/dist/modules/api-protocol-client/src/nonce.js +1 -0
- package/dist/modules/api-protocol-client/src/transports/axios.js +1 -0
- package/dist/modules/api-protocol-client/src/utils.js +1 -0
- package/dist/modules/crypto/browser.js +1 -0
- package/dist/modules/crypto/driver.js +1 -0
- package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -0
- package/dist/modules/im-browser/src/crypto/channel-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/collect-tea.js +1 -0
- package/dist/modules/im-browser/src/crypto/crypto-task-executor.js +1 -0
- package/dist/modules/im-browser/src/crypto/crypto-worker-factory.js +1 -0
- package/dist/modules/im-browser/src/crypto/crypto-worker-protocol.js +1 -0
- package/dist/modules/im-browser/src/crypto/encrypt-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/group-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/peer-public-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/rsa-private-key.js +1 -0
- package/dist/modules/im-browser/src/crypto/rsa-tea-crypto-adapter.js +1 -0
- package/dist/modules/im-browser/src/crypto/stale-key-refresh.js +1 -0
- package/dist/modules/im-browser/src/crypto/tea.js +1 -0
- package/dist/modules/im-browser/src/crypto/wait-for-key-signal.js +1 -0
- package/dist/modules/im-browser/src/http/application-http-adapters.js +1 -0
- package/dist/modules/im-browser/src/http/channel-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/channel-join-application-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/channel-member-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/channel-mention-member-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/directory-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/expression-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/lazy-api-protocol-client.js +1 -0
- package/dist/modules/im-browser/src/http/profile-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/requests/applications.js +1 -0
- package/dist/modules/im-browser/src/http/requests/bind-robot-conversation.js +1 -0
- package/dist/modules/im-browser/src/http/requests/board-pinned-message-validation.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-join-applications.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-management.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-members.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-mention-members.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-message-context.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-mini-program-rel.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-profile.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-read-index.js +1 -0
- package/dist/modules/im-browser/src/http/requests/contact-blocklist.js +1 -0
- package/dist/modules/im-browser/src/http/requests/contact-friendship.js +1 -0
- package/dist/modules/im-browser/src/http/requests/contact-report.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -0
- package/dist/modules/im-browser/src/http/requests/create-channel.js +1 -0
- package/dist/modules/im-browser/src/http/requests/create-face-to-face-group.js +1 -0
- package/dist/modules/im-browser/src/http/requests/create-group.js +1 -0
- package/dist/modules/im-browser/src/http/requests/customer-service-profile.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-board-pinned-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-channel-board-pinned-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-channel-secret-key.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-group-encrypt-info.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-group-info.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-group-member-list.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-user-encrypt-info.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-user-info-friend.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-user-info-other.js +1 -0
- package/dist/modules/im-browser/src/http/requests/group-management.js +1 -0
- package/dist/modules/im-browser/src/http/requests/mark-group-read-all.js +1 -0
- package/dist/modules/im-browser/src/http/requests/membership-join.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pin-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pin-channel-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-messages-by-id.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-chat.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-group.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-signal.js +1 -0
- package/dist/modules/im-browser/src/http/requests/robot-menu-reply.js +1 -0
- package/dist/modules/im-browser/src/http/requests/robot-profile.js +1 -0
- package/dist/modules/im-browser/src/http/requests/search-robots.js +1 -0
- package/dist/modules/im-browser/src/http/requests/set-conversation-undisturb.js +1 -0
- package/dist/modules/im-browser/src/http/requests/set-friend-remark.js +1 -0
- package/dist/modules/im-browser/src/http/requests/set-group-nickname.js +1 -0
- package/dist/modules/im-browser/src/http/requests/unpin-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/unpin-channel-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/update-group-info.js +1 -0
- package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/media/file-md5.js +1 -0
- package/dist/modules/im-browser/src/media/image-clipboard.js +1 -0
- package/dist/modules/im-browser/src/media/image-header-dimensions.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -0
- package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -0
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -0
- package/dist/modules/im-browser/src/media/media-request-limiter.js +1 -0
- package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -0
- package/dist/modules/im-browser/src/media/media-transfer-errors.js +1 -0
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-credentials.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-recovery-codec.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-recovery-store.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-source-fingerprint.js +1 -0
- package/dist/modules/im-browser/src/media/s3-multipart-uploader.js +1 -0
- package/dist/modules/im-browser/src/media/xhr-upload-idle-timeout.js +1 -0
- package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -0
- package/dist/modules/im-browser/src/network/network-monitor.js +1 -0
- package/dist/modules/im-browser/src/scheduling/yield-to-browser.js +1 -0
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -0
- package/dist/modules/im-browser/src/transport/ws-transport.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-amplitude.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-capabilities.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-codec.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-errors.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-playback.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-player.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-recorder.js +1 -0
- package/dist/modules/im-chat-kit/src/i18n/use-im-text.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/applications.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/capabilities.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/context.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/conversation-activation.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/conversation-deletion.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/conversation-list.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/history-return-after-send.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/media-transfer-estimate.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/media.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/message-operations.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/profile-directory.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/quoted-message.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/reaction.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/search-senders.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/search.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/session-favorites.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/session.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/thread-paging.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/thread-return-to-latest.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/thread.store.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-open.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-rels.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/conversation-list.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/conversation-unread.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/delayed-loading-indicator.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/media-source-priority.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/message-notification.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/message-search.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/mini-program-game-preview.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/mini-program-open-url.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/conversation-prefetch-controller.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/runtime-operation.js +1 -0
- package/dist/modules/im-chat-kit/src/services/capabilities.js +1 -0
- package/dist/modules/im-chat-kit/src/services/channel-member-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/channel-profile-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/channel-send-restriction.js +1 -0
- package/dist/modules/im-chat-kit/src/services/direct-contact-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/forward.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/group-member-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/group-profile-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/image-copy.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/media-file-classification.js +1 -0
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/message.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/pinned-message-rules.js +1 -0
- package/dist/modules/im-chat-kit/src/services/pinned-message.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile-access.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile-directory.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile-display.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/read.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/robot-sender-profile.js +1 -0
- package/dist/modules/im-chat-kit/src/services/search.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/send.service.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/active-date.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/create-thread-items.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/message-locate-result.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/new-message-badge.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/resolve-message-body-kind.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/resolve-quoted-message-presentation.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/viewport-rules.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/emoji-legacy-catalog.json.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/index.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/recent.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode-emoji-catalog.json.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/highlight.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/link.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-batch.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-dimensions.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-format.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/time-display.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/waveform.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadBodySwitch.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadItems.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadSurface.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadViewport.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/message-renderer-registry.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-idle-task.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-layout-measurements.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-read-actions-context.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-surface-context.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-viewport-context.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/use-im-thread-layout-measurement.js +1 -0
- package/dist/modules/im-core/src/abort.js +1 -0
- package/dist/modules/im-core/src/cache-namespace.js +1 -0
- package/dist/modules/im-core/src/connection/backoff.js +1 -0
- package/dist/modules/im-core/src/connection/connection-manager.js +1 -0
- package/dist/modules/im-core/src/connection/heartbeat-manager.js +1 -0
- package/dist/modules/im-core/src/conversation-identity.js +1 -0
- package/dist/modules/im-core/src/diagnostics.js +1 -0
- package/dist/modules/im-core/src/event-emitter.js +1 -0
- package/dist/modules/im-core/src/login/login-handler.js +1 -0
- package/dist/modules/im-core/src/mapping/bot-sender.js +1 -0
- package/dist/modules/im-core/src/mapping/call-record-body.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-notify-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-pinned-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-read-position.js +1 -0
- package/dist/modules/im-core/src/mapping/contact-body.js +1 -0
- package/dist/modules/im-core/src/mapping/content-body.js +1 -0
- package/dist/modules/im-core/src/mapping/conversation.js +1 -0
- package/dist/modules/im-core/src/mapping/crypto-batch-preparation.js +1 -0
- package/dist/modules/im-core/src/mapping/customer-service-body.js +1 -0
- package/dist/modules/im-core/src/mapping/customer-service-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/decrypt-recovery.js +1 -0
- package/dist/modules/im-core/src/mapping/file-body.js +1 -0
- package/dist/modules/im-core/src/mapping/files-album-body.js +1 -0
- package/dist/modules/im-core/src/mapping/game-body.js +1 -0
- package/dist/modules/im-core/src/mapping/gift-body.js +1 -0
- package/dist/modules/im-core/src/mapping/group-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/group-notify-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/image-body.js +1 -0
- package/dist/modules/im-core/src/mapping/live-room-body.js +1 -0
- package/dist/modules/im-core/src/mapping/media-album-body.js +1 -0
- package/dist/modules/im-core/src/mapping/merge.js +1 -0
- package/dist/modules/im-core/src/mapping/mes-chat-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/message-id.js +1 -0
- package/dist/modules/im-core/src/mapping/message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/messages-by-id.js +1 -0
- package/dist/modules/im-core/src/mapping/mini-program-body.js +1 -0
- package/dist/modules/im-core/src/mapping/offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/pinned-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/profile-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/reaction-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/recall-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/red-packet-body.js +1 -0
- package/dist/modules/im-core/src/mapping/robot-body.js +1 -0
- package/dist/modules/im-core/src/mapping/robot-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/search-text.js +1 -0
- package/dist/modules/im-core/src/mapping/session-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/signal-offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/sort.js +1 -0
- package/dist/modules/im-core/src/mapping/sticker-body.js +1 -0
- package/dist/modules/im-core/src/mapping/stored-message.js +1 -0
- package/dist/modules/im-core/src/mapping/system-event-timeline-policy.js +1 -0
- package/dist/modules/im-core/src/mapping/text-segments.js +1 -0
- package/dist/modules/im-core/src/mapping/transfer-body.js +1 -0
- package/dist/modules/im-core/src/mapping/transfer-status.js +1 -0
- package/dist/modules/im-core/src/mapping/unread-divider.js +1 -0
- package/dist/modules/im-core/src/mapping/video-body.js +1 -0
- package/dist/modules/im-core/src/mapping/voice-body.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/direct-call-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/direct-call-record.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/direct-p2p-call.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/group-call-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/group-call-record.js +1 -0
- package/dist/modules/im-core/src/message-flow/conversation-support.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/expression/expression-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/forward/can-transmit.js +1 -0
- package/dist/modules/im-core/src/message-flow/forward/forward-content-spec.js +1 -0
- package/dist/modules/im-core/src/message-flow/forward/forward-messages.js +1 -0
- package/dist/modules/im-core/src/message-flow/game/game-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/gift/gift-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/live-room/live-room-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -0
- package/dist/modules/im-core/src/message-flow/mini-program/mini-program-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/reaction/can-react.js +1 -0
- package/dist/modules/im-core/src/message-flow/reaction/reaction-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/reaction/reaction-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/channel-read-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/channel-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/customer-service-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/direct-read-sync.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/group-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/robot-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/channel-message-deletion-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/channel-application-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/channel-notify-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/channel-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/command-handler-registry.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/contact-application-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/direct-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/friend-action-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/group-event-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/group-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/mes-chat-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/robot-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/session-favorite-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/wallet-notify-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/channel-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/channel-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/direct-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/direct-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/group-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/group-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/robot-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/robot-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/send-strategy-registry.js +1 -0
- package/dist/modules/im-core/src/message-flow/transfer/transfer-message.js +1 -0
- package/dist/modules/im-core/src/outbox/outbox-manager.js +1 -0
- package/dist/modules/im-core/src/packet-router.js +1 -0
- package/dist/modules/im-core/src/ports/crypto-port.js +1 -0
- package/dist/modules/im-core/src/ports/crypto-task-executor.js +1 -0
- package/dist/modules/im-core/src/ports/http-port.js +1 -0
- package/dist/modules/im-core/src/ports/media-asset-cache-port.js +1 -0
- package/dist/modules/im-core/src/push/push-registration.js +1 -0
- package/dist/modules/im-core/src/read/read-reporter.js +1 -0
- package/dist/modules/im-core/src/request-tracker.js +1 -0
- package/dist/modules/im-core/src/session-favorite-album.js +1 -0
- package/dist/modules/im-core/src/session-favorite-files.js +1 -0
- package/dist/modules/im-core/src/state/channel-permissions.js +1 -0
- package/dist/modules/im-core/src/state/channel-restriction-coordinator.js +1 -0
- package/dist/modules/im-core/src/state/domain-state.js +1 -0
- package/dist/modules/im-core/src/state/draft-store.js +1 -0
- package/dist/modules/im-core/src/state/group-restriction-coordinator.js +1 -0
- package/dist/modules/im-core/src/state/local-message-window-read-error.js +1 -0
- package/dist/modules/im-core/src/state/message-reactions.js +1 -0
- package/dist/modules/im-core/src/state/message-store.js +1 -0
- package/dist/modules/im-core/src/state/message-window-store.js +1 -0
- package/dist/modules/im-core/src/state/pinned-message-coordinator.js +1 -0
- package/dist/modules/im-core/src/state/pinned-message-store.js +1 -0
- package/dist/modules/im-core/src/state/read-store.js +1 -0
- package/dist/modules/im-core/src/state/session-sort.js +1 -0
- package/dist/modules/im-core/src/state/session-store.js +1 -0
- package/dist/modules/im-core/src/sync/channel-sync-checkpoint.js +1 -0
- package/dist/modules/im-core/src/sync/sync-manager.js +1 -0
- package/dist/modules/im-i18n/src/catalog/en-US.js +1 -0
- package/dist/modules/im-i18n/src/catalog/index.js +1 -0
- package/dist/modules/im-i18n/src/catalog/th-TH.js +1 -0
- package/dist/modules/im-i18n/src/catalog/vi-VN.js +1 -0
- package/dist/modules/im-i18n/src/catalog/zh-CN.js +1 -0
- package/dist/modules/im-i18n/src/catalog/zh-TW.js +1 -0
- package/dist/modules/im-i18n/src/create-im-i18n.js +1 -0
- package/dist/modules/im-i18n/src/format/failure.js +1 -0
- package/dist/modules/im-i18n/src/format/last-message.js +1 -0
- package/dist/modules/im-i18n/src/format/media.js +1 -0
- package/dist/modules/im-i18n/src/format/mention.js +1 -0
- package/dist/modules/im-i18n/src/format/service-text.js +1 -0
- package/dist/modules/im-i18n/src/format/system-message.js +1 -0
- package/dist/modules/im-i18n/src/internal/duration.js +1 -0
- package/dist/modules/im-i18n/src/internal/interpolate.js +1 -0
- package/dist/modules/im-i18n/src/locale.js +1 -0
- package/dist/modules/im-protocol/src/board-pinned-message.js +1 -0
- package/dist/modules/im-protocol/src/frame-codec.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/channel_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/group_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.app.msg_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.channel_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.group_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.login_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.msg_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.pub_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.robot_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.sig_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/msg_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/registry.js +1 -0
- package/dist/modules/im-sdk/src/cache-prefix-migration.js +1 -0
- package/dist/modules/im-sdk/src/create-im-client.js +1 -0
- package/dist/modules/im-sdk/src/domains/channel.js +1 -0
- package/dist/modules/im-sdk/src/domains/contact.js +1 -0
- package/dist/modules/im-sdk/src/domains/conversation.js +1 -0
- package/dist/modules/im-sdk/src/domains/group.js +1 -0
- package/dist/modules/im-sdk/src/domains/media-byte-computation.js +1 -0
- package/dist/modules/im-sdk/src/domains/media.js +1 -0
- package/dist/modules/im-sdk/src/domains/message.js +1 -0
- package/dist/modules/im-sdk/src/domains/pinned-message-source.js +1 -0
- package/dist/modules/im-sdk/src/domains/pinned-message.js +1 -0
- package/dist/modules/im-sdk/src/domains/session.js +1 -0
- package/dist/modules/im-sdk/src/product/applications.js +1 -0
- package/dist/modules/im-sdk/src/product/calls.js +1 -0
- package/dist/modules/im-sdk/src/product/capabilities.js +1 -0
- package/dist/modules/im-sdk/src/product/channel-mention-candidates.js +1 -0
- package/dist/modules/im-sdk/src/product/conversation-background.js +1 -0
- package/dist/modules/im-sdk/src/product/conversation-entry-unread.js +1 -0
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -0
- package/dist/modules/im-sdk/src/product/conversations.js +1 -0
- package/dist/modules/im-sdk/src/product/customer-service.js +1 -0
- package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -0
- package/dist/modules/im-sdk/src/product/diagnostics.js +1 -0
- package/dist/modules/im-sdk/src/product/directory.js +1 -0
- package/dist/modules/im-sdk/src/product/draft.js +1 -0
- package/dist/modules/im-sdk/src/product/emoji-catalog.js +1 -0
- package/dist/modules/im-sdk/src/product/emoji-catalog.json.js +1 -0
- package/dist/modules/im-sdk/src/product/events.js +1 -0
- package/dist/modules/im-sdk/src/product/expressions.js +1 -0
- package/dist/modules/im-sdk/src/product/face-to-face-group.js +1 -0
- package/dist/modules/im-sdk/src/product/group-calls.js +1 -0
- package/dist/modules/im-sdk/src/product/image-format.js +1 -0
- package/dist/modules/im-sdk/src/product/local-data.js +1 -0
- package/dist/modules/im-sdk/src/product/media.js +1 -0
- package/dist/modules/im-sdk/src/product/mention.js +1 -0
- package/dist/modules/im-sdk/src/product/message.js +1 -0
- package/dist/modules/im-sdk/src/product/messages-by-id.js +1 -0
- package/dist/modules/im-sdk/src/product/outbox.js +1 -0
- package/dist/modules/im-sdk/src/product/profiles.js +1 -0
- package/dist/modules/im-sdk/src/product/resource-uploader.js +1 -0
- package/dist/modules/im-sdk/src/product/robots.js +1 -0
- package/dist/modules/im-sdk/src/product/search.js +1 -0
- package/dist/modules/im-sdk/src/product/session-favorites.js +1 -0
- package/dist/modules/im-sdk/src/product/settings.js +1 -0
- package/dist/modules/im-sdk/src/runtime/advanced-message-diagnostics.js +1 -0
- package/dist/modules/im-sdk/src/runtime/channel-read-summary-refresh.js +1 -0
- package/dist/modules/im-sdk/src/runtime/customer-service-legacy-recovery.js +1 -0
- package/dist/modules/im-sdk/src/runtime/decrypt-diagnostics.js +1 -0
- package/dist/modules/im-sdk/src/runtime/foreground-work-coordinator.js +1 -0
- package/dist/modules/im-sdk/src/runtime/group-history-page-boundary.js +1 -0
- package/dist/modules/im-sdk/src/runtime/key-prefetch.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -0
- package/dist/modules/im-sdk/src/runtime/media-cache-maintenance.js +1 -0
- package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -0
- package/dist/modules/im-sdk/src/runtime/protobuf-wire-shape.js +1 -0
- package/dist/modules/im-sdk/src/runtime/receiving-activity.js +1 -0
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -0
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -0
- package/dist/modules/im-sdk/src/runtime/session-http-clients.js +1 -0
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -0
- package/dist/modules/im-sdk/src/runtime/signal-offline-poller.js +1 -0
- package/dist/request-crypto.js +1 -1
- package/dist/sdk.d.ts +170 -111
- package/dist/sdk.js +1 -1
- package/package.json +2 -2
- package/dist/browser-GFKMMRZD.js +0 -1
- package/dist/browser-RTCHWSQ2.js +0 -2
- package/dist/chunk-2U2JMY5V.js +0 -1
- package/dist/chunk-B5V2O54N.js +0 -1
- package/dist/chunk-I7YY5G76.js +0 -1
- package/dist/chunk-IDECJJXC.js +0 -0
- package/dist/chunk-PHJQ6QKU.js +0 -2
- package/dist/chunk-Q2DEFN53.js +0 -1
- package/dist/chunk-SXY56EVC.js +0 -0
- package/dist/chunk-TIQ37Q7E.js +0 -2
- package/dist/chunk-VMNZGJNM.js +0 -2
- package/dist/chunk-WOT6VMZA.js +0 -1
- package/dist/chunk-X7ZBIWYF.js +0 -8
package/dist/chat-kit-vue.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ type ImLocale = 'en-US' | 'th-TH' | 'vi-VN' | 'zh-CN' | 'zh-TW';
|
|
|
6
6
|
/** 媒体业务类型:实现据此选对象存储逻辑桶;sticker 对应 app-sticker。 */
|
|
7
7
|
type MediaKind = 'image' | 'video' | 'voice' | 'file' | 'sticker';
|
|
8
8
|
|
|
9
|
-
/**
|
|
10
|
-
type ConversationType = 'direct' | 'group' | 'channel' | 'supergroup' | 'robot';
|
|
9
|
+
/** 会话类型;各类型分别处理权限、收发和历史。supergroup 仅预留类型,尚未提供业务实现。 */
|
|
10
|
+
type ConversationType = 'direct' | 'group' | 'channel' | 'supergroup' | 'robot' | 'customerService';
|
|
11
11
|
/**
|
|
12
12
|
* 会话复合身份;`conversationId` 只在对应 `conversationType` 的领域内唯一。
|
|
13
13
|
*
|
|
@@ -26,8 +26,8 @@ interface ConversationRef<TType extends ConversationType = ConversationType> {
|
|
|
26
26
|
}
|
|
27
27
|
/** 当前支持持久化草稿的会话类型;`supergroup` 必须继续 fail-fast。 */
|
|
28
28
|
type DraftConversationType = Exclude<ConversationType, 'supergroup'>;
|
|
29
|
-
/** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);liveRoom=直播间分享(contentType=30);未知 wire
|
|
30
|
-
type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'liveRoom' | 'unknown';
|
|
29
|
+
/** 消息内容类型。sticker=表情/贴图(BMessage contentType=7);call=单聊通话记录(contentType=10);transfer=转账(contentType=16);gift=礼品/刮刮卡(contentType=17);robot=机器人卡片(contentType=18);miniProgram=小程序分享卡(contentType=22);redPacket=红包卡(contentType=25);game=小游戏(contentType=27);liveRoom=直播间分享(contentType=30);未知 wire 正文统一转换为 unknown。 */
|
|
30
|
+
type MessageContentType = 'text' | 'system' | 'image' | 'video' | 'voice' | 'file' | 'sticker' | 'contact' | 'miniProgram' | 'game' | 'transfer' | 'gift' | 'call' | 'redPacket' | 'mediaAlbum' | 'filesAlbum' | 'robot' | 'liveRoom' | 'customerService' | 'unknown';
|
|
31
31
|
/**
|
|
32
32
|
* 发送态(客户端态):消息从本地创建到服务端确认的生命周期。
|
|
33
33
|
* `uploading` 仅媒体消息使用:文件上传阶段(uploading→pending→sending→sent);
|
|
@@ -67,10 +67,10 @@ interface ImSystemMessageBody {
|
|
|
67
67
|
pinnedMessageAction?: ImPinnedMessageAction;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
*
|
|
71
|
-
* `system`
|
|
72
|
-
* EXPRESSION
|
|
73
|
-
*
|
|
70
|
+
* 会话最后一条消息的语义摘要,供存储和 im-i18n 展示使用。
|
|
71
|
+
* `system` 保存解析后的 ImSystemMessageBody,formatSystemMessage 在展示时接收 selfId。
|
|
72
|
+
* EXPRESSION 按 imageType 区分 gif 与静态 sticker。
|
|
73
|
+
* 与 lastMessagePreview 同时保存;变化检查逐字段调用 lastMessageSummaryEqual,不比较对象引用。
|
|
74
74
|
*/
|
|
75
75
|
type LastMessageSummary = {
|
|
76
76
|
kind: 'text';
|
|
@@ -266,7 +266,7 @@ interface ImVoiceBody {
|
|
|
266
266
|
teaKey?: Uint8Array;
|
|
267
267
|
/** 文件加密类型:0=跟随消息,1=不加密,3=完整 TEA(BMessage.fileEncryptType;语音与图片/视频同走完整 TEA)。 */
|
|
268
268
|
fileEncryptType?: number;
|
|
269
|
-
/** 录音振幅波形(0-255
|
|
269
|
+
/** 录音振幅波形(0-255):仅发送端本地展示缓存(随消息写入本地存储、刷新后仍可画波形),**不写入 BMessage**(协议无波形字段)。 */
|
|
270
270
|
waveform?: number[];
|
|
271
271
|
}
|
|
272
272
|
/**
|
|
@@ -373,7 +373,7 @@ interface ImRobotImageGroupModule {
|
|
|
373
373
|
/**
|
|
374
374
|
* 机器人卡片倒计时。
|
|
375
375
|
*
|
|
376
|
-
* `endTimeMs`
|
|
376
|
+
* `endTimeMs` 已转换为 epoch 毫秒;wire 秒/毫秒混用只在 mapper 转换,宿主不要再猜单位。
|
|
377
377
|
*/
|
|
378
378
|
interface ImRobotCountdownModule {
|
|
379
379
|
type: 'countdown';
|
|
@@ -466,10 +466,10 @@ interface ImGiftBody {
|
|
|
466
466
|
benCount?: string;
|
|
467
467
|
fissionNumber?: string;
|
|
468
468
|
}
|
|
469
|
-
/**
|
|
469
|
+
/** 通话媒体类型;各端 wire 0/1 的不同含义已转换成统一业务值,宿主无需读取 raw callType。 */
|
|
470
470
|
type ImCallKind = 'audio' | 'video';
|
|
471
471
|
/**
|
|
472
|
-
* 通话结束结果。Android 跨端同步把未接与取消都写成 callStatus=0
|
|
472
|
+
* 通话结束结果。Android 跨端同步把未接与取消都写成 callStatus=0,只能转换为 missed。
|
|
473
473
|
* `unknown` 仅表示该端 status 数字无法识别,不得猜成 completed。
|
|
474
474
|
*/
|
|
475
475
|
type ImCallOutcome = 'missed' | 'rejected' | 'cancelled' | 'completed' | 'busy' | 'no-permission' | 'interrupted' | 'unknown';
|
|
@@ -477,7 +477,7 @@ type ImCallOutcome = 'missed' | 'rejected' | 'cancelled' | 'completed' | 'busy'
|
|
|
477
477
|
* 单聊通话记录正文(contentType==='call',协议 BMessage.contentType=10)。
|
|
478
478
|
*
|
|
479
479
|
* @remarks JSON 在 BMessage.content。Android 本地 / Android 跨端同步 / iOS 三套字段名与 0/1 含义不同,
|
|
480
|
-
*
|
|
480
|
+
* 仅由 mapping/call-record-body 转换成统一业务值。记录由各端本地插入,不能当普通聊天发出。
|
|
481
481
|
*/
|
|
482
482
|
interface ImCallRecordBody {
|
|
483
483
|
callKind: ImCallKind;
|
|
@@ -498,7 +498,7 @@ type ImRedPacketType = 1 | 2 | 3 | 4;
|
|
|
498
498
|
* @remarks 字段来自 proto 72-79 + 复用 34/35/38/49。领域名 `packetId` 对应 wire `rad_packet_id`。
|
|
499
499
|
* 金额保持 proto string,单位是否微单位未证实,禁止默认套转账 ×1e6。
|
|
500
500
|
* HTTP 详情状态与本地「自己已领」属于宿主投影,不进本 DTO(status 39 / state 53 未裁定)。
|
|
501
|
-
*
|
|
501
|
+
* 当前不提供 `sendRedPacket`;出站字段仅用于 codec 往返闭合。
|
|
502
502
|
*/
|
|
503
503
|
interface ImRedPacketBody {
|
|
504
504
|
packetId: string;
|
|
@@ -518,7 +518,7 @@ interface ImRedPacketBody {
|
|
|
518
518
|
type ImContactKind = 'individual' | 'group' | 'channel' | 'robot' | 'unknown';
|
|
519
519
|
/**
|
|
520
520
|
* 名片消息内容体(contentType==='contact')。字段来自 BMessage contentType=8,但使用领域友好命名:
|
|
521
|
-
* id/icon/name
|
|
521
|
+
* id/icon/name 分别转换为 targetId/avatar/displayName;visitCardKey 转换为 kind,未知值放 rawKind。
|
|
522
522
|
*/
|
|
523
523
|
interface ImContactBody {
|
|
524
524
|
/** 被分享对象 id:个人 userId、普通群 groupId、频道 id 或机器人 id。 */
|
|
@@ -550,7 +550,7 @@ interface UnknownMessageBody {
|
|
|
550
550
|
* 若干项共享消息级的撤回、已读、引用与转发语义。
|
|
551
551
|
*/
|
|
552
552
|
interface ImMediaAlbumItem {
|
|
553
|
-
/** 该项是图片还是视频;由协议
|
|
553
|
+
/** 该项是图片还是视频;由协议 mediaType 转换,无法识别的项会在解析时丢弃。 */
|
|
554
554
|
kind: 'image' | 'video';
|
|
555
555
|
/** 远端地址。加密项也是这个地址,解密用本项自己的 `teaKey`。 */
|
|
556
556
|
url: string;
|
|
@@ -632,8 +632,28 @@ interface ImLiveRoomBody {
|
|
|
632
632
|
/** 点赞数十进制字符串,保持协议原文,不在 Core 换算。 */
|
|
633
633
|
liveRoomLikes?: string;
|
|
634
634
|
}
|
|
635
|
+
/** 客服正文保留一条消息内的全部附件;图片和文件各自保持服务端顺序。 */
|
|
636
|
+
interface ImCustomerServiceBody {
|
|
637
|
+
/** 原始文字;空白不被当作不存在。 */
|
|
638
|
+
text: string;
|
|
639
|
+
/** 图片直达地址,不套用普通消息的加密文件结构。 */
|
|
640
|
+
images: readonly string[];
|
|
641
|
+
/** 文件与名称、大小按协议数组索引配对,不创建伪消息 ID。 */
|
|
642
|
+
files: readonly ImCustomerServiceFile[];
|
|
643
|
+
}
|
|
644
|
+
/** 客服文件元数据。大小是服务端展示文字,不能据此认定下载完整。 */
|
|
645
|
+
interface ImCustomerServiceFile {
|
|
646
|
+
/** 服务端给出的资源地址。 */
|
|
647
|
+
url: string;
|
|
648
|
+
/** 服务端名称;缺省时从 URL 最后一个路径片段提取。 */
|
|
649
|
+
name: string;
|
|
650
|
+
/** 可缺省的原始大小描述,例如 1.5MB,并非精确字节数。 */
|
|
651
|
+
sizeLabel?: string;
|
|
652
|
+
}
|
|
635
653
|
interface ImMessageBody {
|
|
636
|
-
/**
|
|
654
|
+
/** 客服专用复合正文;不能直接作为普通消息发送。 */
|
|
655
|
+
customerService?: ImCustomerServiceBody;
|
|
656
|
+
/** 文本内容(明文,解密后的结果)。 */
|
|
637
657
|
text?: string;
|
|
638
658
|
/** contentType==='system' 时的结构化系统提示体(群通知;text 忽略)。 */
|
|
639
659
|
system?: ImSystemMessageBody;
|
|
@@ -683,7 +703,7 @@ interface MentionRange {
|
|
|
683
703
|
end: number;
|
|
684
704
|
}
|
|
685
705
|
/**
|
|
686
|
-
* 群消息 @ 提及(Android
|
|
706
|
+
* 群消息 @ 提及(Android 三写载体的统一解析):`atAll`(MESGrpChat.nNotifyCount=-1)、`atUserIds`(sNotifyUsers 被 @ 成员,
|
|
687
707
|
* 含正文 token 读边界补全)、`ranges`(extend.atRange,可选、仅诊断/兼容——展示**不依赖其坐标**)。正文 `body.text` 保留 `[userId]` token 原样(真相不变);
|
|
688
708
|
* **展示权威来源 = 正文 token + atUserIds/atAll**,由纯函数 `resolveMentionSegments` 还原为高亮段(含 @昵称/@所有人/@我),UI 不自行解析。
|
|
689
709
|
*/
|
|
@@ -705,26 +725,26 @@ type ImMessageFailureReason = 'timeout' | 'rejected' | 'encrypt_failed' | 'netwo
|
|
|
705
725
|
*/
|
|
706
726
|
type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.uploadTimeout' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
|
|
707
727
|
interface ImMessageFailure {
|
|
708
|
-
/**
|
|
728
|
+
/** 转换后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
|
|
709
729
|
code: number;
|
|
710
730
|
/** 失败机器分类(重试 / fail-fast / 统计消费)。 */
|
|
711
731
|
reason: ImMessageFailureReason;
|
|
712
|
-
/**
|
|
732
|
+
/** 失败展示语义码:UI 经 im-i18n 按语言渲染,缺省时使用 message;不单独触发消息状态更新。 */
|
|
713
733
|
displayCode?: ImFailureDisplayCode;
|
|
714
|
-
/** 展示模板参数(如未支持会话类型的 type
|
|
734
|
+
/** 展示模板参数(如未支持会话类型的 type);不单独触发消息状态更新。 */
|
|
715
735
|
params?: Record<string, string | number>;
|
|
716
736
|
/** 媒体失败的媒体类型(图片/视频/语音/文件):供 displayCode 为 media.* 时渲染 label。 */
|
|
717
737
|
mediaKind?: MediaKind;
|
|
718
|
-
/**
|
|
738
|
+
/** 后端原文或诊断文案;没有专门展示码时用于展示,不单独触发消息状态更新(见 merge.failureEqual)。 */
|
|
719
739
|
message?: string;
|
|
720
740
|
/**
|
|
721
741
|
* 是否可重试(false=业务级不可重试):如 direct 非好友或 GROUP 不在群(0x8201)、内容为空/违规(0x8202)、群已解散(0x8315)→ UI 隐藏「重发」。
|
|
722
|
-
* 缺省(undefined)视为可重试(向后兼容)。由 code 决定(classifyAckFailure
|
|
742
|
+
* 缺省(undefined)视为可重试(向后兼容)。由 code 决定(classifyAckFailure),不单独触发消息状态更新。
|
|
723
743
|
*/
|
|
724
744
|
retryable?: boolean;
|
|
725
745
|
}
|
|
726
746
|
interface ImMessageEncryption {
|
|
727
|
-
/**
|
|
747
|
+
/** true=消息密文链路, false=明文链路(encrypt=0)。 */
|
|
728
748
|
encrypted: boolean;
|
|
729
749
|
/** 扩展:加密方案标识,默认 'rsa-tea'。 */
|
|
730
750
|
scheme?: 'rsa-tea';
|
|
@@ -733,16 +753,16 @@ interface ImMessageEncryption {
|
|
|
733
753
|
}
|
|
734
754
|
/** 单条消息领域模型(§4.1)。主键为客户端生成的 id(无 serverId)。 */
|
|
735
755
|
interface ImMessage {
|
|
736
|
-
/**
|
|
756
|
+
/** 客户端生成的稳定消息 ID(UUID),同时作幂等键;刷新后保持。 */
|
|
737
757
|
id: string;
|
|
738
|
-
/**
|
|
758
|
+
/** 消息所属会话的字符串 ID;必须结合 conversationType 使用。 */
|
|
739
759
|
conversationId: string;
|
|
740
760
|
conversationType: ConversationType;
|
|
741
|
-
/**
|
|
761
|
+
/** 发送者的字符串用户 ID。 */
|
|
742
762
|
senderId: string;
|
|
743
763
|
contentType: MessageContentType;
|
|
744
764
|
body: ImMessageBody;
|
|
745
|
-
/**
|
|
765
|
+
/** 统一毫秒 number(本地创建时间,乐观渲染用)。 */
|
|
746
766
|
createdAt: number;
|
|
747
767
|
/** SDK 内部排序键;有效服务端时间优先,ACK 后可以更新。宿主不解析它,消息身份始终使用 id。 */
|
|
748
768
|
sortKey: string;
|
|
@@ -751,7 +771,7 @@ interface ImMessage {
|
|
|
751
771
|
failure?: ImMessageFailure;
|
|
752
772
|
/** 服务端回传的 epoch 毫秒时间;有效时用于正式排序与展示,createdAt 仍保留创建记录。 */
|
|
753
773
|
serverTime?: number;
|
|
754
|
-
/**
|
|
774
|
+
/** 默认 'unread'。 */
|
|
755
775
|
receipt: MessageReceipt;
|
|
756
776
|
/** 离线单聊服务端标记当前账号已在其它端读过;仅用于本地未读投影,不改变对端回执 receipt。 */
|
|
757
777
|
readBySelf?: boolean;
|
|
@@ -784,7 +804,7 @@ interface ImMessage {
|
|
|
784
804
|
/** 扩展位:后端新增语义先落这里,避免污染核心字段。 */
|
|
785
805
|
extensions?: Record<string, unknown>;
|
|
786
806
|
/**
|
|
787
|
-
* 诊断快照(§4.1
|
|
807
|
+
* 诊断快照(§4.1 诊断口径):后端下发的原始协议字段(已转换为可 JSON 序列化形态)。
|
|
788
808
|
* 默认不填充,仅当映射开启 keepRaw 时附带,便于联调、与后端核对原始下发;不参与任何业务逻辑。
|
|
789
809
|
*/
|
|
790
810
|
raw?: ImMessageRaw;
|
|
@@ -899,17 +919,17 @@ type ChannelSessionState = 'active' | 'guest' | 'left' | 'removed' | 'dismissed'
|
|
|
899
919
|
interface ImSession {
|
|
900
920
|
id: string;
|
|
901
921
|
type: ConversationType;
|
|
902
|
-
/**
|
|
922
|
+
/** 由映射层从用户/群资料补齐。 */
|
|
903
923
|
title: string;
|
|
904
924
|
avatar?: string;
|
|
905
925
|
/**
|
|
906
|
-
*
|
|
926
|
+
* 会话最后一条的预览串(**已收窄**):仅承载 text 消息的正文(供会话列表 previewSegments 解析 @/表情,需原始正文串);
|
|
907
927
|
* 媒体 / 加密 / 系统 / 撤回一律空串——其语义改由 lastMessageSummary 承载、UI 经 im-i18n 渲染。旧盘遗留的中文占位在 hydrate / projectSession 重算时清空。
|
|
908
928
|
*/
|
|
909
929
|
lastMessagePreview: string;
|
|
910
930
|
/**
|
|
911
|
-
*
|
|
912
|
-
*
|
|
931
|
+
* 最后一条消息的语义摘要,持久保存并由 im-i18n 按语言生成文案。
|
|
932
|
+
* 与 lastMessagePreview 同时保存,变化检查使用逐字段比较;旧会话缺此字段时可使用 lastMessagePreview。
|
|
913
933
|
*/
|
|
914
934
|
lastMessageSummary?: LastMessageSummary;
|
|
915
935
|
/** 最后一条消息发送者 id(群会话列表预览「发送者名: 内容」前缀用;`'system'`=系统提示、==自己=我发的,前缀策略由宿主定)。 */
|
|
@@ -933,7 +953,7 @@ interface ImSession {
|
|
|
933
953
|
* 会话内容仍显示最新一条消息。收到别人 @我 +1、查看/已读该会话清零。投影自 ReadState.mentionUnreadCount,与 unreadCount 同源持久化。
|
|
934
954
|
*/
|
|
935
955
|
mentionUnreadCount?: number;
|
|
936
|
-
/**
|
|
956
|
+
/** 排序时间(毫秒 number)。 */
|
|
937
957
|
timestamp: number;
|
|
938
958
|
/**
|
|
939
959
|
* 用户手工添加的本地“稍后处理”提醒。
|
|
@@ -949,7 +969,7 @@ interface ImSession {
|
|
|
949
969
|
topTime?: number;
|
|
950
970
|
/**
|
|
951
971
|
* 最新一条消息若为「己方且未完成发送」的态:'sending'(pending/uploading/sending 统一)/ 'failed'。
|
|
952
|
-
* 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession
|
|
972
|
+
* 派生展示字段(随最新消息变化,会话列表据此显示发送中 loading / 失败图标);运行期真相,不持久化(persistSession 写入本地存储时剔除)。
|
|
953
973
|
*/
|
|
954
974
|
lastMessageSendState?: 'sending' | 'failed';
|
|
955
975
|
/**
|
|
@@ -957,11 +977,11 @@ interface ImSession {
|
|
|
957
977
|
*
|
|
958
978
|
* 只在自己发出且 `status='sent'` 时投影;发送中/失败、对端消息、撤回、全员删除和系统提示都不给。
|
|
959
979
|
* `delivered` 与尚未回执一样投影为 `unread`;当前协议没有送达通知,不能把 `sent` 当作对端已收到。
|
|
960
|
-
*
|
|
980
|
+
* 该字段随最新消息变化,并随会话写入本地存储,避免冷启动后
|
|
961
981
|
* 因「盘中缺字段 / 内存有字段」反复广播;对端已读变化必须刷新会话行。
|
|
962
982
|
*/
|
|
963
983
|
lastMessageReceipt?: 'unread' | 'read';
|
|
964
|
-
/**
|
|
984
|
+
/** 我方已读游标(见 §4.3)。 */
|
|
965
985
|
readCursor?: string;
|
|
966
986
|
/** 群受限状态(仅 group;来自 0x2204 群通知 side-effect)。缺省视为 'active'(可正常发送)。 */
|
|
967
987
|
groupState?: GroupSessionState;
|
|
@@ -1195,7 +1215,7 @@ interface ApiProtocolResponse<T = unknown> {
|
|
|
1195
1215
|
*/
|
|
1196
1216
|
type ApiProtocolClient = <T = unknown>(path: string, options?: ApiProtocolRequestOptions) => Promise<ApiProtocolResponse<T>>;
|
|
1197
1217
|
|
|
1198
|
-
/** 服务端按逻辑桶签发的 S3
|
|
1218
|
+
/** 服务端按逻辑桶签发的 S3 临时上传凭证(已转换为 SDK 合同字段)。 */
|
|
1199
1219
|
interface MediaUploadCredentials {
|
|
1200
1220
|
/** STS access key id(服务端字段 `access_key_id`)。 */
|
|
1201
1221
|
accessKeyId: string;
|
|
@@ -1211,7 +1231,7 @@ interface MediaUploadCredentials {
|
|
|
1211
1231
|
region: string;
|
|
1212
1232
|
/** 对象 key 前缀;STS 策略只允许写该前缀下的对象,SDK 生成的 key 必须以它开头。 */
|
|
1213
1233
|
keyPrefix?: string;
|
|
1214
|
-
/**
|
|
1234
|
+
/** 公开访问域名(已转换为带 scheme、无尾斜杠);写进消息体的媒体 URL 以它为准。 */
|
|
1215
1235
|
dnsPoint: string;
|
|
1216
1236
|
/** 服务端身份标识;SDK 不使用,仅原样透出供宿主排查。 */
|
|
1217
1237
|
identityId?: string;
|
|
@@ -1365,7 +1385,7 @@ interface MentionInput {
|
|
|
1365
1385
|
|
|
1366
1386
|
/**
|
|
1367
1387
|
* 当前账号草稿的产品 DTO、跨组件 API 与 handle 绑定门面。
|
|
1368
|
-
*
|
|
1388
|
+
* 草稿按会话类型和 ID 串行保存,统一由 SDK DomainState 管理;当前不支持保存附件,非空附件输入会被明确拒绝。
|
|
1369
1389
|
*/
|
|
1370
1390
|
|
|
1371
1391
|
/** 当前产品草稿实体;只包含可持久化的 text/mention/reply,附件集合固定为空。 */
|
|
@@ -1386,7 +1406,7 @@ interface ConversationDraft {
|
|
|
1386
1406
|
*/
|
|
1387
1407
|
|
|
1388
1408
|
/** default 会话列表支持的精确类型;`supergroup` 继续受产品 Gate 约束。 */
|
|
1389
|
-
type ProductConversationListType = 'direct' | 'group' | 'channel' | 'robot';
|
|
1409
|
+
type ProductConversationListType = 'direct' | 'group' | 'channel' | 'robot' | 'customerService';
|
|
1390
1410
|
|
|
1391
1411
|
type ConversationEntryUnreadSnapshot = Readonly<{
|
|
1392
1412
|
state: 'none';
|
|
@@ -1420,7 +1440,7 @@ type ConversationEntryUnreadNavigation = Readonly<{
|
|
|
1420
1440
|
*/
|
|
1421
1441
|
|
|
1422
1442
|
/** 当前已接线的产品 handle 会话类型;三者只在无会话语义原子层复用。 */
|
|
1423
|
-
type ProductHandleConversationType = 'direct' | 'group' | 'channel' | 'robot';
|
|
1443
|
+
type ProductHandleConversationType = 'direct' | 'group' | 'channel' | 'robot' | 'customerService';
|
|
1424
1444
|
/**
|
|
1425
1445
|
* 产品会话的连续窗口快照;协议 cursor、窗口 id 与 generation 始终保持在 SDK 内部。
|
|
1426
1446
|
*
|
|
@@ -1558,7 +1578,7 @@ type ImRequestErrorHandler = (issue: ImRequestError) => void | Promise<void>;
|
|
|
1558
1578
|
*
|
|
1559
1579
|
* 上传凭证由业务后端按登录态签发(与 iOS、prod H5 同一个接口),回包同时给出**物理桶**、区域、`key_prefix` 和
|
|
1560
1580
|
* 公开访问域名;SDK 据此拼 object key 与消息体 URL,宿主 env 里配的只是申请凭证用的逻辑桶名。凭证缓存(本地
|
|
1561
|
-
* 1 小时、按服务端过期时间提前 5
|
|
1581
|
+
* 1 小时、按服务端过期时间提前 5 分钟失效)、同桶并发请求复用和失败后重新签发由 SDK 负责,宿主只需提供「打一次接口」的纯函数。
|
|
1562
1582
|
*
|
|
1563
1583
|
* 默认单次 PUT/GET;仅 multipartTransfer=true 才允许大资源分片上传、下载。
|
|
1564
1584
|
* 各 bucket 需在对象存储侧配置 CORS 允许本站 origin 的 PUT + GET;开启分片后,超过 16MiB 的上传另需放行
|
package/dist/chat-kit-vue.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {h,C,p,i,B,o,j,m,z,q,g}from'./chunk-I7YY5G76.js';import {f,h as h$2,i as i$1,g as g$1}from'./chunk-B5V2O54N.js';import {a}from'./chunk-Q2DEFN53.js';import'./chunk-VMNZGJNM.js';import'./chunk-X7ZBIWYF.js';import'./chunk-PHJQ6QKU.js';import'./chunk-WOT6VMZA.js';import {defineComponent,h as h$1,onUpdated,onUnmounted,ref,provide,watch,nextTick,onMounted,onBeforeUnmount,computed,inject,isVNode,cloneVNode,Fragment,reactive,shallowReactive}from'vue';function hn(t){let a=0,h=0;for(let f of t)f.kind==="video"?h+=1:a+=1;return {imageCount:a,videoCount:h}}function pn(t){return {systemMessage:a=>a.body.system!==void 0?g$1(a.body.system,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):"",mediaPlaceholder:a=>i$1(a.contentType,{locale:t.locale(),durationMs:a.body.voice?.durationMs,stickerImageType:a.body.sticker?.imageType,gameType:a.body.game?.gameType,callKind:a.body.call?.callKind,...a.body.filesAlbum===void 0?{}:{filesAlbum:{count:a.body.filesAlbum.items.length,caption:a.body.filesAlbum.caption}},...a.body.mediaAlbum===void 0?{}:{mediaAlbum:hn(a.body.mediaAlbum.items)}}),lastMessage:a=>a.lastMessageSummary!==void 0?h$2(a.lastMessageSummary,{locale:t.locale(),resolveName:t.resolveName,selfId:t.selfId()}):a.lastMessagePreview,failureText:a=>a.failure?.displayCode!==void 0?f(a.failure.displayCode,{locale:t.locale(),mediaKind:a.failure.mediaKind,params:a.failure.params}):a.failure?.message??""}}var Yt=Symbol("ImThreadReadActions");function $t(t){provide(Yt,t);}function bn(){return inject(Yt,void 0)}var wt=defineComponent({name:"ImThreadBodySwitch",inheritAttrs:false,props:{message:{type:Object,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{attrs:a,slots:h$2}){return $t(t.readActions),()=>{let f=h(t.message),u=t.rendererRegistry.resolve(f);return u!==void 0?h$1(u,{...a,message:t.message,presentation:t.presentation}):h$2["unsupported-body"]!==void 0?h$2["unsupported-body"]({kind:f,message:t.message}):h$1("span",{"data-im-thread-unsupported-body":f,"aria-hidden":"true"})}}});var It=Symbol("ImThreadViewportRegistration");function vt(){return inject(It,void 0)}var Mt=defineComponent({name:"ImThreadItems",props:{items:{type:Array,required:true},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0}},setup(t,{slots:a}){let h=vt(),f=new Map,u=new Map;onUpdated(()=>{let r=new Set,g=new Set;for(let c of t.items)c.kind==="message"||c.kind==="system"?r.add(c.key):c.kind==="date-separator"&&g.add(c.key);for(let c of f.keys())r.has(c)||f.delete(c);for(let c of u.keys())g.has(c)||u.delete(c);}),onUnmounted(()=>{f.clear(),u.clear();});function k(r,g){let c=Array.isArray(g)?g:[g];return c.length===1&&isVNode(c[0])?cloneVNode(c[0],{key:r}):h$1(Fragment,{key:r},c)}function N(r,g){let c=f.get(r);if(c?.messageId===g)return c.setElement;let w=C=>{h?.registerMessageNode(g,C instanceof HTMLElement?C:null);};return f.set(r,{messageId:g,setElement:w}),w}function U(r,g){let c=u.get(r);if(c!==void 0)return c.label=g,c.setElement;let w={label:g,setElement:C=>{h?.registerDateNode(r,w.label,C instanceof HTMLElement?C:null);}};return u.set(r,w),w.setElement}function E(r){return a.encryption?.({item:r})??h$1("div",{"data-im-thread-encryption":r.key})}function m(r){let g=U(r.key,r.label);return a["date-separator"]?.({item:r,setElement:g})??h$1("div",{ref:g,"data-im-thread-date-separator":r.key},r.label)}function V(r){h?.registerEntryUnreadNode(r instanceof HTMLElement?r:null);}function b(r){return a["entry-unread"]?.({item:r,setElement:V})??h$1("div",{ref:V,"data-im-thread-entry-unread":r.key,...r.count===void 0?{}:{"data-count":String(r.count)}})}function K(r){let g=N(r.key,r.message.id);return a.item!==void 0?a.item({item:r,setElement:g}):a.message!==void 0?a.message({item:r,setElement:g}):r.message.deletedForEveryone!==void 0?a["deleted-message"]?.({item:r,setElement:g})??h$1("article",{ref:g,"data-im-thread-message-id":r.message.id,"data-im-thread-message-terminal":"deleted-for-everyone"},[h$1("span",{"data-im-thread-anchor-point":""})]):r.message.recalled!==void 0?a["recalled-message"]?.({item:r,setElement:g})??h$1("article",{ref:g,"data-im-thread-message-id":r.message.id,"data-im-thread-message-terminal":"recalled"},[h$1("span",{"data-im-thread-anchor-point":""})]):r.kind==="system"&&a.system!==void 0?a.system({item:r,setElement:g}):h$1("article",{ref:g,"data-im-thread-message-id":r.message.id,"data-first-of-run":r.kind==="message"?String(r.firstOfRun):void 0},[h$1("span",{"data-im-thread-anchor-point":""}),h$1(wt,{message:r.message,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{"unsupported-body":a["unsupported-body"]===void 0?void 0:c=>a["unsupported-body"]?.(c)})])}return ()=>h$1("div",{"data-im-thread-items":""},t.items.map(r=>{switch(r.kind){case "encryption":return a.item!==void 0?k(r.key,a.item({item:r})):k(r.key,E(r));case "date-separator":return a.item!==void 0?k(r.key,a.item({item:r,setElement:U(r.key,r.label)})):k(r.key,m(r));case "entry-unread":return a.item!==void 0?k(r.key,a.item({item:r,setElement:V})):k(r.key,b(r));case "system":case "message":return k(r.key,K(r))}return r}))}});function ot(){let t,a=0,h=0,f;function u(){t!==void 0&&clearTimeout(t),t=void 0,f=void 0;}function k(){t=void 0;let U=a-performance.now();if(U>0){h=a,t=setTimeout(k,U);return}let E=f;f=void 0,E?.();}function N(U,E){a=performance.now()+E,f=U,!(t!==void 0&&a>=h)&&(t!==void 0&&clearTimeout(t),h=a,t=setTimeout(k,E));}return {schedule:N,cancel:u}}function Xt(t){let a=new Set,h=new Map,f=new Set;function u(){let E=[...f];f.clear();let m=[],V=[];for(let b of E)if(b.active)try{m.push({job:b,commit:b.read()});}catch(K){V.push(K);}for(let{job:b,commit:K}of m)if(b.active)try{K?.();}catch(r){V.push(r);}V.length>0&&queueMicrotask(()=>{throw new AggregateError(V,"Thread layout measurement failed")});}function k(E){E.active&&(f.add(E),t.requestFrame(u));}function N(E,m){let V=h.get(m);V?.delete(E),V?.size===0&&(h.delete(m),t.unobserve(m));}function U(E){let m={read:E,elements:new Set,active:true};return a.add(m),{observe(V){if(!m.active)return;let b=new Set(V),K=b.size!==m.elements.size||[...b].some(r=>!m.elements.has(r));for(let r of m.elements)b.has(r)||N(m,r);for(let r of b){if(m.elements.has(r))continue;let g=h.get(r);g===void 0&&(g=new Set,h.set(r,g),t.observe(r)),g.add(m);}m.elements=b,K&&b.size>0&&k(m);},invalidate:()=>k(m),dispose(){m.active=false,f.delete(m),a.delete(m);for(let V of m.elements)N(m,V);m.elements.clear();}}}return {register:U,hasTarget:E=>h.has(E),observeTargets:()=>h.forEach((E,m)=>t.observe(m)),resized:E=>E.forEach(m=>h.get(m)?.forEach(k)),invalidateAll:()=>a.forEach(k),dispose(){for(let E of a)E.active=false;a.clear(),f.clear(),h.clear();}}}var en=120,Cn=500,at=.5,tn=8;function it(t){let a=t.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(a!==void 0&&Number.isFinite(a)&&a>0?a:1)}var Rt=defineComponent({name:"ImThreadViewport",props:{messageIds:{type:Array,required:true},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:false},hasNewer:{type:Boolean,default:false},loadingNewer:{type:Boolean,default:false},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:true},shouldFollowAppendedMessage:{type:Function,default:void 0},pendingSendMessageIds:{type:Array,default:()=>[]},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:true},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:false}},emits:{"reach-start":()=>true,"reach-end":()=>true,"visible-range":t=>true,settled:t=>true,"new-message-count":t=>true,"user-scroll":()=>true,"active-date-change":t=>true},setup(t,{emit:a,expose:h,slots:f}){let u=ref(null),k=ref(null),N=new Map,U,E=new Map,m$1=new Set,V=new Map,b=0,K=[],r,g$1,c,w,C$1=Xt({requestFrame:se,observe:e=>c?.observe(e),unobserve:e=>{e!==u.value&&e!==k.value&&!E.has(e)&&c?.unobserve(e);}}),M,$=false,q$1,Z=new Set,le=false,R,O=0,J="",W=1,X=false,Q=false,F=true,G=false,ye=false,Ee=true,ne=false,s=0,de=-1,Ae=-1,Me=ot(),B$1,ue,x,j$1,ce=ref(true),ke=ref(0),fe=C(e=>{ke.value=e,a("new-message-count",e);});function Fe(e){let o=Number.isFinite(t.followThreshold)?Math.max(0,t.followThreshold):0;return e.scrollHeight-e.clientHeight-e.scrollTop<=o}function p$1(e=t.messageIds){return e.flatMap(o=>{let i=N.get(o);if(i===void 0)return [];let v=i.getBoundingClientRect(),A=i.querySelector("[data-im-thread-anchor-point]");return [{id:o,top:v.top,bottom:v.bottom,anchorTop:A?.getBoundingClientRect().top??v.top}]})}function S(e="",o=1){let i=Math.min(1,Math.max(0,o));J!==""&&J!==e&&V.get(J)?.element.style.removeProperty("opacity"),J=e,W=i,e!==""&&V.get(e)?.element.style.setProperty("opacity",String(i));}function T(){S();}function P(){let e=u.value;if(le||e===null||!t.activeDateEnabled)return;let o=[...V.entries()].filter(([,_])=>e.contains(_.element)).map(([_,H])=>{let ie=H.element.getBoundingClientRect();return {key:_,label:H.label,top:ie.top,height:ie.height}}).sort((_,H)=>_.top-H.top),i=e.getBoundingClientRect(),v=o.find(_=>_.height>0)?.height??28,A=g({markers:o,viewportTop:i.top,overlayTop:Number.isFinite(t.activeDateOffset)?Math.max(0,t.activeDateOffset):0,overlayHeight:v});if(A===null){T(),a("active-date-change",null);return}S(A.inlineDateKey,A.inlineOpacity),a("active-date-change",A);}function L(e){g$1={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight};}function ee(e){let o=g$1;if(o===void 0)return false;let i=Math.max(0,e.scrollHeight-e.clientHeight);return i<o.scrollHeight-o.height&&o.scrollTop>i&&Math.abs(e.scrollTop-i)<=it(e)}function z$1(e){return e.scrollTop<0||e.scrollTop>Math.max(0,e.scrollHeight-e.clientHeight)+it(e)}function re(e){return ee(e)||R!==void 0&&(R.behavior==="smooth"||Math.abs(e.scrollTop-R.targetTop)<=it(e))?0:e.scrollTop-b}function Se(e,o){o!==0&&(b=e.scrollTop-o,R=void 0,Ze(true));}function oe(e,o){let i=re(e);if(x!==void 0)return x.expectedOffset-=i,Ce(),Se(e,i),G||et(),false;let v=g$1;if(v===void 0)return false;let A=r,_=A===void 0?void 0:p$1([A.id])[0],H=e.scrollTop-v.scrollTop,ie=ee(e)?0:H,te=A===void 0||_===void 0?0:(_.anchorTop??_.top)-o.top-A.offset+H;return v.scrollHeight!==e.scrollHeight||v.width!==e.clientWidth||v.height!==e.clientHeight||Math.abs(te)>at?(g$1=void 0,!X&&!Q&&!t.loadingOlder&&!t.loadingNewer&&!t.hasNewer&&t.resizeFollowEnabled&&!z$1(e)&&ce.value&&Math.abs(ie)<=at?(ae(),true):(A!==void 0&&We({...A,offset:A.offset-ie}),Se(e,i),false)):false}function Te(){let e=u.value;if(le||e===null)return;let o$1=e.getBoundingClientRect();if(oe(e,o$1))return;let i=M!==void 0&&$?t.messageIds.filter(H=>m$1.has(H)):t.messageIds,v=p$1(i);if(M!==void 0&&$&&v.length===0){ce.value=Fe(e);return}let A=v.filter(H=>B({viewportTop:o$1.top,viewportBottom:o$1.bottom,messageTop:H.top,messageBottom:H.bottom,margin:t.visibleMargin})).map(H=>H.id),_=A.length!==K.length||A.some((H,ie)=>K[ie]!==H);K=Object.freeze(A),r=o(v,{top:o$1.top,bottom:o$1.bottom}),L(e),fe.acknowledgeVisible(A),ce.value=Fe(e),_&&a("visible-range",K),a("settled",{visibleMessageIds:K,...K.length===0?{}:{newestVisibleMessageId:K[K.length-1]},isAtBottom:ce.value,newMessageCount:ke.value});}function se(e){if(Z.add(e),q$1!==void 0)return;let o=()=>{q$1=void 0;let i=[...Z];Z.clear(),i.forEach(v=>v());};typeof globalThis.requestAnimationFrame=="function"?q$1=globalThis.requestAnimationFrame(o):q$1=globalThis.setTimeout(o,0);}function Re(){q$1!==void 0&&(typeof q$1=="number"&&typeof globalThis.cancelAnimationFrame=="function"?globalThis.cancelAnimationFrame(q$1):globalThis.clearTimeout(q$1),q$1=void 0,Z.clear());}function xe(){se(Te);}function lt(){let e=u.value;if(e===null)return;let o$1=e.getBoundingClientRect(),i=o(p$1(),{top:o$1.top,bottom:o$1.bottom});i!==void 0&&(r=i,L(e));}function dt(){return F&&x===void 0&&!Q&&!t.loadingOlder}function ut(){lt(),F=false,de=s,Q=true,ce.value=false,a("reach-start"),se(()=>{t.loadingOlder||(Q=false);});}function Qe(e){return t.hasNewer&&!X&&!t.loadingOlder&&!t.loadingNewer&&Fe(e)}function he(){lt(),X=true,ce.value=false,Ae=s,a("reach-end"),se(()=>{t.loadingNewer||(X=false);});}function $e(){let e=u.value;e===null||s===Ae||!Qe(e)||he();}function Ze(e=false){let o=u.value;if(le||o===null)return;let i=o.scrollTop,v=Math.max(0,o.scrollHeight-o.clientHeight),A=Math.min(v,Math.max(0,b)),_=Math.min(v,Math.max(0,i)),H=ee(o),ie=R,te=false;if(ie!==void 0){let Ye=Math.abs(i-ie.targetTop)<=it(o);te=ie.behavior==="smooth"||Ye,(ie.behavior!=="smooth"||Ye)&&(R=void 0);}!te&&!H&&!G&&Ee&&x===void 0&&i!==b&&(G=true,ye=true,s+=1);let pe=G&&!te&&!H&&i!==b;pe&&(O+=1,a("user-scroll"),se(P)),G&&!ne&&je(),!F&&ye&&s!==de&&i<b&&i>tt()&&we(),x!==void 0&&!te&&(G?!H&&!e&&(x.expectedOffset-=i-b):(Ce(),et())),dt()&&pe&&m({previousScrollTop:A,currentScrollTop:_,topThreshold:t.olderPrefetchThreshold})&&ut(),pe&&Qe(o)&&z({previousScrollTop:A,currentScrollTop:_,isAtBottom:Fe(o),isHistoryWindow:t.hasNewer,isPageSettling:te})&&he(),b=i,xe();}function ct(){Ze();}function ze(e,o="auto"){R={targetTop:e,behavior:o};}function Je(e){let o=x,i=k.value;if(!(o===void 0||i===null)){if(o.visualOffset=Math.abs(e)<=at?0:e,o.visualOffset===0){i.style.removeProperty("transform"),i.style.removeProperty("will-change");return}i.style.setProperty("transform",`translate3d(0, ${o.visualOffset}px, 0)`),i.style.setProperty("will-change","transform");}}function _e(){j$1!==void 0&&(clearTimeout(j$1),j$1=void 0),x!==void 0&&x.visualOffset!==0&&(r=void 0,g$1=void 0);let e=k.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),x=void 0,R=void 0;}function qe(){let e=u.value,o=x;if(e===null||o===void 0)return;let i=N.get(o.anchor.id);return i===void 0?void 0:(i.querySelector("[data-im-thread-anchor-point]")??i).getBoundingClientRect().top-e.getBoundingClientRect().top}function Ce(){let e=x,o=qe();if(e===void 0||o===void 0)return;let i=e.expectedOffset-o;if(Math.abs(i)<=at)return;let v=u.value;v!==null&&ee(v)&&(b=v.scrollTop),Je(e.visualOffset+i),e.committed=false,e.attempts=0;}function ft(){j$1!==void 0&&clearTimeout(j$1),j$1=setTimeout(()=>{j$1=void 0,!(G||x?.committed!==true)&&_e();},Cn);}function be(e,o=false){let i=u.value,v=x;if(le||i===null||v===void 0||z$1(i)||G&&!o)return;if(o){let gt=re(i);v.expectedOffset-=gt,Ce(),Se(i,gt);}let A=e?.visualOffset??v.visualOffset;if(Math.abs(A)<=at){v.committed=true,ft();return}let _=Math.max(0,i.scrollHeight-i.clientHeight),H=i.scrollTop,ie=Math.min(_,Math.max(0,H-A));ze(ie),i.scrollTop=ie;let te=i.scrollTop,pe=A+te-H,Ye=it(i),rt=(H-A<0||H-A>_)&&Math.abs(te-ie)<=Ye;if(b=te,Math.abs(pe)>Ye&&!rt){Je(pe),ze(te),v.committed=false,v.attempts+=1,v.attempts<tn&&!G&&et();return}v.visualOffset!==0&&Je(0),b=te,v.expectedOffset=e===void 0?qe()??v.expectedOffset:e.currentOffset-(te-H),r={...v.anchor,offset:v.expectedOffset},L(i),v.committed=true,v.attempts=0,ft();}function et(){x===void 0||x.attempts>=tn||(j$1!==void 0&&clearTimeout(j$1),j$1=setTimeout(()=>{j$1=void 0,be();},en));}function Ve(e){if(e===void 0)return;x===void 0&&(x={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:false,attempts:0});let o=u.value;if(!G&&o!==null&&!z$1(o)&&x.visualOffset===0){let i=qe();if(i!==void 0){be({visualOffset:x.expectedOffset-i,currentOffset:i});return}}Ce(),!G&&be();}function We(e){let o=u.value;if(o===null||e===void 0)return;if(z$1(o)){Ve(e);return}let i=o.getBoundingClientRect(),v=q(e,p$1([e.id]),{top:i.top,bottom:i.bottom});if(v!==void 0){let A=Math.max(0,o.scrollHeight-o.clientHeight),_=Math.min(A,Math.max(0,o.scrollTop+v));ze(_),o.scrollTop=_,b=o.scrollTop,g$1=void 0;}}function tt(){return Number.isFinite(t.olderPrefetchThreshold)?Math.max(0,t.olderPrefetchThreshold):0}function Be(e=false){O+=1,R?.behavior==="smooth"&&(R=void 0),ye=false,(!G||e)&&(G=true,s+=1),ne&&Me.cancel();}function we(){let e=u.value;if(!(e===null||s===de)&&!(Q||t.loadingOlder)){if(x!==void 0){if(be(void 0,true),!x.committed)return;_e();}F=true,dt()&&e.scrollTop<=tt()&&ut();}}function Ue(){O+=1,r=void 0,g$1=void 0,Me.cancel(),_e(),G=false,ye=false,ne=false,B$1=void 0,ue=void 0,s+=1,de=-1,Ae=-1,F=true,Q=false,X=false,R=void 0;}function Ne(){ne||u.value!==null&&z$1(u.value)||(Me.cancel(),G=false,ye=false,x!==void 0&&(x.attempts=0),be());}function je(){ne||Me.schedule(Ne,en);}function nt(){R=void 0,Ne();}function n(e){Ee=false;let o=!ne;ne=true,Be(o),B$1=e.touches?.[0]?.clientY;}function d(e){let o=e.touches?.[0]?.clientY;o!==void 0&&(B$1!==void 0&&o!==B$1&&(O+=1),B$1!==void 0&&o>B$1?we():B$1!==void 0&&o<B$1&&$e(),B$1=o);}function l(){ne=false,B$1=void 0,je();}function y(e){Ee=true,Be(),e.deltaY<0?we():e.deltaY>0&&$e(),je();}function I(e){e.pointerType!=="touch"&&(Ee=true,Be(),ue=e.clientY,je());}function D(e){e.pointerType==="touch"||!G||ue===void 0||(e.clientY!==ue&&(O+=1),e.clientY<ue?we():e.clientY>ue&&$e(),ue=e.clientY,je());}function Y(e){e.pointerType!=="touch"&&(ue=void 0,je());}function me(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(Ee=true,Be(),e.key==="ArrowUp"||e.key==="PageUp"||e.key==="Home"||e.key===" "&&e.shiftKey?we():$e(),je());}function ae(e="auto"){let o=u.value;if(o===null)return;O+=1,g$1=void 0,_e();let i=Math.max(0,o.scrollHeight-o.clientHeight);ze(i,e),o.scrollTo?.({top:i,behavior:e}),o.scrollTop!==i&&(o.scrollTop=i),b=o.scrollTop,fe.clear(),$=false,Te();}function Ie(){let e=u.value;return e!==null&&e.clientWidth>0&&e.clientHeight>0}function He(){let e=u.value;return Ie()&&e!==null&&e.scrollHeight>e.clientHeight+1}function De(e,o={}){return mt(N.get(e),o)}function mt(e,o){let i=u.value;if(i===null||e===void 0||!i.contains(e)||i.clientHeight<=0)return false;O+=1,_e();let v=i.getBoundingClientRect(),A=e.getBoundingClientRect(),_=o.block??"center",H;_==="start"?H=i.scrollTop+A.top-v.top:_==="end"?H=i.scrollTop+A.bottom-v.bottom:_==="nearest"?A.top>=v.top&&A.bottom<=v.bottom?H=i.scrollTop:A.top<v.top?H=i.scrollTop+A.top-v.top:H=i.scrollTop+A.bottom-v.bottom:H=j({currentScrollTop:i.scrollTop,scrollHeight:i.scrollHeight,targetHeight:A.height,targetTop:A.top,viewportHeight:i.clientHeight,viewportTop:v.top});let ie=Math.max(0,i.scrollHeight-i.clientHeight),te=Math.min(ie,Math.max(0,H));g$1=void 0;let pe=o.behavior??"auto";return ze(te,pe),i.scrollTo?.({top:te,behavior:pe}),i.scrollTop!==te&&(i.scrollTop=te),b=i.scrollTop,$=false,Te(),true}function kt(e){let o=u.value;if(o===null||e===void 0||!o.contains(e)||o.clientHeight<=0)return null;let i=e.getBoundingClientRect(),v=o.scrollTop+i.top-o.getBoundingClientRect().top+i.height/2,A=o.clientHeight/2;return {older:v<A-1,newer:o.scrollHeight-v<A-1}}function an(){return kt(U)}function sn(e){return kt(N.get(e))}function ln(){fe.clear();}function dn(){X=true,ce.value=false;}function un(){X=false,xe();}function cn(e,o){let i=N.get(e);if(i!==o){if(i!==void 0&&(M?.unobserve(i),i.style.removeProperty("--im-thread-placeholder-play-state"),C$1.hasTarget(i)||c?.unobserve?.(i),E.delete(i),m$1.delete(e)),o===null){N.delete(e),m$1.delete(e);return}N.set(e,o),E.set(o,e),typeof globalThis.IntersectionObserver=="function"&&o.style.setProperty("--im-thread-placeholder-play-state","paused"),M?.observe(o),c?.observe(o),xe();}}function fn(e,o,i){let v=V.get(e);if(i===null){V.delete(e);return}V.set(e,{element:i,label:o}),J===e&&i.style.setProperty("opacity",String(W)),v?.element!==i&&(i.dataset.imThreadDateSeparator=e);}return provide(It,{registerLayoutMeasurement:C$1.register,registerMessageNode:cn,registerDateNode:fn,registerEntryUnreadNode:e=>{U=e??void 0;}}),watch(()=>t.contentKey,(e,o)=>{if(e===o)return;Ue();let i=u.value;i!==null&&(b=i.scrollTop);},{flush:"sync"}),watch(()=>t.messageIds,async(e,o)=>{if(e.length===o.length&&e.every((ge,Ge)=>ge===o[Ge]))return;let i=u.value;if(i===null)return;let v=new Set(o);o.length>0&&e.length>0&&!e.some(ge=>v.has(ge))&&Ue();let _=t.contentKey,H=ce.value,ie=o[o.length-1],te=ie===void 0?-1:e.indexOf(ie),pe=te<0?[]:e.slice(te+1).filter(ge=>!v.has(ge)),Ye=pe.some(ge=>t.pendingSendMessageIds.includes(ge)),rt=X||t.loadingNewer||Q||t.loadingOlder,gt=e.length===o.length&&e.every(ge=>v.has(ge))&&e.some((ge,Ge)=>ge!==o[Ge]),xt=o[0],Vt=xt!==void 0&&e.indexOf(xt)>0,Xe;if(r!==void 0&&(Vt||pe.length>0&&rt)){G&&re(i)!==0&&Ze();let ge=i.getBoundingClientRect(),Ge=e.includes(r.id)?p$1([r.id]):[],Tt=Ge[0],gn=Tt!==void 0&&Tt.bottom>ge.top&&Tt.top<ge.bottom?Ge:p$1(e.filter(vn=>v.has(vn)));Xe=p(r,gn,{top:ge.top,bottom:ge.bottom}),Xe!==void 0&&x!==void 0&&!e.includes(x.anchor.id)&&(x.anchor=Xe,x.expectedOffset=Xe.offset);}let mn=O;if(await nextTick(),!(le||t.contentKey!==_||O!==mn)){if(Ye&&t.followNewMessages){ae();return}if(gt&&H&&t.followNewMessages&&t.resizeFollowEnabled&&!t.hasNewer&&!rt){ae();return}if(Vt&&(Q=false,Ve(Xe)),pe.length>0){if(rt){X=false,Ve(Xe),ce.value=false,xe();return}(H||pe.some(Ge=>t.shouldFollowAppendedMessage?.(Ge)===true))&&t.followNewMessages?ae():fe.add(pe);}xe();}},{flush:"pre"}),watch(()=>t.loadingNewer,(e,o)=>{e||!o||!X||se(()=>{t.loadingNewer||(X=false);});},{flush:"pre"}),watch(()=>t.loadingOlder,(e,o)=>{if(e){Q=true;return}!o||!Q||(Q=false);},{flush:"post"}),onMounted(()=>{let e=u.value;if(e!==null){if(b=e.scrollTop,e.addEventListener("scroll",ct,{passive:true}),e.addEventListener("scrollend",nt,{passive:true}),e.addEventListener("touchstart",n,{passive:true}),e.addEventListener("touchmove",d,{passive:true}),e.addEventListener("touchend",l,{passive:true}),e.addEventListener("touchcancel",l,{passive:true}),e.addEventListener("wheel",y,{passive:true}),e.addEventListener("pointerdown",I,{passive:true}),e.addEventListener("pointermove",D,{passive:true}),e.addEventListener("pointerup",Y,{passive:true}),e.addEventListener("pointercancel",Y,{passive:true}),e.addEventListener("keydown",me),typeof globalThis.ResizeObserver=="function"){c=new globalThis.ResizeObserver(o=>{if(le||u.value===null)return;C$1.resized(o.map(v=>v.target)),o.some(({target:v})=>v===e||v===k.value||E.has(v))&&Te();}),c.observe(e),k.value!==null&&c.observe(k.value);for(let o of N.values())c.observe(o);C$1.observeTargets();}if(w=e.ownerDocument.fonts,w?.addEventListener("loadingdone",C$1.invalidateAll),typeof globalThis.IntersectionObserver=="function"){M=new globalThis.IntersectionObserver(o=>{for(let i of o){let v=E.get(i.target);if(v===void 0)continue;let A=i.target,_=i.isIntersecting?"running":"paused";A.style.getPropertyValue("--im-thread-placeholder-play-state")!==_&&A.style.setProperty("--im-thread-placeholder-play-state",_),i.isIntersecting?m$1.add(v):m$1.delete(v);}$=true,xe();},{root:e,rootMargin:`${Number.isFinite(t.visibleMargin)?Math.max(0,t.visibleMargin):0}px 0px`});for(let o of N.values())M.observe(o);}xe();}}),onBeforeUnmount(()=>{le=true;let e=u.value;e!==null&&e.removeEventListener("scroll",ct),e!==null&&(e.removeEventListener("scrollend",nt),e.removeEventListener("touchstart",n),e.removeEventListener("touchmove",d),e.removeEventListener("touchend",l),e.removeEventListener("touchcancel",l),e.removeEventListener("wheel",y),e.removeEventListener("pointerdown",I),e.removeEventListener("pointermove",D),e.removeEventListener("pointerup",Y),e.removeEventListener("pointercancel",Y),e.removeEventListener("keydown",me)),Me.cancel(),_e(),Re(),w?.removeEventListener("loadingdone",C$1.invalidateAll),C$1.dispose(),c?.disconnect(),M?.disconnect(),T(),U=void 0;for(let o of N.values())o.style.removeProperty("--im-thread-placeholder-play-state");N.clear(),E.clear(),m$1.clear(),V.clear(),fe.clear();}),h({getViewportElement:()=>u.value,clearNewMessageBadge:ln,clearActiveDate:T,isAtBottom:computed(()=>ce.value),isMeasurable:Ie,isScrollable:He,getMessageCenteringNeeds:sn,newMessageCount:computed(()=>ke.value),prepareHistoryPageAppend:dn,cancelHistoryPageAppend:un,trackRemoteMessageIds:(e,o)=>fe.trackRemote(e,o),scrollToLatest:ae,scrollToMessage:De,scrollToEntryUnread:()=>mt(U,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:an,focusViewport:()=>u.value?.focus({preventScroll:true})}),()=>h$1("div",{ref:u,"data-im-thread-viewport":"",role:"log",tabindex:-1},[h$1("div",{ref:k,"data-im-thread-viewport-content":""},f.default?.())])}});var nn=Symbol("ImThreadSurfaceContext");function Dn(t){if(typeof t.getState!="function")throw new TypeError("ImThreadSurfaceContext.getState \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.actions?.loadOlder!="function")throw new TypeError("ImThreadSurfaceContext.actions.loadOlder \u5FC5\u987B\u662F\u51FD\u6570");if(typeof t.formatDate!="function")throw new TypeError("ImThreadSurfaceContext.formatDate \u5FC5\u987B\u662F\u51FD\u6570");return Object.freeze({...t,actions:Object.freeze({...t.actions})})}function Fn(t){provide(nn,t);}function Et(){let t=inject(nn);if(t===void 0)throw new Error("ImThreadSurface \u9700\u8981\u663E\u5F0F context prop \u6216 provideImThreadSurfaceContext");return t}function jn(t,a){if(t.key!==a.key||t.kind!==a.kind)return false;switch(a.kind){case "message":return t.kind==="message"&&t.message===a.message&&t.firstOfRun===a.firstOfRun;case "system":return t.kind==="system"&&t.message===a.message;case "date-separator":return t.kind==="date-separator"&&t.label===a.label;case "entry-unread":return t.kind==="entry-unread"&&t.count===a.count;case "encryption":return true}}function rn(t,a){if(t===void 0)return a;let h=new Map(t.map(u=>[u.key,u])),f=a.map(u=>{let k=h.get(u.key);return k!==void 0&&jn(k,u)?k:u});return t.length===f.length&&f.every((u,k)=>u===t[k])?t:f}var St=Object.freeze({followThreshold:120,olderPrefetchThreshold:120,visibleReadDelay:300,visibleMargin:8,activeDateOffset:16,activeDateIdleDelay:1500}),Pt=Object.freeze({enabled:true,maxFillPages:8}),Kn=8,_n=160;function qn(t,a){return t?.conversationType===a.conversationType&&t.conversationId===a.conversationId}var Gn=defineComponent({name:"ImThreadSurface",props:{conversation:{type:Object,required:true},context:{type:Object,default:void 0},rendererRegistry:{type:Object,required:true},presentation:{type:Object,default:void 0},readActions:{type:Object,default:void 0},viewportOptions:{type:Object,default:()=>({})},initialViewportOptions:{type:Object,default:()=>({})},hooks:{type:Object,default:void 0}},setup(t,{expose:a$1,slots:h}){let f=t.context??Et(),u=ref(null),k=ref(0),N=ref(false),U=ref(false),E=ref(false),m,V,b,K=ref(false),r=ref(false),g=ref(false),c=false,w,C=ref(true),M=[],$=ot(),q=0,Z=ref(0),le,R=null,O="",J="",W="",X=false,Q=false,F=ref(false),G=ref(""),ye=ref(false),Ee=ot(),ne,s=computed(()=>f.getState()),de=computed(()=>!!s.value.pendingLocationMessageId),Ae=computed(()=>s.value.pageVisible??f.isPageVisible?.()??true),Me=computed(()=>s.value.pageEngaged??f.isPageEngaged?.()??true),B=computed(()=>qn(s.value.activeConversation,t.conversation)),ue=computed(()=>({...St,...t.viewportOptions})),x=computed(()=>{let n=t.initialViewportOptions.maxFillPages??Pt.maxFillPages;return {enabled:t.initialViewportOptions.enabled??Pt.enabled,maxFillPages:Number.isFinite(n)?Math.max(0,Math.floor(n)):Pt.maxFillPages}}),j=computed(()=>!B.value||!s.value.ready?"":`${t.conversation.conversationType}\0${t.conversation.conversationId}`),ce="",ke=computed(n=>{let d=B.value?`${t.conversation.conversationType}\0${t.conversation.conversationId}`:"",l=ce===d?n:void 0;return ce=d,B.value?rn(l,i({messages:s.value.messages,entryUnread:s.value.entryUnread,formatDate:f.formatDate,leadingItems:f.leadingItems?.(),beforeMessageItems:f.beforeMessageItems})):rn(l,[])}),fe=computed(()=>ke.value.flatMap(n=>n.kind==="message"||n.kind==="system"?[n.message.id]:[])),Fe=computed(()=>s.value.messages.filter(n=>(n.status==="pending"||n.status==="uploading"||n.status==="sending")&&f.shouldFollowMessage?.(n)===true).map(n=>n.id));function p(){Ee.cancel(),ne!==void 0&&(clearTimeout(ne),ne=void 0);}function S(n=false){if(p(),ye.value=false,n){u.value?.clearActiveDate(),G.value="";return}ne=setTimeout(()=>{ne=void 0,!ye.value&&(u.value?.clearActiveDate(),G.value="");},_n);}function T(n){if(n===null){S();return}ne!==void 0&&(clearTimeout(ne),ne=void 0),G.value=n.label,ye.value=true;let d=ue.value.activeDateIdleDelay,l=Number.isFinite(d)?Math.max(0,d):St.activeDateIdleDelay;Ee.schedule(()=>S(),l);}async function P(n,d,l,y=true){t.hooks?.beforeAction?.(n);try{let I=await d();return l?.()!==!1&&t.hooks?.afterAction?.(n,I),I}catch(I){throw y&&l?.()!==false&&t.hooks?.onError?.(n,I),I}}function L(n="automatic",d,l=true){return !B.value||s.value.loading||!s.value.hasOlder?Promise.resolve(0):P({kind:"load-older",source:n},()=>f.actions.loadOlder(),d,l)}function ee(){return z()}function z(n,d=true){let l=f.actions.loadNewer,y=s.value.loadingNewer??s.value.loading;return !B.value||y||!s.value.hasNewer||l===void 0?Promise.resolve(0):P({kind:"load-newer"},()=>l(),n,d)}async function re(n){for(let d=0;d<Kn;d+=1){if(!B.value||E.value||U.value||de.value)return;let l=n==="older"?s.value.hasOlder:s.value.hasNewer,y=n==="older"?s.value.olderError:s.value.newerError;if(!l||y!==null||(n==="older"?await L("user-scroll"):await ee())>0)return;let D=n==="older"?s.value.hasOlder:s.value.hasNewer,Y=n==="older"?s.value.olderError:s.value.newerError;if(!D||Y!==null)return}}async function Se(){return !B.value||f.actions.loadNewer===void 0?0:Te({kind:"load-newer"},()=>f.actions.retryNewer?.()??f.actions.loadNewer?.({force:true})??Promise.resolve(0))}async function oe(){return B.value?Te({kind:"retry-older"},()=>f.actions.retryOlder?.()??f.actions.loadOlder({force:true})):0}async function Te(n,d){let l=j.value,y=++q;R=null,W="";let I;try{I=await P(n,d);}catch(D){throw be(l,y)&&(W=l),D}return be(l,y)&&!F.value&&(R=null,Be()),I}async function se(){if(!B.value)return false;let n=j.value;Ue(),Ne();let d=++Z.value;return E.value=false,we(true),X=true,O=n,J=We(Ve()),!await P({kind:"jump-to-latest"},()=>f.actions.jumpToLatest?.()??Promise.resolve(!s.value.isHistoryWindow),()=>he(n,d))||!he(n,d)||(await nextTick(),!he(n,d))?false:(u.value?.scrollToLatest(),N.value=true,g.value=false,xe(),true)}function Re(n=false){let d=u.value,l=d?.getViewportElement();r.value=d?.isScrollable()===true;let y=s.value.entryUnreadNavigation;K.value=y?.state==="located"&&M.includes(y.firstMessageId),F.value&&K.value&&(N.value=true);let I=l==null?0:Math.max(0,l.scrollHeight-l.clientHeight-l.scrollTop);g.value=y!==void 0&&I>50,n&&y!==void 0&&l!==null&&l!==void 0&&l.clientHeight>0&&I>=l.clientHeight&&(N.value=true);}function xe(){let n=f.actions.markConversationRead;if(n===void 0||!Me.value||!B.value||!F.value||U.value||c&&(!C.value||s.value.hasNewer)||w!==void 0||s.value.error!==null)return;let d=j.value,l=n().then(()=>{w===l&&d===j.value&&(c=true);}).catch(y=>{!Q&&w===l&&d===j.value&&t.hooks?.onError?.({kind:"mark-conversation-read"},y);}).finally(()=>{w===l&&(w=void 0);});w=l;}async function lt(){let n=f.actions.loadEntryUnread;if(!B.value||U.value||n===void 0)return "cancelled";Ne();let d=j.value,l=++Z.value;E.value=false;let y=new AbortController;b=y,V=l,U.value=true,we(true),X=true;try{let I=await P({kind:"jump-to-entry-unread"},()=>n({signal:y.signal}),()=>he(d,l));if(!he(d,l))return "cancelled";if(!I||s.value.entryUnread.state!=="located")return "unavailable";let Y=await dt(d,l);return Y&&(N.value=!0),Y?"located":he(d,l)?"unavailable":"cancelled"}catch(I){if(!he(d,l))return "cancelled";throw I}finally{V===l&&(V=void 0,b=void 0,U.value=false);}}async function dt(n,d){await nextTick();for(let l=0;l<60;l+=1){if(!he(n,d))return false;if(u.value?.scrollToEntryUnread())return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(y=>window.requestAnimationFrame(()=>y()));}return false}function ut(n){C.value=n.isAtBottom,k.value=n.newMessageCount,Re(),Be();}function Qe(n,d){return u.value?.scrollToMessage(n,d)??false}function he(n,d){return !Q&&Z.value===d&&j.value===n&&B.value}async function $e(n,d,l,y){for(let I=0;I<60;I+=1){if(!he(n,d))return false;if(Qe(l,y))return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(D=>window.requestAnimationFrame(()=>D()));}return false}async function Ze(n,d){for(let l=0;l<60;l+=1){if(!n())return false;if(u.value?.isMeasurable()&&u.value.getMessageCenteringNeeds(d)!=null)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(y=>window.requestAnimationFrame(()=>y()));}return false}async function ct(n){let d=()=>!n()||!(s.value.loading||s.value.loadingOlder||s.value.loadingNewer);return d()||await new Promise(l=>{let y=watch(d,I=>{I&&(y(),l());},{flush:"sync"});}),await nextTick(),await nextTick(),n()}async function ze(n,d,l){let y=u.value;if(y===null||!y.isMeasurable())return false;let I=0,D="older",Y=()=>he(n,d),me=async ae=>{let Ie=0,He=ae==="older"?s.value.olderError:s.value.newerError,De=He===void 0?s.value.error:He;if(De!=null)throw De;if(ae==="older")Ie=await L("automatic",Y,false);else {y.prepareHistoryPageAppend();try{Ie=await z(Y,!1);}catch(mt){throw Y()&&y.cancelHistoryPageAppend(),mt}Ie<=0&&Y()&&!s.value.hasNewer&&y.cancelHistoryPageAppend();}return I+=1,await nextTick(),await nextTick(),Y()};for(;he(n,d)&&I<x.value.maxFillPages&&y.isMeasurable();){if(!await ct(Y))return false;let ae=y.getMessageCenteringNeeds(l);if(ae===null)return false;let Ie=!s.value.hasOlder,He=!s.value.hasNewer||f.actions.loadNewer===void 0,De=ae.older&&ae.newer&&!Ie&&!He?D:ae.older&&!Ie?"older":ae.newer&&!He?"newer":void 0;if(De===void 0)break;if(D=De==="older"?"newer":"older",!await me(De))return false}return he(n,d)}async function Je(n,d={behavior:"auto",block:"center"}){if(!B.value||n==="")return {ok:false,reason:"cancelled"};let l=j.value,y=E.value;Ue(),Ne();let I=y||le!==void 0||(s.value.loadingOlder??s.value.loading)||(s.value.loadingNewer??s.value.loading),D=++Z.value;E.value=true;let Y=new AbortController;m=Y,we(true),X=true,O=l,J=We(Ve());let me=()=>he(l,D);try{if(I&&f.actions.loadAround!==void 0||!fe.value.includes(n)){let Ie=f.actions.loadAround;if(Ie===void 0)return {ok:!1,reason:"anchor-unavailable"};let He={};le=He;try{let De=await P({kind:"locate-message",messageId:n},()=>Ie(n,{signal:Y.signal}),me,!1);if(!me())return {ok:!1,reason:"cancelled"};if(!De)return {ok:!1,reason:"not-visible"}}finally{le===He&&(le=void 0);}}return await nextTick(),await nextTick(),!await Ze(me,n)||!await ze(l,D,n)?{ok:!1,reason:me()?"not-visible":"cancelled"}:await $e(l,D,n,d)?{ok:!0}:{ok:!1,reason:me()?"not-visible":"cancelled"}}catch(ae){return me()?a(ae):{ok:false,reason:"cancelled"}}finally{m===Y&&(m=void 0),Z.value===D&&(E.value=false);}}async function _e(n,d){return (await Je(n,d)).ok}function qe(){$.cancel();}function Ce(){if(!F.value){qe();return}let n=t.readActions;if(n===void 0&&f.actions.markVisibleMessages===void 0){qe();return}let d=Number.isFinite(ue.value.visibleReadDelay)?Math.max(0,ue.value.visibleReadDelay):St.visibleReadDelay;$.schedule(()=>{if(!B.value||!Me.value)return;xe();let l=f.actions.markVisibleMessages;if(l!==void 0){let D=M;l(D).catch(Y=>{t.hooks?.onError?.({kind:"visible-range",messageIds:D},Y);});return}if(n===void 0)return;let y=M[M.length-1];if(y===void 0)return;let I=n.resolveTarget===void 0?y:n.resolveTarget(y);I!=null&&Promise.resolve(n.markRead(I)).catch(D=>{t.hooks?.onError?.({kind:"visible-range",messageIds:M},D);});},d);}function ft(n){M=Object.freeze([...n]),Re();let d={kind:"visible-range",messageIds:M};t.hooks?.beforeAction?.(d);try{f.actions.onVisibleRange?.(M),t.hooks?.afterAction?.(d,void 0);}catch(l){throw t.hooks?.onError?.(d,l),l}F.value?Ce():Be();}function be(n,d){return !Q&&q===d&&j.value===n&&!X&&!de.value}function et(n,d){be(n,d)&&(O=n,J=We(Ve()),F.value=true,Re(),xe(),Ce());}function Ve(){return s.value.entryUnreadNavigation===void 0?s.value.entryUnread:{state:"none"}}function We(n){return n.state!=="located"?n.state:`${n.state}:${n.firstMessageId}`}async function tt(n,d,l){for(let y=0;y<60;y+=1){if(!be(n,d))return false;if(u.value?.scrollToMessage(l,{behavior:"auto",block:"center"})===true)return true;await nextTick(),typeof window<"u"&&typeof window.requestAnimationFrame=="function"&&await new Promise(D=>window.requestAnimationFrame(()=>D()));}return false}function Be(){let n=j.value,d=We(Ve());if(n===""||s.value.loading||E.value||de.value||s.value.error!==null&&s.value.messages.length===0||O===n&&(J===d||J.startsWith("located:")||X)||W===n||R!==null)return;if(!x.value.enabled){O=n,J=d,F.value=true,Ce();return}let l=++q;X=false,F.value=false;let y=(async()=>{if(await nextTick(),!be(n,l))return;let I=u.value;if(I===null||!I.isMeasurable())return;let D=Ve();if(D.state==="located"&&!fe.value.includes(D.firstMessageId))return;let Y=D.state==="located"?await tt(n,l,D.firstMessageId):false;if(D.state==="located"&&!Y)return;Y||I.scrollToLatest();let me=0;for(;be(n,l)&&me<x.value.maxFillPages&&s.value.error===null&&(s.value.hasOlder||s.value.hasNewer&&f.actions.loadNewer!==void 0)&&I.isMeasurable()&&!I.isScrollable();){if(s.value.hasNewer&&f.actions.loadNewer!==void 0&&(s.value.messages.length===0||!s.value.hasOlder)){let Ie=Z.value;I.prepareHistoryPageAppend();try{await ee(),await nextTick();}finally{j.value===n&&Z.value===Ie&&(q===l||X)&&I.cancelHistoryPageAppend();}}else await L();if(!be(n,l)||(me+=1,await nextTick(),await nextTick(),!I.isMeasurable()))return}if(!be(n,l)||!I.isMeasurable())return;let ae=Ve();if(ae.state==="located"){if(!fe.value.includes(ae.firstMessageId)||!await tt(n,l,ae.firstMessageId))return}else (me>0||Y)&&I.scrollToLatest();await nextTick(),et(n,l);})().catch(()=>{be(n,l)&&(W=n);}).finally(()=>{R===y&&(R=null);});R=y;}function we(n,d=false){q+=1,R=null,X=false,F.value=n,n||(O="",J="",d||(W="")),qe();}function Ue(){b!==void 0&&(Z.value+=1,b.abort(),b=void 0,V=void 0,U.value=false);}function Ne(){!E.value&&m===void 0||(Z.value+=1,m?.abort(),m=void 0,E.value=false);}function je(){if(Re(true),Ue(),Ne(),de.value&&f.actions.cancelMessageLocation?.(),X=true,F.value)return;let n=j.value;q+=1,R=null,O=n,F.value=true,Ce();}let nt=Object.freeze({getViewportElement:()=>u.value?.getViewportElement()??null,loadOlder:L,retryOlder:oe,loadNewer:ee,retryNewer:Se,jumpToLatest:se,jumpToEntryUnread:lt,scrollToMessage:Qe,locateMessage:_e,locateMessageDetailed:Je,focusViewport:()=>u.value?.focusViewport()});return a$1(nt),watch(Me,n=>{n&&F.value?Ce():qe();}),watch([()=>s.value.activeRemoteMessageRevision??0,u,j],()=>{let n=u.value;if(n===null||!B.value)return;let d=f.actions.drainActiveRemoteMessageIds?.()??[];n.trackRemoteMessageIds(d,{isAtBottom:C.value,isHistoryWindow:s.value.isHistoryWindow,isPageVisible:Ae.value})&&(C.value=false);},{flush:"post"}),watch(()=>s.value.pendingLocationMessageId??"",n=>{(n!==""||E.value)&&(Ne(),Z.value+=1,E.value=false),n!==""&&(Ue(),F.value||we(false));},{flush:"sync"}),watch([j,()=>s.value.loading,()=>s.value.error,()=>fe.value.length,()=>s.value.hasOlder,()=>We(Ve()),x,()=>s.value.hasNewer,de],([n,d,l,y,,I],[D,,,Y,,me])=>{if(n!==D&&(Ue(),Ne(),Z.value+=1,E.value=false,le=void 0,we(false),S(true),u.value?.clearNewMessageBadge(),k.value=0,C.value=true,M=[],N.value=false,K.value=false,r.value=false,g.value=false,U.value=false,V=void 0,c=false,w=void 0),n!==""&&n===D&&Y!==void 0&&Y>0&&y===0&&(s.value.hasOlder||s.value.hasNewer)&&F.value&&we(false,true),n!==""&&n===D&&I!==me&&!J.startsWith("located:")&&!X&&I.startsWith("located:")&&(O="",J="",F.value=false),n===""){we(false);return}if(l!==null&&s.value.messages.length===0){F.value||we(false,true);return}d||Be();},{flush:"post",immediate:true}),onBeforeUnmount(()=>{Q=true,Ue(),Ne(),Z.value+=1,we(false),S(true);}),()=>{let n={conversation:t.conversation,state:s.value,items:ke.value,actions:nt,initialViewportSettled:j.value!==""&&(s.value.messages.length===0?!s.value.loading&&s.value.error===null&&!s.value.hasOlder&&!s.value.hasNewer:F.value&&O===j.value)},d=[h.header?.(n),h["before-list"]?.(n)];if(!B.value)d.push(h.unsupported?.(n)??h$1("div",{"data-im-thread-unsupported":""}));else if(!s.value.ready&&s.value.loading)d.push(h.loading?.(n)??h$1("div",{"data-im-thread-loading":""}));else if(s.value.error!==null&&s.value.messages.length===0)d.push(h.error?.(n)??h$1("div",{"data-im-thread-error":""}));else if(s.value.ready&&s.value.messages.length===0&&!s.value.hasOlder&&!s.value.hasNewer)d.push(h.empty?.(n)??h$1("div",{"data-im-thread-empty":""}));else {let l=h$1(Rt,{ref:u,messageIds:fe.value,contentKey:`${t.conversation.conversationType}\0${t.conversation.conversationId}`,loadingOlder:s.value.loadingOlder??s.value.loading,hasNewer:s.value.hasNewer,loadingNewer:s.value.loadingNewer??s.value.loading,followThreshold:ue.value.followThreshold,olderPrefetchThreshold:ue.value.olderPrefetchThreshold,visibleMargin:ue.value.visibleMargin,activeDateOffset:ue.value.activeDateOffset,activeDateEnabled:h["active-date"]!==void 0,resizeFollowEnabled:F.value&&!U.value&&!E.value&&!de.value,followNewMessages:Ae.value&&!U.value&&!E.value&&!de.value,shouldFollowAppendedMessage:y=>{let I=s.value.messages.find(D=>D.id===y);return I===void 0?false:f.shouldFollowMessage?.(I)===true},pendingSendMessageIds:Fe.value,onReachStart:()=>{re("older").catch(()=>{});},onReachEnd:()=>{re("newer").catch(()=>{});},onSettled:ut,onUserScroll:je,onActiveDateChange:T,onVisibleRange:ft,onNewMessageCount:y=>{k.value=y;}},{default:()=>[h["viewport-before"]?.(n),h$1(Mt,{items:ke.value,rendererRegistry:t.rendererRegistry,presentation:t.presentation,readActions:t.readActions},{item:h.item,"date-separator":h["date-separator"],"entry-unread":h["entry-unread"],encryption:h.encryption,system:h.system,message:h.message,"recalled-message":h["recalled-message"],"deleted-message":h["deleted-message"],"unsupported-body":h["unsupported-body"]}),h["viewport-after"]?.(n)]});d.push(h$1("div",{"data-im-thread-viewport-shell":""},[h["active-date"]?.({label:G.value,visible:ye.value&&G.value!==""}),l,h["entry-unread-navigation"]?.({...n,count:s.value.entryUnreadNavigation?.state==="none"?0:s.value.entryUnreadNavigation?.count??0,loading:U.value,visible:n.initialViewportSettled&&!N.value&&!K.value&&!s.value.isHistoryWindow&&s.value.entryUnreadNavigation!==void 0&&s.value.entryUnreadNavigation.state!=="none"&&s.value.entryUnreadNavigation.count>0&&(r.value||s.value.hasOlder)})])),s.value.error!==null&&d.push(h.error?.(n)??h$1("div",{"data-im-thread-error":""}));}return d.push(h["after-list"]?.(n),h["jump-to-latest"]?.({...n,count:k.value,visible:g.value||!C.value||s.value.isHistoryWindow}),h["context-menu"]?.(n),h.composer?.(n)),h$1("section",{"data-im-thread-surface":"","data-conversation-type":t.conversation.conversationType,"data-conversation-id":t.conversation.conversationId},d)}}});function zn(t){let a=new Map;for(let f of t){if(a.has(f.kind))throw new Error(`\u6D88\u606F renderer kind \u91CD\u590D\u6CE8\u518C\uFF1A${f.kind}`);a.set(f.kind,f.component);}let h=Object.freeze([...a.keys()]);return Object.freeze({kinds:h,resolve:f=>a.get(f)})}var $n=140,Jn=120;function yt(t,a){if(t.width<=0||t.height<=0)return 0;let h=Math.max(0,Math.min(t.right,a.right)-Math.max(t.left,a.left)),f=Math.max(0,Math.min(t.bottom,a.bottom)-Math.max(t.top,a.top));return Math.min(1,h*f/(t.width*t.height))}function At(t,a){return {x:t.x,y:t.top-a,top:t.top-a,bottom:t.bottom+a,left:t.left,right:t.right,width:t.width,height:t.height+a*2,toJSON:()=>({})}}function Ot(t){let a=Math.max(0,t.scrollIdleMs??$n),h=Math.max(0,t.visibilityDwellMs??Jn),f=Math.min(1,Math.max(0,t.minimumIntersectionRatio??.01)),u=Math.max(0,t.revealMarginPx??0),k=Math.max(0,t.preloadMarginPx??0),N=Math.max(u,k),U=Math.max(0,t.maxPreloadTargets??Number.POSITIVE_INFINITY),E=Math.max(1,t.maxSettledVisible??Number.POSITIVE_INFINITY),m=new Map,V=new Map,b=reactive(new Set),K=new Set,r=new Set,g=[],c=null,w=null,C=null,M=false,$=false,q=false,Z=false,le=new Map,R=0,O=false;function J(){R+=1,O=false,le.clear();}function W(p){let S=[...p].filter(([P,L])=>m.get(P)===L);if(S.length===0)return;let T=Ee();ne(true,T,S),Ae(T,S);}function X(p){if(!t.batchRegistration){W(p);return}for(let[T,P]of p)le.set(T,P);if(O)return;O=true;let S=R;nextTick(()=>{if(q||S!==R)return;O=false;let T=[...le];le.clear(),W(T),x();});}let Q,F;function G(){Q!==void 0&&clearTimeout(Q),Q=void 0;}function ye(){F!==void 0&&clearTimeout(F),F=void 0;}function Ee(){let p,S=new Map;return {getRootRect(){return p===void 0&&(p=c?.getBoundingClientRect()??null),p},getElementRect(T){let P=S.get(T);return P===void 0&&(P=T.getBoundingClientRect(),S.set(T,P)),P}}}function ne(p=false,S=Ee(),T=m){if(!p&&w!==null||c===null)return;let P=S.getRootRect();if(P===null)return;let L=At(P,N);for(let[ee,z]of T){let re=S.getElementRect(ee);z.ratio=yt(re,P),z.intersecting=z.ratio>0,z.revealIntersecting=N>0?yt(re,L)>0:z.intersecting&&z.ratio>=f;}}function s(p){return p.intersecting&&p.ratio>=f}function de(p){let S=V.get(p.key);return S!==void 0&&m.get(S)===p}function Ae(p=Ee(),S=m){let T=[];for(let[P,L]of S)if(!(!L.revealIntersecting||b.has(L.key))){if(N>u){if(u===0&&!s(L))continue;if(u>0){let ee=p.getRootRect();if(ee===null||yt(p.getElementRect(P),At(ee,u))<=0)continue}}T.push(L);}for(let P of T)!de(P)||b.has(P.key)||(b.add(P.key),t.onRevealed?.(P.item));}function Me(p,S=false){let T=new Set(p.map(L=>L.key));if(!(!(T.size!==r.size||[...T].some(L=>!r.has(L)))&&!S)){r.clear();for(let L of T)r.add(L);t.onSettledVisibleChange?.(p.map(L=>L.item));}}function B(p,S=false){!S&&p.length===g.length&&p.every((T,P)=>T.key===g[P]?.key&&T.item===g[P]?.item)||(g=p,t.onSettledPreloadChange?.(p.map(T=>T.item)));}function ue(){if(q||M)return;let p=$;$=false;let S=R,T=c,P=()=>!q&&!M&&S===R&&c===T,L=Ee();ne(false,L);let ee=L.getRootRect(),z=ee===null?0:(ee.top+ee.bottom)/2,re=[...m.entries()].filter(([,oe])=>s(oe)).map(([oe,Te])=>({target:Te,rect:L.getElementRect(oe)})).sort((oe,Te)=>Math.abs((oe.rect.top+oe.rect.bottom)/2-z)-Math.abs((Te.rect.top+Te.rect.bottom)/2-z)).slice(0,E).map(({target:oe})=>oe),Se;if(t.onSettledPreloadChange!==void 0&&ee!==null){let oe=At(ee,k);Se=[...m.entries()].filter(([,se])=>se.revealIntersecting).map(([se,Re])=>({target:Re,rect:L.getElementRect(se)})).filter(({target:se,rect:Re})=>s(se)||k>0&&yt(Re,oe)>0).sort((se,Re)=>Number(s(Re.target))-Number(s(se.target))||Math.abs((se.rect.top+se.rect.bottom)/2-z)-Math.abs((Re.rect.top+Re.rect.bottom)/2-z)).slice(0,U).map(({target:se})=>se);}if(Ae(L),!!P()&&(Me(re.filter(de),p),!!P())){Se!==void 0&&B(Se.filter(de),p);for(let oe of re){if(!P())return;!de(oe)||K.has(oe.key)||(K.add(oe.key),t.onActivated?.(oe.item));}}}function x(){q||M||(ye(),F=setTimeout(()=>{F=void 0,ue();},h));}function j(){q||($=true,ce(true),B([]),ne(),Ae(),Me([]),ye(),G(),Q=setTimeout(()=>{Q=void 0,ce(false),x();},a));}function ce(p){M!==p&&(M=p,t.onScrollingChange?.(p));}function ke(){c?.removeEventListener("scroll",j),w?.disconnect(),C?.disconnect(),w=null,C=null,c=null;}function fe(p=true){if(q)return;let S=t.getRoot();if(!(S===c&&c!==null)){if(B([]),ke(),c=S,c===null){p&&!Z&&(Z=true,Promise.resolve().then(()=>{Z=false,q||(fe(false),x());}));return}if(c.addEventListener("scroll",j,{passive:true}),typeof IntersectionObserver<"u"){w=new IntersectionObserver(T=>{for(let P of T){let L=m.get(P.target);L!==void 0&&(L.intersecting=P.isIntersecting,L.ratio=P.intersectionRatio,N===0&&(L.revealIntersecting=P.isIntersecting&&P.intersectionRatio>=f));}Ae(),x();},{root:c,threshold:[0,f,1]}),N>0&&(C=new IntersectionObserver(T=>{for(let P of T){let L=m.get(P.target);L!==void 0&&(L.revealIntersecting=P.isIntersecting);}Ae(),x();},{root:c,rootMargin:`${N}px 0px`,threshold:0}));for(let T of m.keys())w.observe(T);for(let T of m.keys())C?.observe(T);}X(m);}}function Fe(p){B(g.filter(S=>S.key!==p)),b.delete(p),K.delete(p),r.delete(p);}return {register(p,S){if(q)return;let T=t.getKey(p),P=b.has(T),L=K.has(T),ee=S===null?void 0:m.get(S);ee!==void 0&&ee.key!==T&&(V.delete(ee.key),m.delete(S),Fe(ee.key));let z=V.get(T);if(z!==void 0&&z!==S&&(w?.unobserve(z),C?.unobserve(z),m.delete(z),V.delete(T)),S===null){z!==void 0&&(w?.unobserve(z),C?.unobserve(z),m.delete(z),V.delete(T)),Fe(T);return}let re=m.get(S);if(re?.key===T&&re.item===p){let Te=c;fe(),c!==Te&&x();return}let Se={item:p,key:T,intersecting:re?.key===T?re.intersecting:false,ratio:re?.key===T?re.ratio:0,revealIntersecting:re?.key===T?re.revealIntersecting:false};m.set(S,Se),V.set(T,S);let oe=c;fe(),c===oe&&(w?.observe(S),C?.observe(S),X([[S,Se]])),P&&t.onRevealed?.(p),L&&de(Se)&&t.onActivated?.(p),x();},isRevealed:p=>b.has(t.getKey(p)),isActivated:p=>K.has(t.getKey(p)),isSettledVisible:p=>r.has(t.getKey(p)),isScrolling:()=>M,notifyScroll:j,refresh(){fe(),J(),W(m),x();},reset(){J(),G(),ye(),ce(false),$=false,Me([]),B([]),ke(),m.clear(),V.clear(),b.clear(),K.clear();},dispose(){q||(J(),G(),ye(),ce(false),$=false,Me([]),B([]),ke(),m.clear(),V.clear(),b.clear(),K.clear(),q=true);}}}function Xn(t){let a=new Map,h=new Map,f=shallowReactive(new Map),u=new Map,k=new Map,N=[],U=false,E=r=>{let g=a.get(r.channel);return g===void 0?r.channel:`${r.channel}\0${g.getKey(r.item)}`},m=Ot({getRoot:t.getRoot,batchRegistration:t.batchRegistration,getKey:r=>r.key,revealMarginPx:t.revealMarginPx,preloadMarginPx:t.preloadMarginPx,minimumIntersectionRatio:t.minimumIntersectionRatio,scrollIdleMs:t.scrollIdleMs,visibilityDwellMs:t.visibilityDwellMs,onScrollingChange:r=>{for(let g of a.values())g.onScrollingChange?.(r);},onRevealed:r=>r.targets.forEach(g=>a.get(g.channel)?.onRevealed?.(g.item)),onActivated:r=>r.targets.forEach(g=>a.get(g.channel)?.onActivated?.(g.item)),onSettledPreloadChange:r=>{let g=r.flatMap(c=>c.targets);for(let[c,w]of a){let C=g.filter(M=>M.channel===c).map(M=>M.item);w.onSettledPreloadChange?.(C.slice(0,Math.max(0,w.maxPreloadTargets??Number.POSITIVE_INFINITY)));}},onSettledVisibleChange:r=>{V(r.flatMap(g=>g.targets));}});function V(r){N=r;for(let[g,c]of a){let w=r.filter(M=>M.channel===g).map(M=>M.item),C=c.maxSettledVisible===void 0?w:w.slice(0,c.maxSettledVisible);c.onSettledVisibleChange?.(C);}}function b(r){let g=u.get(r),c=[];for(let M of a.keys()){let $=g?.get(M);$!==void 0&&c.push($);}let w=f.get(r);if(w!==void 0&&c.length===w.targets.length&&c.every((M,$)=>M===w.targets[$]))return;if(c.length===0)w!==void 0&&(f.delete(r),k.get(w.key)===r&&(k.delete(w.key),m.register(w,null)));else {let M={key:JSON.stringify(c.map(E)),targets:c};w!==void 0&&w.key!==M.key&&k.get(w.key)===r&&k.delete(w.key),f.set(r,M),k.set(M.key,r),m.register(M,r);}let C=N.flatMap(M=>{let $=h.get(M.channel)?.get(a.get(M.channel).getKey(M.item));return $===void 0?[]:[$.target]});(C.length!==N.length||C.some((M,$)=>M!==N[$]))&&V(C);}function K(r){return g=>{if(U)throw new Error("Thread visibility target group \u5DF2\u91CA\u653E");if(a.has(r))throw new Error(`Thread visibility channel \u5DF2\u5B58\u5728: ${r}`);a.set(r,g);let c=shallowReactive(new Map);h.set(r,c);let w=new Map,C=false,M=R=>({channel:r,item:R});function $(R){w.delete(R);let O=u.get(R);O?.delete(r),O?.size===0&&u.delete(R);}function q(){let R=[...w.keys()];c.clear();for(let O of R)$(O);for(let O of R)b(O);g.onScrollingChange?.(false),g.onSettledVisibleChange?.([]),g.onSettledPreloadChange?.([]);}function Z(R,O){let J=c.get(g.getKey(R)),W=J===void 0?void 0:f.get(J.element);return W!==void 0&&O(W)}return {register(R,O){if(C||U)return;let J=g.getKey(R),W=c.get(J);if(O===null){W!==void 0&&(c.delete(J),$(W.element),b(W.element));return}if(W?.target.item===R&&W.element===O){let G=f.get(O);G!==void 0&&m.register(G,O);return}let X=W?.target.item===R?W.target:M(R),Q=w.get(O);Q!==void 0&&Q!==J&&c.delete(Q),W!==void 0&&W.element!==O&&$(W.element),c.set(J,{target:X,element:O}),w.set(O,J);let F=u.get(O);F===void 0&&(F=new Map,u.set(O,F)),F.set(r,X),b(O),W!==void 0&&W.element!==O&&b(W.element);},isRevealed:R=>Z(R,m.isRevealed),isActivated:R=>Z(R,m.isActivated),isSettledVisible:R=>Z(R,m.isSettledVisible),isScrolling:m.isScrolling,notifyScroll:m.notifyScroll,refresh:m.refresh,reset:q,dispose(){C||(q(),C=true,a.delete(r),h.delete(r));}}}}return {createFactory:K,refresh:m.refresh,dispose(){if(!U){for(let r of f.values())m.register(r,null);f.clear(),u.clear(),k.clear();for(let r of a.values())r.onSettledPreloadChange?.([]);h.clear(),a.clear(),m.dispose(),U=true;}}}}function Zn(t){let a=vt();if(a===void 0)throw new Error("useImThreadLayoutMeasurement requires an ImThreadViewport");let h=a.registerLayoutMeasurement(t);return onBeforeUnmount(h.dispose),h}export{wt as ImThreadBodySwitch,Mt as ImThreadItems,Gn as ImThreadSurface,Rt as ImThreadViewport,Dn as createImThreadSurfaceContext,zn as createMessageRendererRegistry,Xn as createThreadVisibilityTargetGroup,Ot as createThreadVisibilityTargets,Fn as provideImThreadSurfaceContext,pn as useImText,Zn as useImThreadLayoutMeasurement,Et as useImThreadSurfaceContext,bn as useOptionalImThreadReadActions};
|
|
1
|
+
import{ImThreadBodySwitch as t}from"./modules/im-chat-kit/src/vue/thread/ImThreadBodySwitch.js";import{ImThreadItems as r}from"./modules/im-chat-kit/src/vue/thread/ImThreadItems.js";import{ImThreadSurface as e}from"./modules/im-chat-kit/src/vue/thread/ImThreadSurface.js";import{ImThreadViewport as m}from"./modules/im-chat-kit/src/vue/thread/ImThreadViewport.js";import{createImThreadSurfaceContext as i,provideImThreadSurfaceContext as s,useImThreadSurfaceContext as o}from"./modules/im-chat-kit/src/vue/thread/thread-surface-context.js";import{createMessageRendererRegistry as a}from"./modules/im-chat-kit/src/vue/thread/message-renderer-registry.js";import{createThreadVisibilityTargetGroup as d}from"./modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js";import{createThreadVisibilityTargets as h}from"./modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js";import{useImText as c}from"./modules/im-chat-kit/src/i18n/use-im-text.js";import{useImThreadLayoutMeasurement as u}from"./modules/im-chat-kit/src/vue/thread/use-im-thread-layout-measurement.js";import{useOptionalImThreadReadActions as l}from"./modules/im-chat-kit/src/vue/thread/thread-read-actions-context.js";export{t as ImThreadBodySwitch,r as ImThreadItems,e as ImThreadSurface,m as ImThreadViewport,i as createImThreadSurfaceContext,a as createMessageRendererRegistry,d as createThreadVisibilityTargetGroup,h as createThreadVisibilityTargets,s as provideImThreadSurfaceContext,c as useImText,u as useImThreadLayoutMeasurement,o as useImThreadSurfaceContext,l as useOptionalImThreadReadActions};
|