|
@@ -1,32 +1,64 @@
|
|
-import React, { useState } from 'react';
|
|
|
|
-import { View, StyleSheet, TouchableOpacity, Text, Image } from 'react-native';
|
|
|
|
-import ActionSheet, { SheetManager } from 'react-native-actions-sheet';
|
|
|
|
-import { useNavigation } from '@react-navigation/native';
|
|
|
|
-import { chatStyles } from './styles';
|
|
|
|
|
|
+import React, { FC, useEffect, useState } from 'react';
|
|
|
|
+import { Text, TouchableOpacity, View, Image, StyleSheet } from 'react-native';
|
|
|
|
+import { NavigationProp, useFocusEffect } from '@react-navigation/native';
|
|
|
|
+import { storage, StoreType } from 'src/storage';
|
|
|
|
+import { PageWrapper, Header, Input, AvatarWithInitials, WarningModal } from 'src/components';
|
|
|
|
+import { usePostGetGroupMembersQuery, usePostGetGroupSettingsQuery } from '@api/chat';
|
|
import { Colors } from 'src/theme';
|
|
import { Colors } from 'src/theme';
|
|
-import { AvatarWithInitials, Input } from 'src/components';
|
|
|
|
import { API_HOST } from 'src/constants';
|
|
import { API_HOST } from 'src/constants';
|
|
-import { NAVIGATION_PAGES } from 'src/types';
|
|
|
|
|
|
+import { getFontSize } from 'src/utils';
|
|
|
|
+import { SheetManager } from 'react-native-actions-sheet';
|
|
|
|
+import UserOptionsModal from '../Components/UserOptionsModal';
|
|
|
|
+import { chatStyles } from '../Components/styles';
|
|
import { FlashList } from '@shopify/flash-list';
|
|
import { FlashList } from '@shopify/flash-list';
|
|
|
|
|
|
import SearchIcon from 'assets/icons/search.svg';
|
|
import SearchIcon from 'assets/icons/search.svg';
|
|
-import { getFontSize } from 'src/utils';
|
|
|
|
|
|
+import DotsIcon from 'assets/icons/messages/dots-vertical.svg';
|
|
|
|
+
|
|
|
|
+type Props = {
|
|
|
|
+ navigation: NavigationProp<any>;
|
|
|
|
+ route: any;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const MembersListScreen: FC<Props> = ({ navigation, route }) => {
|
|
|
|
+ const token = storage.get('token', StoreType.STRING) as string;
|
|
|
|
+ const currentUserId = storage.get('uid', StoreType.STRING) as string;
|
|
|
|
+ const { groupToken, canChangeAdmin } = route.params;
|
|
|
|
|
|
-const AllNomadsModal = () => {
|
|
|
|
- const navigation = useNavigation();
|
|
|
|
|
|
+ const [modalState, setModalState] = useState({
|
|
|
|
+ isWarningVisible: false,
|
|
|
|
+ title: '',
|
|
|
|
+ buttonTitle: '',
|
|
|
|
+ message: '',
|
|
|
|
+ action: () => {}
|
|
|
|
+ });
|
|
const [searchQuery, setSearchQuery] = useState('');
|
|
const [searchQuery, setSearchQuery] = useState('');
|
|
- const [data, setData] = useState<any[]>([]);
|
|
|
|
const [filteredData, setFilteredData] = useState<any[]>([]);
|
|
const [filteredData, setFilteredData] = useState<any[]>([]);
|
|
|
|
+ const { data, refetch } = usePostGetGroupSettingsQuery(token, groupToken, true);
|
|
|
|
+ const { data: members, refetch: refetchMembers } = usePostGetGroupMembersQuery(
|
|
|
|
+ token,
|
|
|
|
+ groupToken,
|
|
|
|
+ true
|
|
|
|
+ );
|
|
|
|
|
|
- const handleSheetOpen = (payload: any) => {
|
|
|
|
- setData(payload?.members ?? []);
|
|
|
|
- setFilteredData(payload?.members ?? []);
|
|
|
|
- };
|
|
|
|
|
|
+ useFocusEffect(() => {
|
|
|
|
+ navigation.getParent()?.setOptions({
|
|
|
|
+ tabBarStyle: {
|
|
|
|
+ display: 'none'
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ if (members && members.settings) {
|
|
|
|
+ setFilteredData(members.settings);
|
|
|
|
+ }
|
|
|
|
+ }, [members]);
|
|
|
|
|
|
const handleSearch = (text: string) => {
|
|
const handleSearch = (text: string) => {
|
|
- if (text) {
|
|
|
|
|
|
+ if (text && members) {
|
|
const searchData =
|
|
const searchData =
|
|
- data?.filter((item: any) => {
|
|
|
|
|
|
+ members?.settings?.filter((item: any) => {
|
|
const itemData = item.name ? item.name.toLowerCase() : ''.toLowerCase();
|
|
const itemData = item.name ? item.name.toLowerCase() : ''.toLowerCase();
|
|
const textData = text.toLowerCase();
|
|
const textData = text.toLowerCase();
|
|
return itemData.indexOf(textData) > -1;
|
|
return itemData.indexOf(textData) > -1;
|
|
@@ -34,27 +66,13 @@ const AllNomadsModal = () => {
|
|
setFilteredData(searchData);
|
|
setFilteredData(searchData);
|
|
setSearchQuery(text);
|
|
setSearchQuery(text);
|
|
} else {
|
|
} else {
|
|
- setFilteredData(data);
|
|
|
|
|
|
+ setFilteredData(members?.settings ?? []);
|
|
setSearchQuery(text);
|
|
setSearchQuery(text);
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
const renderItem = ({ item }: { item: any }) => (
|
|
const renderItem = ({ item }: { item: any }) => (
|
|
- <TouchableOpacity
|
|
|
|
- style={styles.userItem}
|
|
|
|
- onPress={() => {
|
|
|
|
- SheetManager.hide('all-nomads-modal').then(() => {
|
|
|
|
- navigation.navigate(
|
|
|
|
- ...([
|
|
|
|
- NAVIGATION_PAGES.PUBLIC_PROFILE_VIEW,
|
|
|
|
- {
|
|
|
|
- userId: item.uid
|
|
|
|
- }
|
|
|
|
- ] as never)
|
|
|
|
- );
|
|
|
|
- });
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
|
|
+ <View style={styles.userItem}>
|
|
{item.avatar ? (
|
|
{item.avatar ? (
|
|
<Image source={{ uri: API_HOST + item.avatar }} style={chatStyles.avatar} />
|
|
<Image source={{ uri: API_HOST + item.avatar }} style={chatStyles.avatar} />
|
|
) : (
|
|
) : (
|
|
@@ -82,29 +100,35 @@ const AllNomadsModal = () => {
|
|
Admin
|
|
Admin
|
|
</Text>
|
|
</Text>
|
|
)}
|
|
)}
|
|
- </TouchableOpacity>
|
|
|
|
- );
|
|
|
|
-
|
|
|
|
- return (
|
|
|
|
- <ActionSheet
|
|
|
|
- id="all-nomads-modal"
|
|
|
|
- containerStyle={styles.sheetContainer}
|
|
|
|
- defaultOverlayOpacity={0.5}
|
|
|
|
- closeOnTouchBackdrop={true}
|
|
|
|
- keyboardHandlerEnabled={true}
|
|
|
|
- onBeforeShow={(sheetRef) => {
|
|
|
|
- const payload = sheetRef || null;
|
|
|
|
- handleSheetOpen(payload);
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <View style={styles.container}>
|
|
|
|
|
|
+ {item.uid !== +currentUserId && (
|
|
<TouchableOpacity
|
|
<TouchableOpacity
|
|
- style={styles.header}
|
|
|
|
- onPress={() => SheetManager.hide('all-nomads-modal')}
|
|
|
|
|
|
+ style={{ padding: 6 }}
|
|
|
|
+ onPress={() =>
|
|
|
|
+ SheetManager.show('user-options-modal', {
|
|
|
|
+ payload: {
|
|
|
|
+ admin: item.admin,
|
|
|
|
+ uid: item.uid,
|
|
|
|
+ name: item.name,
|
|
|
|
+ canChangeAdmin,
|
|
|
|
+ token,
|
|
|
|
+ groupToken,
|
|
|
|
+ refetch,
|
|
|
|
+ refetchMembers,
|
|
|
|
+ setIsWarningVisible: setModalState
|
|
|
|
+ } as any
|
|
|
|
+ })
|
|
|
|
+ }
|
|
>
|
|
>
|
|
- <Text style={chatStyles.cancelText}>Cancel</Text>
|
|
|
|
|
|
+ <DotsIcon />
|
|
</TouchableOpacity>
|
|
</TouchableOpacity>
|
|
|
|
+ )}
|
|
|
|
+ </View>
|
|
|
|
+ );
|
|
|
|
|
|
|
|
+ return (
|
|
|
|
+ <PageWrapper>
|
|
|
|
+ <Header label="Nomads" />
|
|
|
|
+ <View style={styles.container}>
|
|
<Input
|
|
<Input
|
|
inputMode={'search'}
|
|
inputMode={'search'}
|
|
placeholder={'Search nomads'}
|
|
placeholder={'Search nomads'}
|
|
@@ -128,7 +152,18 @@ const AllNomadsModal = () => {
|
|
contentContainerStyle={{ paddingBottom: 16 }}
|
|
contentContainerStyle={{ paddingBottom: 16 }}
|
|
/>
|
|
/>
|
|
</View>
|
|
</View>
|
|
- </ActionSheet>
|
|
|
|
|
|
+
|
|
|
|
+ <WarningModal
|
|
|
|
+ type={'delete'}
|
|
|
|
+ isVisible={modalState.isWarningVisible}
|
|
|
|
+ buttonTitle={modalState.buttonTitle}
|
|
|
|
+ message={modalState.message}
|
|
|
|
+ action={modalState.action}
|
|
|
|
+ onClose={() => setModalState({ ...modalState, isWarningVisible: false })}
|
|
|
|
+ title={modalState.title}
|
|
|
|
+ />
|
|
|
|
+ <UserOptionsModal />
|
|
|
|
+ </PageWrapper>
|
|
);
|
|
);
|
|
};
|
|
};
|
|
|
|
|
|
@@ -136,13 +171,7 @@ const styles = StyleSheet.create({
|
|
container: {
|
|
container: {
|
|
backgroundColor: 'white',
|
|
backgroundColor: 'white',
|
|
gap: 16,
|
|
gap: 16,
|
|
- height: '100%'
|
|
|
|
- },
|
|
|
|
- sheetContainer: {
|
|
|
|
- height: '95%',
|
|
|
|
- borderTopLeftRadius: 15,
|
|
|
|
- borderTopRightRadius: 15,
|
|
|
|
- paddingHorizontal: 16
|
|
|
|
|
|
+ flex: 1
|
|
},
|
|
},
|
|
avatar: {
|
|
avatar: {
|
|
width: 30,
|
|
width: 30,
|
|
@@ -168,4 +197,4 @@ const styles = StyleSheet.create({
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
-export default AllNomadsModal;
|
|
|
|
|
|
+export default MembersListScreen;
|