refactor: 优化用户选择器

pull/49/head
moonrailgun 3 years ago
parent 65b4ec9e2e
commit 31fbd35cdc

@ -0,0 +1,35 @@
import React from 'react';
import { useAppSelector } from 'tailchat-shared';
import { UserPicker } from './UserPicker';
interface FriendPickerProps {
/**
* id
*
*/
withoutUserIds?: string[];
/**
*
* true
*/
withSearch?: boolean;
selectedIds: string[];
onChange: (selectedIds: string[]) => void;
}
export const FriendPicker: React.FC<FriendPickerProps> = React.memo((props) => {
const { withoutUserIds = [], selectedIds, onChange } = props;
const friendIds = useAppSelector((state) =>
state.user.friends.filter((id) => !withoutUserIds.includes(id))
);
return (
<UserPicker
selectedIds={selectedIds}
onChange={onChange}
allUserIds={friendIds}
/>
);
});
FriendPicker.displayName = 'FriendPicker';

@ -1,21 +1,17 @@
import { Checkbox, Input } from 'antd'; import { Checkbox, Input } from 'antd';
import React, { useCallback, useState } from 'react'; import React, { useCallback, useState } from 'react';
import { import { t, useUserInfoList } from 'tailchat-shared';
getCachedUserInfo,
t,
useAppSelector,
useAsync,
} from 'tailchat-shared';
import _take from 'lodash/take'; import _take from 'lodash/take';
import _without from 'lodash/without'; import _without from 'lodash/without';
import { Avatar } from './Avatar'; import { Avatar } from 'tailchat-design';
interface FriendPickerProps { /**
/** *
* id */
*
*/ interface UserPickerProps {
withoutUserIds?: string[]; selectedIds: string[];
onChange: (selectedIds: string[]) => void;
/** /**
* *
@ -23,24 +19,15 @@ interface FriendPickerProps {
*/ */
withSearch?: boolean; withSearch?: boolean;
selectedIds: string[]; /**
onChange: (selectedIds: string[]) => void; * id
*/
allUserIds: string[];
} }
export const FriendPicker: React.FC<FriendPickerProps> = React.memo((props) => { export const UserPicker: React.FC<UserPickerProps> = React.memo((props) => {
const { const { withSearch = true, selectedIds, onChange, allUserIds } = props;
withoutUserIds = [],
withSearch = true,
selectedIds,
onChange,
} = props;
const [searchValue, setSearchValue] = useState(''); const [searchValue, setSearchValue] = useState('');
const friendIds = useAppSelector((state) => const userInfoList = useUserInfoList(allUserIds);
state.user.friends.filter((id) => !withoutUserIds.includes(id))
);
const { value: friendInfoList = [] } = useAsync(() => {
return Promise.all(friendIds.map((id) => getCachedUserInfo(id)));
}, [friendIds.join(',')]);
const handleSelectUser = useCallback( const handleSelectUser = useCallback(
(userId: string, isSelected: boolean) => { (userId: string, isSelected: boolean) => {
@ -78,8 +65,8 @@ export const FriendPicker: React.FC<FriendPickerProps> = React.memo((props) => {
</div> </div>
{_take( {_take(
friendInfoList.filter((info) => info.nickname.includes(searchValue)), userInfoList.filter((info) => info.nickname.includes(searchValue)),
5 10
).map((info) => { ).map((info) => {
return ( return (
<div key={info._id} className="my-1"> <div key={info._id} className="my-1">
@ -102,4 +89,4 @@ export const FriendPicker: React.FC<FriendPickerProps> = React.memo((props) => {
</div> </div>
); );
}); });
FriendPicker.displayName = 'FriendPicker'; UserPicker.displayName = 'UserPicker';

@ -1,7 +1,7 @@
import { Button } from 'antd'; import { Button } from 'antd';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { appendDMConverseMembers, t, useAsyncFn } from 'tailchat-shared'; import { appendDMConverseMembers, t, useAsyncFn } from 'tailchat-shared';
import { FriendPicker } from '../FriendPicker'; import { FriendPicker } from '../UserPicker/FriendPicker';
import { closeModal, ModalWrapper } from '../Modal'; import { closeModal, ModalWrapper } from '../Modal';
interface AppendDMConverseMembersProps { interface AppendDMConverseMembersProps {

@ -2,7 +2,7 @@ import { Button } from 'antd';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { createDMConverse, t, useAsyncRequest } from 'tailchat-shared'; import { createDMConverse, t, useAsyncRequest } from 'tailchat-shared';
import { FriendPicker } from '../FriendPicker'; import { FriendPicker } from '../UserPicker/FriendPicker';
import { closeModal, ModalWrapper } from '../Modal'; import { closeModal, ModalWrapper } from '../Modal';
interface CreateDMConverseProps { interface CreateDMConverseProps {

@ -72,7 +72,7 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
}, []); }, []);
return ( return (
<Loading spinning={loading}> <Loading spinning={loading} className="h-full">
<div className="flex h-full"> <div className="flex h-full">
<div className="pr-2 mr-2 w-40 border-r border-white border-opacity-20"> <div className="pr-2 mr-2 w-40 border-r border-white border-opacity-20">
{/* 角色列表 */} {/* 角色列表 */}

@ -9,7 +9,7 @@ import { useUpdateRef } from 'tailchat-shared';
* *
* ?nav=xxx * ?nav=xxx
*/ */
export function useHistoryNav( export function useLocationNav(
pattern: string, pattern: string,
callback: (nav: string) => void callback: (nav: string) => void
) { ) {

@ -5,7 +5,7 @@ import React from 'react';
import { useCallback } from 'react'; import { useCallback } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { quitGroup, showAlert, t, useIsGroupOwner } from 'tailchat-shared'; import { quitGroup, showAlert, t, useIsGroupOwner } from 'tailchat-shared';
import { useHistoryNav } from '@/hooks/useHistoryNav'; import { useLocationNav } from '@/hooks/useHistoryNav';
/** /**
* Header hooks * Header hooks
@ -41,7 +41,7 @@ export function useGroupHeaderAction(groupId: string) {
}); });
}, [groupId, isOwner]); }, [groupId, isOwner]);
useHistoryNav('group.*', (nav) => { useLocationNav('group.*', (nav) => {
if (nav.startsWith('group.detail')) { if (nav.startsWith('group.detail')) {
handleShowGroupDetail(); handleShowGroupDetail();
} }

Loading…
Cancel
Save