import React, { useCallback, useEffect, useState } from 'react' import { View, Text, FlatList, StyleSheet, TouchableOpacity, SafeAreaView, ActivityIndicator, Alert, } from 'react-native' import { useNavigation, useFocusEffect } from '@react-navigation/native' import type { NativeStackScreenProps } from '@react-navigation/native-stack' import { ImSDK } from '@xuqm/rn-sdk' import { demoApi, type UserProfile } from '../../api/demo' import type { RootStackParams } from '../../navigation/types' type Props = NativeStackScreenProps export default function GroupMembersScreen({ route }: Props) { const { groupId, groupName } = route.params const navigation = useNavigation() const [members, setMembers] = useState([]) const [loading, setLoading] = useState(true) const load = useCallback(async () => { setLoading(true) try { const groups = await ImSDK.listGroups() const group = groups.find(g => g.id === groupId) if (!group) return const ids = group.memberIds.split(',').filter(Boolean) const profiles = await Promise.all( ids.map(async id => { const res = await demoApi.searchUsers(id) return res.find(u => u.userId === id) ?? { userId: id, nickname: id, avatar: '', gender: 'UNKNOWN' as const, status: '' } }) ) setMembers(profiles) } catch { /* silently fail */ } finally { setLoading(false) } }, [groupId]) useFocusEffect(useCallback(() => { load() }, [load])) return ( {loading ? : ( u.userId} renderItem={({ item }) => { const letter = (item.nickname || item.userId).charAt(0).toUpperCase() return ( {letter} {item.nickname} @{item.userId} ) }} ItemSeparatorComponent={() => } ListHeaderComponent={{members.length} 名成员} /> ) } ) } const styles = StyleSheet.create({ root: { flex: 1, backgroundColor: '#f5f5f5' }, count: { padding: 12, fontSize: 13, color: '#888', backgroundColor: '#f5f5f5' }, row: { flexDirection: 'row', alignItems: 'center', padding: 12, backgroundColor: '#fff' }, avatar: { width: 44, height: 44, borderRadius: 8, backgroundColor: '#5856d6', alignItems: 'center', justifyContent: 'center', marginRight: 12 }, avatarText: { color: '#fff', fontSize: 17, fontWeight: '600' }, body: { flex: 1 }, name: { fontSize: 16, fontWeight: '500', color: '#111' }, uid: { fontSize: 13, color: '#888', marginTop: 2 }, sep: { height: StyleSheet.hairlineWidth, backgroundColor: '#e0e0e0', marginLeft: 68 }, })