From 0c722e2dd34c5405357ee813f15369b098ed0410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Gon=C3=A7alves=20Marchi?= Date: Fri, 8 Mar 2024 09:40:31 -0300 Subject: [PATCH] fix(Group): Prevent members from removing others (#1906) Co-authored-by: Sara Tavares <29093946+stavares843@users.noreply.github.com> Co-authored-by: Darius Clark --- .../chats/presentation/chat/edit_group.rs | 73 +++++++++++++------ 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/ui/src/layouts/chats/presentation/chat/edit_group.rs b/ui/src/layouts/chats/presentation/chat/edit_group.rs index 829c947c81d..98bf3281631 100644 --- a/ui/src/layouts/chats/presentation/chat/edit_group.rs +++ b/ui/src/layouts/chats/presentation/chat/edit_group.rs @@ -3,6 +3,7 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use common::{ icons::outline::Shape as Icon, + icons::Icon as IconElement, language::get_local_text, state::{Identity, State}, warp_runner::{RayGunCmd, WarpCmd}, @@ -45,6 +46,8 @@ pub fn EditGroup(cx: Scope) -> Element { let edit_group_action = use_state(cx, || EditGroupAction::Remove); let conv_id = state.read().get_active_chat().unwrap().id; + let creator_id = state.read().get_active_chat()?.creator.clone()?; + let friends_did_already_in_group = state.read().get_active_chat().unwrap().participants; let friends_list: HashMap = HashMap::from_iter( @@ -111,6 +114,9 @@ pub fn EditGroup(cx: Scope) -> Element { } }); + let creator_did2 = creator_id.clone(); + let am_i_group_creator = creator_id == state.read().did_key(); + cx.render(rsx!( div { id: "edit-members", @@ -162,6 +168,7 @@ pub fn EditGroup(cx: Scope) -> Element { aria_label: "friend-group", friends.iter().map( |_friend| { + let is_group_creator = creator_did2.clone() == _friend.clone().did_key(); rsx!( friend_row { add_or_remove: if *edit_group_action.current() == EditGroupAction::Add { @@ -169,6 +176,8 @@ pub fn EditGroup(cx: Scope) -> Element { } else { "remove".into() }, + friend_is_group_creator: is_group_creator, + am_i_group_creator: am_i_group_creator, friend: _friend.clone(), minimal: minimal, conv_id: conv_id, @@ -196,6 +205,8 @@ pub fn EditGroup(cx: Scope) -> Element { #[derive(Props, Eq, PartialEq)] pub struct FriendRowProps { add_or_remove: String, + friend_is_group_creator: bool, + am_i_group_creator: bool, minimal: bool, friend: Identity, conv_id: Uuid, @@ -272,34 +283,50 @@ fn friend_row(cx: Scope) -> Element { _friend.username(), }, }, - Button { - aria_label: if cx.props.add_or_remove == "add" { - get_local_text("uplink.add") - } else { - get_local_text("uplink.remove") - }, - icon: if cx.props.add_or_remove == "add" { - Icon::UserPlus - } else { - Icon::UserMinus - }, - text: if cx.props.minimal { String::new() } - else if cx.props.add_or_remove == "add" { + if cx.props.friend_is_group_creator { + rsx!( + div { + class: "group-creator-container", + IconElement { + icon: Icon::Satellite + } + span { + class: "group-creator-text", + get_local_text("messages.group-creator-label") + } + } + ) + } + if cx.props.am_i_group_creator || cx.props.add_or_remove == "add" { + rsx!(Button { + aria_label: if cx.props.add_or_remove == "add" { get_local_text("uplink.add") } else { get_local_text("uplink.remove") - } - , - onpress: move |_| { - let mut friends = selected_friends.get().clone(); - friends.clear(); - selected_friends.set(vec![_friend.did_key()].into_iter().collect()); - if cx.props.add_or_remove == "add" { - ch.send(ChanCmd::AddParticipants); + }, + icon: if cx.props.add_or_remove == "add" { + Icon::UserPlus } else { - ch.send(ChanCmd::RemoveParticipants); + Icon::UserMinus + }, + text: if cx.props.minimal { String::new() } + else if cx.props.add_or_remove == "add" { + get_local_text("uplink.add") + } else { + get_local_text("uplink.remove") + } + , + onpress: move |_| { + let mut friends = selected_friends.get().clone(); + friends.clear(); + selected_friends.set(vec![_friend.did_key()].into_iter().collect()); + if cx.props.add_or_remove == "add" { + ch.send(ChanCmd::AddParticipants); + } else { + ch.send(ChanCmd::RemoveParticipants); + } } - } + }) } } ))