feat: 群组成员面板增加在线离线排序

pull/81/head
moonrailgun 3 years ago
parent fc8915430f
commit 240bd72cb6

@ -34,8 +34,11 @@ export function useCachedUserInfo(
/** /**
* *
*/ */
export function useCachedOnlineStatus(ids: string[]): boolean[] { export function useCachedOnlineStatus(
const { data } = useQuery( ids: string[],
onOnlineStatusUpdate?: (onlineStatus: boolean[]) => void
): boolean[] {
const { data, isSuccess } = useQuery(
['onlineStatus', ids.join(',')], ['onlineStatus', ids.join(',')],
() => getUserOnlineStatus(ids), () => getUserOnlineStatus(ids),
{ {
@ -43,5 +46,11 @@ export function useCachedOnlineStatus(ids: string[]): boolean[] {
} }
); );
if (isSuccess && Array.isArray(data)) {
if (typeof onOnlineStatusUpdate === 'function' && data) {
onOnlineStatusUpdate(data);
}
}
return data ?? ids.map(() => false); return data ?? ids.map(() => false);
} }

@ -28,6 +28,7 @@
"k24ccd723": "Refresh now", "k24ccd723": "Refresh now",
"k267cc491": "Me", "k267cc491": "Me",
"k2a8031e": "Homepage", "k2a8031e": "Homepage",
"k2c6ee8d": "Confirm the action",
"k2c7df74f": "Modify Group Panel", "k2c7df74f": "Modify Group Panel",
"k2d6cfb27": "Chat Channel", "k2d6cfb27": "Chat Channel",
"k2ec4966c": "Selected {{num}} items", "k2ec4966c": "Selected {{num}} items",
@ -219,6 +220,7 @@
"kdf6e53ca": "Converse does not have permission", "kdf6e53ca": "Converse does not have permission",
"ke17b2c87": "Do not upload pictures that violate local laws and regulations", "ke17b2c87": "Do not upload pictures that violate local laws and regulations",
"ke187440d": "Panel type cannot be empty", "ke187440d": "Panel type cannot be empty",
"kea977d95": "The following users are offline",
"kecb51e2c": "Old password", "kecb51e2c": "Old password",
"kecbd7449": "Delete", "kecbd7449": "Delete",
"ked2baf28": "Loading...", "ked2baf28": "Loading...",

@ -28,6 +28,7 @@
"k24ccd723": "立即刷新", "k24ccd723": "立即刷新",
"k267cc491": "我", "k267cc491": "我",
"k2a8031e": "个人主页", "k2a8031e": "个人主页",
"k2c6ee8d": "确认操作",
"k2c7df74f": "编辑群组面板", "k2c7df74f": "编辑群组面板",
"k2d6cfb27": "聊天频道", "k2d6cfb27": "聊天频道",
"k2ec4966c": "已选择 {{num}} 项", "k2ec4966c": "已选择 {{num}} 项",
@ -219,6 +220,7 @@
"kdf6e53ca": "会话没有权限", "kdf6e53ca": "会话没有权限",
"ke17b2c87": "请勿上传违反当地法律法规的图片", "ke17b2c87": "请勿上传违反当地法律法规的图片",
"ke187440d": "面板类型不能为空", "ke187440d": "面板类型不能为空",
"kea977d95": "以下用户已离线",
"kecb51e2c": "旧密码", "kecb51e2c": "旧密码",
"kecbd7449": "删除", "kecbd7449": "删除",
"ked2baf28": "加载中...", "ked2baf28": "加载中...",

@ -197,12 +197,10 @@ export async function fetchUserInfo(userId: string): Promise<UserBaseInfo> {
export async function getUserOnlineStatus( export async function getUserOnlineStatus(
userIds: string[] userIds: string[]
): Promise<boolean[]> { ): Promise<boolean[]> {
const { data } = await request.get<boolean[]>( const { data } = await request.post<boolean[]>(
'/api/gateway/checkUserOnline', '/api/gateway/checkUserOnline',
{ {
params: { userIds,
userIds,
},
} }
); );

@ -1,8 +1,13 @@
import { Icon } from '@/components/Icon'; import { Icon } from '@/components/Icon';
import { UserListItem } from '@/components/UserListItem'; import { UserListItem } from '@/components/UserListItem';
import { Input, Skeleton } from 'antd'; import { Divider, Input, Skeleton } from 'antd';
import React, { useMemo, useState } from 'react'; import React, { useMemo, useState } from 'react';
import { t, useGroupInfo } from 'tailchat-shared'; import {
t,
useCachedOnlineStatus,
useGroupInfo,
UserBaseInfo,
} from 'tailchat-shared';
import { useUserInfoList } from 'tailchat-shared/hooks/model/useUserInfoList'; import { useUserInfoList } from 'tailchat-shared/hooks/model/useUserInfoList';
interface MembersPanelProps { interface MembersPanelProps {
@ -17,6 +22,27 @@ export const MembersPanel: React.FC<MembersPanelProps> = React.memo((props) => {
const members = groupInfo?.members ?? []; const members = groupInfo?.members ?? [];
const userInfoList = useUserInfoList(members.map((m) => m.userId)); const userInfoList = useUserInfoList(members.map((m) => m.userId));
const [searchStr, setSearchStr] = useState(''); const [searchStr, setSearchStr] = useState('');
const membersOnlineStatus = useCachedOnlineStatus(
members.map((m) => m.userId)
);
const groupedMembers = useMemo(() => {
const online: UserBaseInfo[] = [];
const offline: UserBaseInfo[] = [];
userInfoList.forEach((m, i) => {
if (membersOnlineStatus[i] === true) {
online.push(m);
} else {
offline.push(m);
}
});
return {
online,
offline,
};
}, [userInfoList, membersOnlineStatus]);
const filteredGroupMembers = useMemo(() => { const filteredGroupMembers = useMemo(() => {
return userInfoList.filter((u) => u.nickname.includes(searchStr)); return userInfoList.filter((u) => u.nickname.includes(searchStr));
@ -26,6 +52,12 @@ export const MembersPanel: React.FC<MembersPanelProps> = React.memo((props) => {
return <Skeleton />; return <Skeleton />;
} }
const isSearching = searchStr !== '';
const renderUser = (member: UserBaseInfo) => (
<UserListItem key={member._id} userId={member._id} />
);
return ( return (
<div> <div>
<div className="p-2"> <div className="p-2">
@ -37,9 +69,17 @@ export const MembersPanel: React.FC<MembersPanelProps> = React.memo((props) => {
/> />
</div> </div>
{filteredGroupMembers.map((member) => ( {isSearching ? (
<UserListItem key={member._id} userId={member._id} /> filteredGroupMembers.map(renderUser)
))} ) : (
<>
{groupedMembers.online.map(renderUser)}
<Divider>{t('以下用户已离线')}</Divider>
{groupedMembers.offline.map(renderUser)}
</>
)}
</div> </div>
); );
}); });

Loading…
Cancel
Save