fix: reddot not remote after clear message

This commit is contained in:
tangtaoit 2024-12-03 08:37:48 +08:00
parent 41dd52904c
commit 1fa8523dfe
5 changed files with 69 additions and 16 deletions

View File

@ -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<ConversationProps> 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<ConversationProps> 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<ConversationProps> implements Conver
}
}
// 所有可见的消息
allVisiableMessages(vp: HTMLElement | null):Array<MessageWrap> {
allVisiableMessages(vp: HTMLElement | null): Array<MessageWrap> {
const visiableMessages = new Array<MessageWrap>()
if (!this.vm.messages || this.vm.messages.length === 0) {
return visiableMessages
@ -433,7 +441,7 @@ export class Conversation extends Component<ConversationProps> 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<ConversationProps> implements Conver
<ConversationPositionView onScrollToBottom={async () => {
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 // 设置为闪烁提醒

View File

@ -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)
}

View File

@ -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<ConversationListProps, C
}
async onClearMessages(channel: Channel) {
const conversation = WKSDK.shared().conversationManager.findConversation(channel)
if (!conversation) {
return
if(this.props.onClearMessages) {
this.props.onClearMessages(channel)
}
await WKApp.conversationProvider.clearConversationMessages(conversation)
conversation.lastMessage = undefined
WKApp.endpointManager.invoke(EndpointID.clearChannelMessages, channel)
this.setState({})
}
render() {

View File

@ -15,6 +15,7 @@ import { Channel, ChannelInfo, WKSDK } from "wukongimjssdk";
import { ChannelInfoListener } from "wukongimjssdk";
import { ChatMenus } from "../../App";
import ConversationContext from "../../Components/Conversation/context";
import { EndpointID } from "../../Service/Const";
export interface ChatContentPageProps {
channel: Channel;
@ -51,6 +52,8 @@ export class ChatContentPage extends Component<
WKSDK.shared().channelManager.removeListener(this.channelInfoListener);
}
render(): React.ReactNode {
const { channel, initLocateMessageSeq } = this.props;
const { showChannelSetting } = this.state;
@ -175,7 +178,17 @@ export default class ChatPage extends Component<any> {
// WKApp.routeMain.replaceToRoot(<ChatContentPage vm={this.vm}></ChatContentPage>)
}
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<any> {
<ConversationList
select={WKApp.shared.openChannel}
conversations={vm.conversations}
onClearMessages={this.vm.clearMessages.bind(this.vm)}
onClick={(conversation: ConversationWrap) => {
vm.selectedConversation = conversation;
WKApp.endpoints.showConversation(

View File

@ -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