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 React, { Component, HTMLProps } from "react";
import Provider from "../../Service/Provider"; import Provider from "../../Service/Provider";
import ConversationVM from "./vm"; import ConversationVM from "./vm";
@ -6,7 +6,7 @@ import "./index.css"
import { MessageWrap } from "../../Service/Model"; import { MessageWrap } from "../../Service/Model";
import WKApp from "../../App"; import WKApp from "../../App";
import { RevokeCell } from "../../Messages/Revoke"; import { RevokeCell } from "../../Messages/Revoke";
import { MessageContentTypeConst } from "../../Service/Const"; import { MessageContentTypeConst } from "../../Service/Const";
import ConversationContext from "./context"; import ConversationContext from "./context";
import MessageInput, { MentionModel, MessageInputContext } from "../MessageInput"; import MessageInput, { MentionModel, MessageInputContext } from "../MessageInput";
import ContextMenus, { ContextMenusContext } from "../ContextMenus"; import ContextMenus, { ContextMenusContext } from "../ContextMenus";
@ -258,7 +258,7 @@ export class Conversation extends Component<ConversationProps> implements Conver
} }
this.scrollTimer = window.setTimeout(() => { this.scrollTimer = window.setTimeout(() => {
this.handleScrollEnd() this.handleScrollEnd()
}, 500) }, 500)
this.contextMenusContext.hide() this.contextMenusContext.hide()
const targetScrollTop = e.target.scrollTop; const targetScrollTop = e.target.scrollTop;
const scrollOffsetTop = e.target.scrollHeight - (targetScrollTop + e.target.clientHeight); 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() { handleScrollEnd() {
this.uploadReadedIfNeed() 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>() const visiableMessages = new Array<MessageWrap>()
if (!this.vm.messages || this.vm.messages.length === 0) { if (!this.vm.messages || this.vm.messages.length === 0) {
return visiableMessages return visiableMessages
@ -433,7 +441,7 @@ export class Conversation extends Component<ConversationProps> implements Conver
if (!viewport) { if (!viewport) {
return visiableMessages return visiableMessages
} }
const targetScrollTop = viewport.scrollTop; const targetScrollTop = viewport.scrollTop;
for (let index = 0; index < this.vm.messages.length; index++) { for (let index = 0; index < this.vm.messages.length; index++) {
const message = this.vm.messages[index]; const message = this.vm.messages[index];
@ -505,7 +513,7 @@ export class Conversation extends Component<ConversationProps> implements Conver
<ConversationPositionView onScrollToBottom={async () => { <ConversationPositionView onScrollToBottom={async () => {
return this.vm.onDownArrow() return this.vm.onDownArrow()
}} onReminder={(reminder) => { }} onReminder={(reminder) => {
return this.vm.syncMessages(reminder.messageSeq,()=>{ return this.vm.syncMessages(reminder.messageSeq, () => {
const newMessageWrap = this.vm.findMessageWithMessageSeq(reminder.messageSeq) const newMessageWrap = this.vm.findMessageWithMessageSeq(reminder.messageSeq)
if (newMessageWrap) { if (newMessageWrap) {
newMessageWrap.locateRemind = true // 设置为闪烁提醒 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 WKApp from "../../App";
import { SyncMessageOptions } from "../../Service/DataSource/DataProvider"; import { SyncMessageOptions } from "../../Service/DataSource/DataProvider";
import { MessageWrap } from "../../Service/Model"; import { MessageWrap } from "../../Service/Model";
@ -40,6 +40,7 @@ export default class ConversationVM extends ProviderListener {
messageListener!: MessageListener // 消息监听 messageListener!: MessageListener // 消息监听
cmdListener!: MessageListener // cmd消息监听 cmdListener!: MessageListener // cmd消息监听
messageStatusListener!: MessageStatusListener // 消息状态监听 messageStatusListener!: MessageStatusListener // 消息状态监听
conversationListener!: ConversationListener // 会话监听
lastMessage?: MessageWrap // 此会话的最后一条最新的消息 lastMessage?: MessageWrap // 此会话的最后一条最新的消息
lastLocalMessageElement?: HTMLElement | null // 最后一条消息的dom元素 lastLocalMessageElement?: HTMLElement | null // 最后一条消息的dom元素
private _showScrollToBottomBtn?: boolean = false // 是否显示底部按钮 private _showScrollToBottomBtn?: boolean = false // 是否显示底部按钮
@ -253,6 +254,17 @@ export default class ConversationVM extends ProviderListener {
didMount(): void { 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) => { this.messageListener = (message: Message) => {
if (!message.channel.isEqual(this.channel)) { if (!message.channel.isEqual(this.channel)) {
@ -303,8 +315,12 @@ export default class ConversationVM extends ProviderListener {
WKApp.endpointManager.setMethod(EndpointID.clearChannelMessages, (channel: Channel) => { WKApp.endpointManager.setMethod(EndpointID.clearChannelMessages, (channel: Channel) => {
if (channel.isEqual(this.channel)) { if (channel.isEqual(this.channel)) {
if(this.messagesOfOrigin.length > 0) {
this.browseToMessageSeq = this.messagesOfOrigin[this.messagesOfOrigin.length-1].messageSeq
}
this.messagesOfOrigin = [] this.messagesOfOrigin = []
this.messages = [] this.messages = []
this.lastMessage = undefined
this.notifyListener() this.notifyListener()
} }
}, {}) }, {})
@ -381,6 +397,7 @@ export default class ConversationVM extends ProviderListener {
WKSDK.shared().chatManager.removeCMDListener(this.cmdListener) WKSDK.shared().chatManager.removeCMDListener(this.cmdListener)
TypingManager.shared.removeTypingListener(this.typingListener) TypingManager.shared.removeTypingListener(this.typingListener)
WKSDK.shared().conversationManager.removeConversationListener(this.conversationListener)
} }
@ -664,13 +681,14 @@ export default class ConversationVM extends ProviderListener {
this.lastMessage = message this.lastMessage = message
change = true change = true
} }
if (change) { if (change && this.showScrollToBottomBtn) {
this.refreshNewMsgCount() this.refreshNewMsgCount()
} }
} }
// 刷新新消息数量 // 刷新新消息数量
refreshNewMsgCount() { refreshNewMsgCount() {
const oldUnreadCount = this.unreadCount const oldUnreadCount = this.unreadCount
if (this.browseToMessageSeq == 0) { if (this.browseToMessageSeq == 0) {
this.unreadCount = 0 this.unreadCount = 0
@ -689,6 +707,7 @@ export default class ConversationVM extends ProviderListener {
if (oldUnreadCount != this.unreadCount) { if (oldUnreadCount != this.unreadCount) {
const conversation = WKSDK.shared().conversationManager.findConversation(this.channel) const conversation = WKSDK.shared().conversationManager.findConversation(this.channel)
if (conversation) { if (conversation) {
console.log("this.unreadCount--->",this.unreadCount)
conversation.unread = this.unreadCount conversation.unread = this.unreadCount
WKSDK.shared().conversationManager.notifyConversationListeners(conversation, ConversationAction.update) WKSDK.shared().conversationManager.notifyConversationListeners(conversation, ConversationAction.update)
} }

View File

@ -21,6 +21,7 @@ export interface ConversationListProps {
conversations: ConversationWrap[] conversations: ConversationWrap[]
select?: Channel select?: Channel
onClick?: (conversation: ConversationWrap) => void onClick?: (conversation: ConversationWrap) => void
onClearMessages?: (channel: Channel) => void
} }
export interface ConversationListState { export interface ConversationListState {
@ -234,14 +235,9 @@ export default class ConversationList extends Component<ConversationListProps, C
} }
async onClearMessages(channel: Channel) { async onClearMessages(channel: Channel) {
const conversation = WKSDK.shared().conversationManager.findConversation(channel) if(this.props.onClearMessages) {
if (!conversation) { this.props.onClearMessages(channel)
return
} }
await WKApp.conversationProvider.clearConversationMessages(conversation)
conversation.lastMessage = undefined
WKApp.endpointManager.invoke(EndpointID.clearChannelMessages, channel)
this.setState({})
} }
render() { render() {

View File

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

View File

@ -8,6 +8,7 @@ import { ConversationWrap } from "../../Service/Model";
import { ProviderListener } from "../../Service/Provider"; import { ProviderListener } from "../../Service/Provider";
import { animateScroll, scroller } from 'react-scroll'; import { animateScroll, scroller } from 'react-scroll';
import { ProhibitwordsService } from "../../Service/ProhibitwordsService"; import { ProhibitwordsService } from "../../Service/ProhibitwordsService";
import { EndpointID } from "../../Service/Const";
export class ChatVM extends ProviderListener { export class ChatVM extends ProviderListener {
conversations: ConversationWrap[] = new Array() 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) { setConnectTitleWithConnectStatus(connectStatus: ConnectStatus) {
if (connectStatus === ConnectStatus.Connected) { if (connectStatus === ConnectStatus.Connected) {
this.connectTitle = WKApp.config.appName this.connectTitle = WKApp.config.appName