perf: add virtual list for friend list #238

pull/249/head
moonrailgun 11 months ago
parent a4f7c091fd
commit f09f7017bd

@ -43,5 +43,13 @@
.ant-tabs-content-holder { .ant-tabs-content-holder {
overflow-x: hidden; overflow-x: hidden;
overflow-y: auto; overflow-y: auto;
.ant-tabs-content {
height: 100%;
.ant-tabs-tabpane {
height: 100%;
}
}
} }
} }

@ -2,6 +2,7 @@ import { Tabs, TabsProps } from 'antd';
import React from 'react'; import React from 'react';
import './PillTabs.less'; import './PillTabs.less';
import clsx from 'clsx';
/** /**
* @example * @example
@ -9,7 +10,12 @@ import './PillTabs.less';
*/ */
export const PillTabs: React.FC<TabsProps> = React.memo((props) => { export const PillTabs: React.FC<TabsProps> = React.memo((props) => {
return ( return (
<Tabs {...props} className="pill-tabs" type="card" animated={false}> <Tabs
{...props}
className={clsx(props.className, 'pill-tabs')}
type="card"
animated={false}
>
{props.children} {props.children}
</Tabs> </Tabs>
); );

@ -59,7 +59,7 @@ export const GroupMember: React.FC<{ groupId: string }> = React.memo(
<div className="flex-1 overflow-auto"> <div className="flex-1 overflow-auto">
<Virtuoso <Virtuoso
style={{ height: '100%' }} className="h-full"
data={isSearching ? filteredGroupMembers : userInfos} data={isSearching ? filteredGroupMembers : userInfos}
itemContent={(index, item) => renderUser(item)} itemContent={(index, item) => renderUser(item)}
/> />

@ -24,6 +24,7 @@ import { Problem } from '@/components/Problem';
import { closeModal, openModal } from '@/components/Modal'; import { closeModal, openModal } from '@/components/Modal';
import { SetFriendNickname } from '@/components/modals/SetFriendNickname'; import { SetFriendNickname } from '@/components/modals/SetFriendNickname';
import { Icon } from 'tailchat-design'; import { Icon } from 'tailchat-design';
import { Virtuoso } from 'react-virtuoso';
/** /**
* *
@ -95,7 +96,7 @@ export const FriendList: React.FC<{
} }
return ( return (
<div className="py-2.5 px-5"> <div className="py-2.5 px-5 h-full flex flex-col">
<div>{t('好友列表')}</div> <div>{t('好友列表')}</div>
<Input <Input
@ -107,50 +108,54 @@ export const FriendList: React.FC<{
onChange={(e) => setSearchText(e.target.value)} onChange={(e) => setSearchText(e.target.value)}
/> />
<div> <div className="flex-1">
{searchResult.map((item) => ( <Virtuoso
<UserListItem className="h-full"
key={item._id} data={searchResult}
userId={item._id} itemContent={(index, item) => (
actions={[ <UserListItem
<Tooltip key="message" title={t('发送消息')}> key={item._id}
<div> userId={item._id}
<IconBtn actions={[
icon="mdi:message-text-outline" <Tooltip key="message" title={t('发送消息')}>
onClick={() => handleCreateConverse(item._id)}
/>
</div>
</Tooltip>,
<div key="more">
<Dropdown
menu={{
items: [
{
key: 'setNickname',
onClick: () => handleSetFriendNickname(item._id),
label: isValidStr(item.nickname)
? t('更改好友昵称')
: t('添加好友昵称'),
},
{
key: 'delete',
danger: true,
onClick: () => handleRemoveFriend(item._id),
label: t('删除'),
},
],
}}
trigger={['click']}
placement="bottomRight"
>
<div> <div>
<IconBtn icon="mdi:dots-vertical" /> <IconBtn
icon="mdi:message-text-outline"
onClick={() => handleCreateConverse(item._id)}
/>
</div> </div>
</Dropdown> </Tooltip>,
</div>, <div key="more">
]} <Dropdown
/> menu={{
))} items: [
{
key: 'setNickname',
onClick: () => handleSetFriendNickname(item._id),
label: isValidStr(item.nickname)
? t('更改好友昵称')
: t('添加好友昵称'),
},
{
key: 'delete',
danger: true,
onClick: () => handleRemoveFriend(item._id),
label: t('删除'),
},
],
}}
trigger={['click']}
placement="bottomRight"
>
<div>
<IconBtn icon="mdi:dots-vertical" />
</div>
</Dropdown>
</div>,
]}
/>
)}
/>
</div> </div>
</div> </div>
); );

@ -29,6 +29,7 @@ export const FriendPanel: React.FC = React.memo(() => {
return ( return (
<div className="w-full"> <div className="w-full">
<PillTabs <PillTabs
className="h-full"
activeKey={activeKey} activeKey={activeKey}
onChange={setActiveKey} onChange={setActiveKey}
items={_compact([ items={_compact([

Loading…
Cancel
Save