diff --git a/packages/tsdaodaobase/src/Components/Conversation/index.tsx b/packages/tsdaodaobase/src/Components/Conversation/index.tsx index 1e3c5a1..eab57ea 100644 --- a/packages/tsdaodaobase/src/Components/Conversation/index.tsx +++ b/packages/tsdaodaobase/src/Components/Conversation/index.tsx @@ -1,4 +1,4 @@ -import { Channel, ChannelTypeGroup, ChannelTypePerson, ConversationAction, WKSDK, Mention, Message, MessageContent, Reminder, ReminderType, Reply,MessageText } from "wukongimjssdk"; +import { Channel, ChannelTypeGroup, ChannelTypePerson, ConversationAction, WKSDK, Mention, Message, MessageContent, Reminder, ReminderType, Reply, MessageText } from "wukongimjssdk"; import React, { Component, HTMLProps } from "react"; import Provider from "../../Service/Provider"; import ConversationVM from "./vm"; @@ -6,7 +6,7 @@ import "./index.css" import { MessageWrap } from "../../Service/Model"; import WKApp from "../../App"; import { RevokeCell } from "../../Messages/Revoke"; -import { MessageContentTypeConst } from "../../Service/Const"; +import { MessageContentTypeConst } from "../../Service/Const"; import ConversationContext from "./context"; import MessageInput, { MentionModel, MessageInputContext } from "../MessageInput"; import ContextMenus, { ContextMenusContext } from "../ContextMenus"; @@ -258,7 +258,7 @@ export class Conversation extends Component implements Conver } this.scrollTimer = window.setTimeout(() => { this.handleScrollEnd() - }, 500) + }, 500) this.contextMenusContext.hide() const targetScrollTop = e.target.scrollTop; const scrollOffsetTop = e.target.scrollHeight - (targetScrollTop + e.target.clientHeight); @@ -284,6 +284,14 @@ export class Conversation extends Component implements Conver } + // 判断内容是否满一屏幕 + isFullScreen(viewport: HTMLElement | null) { + if (!viewport) { + return false + } + return viewport.scrollHeight > viewport.clientHeight + } + handleScrollEnd() { this.uploadReadedIfNeed() } @@ -421,7 +429,7 @@ export class Conversation extends Component implements Conver } } // 所有可见的消息 - allVisiableMessages(vp: HTMLElement | null):Array { + allVisiableMessages(vp: HTMLElement | null): Array { const visiableMessages = new Array() if (!this.vm.messages || this.vm.messages.length === 0) { return visiableMessages @@ -433,7 +441,7 @@ export class Conversation extends Component implements Conver if (!viewport) { return visiableMessages } - + const targetScrollTop = viewport.scrollTop; for (let index = 0; index < this.vm.messages.length; index++) { const message = this.vm.messages[index]; @@ -505,7 +513,7 @@ export class Conversation extends Component implements Conver { return this.vm.onDownArrow() }} onReminder={(reminder) => { - return this.vm.syncMessages(reminder.messageSeq,()=>{ + return this.vm.syncMessages(reminder.messageSeq, () => { const newMessageWrap = this.vm.findMessageWithMessageSeq(reminder.messageSeq) if (newMessageWrap) { newMessageWrap.locateRemind = true // 设置为闪烁提醒 diff --git a/packages/tsdaodaobase/src/Components/Conversation/vm.ts b/packages/tsdaodaobase/src/Components/Conversation/vm.ts index 4253e96..c907aa6 100644 --- a/packages/tsdaodaobase/src/Components/Conversation/vm.ts +++ b/packages/tsdaodaobase/src/Components/Conversation/vm.ts @@ -1,4 +1,4 @@ -import { Channel, ChannelTypeGroup, ChannelTypePerson, ConversationAction, WKSDK, Message, MessageContent, MessageStatus, Subscriber, Conversation, MessageExtra, CMDContent, PullMode, MessageContentType, ChannelInfo } from "wukongimjssdk"; +import { Channel, ChannelTypeGroup, ChannelTypePerson, ConversationAction, WKSDK, Message, MessageContent, MessageStatus, Subscriber, Conversation, MessageExtra, CMDContent, PullMode, MessageContentType, ChannelInfo, ConversationListener } from "wukongimjssdk"; import WKApp from "../../App"; import { SyncMessageOptions } from "../../Service/DataSource/DataProvider"; import { MessageWrap } from "../../Service/Model"; @@ -40,6 +40,7 @@ export default class ConversationVM extends ProviderListener { messageListener!: MessageListener // 消息监听 cmdListener!: MessageListener // cmd消息监听 messageStatusListener!: MessageStatusListener // 消息状态监听 + conversationListener!: ConversationListener // 会话监听 lastMessage?: MessageWrap // 此会话的最后一条最新的消息 lastLocalMessageElement?: HTMLElement | null // 最后一条消息的dom元素 private _showScrollToBottomBtn?: boolean = false // 是否显示底部按钮 @@ -253,6 +254,17 @@ export default class ConversationVM extends ProviderListener { didMount(): void { + this.conversationListener = (conversation: Conversation, action: ConversationAction) => { + if(!conversation.channel.isEqual(this.channel)) { + return + } + if(action == ConversationAction.update) { + console.log("update-2--->",conversation.unread) + this.unreadCount = conversation.unread + } + } + WKSDK.shared().conversationManager.addConversationListener(this.conversationListener) + // 消息监听 this.messageListener = (message: Message) => { if (!message.channel.isEqual(this.channel)) { @@ -303,8 +315,12 @@ export default class ConversationVM extends ProviderListener { WKApp.endpointManager.setMethod(EndpointID.clearChannelMessages, (channel: Channel) => { if (channel.isEqual(this.channel)) { + if(this.messagesOfOrigin.length > 0) { + this.browseToMessageSeq = this.messagesOfOrigin[this.messagesOfOrigin.length-1].messageSeq + } this.messagesOfOrigin = [] this.messages = [] + this.lastMessage = undefined this.notifyListener() } }, {}) @@ -381,6 +397,7 @@ export default class ConversationVM extends ProviderListener { WKSDK.shared().chatManager.removeCMDListener(this.cmdListener) TypingManager.shared.removeTypingListener(this.typingListener) + WKSDK.shared().conversationManager.removeConversationListener(this.conversationListener) } @@ -664,13 +681,14 @@ export default class ConversationVM extends ProviderListener { this.lastMessage = message change = true } - if (change) { + if (change && this.showScrollToBottomBtn) { this.refreshNewMsgCount() } } // 刷新新消息数量 refreshNewMsgCount() { + const oldUnreadCount = this.unreadCount if (this.browseToMessageSeq == 0) { this.unreadCount = 0 @@ -689,6 +707,7 @@ export default class ConversationVM extends ProviderListener { if (oldUnreadCount != this.unreadCount) { const conversation = WKSDK.shared().conversationManager.findConversation(this.channel) if (conversation) { + console.log("this.unreadCount--->",this.unreadCount) conversation.unread = this.unreadCount WKSDK.shared().conversationManager.notifyConversationListeners(conversation, ConversationAction.update) } diff --git a/packages/tsdaodaobase/src/Components/ConversationList/index.tsx b/packages/tsdaodaobase/src/Components/ConversationList/index.tsx index 7ec38d6..637645c 100644 --- a/packages/tsdaodaobase/src/Components/ConversationList/index.tsx +++ b/packages/tsdaodaobase/src/Components/ConversationList/index.tsx @@ -21,6 +21,7 @@ export interface ConversationListProps { conversations: ConversationWrap[] select?: Channel onClick?: (conversation: ConversationWrap) => void + onClearMessages?: (channel: Channel) => void } export interface ConversationListState { @@ -234,14 +235,9 @@ export default class ConversationList extends Component { // WKApp.routeMain.replaceToRoot() } - componentWillUnmount() {} + componentWillUnmount() { } + + + + updateConversation(channel: Channel) { + const conversation = WKSDK.shared().conversationManager.findConversation(channel) + if(conversation) { + conversation.unread = 0 + conversation.lastMessage = undefined + } + } render(): ReactNode { return ( @@ -235,6 +248,7 @@ export default class ChatPage extends Component { { vm.selectedConversation = conversation; WKApp.endpoints.showConversation( diff --git a/packages/tsdaodaobase/src/Pages/Chat/vm.ts b/packages/tsdaodaobase/src/Pages/Chat/vm.ts index 14bc53b..5ac2109 100644 --- a/packages/tsdaodaobase/src/Pages/Chat/vm.ts +++ b/packages/tsdaodaobase/src/Pages/Chat/vm.ts @@ -8,6 +8,7 @@ import { ConversationWrap } from "../../Service/Model"; import { ProviderListener } from "../../Service/Provider"; import { animateScroll, scroller } from 'react-scroll'; import { ProhibitwordsService } from "../../Service/ProhibitwordsService"; +import { EndpointID } from "../../Service/Const"; export class ChatVM extends ProviderListener { conversations: ConversationWrap[] = new Array() @@ -182,6 +183,21 @@ export class ChatVM extends ProviderListener { } } + async clearMessages(channel: Channel) { + + const conversationWrap = this.findConversation(channel) + if (!conversationWrap) { + return + } + await WKApp.conversationProvider.clearConversationMessages(conversationWrap.conversation) + conversationWrap.conversation.lastMessage = undefined + conversationWrap.conversation.unread = 0 + WKApp.endpointManager.invoke(EndpointID.clearChannelMessages, channel) + this.sortConversations() + this.notifyListener() + } + + setConnectTitleWithConnectStatus(connectStatus: ConnectStatus) { if (connectStatus === ConnectStatus.Connected) { this.connectTitle = WKApp.config.appName