Selaa lähdekoodia

group chat fixes

Viktoriia 4 kuukautta sitten
vanhempi
commit
6651f3d35a

+ 54 - 5
src/modules/api/chat/chat-api.ts

@@ -256,7 +256,7 @@ export interface PostUpdateGroupSettings {
   members_can_see_members?: 0 | 1;
   name?: string;
   description?: string;
-  avatar?: { uri: string; type: string; name?: string };
+  group_avatar?: { uri: string; type: string; name?: string };
 }
 
 export interface PostGetGroupMessageStatusReturn {
@@ -338,15 +338,27 @@ export const chatApi = {
     if (data.description) {
       formData.append('description', data.description);
     }
+    if (data.members_can_edit_settings) {
+      formData.append('members_can_edit_settings', JSON.stringify(data.members_can_edit_settings));
+    }
+    if (data.members_can_send_messages) {
+      formData.append('members_can_send_messages', JSON.stringify(data.members_can_send_messages));
+    }
+    if (data.members_can_add_new_members) {
+      formData.append(
+        'members_can_add_new_members',
+        JSON.stringify(data.members_can_add_new_members)
+      );
+    }
 
     formData.append('admins', JSON.stringify(data.admins));
 
     if (data.group_avatar) {
       const { uri, type, name } = data.group_avatar;
-      formData.append('attachment', {
+      formData.append('group_avatar', {
         uri,
         type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
-        name: name || 'file'
+        name: name || 'avatar'
       } as unknown as Blob);
     }
 
@@ -413,8 +425,45 @@ export const chatApi = {
     request.postForm<PostGetGroupSettingsReturn>(API.GET_GROUP_SETTINGS, { token, group_token }),
   getGroupMembers: (token: string, group_token: string) =>
     request.postForm<PostGetGroupMembersReturn>(API.GET_GROUP_MEMBERS, { token, group_token }),
-  updateGroupSettings: (data: PostUpdateGroupSettings) =>
-    request.postForm<ResponseType>(API.UPDATE_GROUP_SETTINGS, data),
+  updateGroupSettings: (data: PostUpdateGroupSettings) => {
+    const formData = new FormData();
+
+    formData.append('token', data.token);
+    formData.append('group_token', data.group_token);
+
+    if (data.members_can_edit_settings) {
+      formData.append('members_can_edit_settings', JSON.stringify(data.members_can_edit_settings));
+    }
+    if (data.members_can_add_new_members) {
+      formData.append(
+        'members_can_add_new_members',
+        JSON.stringify(data.members_can_add_new_members)
+      );
+    }
+    if (data.members_can_send_messages) {
+      formData.append('members_can_send_messages', JSON.stringify(data.members_can_send_messages));
+    }
+    if (data.members_can_see_members) {
+      formData.append('members_can_see_members', JSON.stringify(data.members_can_see_members));
+    }
+    if (data.name) {
+      formData.append('name', data.name);
+    }
+    if (data.description) {
+      formData.append('description', data.description);
+    }
+
+    if (data.group_avatar) {
+      const { uri, type, name } = data.group_avatar;
+      formData.append('group_avatar', {
+        uri,
+        type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
+        name: name || 'avatar'
+      } as unknown as Blob);
+    }
+
+    return request.postForm<ResponseType>(API.UPDATE_GROUP_SETTINGS, formData);
+  },
   getGroupMessageStatus: (token: string, group_token: string, message_id: number) =>
     request.postForm<PostGetGroupMessageStatusReturn>(API.GET_GROUP_MESSAGE_STATUS, {
       token,

+ 16 - 6
src/screens/InAppScreens/MessagesScreen/Components/EditGroupModal.tsx

@@ -23,6 +23,7 @@ import { useNavigation } from '@react-navigation/native';
 import { usePostUpdateGroupSettingsMutation, usePostRemoveFromGroupMutation } from '@api/chat';
 import { getFontSize } from 'src/utils';
 import CheckSvg from 'assets/icons/travels-screens/circle-check.svg';
+import { StoreType, storage } from 'src/storage';
 
 const SettingsSchema = yup.object({
   name: yup
@@ -33,6 +34,7 @@ const SettingsSchema = yup.object({
 });
 
 const SearchModal = () => {
+  const currentUserId = storage.get('uid', StoreType.STRING) as number;
   const [isSubmitting, setIsSubmitting] = useState(false);
   const [data, setData] = useState<any>(null);
   const [image, setImage] = useState<ImagePicker.ImagePickerAsset | null>(null);
@@ -80,7 +82,11 @@ const SearchModal = () => {
     const isSelected = filteredUsers.some((selected) => selected.uid === item.uid);
 
     return (
-      <TouchableOpacity style={styles.userItem} onPress={() => toggleUserSelection(item)}>
+      <TouchableOpacity
+        style={styles.userItem}
+        disabled={item.uid === +currentUserId}
+        onPress={() => toggleUserSelection(item)}
+      >
         {item.avatar ? (
           <Image source={{ uri: API_HOST + item.avatar }} style={styles.avatar} />
         ) : (
@@ -107,9 +113,11 @@ const SearchModal = () => {
             Admin
           </Text>
         )}
-        <View style={styles.unselectedCircle}>
-          {isSelected && <CheckSvg fill={Colors.DARK_BLUE} height={20} width={20} />}
-        </View>
+        {item.uid !== +currentUserId && (
+          <View style={styles.unselectedCircle}>
+            {isSelected && <CheckSvg fill={Colors.DARK_BLUE} height={20} width={20} />}
+          </View>
+        )}
       </TouchableOpacity>
     );
   };
@@ -174,7 +182,6 @@ const SearchModal = () => {
                 },
                 {
                   onSuccess: (res) => {
-                    console.log('res', res);
                     data && data.refetchMembers();
                   }
                 }
@@ -223,7 +230,10 @@ const SearchModal = () => {
                     {image || data?.settings?.avatar ? (
                       <>
                         <Image
-                          source={{ uri: image ? image.uri : API_HOST + data?.settings?.avatar }}
+                          source={{
+                            uri: image ? image.uri : API_HOST + data?.settings?.avatar,
+                            cache: 'reload'
+                          }}
                           style={styles.groupPhotoImage}
                         />
                         <Text style={chatStyles.photoText}>Change photo</Text>

+ 3 - 3
src/screens/InAppScreens/MessagesScreen/Components/RouteAddGroup.tsx

@@ -27,7 +27,7 @@ const ProfileSchema = yup.object({
     .required('name is required')
     .min(3, 'group name should be at least 3 characters'),
   description: yup.string().optional().max(8000, 'description should not exceed 8000 characters'),
-  users: yup.array().min(2, 'select at least 2 members').required('members are required')
+  users: yup.array().min(1, 'select at least 1 member').required('members are required')
 });
 
 const RouteAddGroup = () => {
@@ -137,7 +137,7 @@ const RouteAddGroup = () => {
             );
             router?.close();
           },
-          onError: (err) => {
+          onError: () => {
             setIsSubmitting(false);
           }
         });
@@ -312,7 +312,7 @@ const RouteAddGroup = () => {
                   <Text
                     style={[styles.textError, selectedUsers.length > 0 ? { marginTop: -18 } : {}]}
                   >
-                    select at least 2 members
+                    select at least 1 member
                   </Text>
                 )}
               </View>

+ 1 - 0
src/screens/InAppScreens/MessagesScreen/Components/SearchUsersModal.tsx

@@ -33,6 +33,7 @@ const SearchModal = () => {
       closeOnTouchBackdrop={false}
       keyboardHandlerEnabled={false}
       onClose={() => clearStore()}
+      isModal={false}
     />
   );
 };

+ 2 - 2
src/screens/InAppScreens/MessagesScreen/GroupChatScreen/index.tsx

@@ -998,7 +998,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
         (item) =>
           !item.item.received &&
           !item.item.deleted &&
-          !item.item.system &&
+          item.item._id !== 'unreadMarker' &&
           item.item.user._id !== +currentUserId &&
           !sentToServer.current.has(item.item._id)
       )
@@ -1790,7 +1790,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
               disabled={userType !== 'normal'}
             >
               {groupAvatar && userType === 'normal' ? (
-                <Image source={{ uri: groupAvatar }} style={styles.avatar} />
+                <Image source={{ uri: groupAvatar, cache: 'reload' }} style={styles.avatar} />
               ) : userType === 'normal' ? (
                 <GroupIcon fill={Colors.DARK_BLUE} width={30} height={30} />
               ) : (

+ 4 - 4
src/screens/InAppScreens/MessagesScreen/GroupSettingsScreen/index.tsx

@@ -177,7 +177,7 @@ const GroupSettingScreen: FC<Props> = ({ navigation, route }) => {
         contentContainerStyle={{
           paddingBottom: insets.bottom + tabBarHeight,
           justifyContent: 'space-between',
-          flex: 1
+          flexGrow: 1
         }}
       >
         <View style={{ gap: 16 }}>
@@ -191,7 +191,7 @@ const GroupSettingScreen: FC<Props> = ({ navigation, route }) => {
                 <GroupIcon width={80} height={80} fill={Colors.LIGHT_GRAY} />
               ) : (
                 <Image
-                  source={{ uri: API_HOST + data.settings.avatar }}
+                  source={{ uri: API_HOST + data.settings.avatar, cache: 'reload' }}
                   style={{
                     width: 80,
                     height: 80,
@@ -227,7 +227,7 @@ const GroupSettingScreen: FC<Props> = ({ navigation, route }) => {
                   alignItems: 'center'
                 }}
               >
-                <Text style={styles.title}>{members.settings.length} nomads</Text>
+                <Text style={styles.title}>{members.settings?.length} nomads</Text>
                 {data.settings.members_can_add_new_members === 1 || data.settings.admin === 1 ? (
                   <TouchableOpacity style={{ padding: 6, paddingRight: 0 }}>
                     <UserPlusIcon fill={Colors.ORANGE} height={18} width={23} />
@@ -238,7 +238,7 @@ const GroupSettingScreen: FC<Props> = ({ navigation, route }) => {
               <View style={{ gap: 6 }}>
                 {(data.settings.member_count > 4
                   ? members.settings.slice(0, 4)
-                  : members.settings
+                  : (members.settings ?? [])
                 ).map((member, index) => (
                   <TouchableOpacity
                     key={index}

+ 7 - 1
src/screens/InAppScreens/MessagesScreen/index.tsx

@@ -360,7 +360,13 @@ const MessagesScreen = () => {
         >
           <View style={styles.chatItem}>
             {item.avatar && (item.user_type === 'normal' || !item.user_type) ? (
-              <Image source={{ uri: API_HOST + item.avatar }} style={styles.avatar} />
+              <Image
+                source={{
+                  uri: API_HOST + item.avatar,
+                  cache: item.group_chat_token ? 'reload' : 'force-cache'
+                }}
+                style={styles.avatar}
+              />
             ) : item.uid && (item.user_type === 'normal' || !item.user_type) ? (
               <AvatarWithInitials
                 text={