import React, { FC, useEffect, useState } from 'react'; import { ScrollView, Text, TouchableOpacity, View, Image, StyleSheet } from 'react-native'; import { NavigationProp } from '@react-navigation/native'; import ImageView from 'react-native-image-viewing'; import { storage, StoreType } from 'src/storage'; import { PageWrapper, Header, Loading, Input, AvatarWithInitials, WarningModal } from 'src/components'; import { usePostGetGroupMembersQuery, usePostGetGroupSettingsQuery, usePostLeaveGroupMutation, usePostRemoveGroupFromListMutation, usePostSetMuteForGroupMutation } from '@api/chat'; import { Colors } from 'src/theme'; import { API_HOST } from 'src/constants'; import GroupIcon from 'assets/icons/messages/group-chat.svg'; import { getFontSize } from 'src/utils'; import ExitIcon from 'assets/icons/messages/exit.svg'; import TrashIcon from 'assets/icons/travels-screens/trash-solid.svg'; import BellSlashIcon from 'assets/icons/messages/bell-slash.svg'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import EditIcon from 'assets/icons/travels-screens/pen-to-square.svg'; import UserPlusIcon from 'assets/icons/user-plus.svg'; import { NAVIGATION_PAGES } from 'src/types'; import { SheetManager } from 'react-native-actions-sheet'; import EditGroupModal from '../Components/EditGroupModal'; type Props = { navigation: NavigationProp; route: any; }; const GroupSettingScreen: FC = ({ navigation, route }) => { const token = storage.get('token', StoreType.STRING) as string; const groupToken = route.params.groupToken; const insets = useSafeAreaInsets(); const [canSeeMembers, setCanSeeMembers] = useState(false); const { data, refetch } = usePostGetGroupSettingsQuery(token, groupToken, true); const { data: members, refetch: refetchMembers } = usePostGetGroupMembersQuery( token, groupToken, canSeeMembers ); const [fullSizeImageVisible, setFullSizeImageVisible] = useState(false); const [muted, setMuted] = useState(false); const [modalState, setModalState] = useState({ isWarningVisible: false, title: '', buttonTitle: '', message: '', action: () => {} }); const { mutateAsync: muteGroup } = usePostSetMuteForGroupMutation(); const { mutateAsync: leaveGroup } = usePostLeaveGroupMutation(); const { mutateAsync: removeGroupFromList } = usePostRemoveGroupFromListMutation(); useEffect(() => { if (data && data.settings) { setCanSeeMembers(data.settings.members_can_see_members === 1 || data.settings.admin === 1); setMuted(data.settings.muted === 1); } }, [data]); const handleMute = async () => { await muteGroup( { token, value: muted ? 0 : 1, group_token: groupToken }, { onSuccess: () => { setMuted(!muted); } } ); }; const handleLeaveGroup = async () => { if (!data) return; setModalState({ isWarningVisible: true, title: `Leave group ${data.settings.name}`, buttonTitle: 'Leave', message: `Are you sure you want to leave ${data.settings.name}?`, action: async () => { await leaveGroup( { token, group_token: groupToken }, { onSuccess: () => { navigation.navigate(NAVIGATION_PAGES.CHATS_LIST); } } ); } }); }; const handleDeleteGroup = async () => { if (!data) return; setModalState({ isWarningVisible: true, title: `Delete ${data.settings.name}`, buttonTitle: 'Delete', message: `Are you sure you want to delete this group chat?\nThis action will remove the chat from your history, but it won't affect other participants.`, action: async () => { await removeGroupFromList( { token, group_token: groupToken }, { onSuccess: () => { navigation.navigate(NAVIGATION_PAGES.CHATS_LIST); } } ); } }); }; const openEditModal = () => { if (!data) return; SheetManager.show('edit-group-modal', { payload: { settings: data.settings, members: data.settings.admin === 1 ? members?.settings : [], token, groupToken, refetch, refetchMembers } }); }; if (!data) return ; return (
) : null } /> setFullSizeImageVisible(true)} disabled={!data.settings.avatar} > {!data.settings.avatar ? ( ) : ( )} {data.settings.name} {data.settings.member_count} nomads {data.settings.description && ( )} {canSeeMembers && members ? ( {members.settings.length} nomads {data.settings.members_can_add_new_members === 1 || data.settings.admin === 1 ? ( ) : null} {(data.settings.member_count > 4 ? members.settings.slice(0, 4) : members.settings ).map((member, index) => ( {}}> {member.avatar ? ( ) : ( )} {member.name} {member.admin === 1 && ( Admin )} ))} {data.settings.member_count > 4 ? ( All nomads... ) : null} ) : null} {muted ? 'Unmute' : 'Mute'} Leave group chat Delete group chat setModalState({ ...modalState, isWarningVisible: false })} title={modalState.title} /> index.toString()} imageIndex={0} visible={fullSizeImageVisible} onRequestClose={() => setFullSizeImageVisible(false)} swipeToCloseEnabled={false} backgroundColor={Colors.DARK_BLUE} doubleTapToZoomEnabled={true} /> ); }; const styles = StyleSheet.create({ photoContainer: { alignItems: 'center', gap: 8 }, groupPhoto: { width: 80, height: 80, borderRadius: 40, alignItems: 'center', justifyContent: 'center' }, bigText: { color: Colors.DARK_BLUE, fontSize: getFontSize(18), fontFamily: 'montserrat-700' }, userItem: { flexDirection: 'row', alignItems: 'center', paddingVertical: 8, paddingHorizontal: 12, backgroundColor: Colors.FILL_LIGHT, gap: 8, borderRadius: 8 }, avatar: { width: 36, height: 36, borderRadius: 18, borderWidth: 1, borderColor: Colors.LIGHT_GRAY }, userName: { color: Colors.DARK_BLUE, fontSize: getFontSize(14), fontFamily: 'montserrat-700' }, title: { color: Colors.DARK_BLUE, fontSize: getFontSize(14), fontFamily: 'redhat-700' }, optionsContainer: { paddingVertical: 10, paddingHorizontal: 8, gap: 16, borderRadius: 8, backgroundColor: Colors.FILL_LIGHT }, option: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }, optionText: { fontSize: getFontSize(12), fontWeight: '600', color: Colors.DARK_BLUE }, dangerOption: { paddingVertical: 10, borderBottomWidth: 1, borderBlockColor: Colors.WHITE }, dangerText: { color: Colors.RED } }); export default GroupSettingScreen;