mirror of
https://github.com/hanzo-io/chat.git
synced 2026-10-30 18:57:58 +00:00
73 lines
3.6 KiB
TypeScript
73 lines
3.6 KiB
TypeScript
import React from 'react';
|
|
import { Dimensions, Pressable, View } from 'react-native';
|
|
import { FlashList } from '@shopify/flash-list';
|
|
import Animated, { configureReanimatedLogger, ZoomIn, ZoomOut } from 'react-native-reanimated';
|
|
import CheckIcon from "@assets/icons/CheckIcon.svg";
|
|
import { UserFields } from '@raven/types/common/UserFields';
|
|
import { Member } from '@raven/lib/hooks/useFetchChannelMembers';
|
|
import UserAvatar from '@components/layout/UserAvatar';
|
|
import { Text } from '@components/nativewindui/Text';
|
|
import { Divider } from '@components/layout/Divider';
|
|
import { COLORS } from '@theme/colors';
|
|
import { useColorScheme } from '@hooks/useColorScheme';
|
|
|
|
interface MemberListProps {
|
|
filteredMembers: UserFields[];
|
|
selectedMembers: Member[];
|
|
handleSelectMember: (member: Member) => void;
|
|
debouncedText: string;
|
|
}
|
|
|
|
configureReanimatedLogger({
|
|
strict: false,
|
|
})
|
|
|
|
const MemberList: React.FC<MemberListProps> = ({ filteredMembers, selectedMembers, handleSelectMember, debouncedText }) => {
|
|
const { isDarkColorScheme } = useColorScheme()
|
|
return (
|
|
<FlashList
|
|
data={filteredMembers}
|
|
renderItem={({ item }) => {
|
|
const isMemberSelected = selectedMembers.find(member => member.name === item.name);
|
|
return (
|
|
<Pressable onPress={() => handleSelectMember(item as Member)} className='ios:active:bg-background dark:ios:active:bg-linkColor flex-row items-center justify-between rounded-lg px-2.5'>
|
|
<View className='gap-3 px-2 py-2.5 flex-row items-center'>
|
|
<View className='relative'>
|
|
<UserAvatar
|
|
src={item.user_image ?? ""}
|
|
alt={item.full_name ?? ""}
|
|
availabilityStatus={item.availability_status}
|
|
/>
|
|
<View>
|
|
{isMemberSelected && (
|
|
<Animated.View entering={ZoomIn} exiting={ZoomOut} className='w-4 h-4 absolute -bottom-1.5 -right-1.5 items-center justify-center rounded-full border border-card bg-green z-1'>
|
|
<CheckIcon fill={isDarkColorScheme ? COLORS.black : COLORS.white} height={11} width={11} />
|
|
</Animated.View>
|
|
)}
|
|
</View>
|
|
</View>
|
|
<View className='flex-col gap-0.5 justify-center'>
|
|
<Text className='text-foreground font-medium text-[15px]'>{item.full_name}</Text>
|
|
<Text className='text-muted-foreground text-sm'>{item.name}</Text>
|
|
</View>
|
|
</View>
|
|
</Pressable>
|
|
)
|
|
}}
|
|
keyExtractor={(item) => item.name}
|
|
estimatedItemSize={64}
|
|
ItemSeparatorComponent={() => <Divider className='mx-0' />}
|
|
bounces={false}
|
|
showsVerticalScrollIndicator={false}
|
|
ListEmptyComponent={!debouncedText.length ? () => (
|
|
<View className="flex-1 items-center justify-center" style={{ height: Dimensions.get("screen").height - 200 }}>
|
|
<Text className="text-[15px] text-center text-muted-foreground">
|
|
No channel members found.
|
|
</Text>
|
|
</View>
|
|
) : undefined}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export default MemberList |