feat: 发送消息后聊天列表自动滚动到底部

pull/81/head
moonrailgun 3 years ago
parent 46656c3954
commit 426e3cd712

@ -1,4 +1,5 @@
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import type { SendMessagePayload } from '../model/message';
/** /**
* *
@ -15,6 +16,11 @@ export interface SharedEventMap {
updateNetworkStatus: ( updateNetworkStatus: (
status: 'connected' | 'reconnecting' | 'disconnected' status: 'connected' | 'reconnecting' | 'disconnected'
) => void; ) => void;
/**
*
*/
sendMessage: (payload: SendMessagePayload) => void;
} }
export type SharedEventType = keyof SharedEventMap; export type SharedEventType = keyof SharedEventMap;

@ -20,6 +20,7 @@ import {
} from '../..'; } from '../..';
import { MessageHelper } from '../../utils/message-helper'; import { MessageHelper } from '../../utils/message-helper';
import { ChatConverseType } from '../../model/converse'; import { ChatConverseType } from '../../model/converse';
import { sharedEvent } from '../../event';
function useHandleSendMessage(context: ConverseContext) { function useHandleSendMessage(context: ConverseContext) {
const { converseId } = context; const { converseId } = context;
@ -52,6 +53,7 @@ function useHandleSendMessage(context: ConverseContext) {
// TODO: 增加临时消息, 对网络环境不佳的状态进行优化 // TODO: 增加临时消息, 对网络环境不佳的状态进行优化
sharedEvent.emit('sendMessage', payload);
const message = await sendMessage(payload); const message = await sendMessage(payload);
dispatch( dispatch(
chatActions.appendConverseMessage({ chatActions.appendConverseMessage({

@ -1,4 +1,4 @@
import React, { useMemo, useRef } from 'react'; import React, { useEffect, useMemo, useRef } from 'react';
import { buildMessageItemRow } from './Item'; import { buildMessageItemRow } from './Item';
import type { MessageListProps } from './types'; import type { MessageListProps } from './types';
import { import {
@ -6,7 +6,7 @@ import {
Virtuoso, Virtuoso,
VirtuosoGridHandle, VirtuosoGridHandle,
} from 'react-virtuoso'; } from 'react-virtuoso';
import type { ChatMessage } from 'tailchat-shared'; import { ChatMessage, sharedEvent } from 'tailchat-shared';
import _last from 'lodash/last'; import _last from 'lodash/last';
const PREPEND_OFFSET = 10 ** 7; const PREPEND_OFFSET = 10 ** 7;
@ -24,6 +24,22 @@ export const VirtualizedMessageList: React.FC<MessageListProps> = React.memo(
const listRef = useRef<VirtuosoGridHandle>(); const listRef = useRef<VirtuosoGridHandle>();
const numItemsPrepended = usePrependedMessagesCount(props.messages); const numItemsPrepended = usePrependedMessagesCount(props.messages);
useEffect(() => {
const onSendMessage = () => {
listRef.current?.scrollToIndex({
index: 'LAST',
align: 'end',
behavior: 'smooth',
});
};
sharedEvent.on('sendMessage', onSendMessage);
return () => {
sharedEvent.off('sendMessage', onSendMessage);
};
}, []);
const handleLoadMore = () => { const handleLoadMore = () => {
if (props.isLoadingMore) { if (props.isLoadingMore) {
return; return;

Loading…
Cancel
Save