refactor: 消息列表

pull/13/head
moonrailgun 4 years ago
parent f5cd580175
commit 73fdb032a5

@ -4,6 +4,7 @@ import {
getUserOnlineStatus, getUserOnlineStatus,
UserBaseInfo, UserBaseInfo,
} from '../model/user'; } from '../model/user';
import { isValidStr } from '../utils/string-helper';
/** /**
* *
@ -12,10 +13,20 @@ export function useCachedUserInfo(
userId: string, userId: string,
refetch = false refetch = false
): UserBaseInfo | Record<string, never> { ): UserBaseInfo | Record<string, never> {
const { data } = useQuery(['user', userId], () => fetchUserInfo(userId), { const { data } = useQuery(
staleTime: 2 * 60 * 60 * 1000, // 缓存2小时 ['user', userId],
refetchOnMount: refetch ? 'always' : true, () => {
}); if (!isValidStr(userId)) {
return {};
}
return fetchUserInfo(userId);
},
{
staleTime: 2 * 60 * 60 * 1000, // 缓存2小时
refetchOnMount: refetch ? 'always' : true,
}
);
return data ?? {}; return data ?? {};
} }

@ -51,6 +51,7 @@ export {
denyFriendRequest, denyFriendRequest,
} from './model/friend'; } from './model/friend';
export type { FriendRequest } from './model/friend'; export type { FriendRequest } from './model/friend';
export type { ChatMessage } from './model/message';
export type { UserBaseInfo, UserLoginInfo } from './model/user'; export type { UserBaseInfo, UserLoginInfo } from './model/user';
export { export {
loginWithEmail, loginWithEmail,

@ -55,3 +55,11 @@ export function getTextColorHex(text: unknown): string {
const id = str2int(text); const id = str2int(text);
return color[id % color.length]; return color[id % color.length];
} }
/**
*
*
*/
export function isValidStr(str: unknown): str is string {
return typeof str == 'string' && str !== '';
}

@ -0,0 +1,20 @@
import React from 'react';
import { ChatMessage, useCachedUserInfo } from 'pawchat-shared';
interface ChatMessageItemProps {
showAvatar: boolean;
payload: ChatMessage;
}
export const ChatMessageItem: React.FC<ChatMessageItemProps> = React.memo(
(props) => {
const { showAvatar, payload } = props;
const userInfo = useCachedUserInfo(payload.author ?? '');
return (
<div>
{userInfo.nickname}: {payload.content}
</div>
);
}
);
ChatMessageItem.displayName = 'ChatMessageItem';

@ -0,0 +1,23 @@
import React from 'react';
import type { ChatMessage } from 'pawchat-shared';
import { ChatMessageItem } from './Item';
interface ChatMessageListProps {
messages: ChatMessage[];
}
export const ChatMessageList: React.FC<ChatMessageListProps> = React.memo(
(props) => {
return (
<div>
{props.messages.map((message) => (
<ChatMessageItem
key={message._id}
showAvatar={true}
payload={message}
/>
))}
</div>
);
}
);
ChatMessageList.displayName = 'ChatMessageList';

@ -3,6 +3,7 @@ import React from 'react';
import { useConverseMessage } from 'pawchat-shared'; import { useConverseMessage } from 'pawchat-shared';
import { AlertErrorView } from '../AlertErrorView'; import { AlertErrorView } from '../AlertErrorView';
import { ChatInputBox } from './ChatInputBox'; import { ChatInputBox } from './ChatInputBox';
import { ChatMessageList } from './ChatMessageList';
const ChatBoxPlaceholder: React.FC = React.memo(() => { const ChatBoxPlaceholder: React.FC = React.memo(() => {
return ( return (
@ -39,7 +40,8 @@ export const ChatBox: React.FC<{
return ( return (
<div> <div>
<div>: {JSON.stringify(messages)}</div> <ChatMessageList messages={messages} />
<ChatInputBox <ChatInputBox
onSendMsg={(msg) => onSendMsg={(msg) =>
handleSendMessage({ handleSendMessage({

Loading…
Cancel
Save