diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index e6df139569..3736e269a8 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -455,7 +455,7 @@ struct ChatView: View { if let groupMember = groupMember_ { MemberSupportChatToolbar(groupMember: groupMember) } else { - textChatToolbar("Support") + textChatToolbar("Chat with admins") } } case let .msgContentTagContext(contentTag): @@ -502,7 +502,7 @@ struct ChatView: View { private func customUserSupportChatNavigationBar() -> some View { VStack(spacing: 0) { HStack { - Text("Support") + Text("Chat with admins") .font(.headline) .foregroundColor(theme.colors.onBackground) } diff --git a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift index 66fe67a29e..813a2d3d73 100644 --- a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift +++ b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift @@ -78,6 +78,12 @@ struct AddGroupMembersViewCommon: View { let count = selectedContacts.count Section { if creatingGroup { + MemberAdmissionButton( + groupInfo: $groupInfo, + admission: groupInfo.groupProfile.memberAdmission_, + currentAdmission: groupInfo.groupProfile.memberAdmission_, + creatingGroup: true + ) GroupPreferencesButton( groupInfo: $groupInfo, preferences: groupInfo.fullGroupPreferences, diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 66865f39ba..c84124b593 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -89,6 +89,18 @@ struct GroupChatInfoView: View { .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) Section { + if groupInfo.canAddMembers && groupInfo.businessChat == nil { + groupLinkButton() + } + if groupInfo.businessChat == nil && groupInfo.membership.memberRole >= .moderator { + memberSupportButton() + } + if groupInfo.canModerate { + GroupReportsChatNavLink( + chat: chat, + im: ItemsModel(secondaryIMFilter: .msgContentTagContext(contentTag: .report)) + ) + } if groupInfo.membership.supportChat != nil { let scopeInfo: GroupChatScopeInfo = .memberSupport(groupMember_: nil) UserSupportChatNavLink( @@ -96,15 +108,8 @@ struct GroupChatInfoView: View { im: ItemsModel(secondaryIMFilter: .groupChatScopeContext(groupScopeInfo: scopeInfo)) ) } - if groupInfo.businessChat == nil && groupInfo.membership.memberRole >= .moderator { - memberSupportButton() - } - if groupInfo.canModerate { - GroupReportsChatNavLink( - chat: Chat(chatInfo: .group(groupInfo: groupInfo, groupChatScope: nil), chatItems: [], chatStats: ChatStats()), - im: ItemsModel(secondaryIMFilter: .msgContentTagContext(contentTag: .report)) - ) - } + } header: { + Text("") } Section { @@ -115,8 +120,6 @@ struct GroupChatInfoView: View { addOrEditWelcomeMessage() } GroupPreferencesButton(groupInfo: $groupInfo, preferences: groupInfo.fullGroupPreferences, currentPreferences: groupInfo.fullGroupPreferences) - } header: { - Text("") } footer: { let label: LocalizedStringKey = ( groupInfo.businessChat == nil @@ -145,9 +148,6 @@ struct GroupChatInfoView: View { Section(header: Text("\(members.count + 1) members").foregroundColor(theme.colors.secondary)) { if groupInfo.canAddMembers { - if groupInfo.businessChat == nil { - groupLinkButton() - } if (chat.chatInfo.incognito) { Label("Invite members", systemImage: "plus") .foregroundColor(Color(uiColor: .tertiaryLabel)) @@ -550,7 +550,7 @@ struct GroupChatInfoView: View { userSupportChatNavLinkActive = true } } label: { - Label("Support chat", systemImage: "flag") + Label("Chat with admins", systemImage: "flag") } NavigationLink(isActive: $userSupportChatNavLinkActive) { @@ -573,16 +573,20 @@ struct GroupChatInfoView: View { private func memberSupportButton() -> some View { NavigationLink { MemberSupportView(groupInfo: groupInfo) - .navigationBarTitle("Member support") + .navigationBarTitle("Chats with members") .modifier(ThemedBackground()) .navigationBarTitleDisplayMode(.large) } label: { - Label("Member support", systemImage: "flag") + Label( + "Chats with members", + systemImage: chat.chatStats.supportChatsUnreadCount > 0 ? "flag.fill" : "flag" + ) } } struct GroupReportsChatNavLink: View { @EnvironmentObject var chatModel: ChatModel + @EnvironmentObject var theme: AppTheme @State private var groupReportsChatNavLinkActive = false @ObservedObject var chat: Chat var im: ItemsModel @@ -594,7 +598,11 @@ struct GroupChatInfoView: View { groupReportsChatNavLinkActive = true } } label: { - Label("Member reports", systemImage: "flag") + Label( + "Member reports", + systemImage: chat.chatStats.reportsCount > 0 ? "flag.fill" : "flag" + ) + .foregroundColor(chat.chatStats.reportsCount > 0 ? .red : theme.colors.primary) } NavigationLink(isActive: $groupReportsChatNavLinkActive) { diff --git a/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift b/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift index 3ad4de639d..55b1dc6d2e 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift @@ -33,8 +33,8 @@ struct GroupPreferencesView: View { Section { MemberAdmissionButton( groupInfo: $groupInfo, - admission: groupInfo.groupProfile.memberAdmission ?? GroupMemberAdmission(), - currentAdmission: groupInfo.groupProfile.memberAdmission ?? GroupMemberAdmission(), + admission: groupInfo.groupProfile.memberAdmission_, + currentAdmission: groupInfo.groupProfile.memberAdmission_, creatingGroup: creatingGroup ) } @@ -85,62 +85,6 @@ struct GroupPreferencesView: View { } } - struct MemberAdmissionButton: View { - @Binding var groupInfo: GroupInfo - @State var admission: GroupMemberAdmission - @State var currentAdmission: GroupMemberAdmission - var creatingGroup: Bool = false - - var body: some View { - NavigationLink { - MemberAdmissionView( - groupInfo: $groupInfo, - admission: $admission, - currentAdmission: currentAdmission, - creatingGroup: creatingGroup, - saveAdmission: saveAdmission - ) - .navigationBarTitle("Member admission") - .modifier(ThemedBackground(grouped: true)) - .navigationBarTitleDisplayMode(.large) - .onDisappear { - let saveText = NSLocalizedString( - creatingGroup ? "Save" : "Save and notify group members", - comment: "alert button" - ) - - if groupInfo.groupProfile.memberAdmission != admission { - showAlert( - title: NSLocalizedString("Save admission settings?", comment: "alert title"), - buttonTitle: saveText, - buttonAction: { saveAdmission() }, - cancelButton: true - ) - } - } - } label: { - Label("Member admission", systemImage: "switch.2") - } - } - - private func saveAdmission() { - Task { - do { - var gp = groupInfo.groupProfile - gp.memberAdmission = admission - let gInfo = try await apiUpdateGroup(groupInfo.groupId, gp) - await MainActor.run { - groupInfo = gInfo - ChatModel.shared.updateGroup(gInfo) - currentAdmission = admission - } - } catch { - logger.error("MemberAdmissionView apiUpdateGroup error: \(responseError(error))") - } - } - } - } - private func featureSection(_ feature: GroupFeature, _ enableFeature: Binding, _ enableForRole: Binding? = nil) -> some View { Section { let color: Color = enableFeature.wrappedValue == .on ? .green : theme.colors.secondary @@ -204,6 +148,66 @@ struct GroupPreferencesView: View { } } +struct MemberAdmissionButton: View { + @Binding var groupInfo: GroupInfo + @State var admission: GroupMemberAdmission + @State var currentAdmission: GroupMemberAdmission + var creatingGroup: Bool = false + + var body: some View { + NavigationLink { + MemberAdmissionView( + groupInfo: $groupInfo, + admission: $admission, + currentAdmission: currentAdmission, + creatingGroup: creatingGroup, + saveAdmission: saveAdmission + ) + .navigationBarTitle("Member admission") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.large) + .onDisappear { + let saveText = NSLocalizedString( + creatingGroup ? "Save" : "Save and notify group members", + comment: "alert button" + ) + + if groupInfo.groupProfile.memberAdmission_ != admission { + showAlert( + title: NSLocalizedString("Save admission settings?", comment: "alert title"), + buttonTitle: saveText, + buttonAction: { saveAdmission() }, + cancelButton: true + ) + } + } + } label: { + if creatingGroup { + Text("Set member admission") + } else { + Label("Member admission", systemImage: "switch.2") + } + } + } + + private func saveAdmission() { + Task { + do { + var gp = groupInfo.groupProfile + gp.memberAdmission = admission + let gInfo = try await apiUpdateGroup(groupInfo.groupId, gp) + await MainActor.run { + groupInfo = gInfo + ChatModel.shared.updateGroup(gInfo) + currentAdmission = admission + } + } catch { + logger.error("MemberAdmissionView apiUpdateGroup error: \(responseError(error))") + } + } + } +} + struct GroupPreferencesView_Previews: PreviewProvider { static var previews: some View { GroupPreferencesView( diff --git a/apps/ios/Shared/Views/Chat/Group/MemberAdmissionView.swift b/apps/ios/Shared/Views/Chat/Group/MemberAdmissionView.swift index dadf13d1a0..e1db2c35ad 100644 --- a/apps/ios/Shared/Views/Chat/Group/MemberAdmissionView.swift +++ b/apps/ios/Shared/Views/Chat/Group/MemberAdmissionView.swift @@ -30,8 +30,8 @@ struct MemberAdmissionView: View { VStack { List { admissionSection( - NSLocalizedString("Review", comment: "admission stage"), - NSLocalizedString("Review new members before admitting to group.", comment: "admission stage description"), + NSLocalizedString("Review members", comment: "admission stage"), + NSLocalizedString("Review members before admitting (\"knocking\").", comment: "admission stage description"), $admission.review ) diff --git a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift index 71d7efec92..587647edea 100644 --- a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift +++ b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift @@ -44,7 +44,7 @@ struct MemberSupportView: View { : membersWithChats.filter { $0.wrapped.localAliasAndFullName.localizedLowercase.contains(s) } if membersWithChats.isEmpty { - Text("No support chats") + Text("No chats with members") .foregroundColor(.secondary) } else { List { diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 72ef033e6b..8501d55bab 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -2101,6 +2101,11 @@ public struct GroupProfile: Codable, NamedChat, Hashable { public var memberAdmission: GroupMemberAdmission? public var localAlias: String { "" } + public var memberAdmission_: GroupMemberAdmission { + get { self.memberAdmission ?? GroupMemberAdmission() } + set { memberAdmission = newValue } + } + public static let sampleData = GroupProfile( displayName: "team", fullName: "My Team" diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index 7af2317123..84d811d1a9 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -342,7 +342,7 @@ fun ChatView( } } }, - showReportsOrSupportChats = { + showReports = { val info = activeChatInfo.value ?: return@ChatLayout if (ModalManager.end.hasModalsOpen()) { ModalManager.end.closeModals() @@ -350,9 +350,18 @@ fun ChatView( } hideKeyboard(view) scope.launch { - if (reportsCount > 0) { - showGroupReportsView(staleChatId, scrollToItemId, info) - } else if (info is ChatInfo.Group && info.groupInfo.membership.memberRole >= GroupMemberRole.Moderator) { + showGroupReportsView(staleChatId, scrollToItemId, info) + } + }, + showSupportChats = { + val info = activeChatInfo.value ?: return@ChatLayout + if (ModalManager.end.hasModalsOpen()) { + ModalManager.end.closeModals() + return@ChatLayout + } + hideKeyboard(view) + scope.launch { + if (info is ChatInfo.Group && info.groupInfo.membership.memberRole >= GroupMemberRole.Moderator) { ModalManager.end.showCustomModal { close -> MemberSupportView( chatRh, @@ -733,7 +742,8 @@ fun ChatLayout( selectedChatItems: MutableState?>, back: () -> Unit, info: () -> Unit, - showReportsOrSupportChats: () -> Unit, + showReports: () -> Unit, + showSupportChats: () -> Unit, showMemberInfo: (GroupInfo, GroupMember) -> Unit, loadMessages: suspend (ChatId, ChatPagination, visibleItemIndexesNonReversed: () -> IntRange) -> Unit, deleteMessage: (Long, CIDeleteMode) -> Unit, @@ -887,7 +897,7 @@ fun ChatLayout( val supportChatsUnreadCount = supportChatsUnreadCount(chatInfo?.id) if (oneHandUI.value && chatBottomBar.value) { if (chatsCtx.secondaryContextFilter == null && (reportsCount > 0 || supportChatsUnreadCount > 0)) { - SupportChatsCountToolbar(reportsCount, supportChatsUnreadCount, withStatusBar = true, showReportsOrSupportChats) + SupportChatsCountToolbar(reportsCount, supportChatsUnreadCount, withStatusBar = true, showReports, showSupportChats) } else { StatusBarBackground() } @@ -944,7 +954,7 @@ fun ChatLayout( } } if ((reportsCount > 0 || supportChatsUnreadCount > 0) && (!oneHandUI.value || !chatBottomBar.value)) { - SupportChatsCountToolbar(reportsCount, supportChatsUnreadCount, withStatusBar = false, showReportsOrSupportChats) + SupportChatsCountToolbar(reportsCount, supportChatsUnreadCount, withStatusBar = false, showReports, showSupportChats) } } } @@ -1180,37 +1190,64 @@ private fun SupportChatsCountToolbar( reportsCount: Int, supportChatsUnreadCount: Int, withStatusBar: Boolean, - showReportsOrSupportChats: () -> Unit + showReports: () -> Unit, + showSupportChats: () -> Unit ) { Box { val statusBarPadding = if (withStatusBar) WindowInsets.statusBars.asPaddingValues().calculateTopPadding() else 0.dp Row( Modifier - .fillMaxWidth() - .height(AppBarHeight * fontSizeSqrtMultiplier + statusBarPadding) - .background(MaterialTheme.colors.background) - .clickable(onClick = showReportsOrSupportChats) - .padding(top = statusBarPadding), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly, ) { - val iconColor = if (reportsCount == 0) MaterialTheme.colors.primary else MaterialTheme.colors.error - Icon(painterResource(MR.images.ic_flag), null, Modifier.size(22.dp), tint = iconColor) - Spacer(Modifier.width(4.dp)) - Text( - if (supportChatsUnreadCount == 0) { - if (reportsCount == 1) { - stringResource(MR.strings.group_reports_active_one) - } else { - stringResource(MR.strings.group_reports_active).format(reportsCount) - } - } else if (reportsCount == 0) { - stringResource(MR.strings.group_new_support_messages).format(supportChatsUnreadCount) - } else { - String.format(generalGetString(MR.strings.group_reports_active_new_support_messages), reportsCount, supportChatsUnreadCount) - }, - style = MaterialTheme.typography.button - ) + if (reportsCount > 0) { + Row( + Modifier + .fillMaxWidth() + .weight(1F) + .height(AppBarHeight * fontSizeSqrtMultiplier + statusBarPadding) + .background(MaterialTheme.colors.background) + .clickable(onClick = showReports) + .padding(top = statusBarPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Icon(painterResource(MR.images.ic_flag), null, Modifier.size(22.dp), tint = MaterialTheme.colors.error) + Spacer(Modifier.width(4.dp)) + Text( + if (reportsCount == 1) { + stringResource(MR.strings.group_reports_active_one) + } else { + stringResource(MR.strings.group_reports_active).format(reportsCount) + }, + style = MaterialTheme.typography.button + ) + } + } + + if (supportChatsUnreadCount > 0) { + Row( + Modifier + .fillMaxWidth() + .weight(1F) + .height(AppBarHeight * fontSizeSqrtMultiplier + statusBarPadding) + .background(MaterialTheme.colors.background) + .clickable(onClick = showSupportChats) + .padding(top = statusBarPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Icon(painterResource(MR.images.ic_flag), null, Modifier.size(22.dp), tint = MaterialTheme.colors.primary) + Spacer(Modifier.width(4.dp)) + Text( + if (appPlatform.isAndroid) + stringResource(MR.strings.group_new_support_messages_short).format(supportChatsUnreadCount) + else + stringResource(MR.strings.group_new_support_messages).format(supportChatsUnreadCount), + style = MaterialTheme.typography.button + ) + } + } } Divider(Modifier.align(Alignment.BottomStart)) } @@ -3027,7 +3064,8 @@ fun PreviewChatLayout() { selectedChatItems = remember { mutableStateOf(setOf()) }, back = {}, info = {}, - showReportsOrSupportChats = {}, + showReports = {}, + showSupportChats = {}, showMemberInfo = { _, _ -> }, loadMessages = { _, _, _ -> }, deleteMessage = { _, _ -> }, @@ -3105,7 +3143,8 @@ fun PreviewGroupChatLayout() { selectedChatItems = remember { mutableStateOf(setOf()) }, back = {}, info = {}, - showReportsOrSupportChats = {}, + showReports = {}, + showSupportChats = {}, showMemberInfo = { _, _ -> }, loadMessages = { _, _, _ -> }, deleteMessage = { _, _ -> }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt index 369a498c25..48c1ba5200 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt @@ -55,6 +55,16 @@ fun AddGroupMembersView(rhId: Long?, groupInfo: GroupInfo, creatingGroup: Boolea GroupPreferencesView(chatModel, rhId, groupInfo.id, close) } }, + openMemberAdmission = { + ModalManager.end.showCustomModal { close -> + MemberAdmissionView( + chat.simplex.common.platform.chatModel, + rhId, + groupInfo.id, + close + ) + } + }, inviteMembers = { allowModifyMembers = false withLongRunningApi(slow = 120_000) { @@ -110,6 +120,7 @@ fun AddGroupMembersLayout( allowModifyMembers: Boolean, searchText: MutableState, openPreferences: () -> Unit, + openMemberAdmission: () -> Unit, inviteMembers: () -> Unit, clearSelection: () -> Unit, addContact: (Long) -> Unit, @@ -165,6 +176,9 @@ fun AddGroupMembersLayout( } else { SectionView { if (creatingGroup) { + SectionItemView(openMemberAdmission) { + Text(stringResource(MR.strings.set_member_admission)) + } SectionItemView(openPreferences) { Text(stringResource(MR.strings.set_group_preferences)) } @@ -376,6 +390,7 @@ fun PreviewAddGroupMembersLayout() { allowModifyMembers = true, searchText = remember { mutableStateOf(TextFieldValue("")) }, openPreferences = {}, + openMemberAdmission = {}, inviteMembers = {}, clearSelection = {}, addContact = {}, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index beb7539171..9a27dd150b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -463,22 +463,30 @@ fun ModalData.GroupChatInfoLayout( var anyTopSectionRowShow = false SectionView { - if (groupInfo.membership.supportChat != null) { + if (groupInfo.canAddMembers && groupInfo.businessChat == null) { anyTopSectionRowShow = true - UserSupportChatButton(groupInfo, scrollToItemId) + if (groupLink == null) { + CreateGroupLinkButton(manageGroupLink) + } else { + GroupLinkButton(manageGroupLink) + } } if (groupInfo.businessChat == null && groupInfo.membership.memberRole >= GroupMemberRole.Moderator) { anyTopSectionRowShow = true - MemberSupportButton(openMemberSupport) + MemberSupportButton(chat, openMemberSupport) } if (groupInfo.canModerate) { anyTopSectionRowShow = true - GroupReportsButton { + GroupReportsButton(chat) { scope.launch { showGroupReportsView(chatModel.chatId, scrollToItemId, chat.chatInfo) } } } + if (groupInfo.membership.supportChat != null) { + anyTopSectionRowShow = true + UserSupportChatButton(groupInfo, scrollToItemId) + } } if (anyTopSectionRowShow) { SectionDividerSpaced(maxBottomPadding = false) @@ -520,13 +528,6 @@ fun ModalData.GroupChatInfoLayout( SectionView(title = String.format(generalGetString(MR.strings.group_info_section_title_num_members), activeSortedMembers.count() + 1)) { if (groupInfo.canAddMembers) { - if (groupInfo.businessChat == null) { - if (groupLink == null) { - CreateGroupLinkButton(manageGroupLink) - } else { - GroupLinkButton(manageGroupLink) - } - } val onAddMembersClick = if (chat.chatInfo.incognito) ::cantInviteIncognitoAlert else addMembers val tint = if (chat.chatInfo.incognito) MaterialTheme.colors.secondary else MaterialTheme.colors.primary val addMembersTitleId = when (groupInfo.businessChat?.chatType) { @@ -738,11 +739,12 @@ private fun GroupChatInfoHeader(cInfo: ChatInfo, groupInfo: GroupInfo) { } @Composable -private fun MemberSupportButton(onClick: () -> Unit) { +private fun MemberSupportButton(chat: Chat, onClick: () -> Unit) { SettingsActionItem( - painterResource(MR.images.ic_flag), + painterResource(if (chat.chatStats.supportChatsUnreadCount > 0) MR.images.ic_flag_filled else MR.images.ic_flag), stringResource(MR.strings.member_support), - click = onClick + click = onClick, + iconColor = (if (chat.chatStats.supportChatsUnreadCount > 0) MaterialTheme.colors.primary else MaterialTheme.colors.secondary) ) } @@ -756,11 +758,12 @@ private fun GroupPreferencesButton(titleId: StringResource, onClick: () -> Unit) } @Composable -private fun GroupReportsButton(onClick: () -> Unit) { +private fun GroupReportsButton(chat: Chat, onClick: () -> Unit) { SettingsActionItem( - painterResource(MR.images.ic_flag), + painterResource(if (chat.chatStats.reportsCount > 0) MR.images.ic_flag_filled else MR.images.ic_flag), stringResource(MR.strings.group_reports_member_reports), - click = onClick + click = onClick, + iconColor = (if (chat.chatStats.reportsCount > 0) Color.Red else MaterialTheme.colors.secondary) ) } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 1f4115e927..4cc727ba4f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -466,7 +466,7 @@ %d reports Member reports %d new support messages - %1$d reports, %2$d new support messages + %d messages Share message… @@ -512,7 +512,7 @@ Report content: only group moderators will see it. Report other: only group moderators will see it. Report sent to moderators - You can view your reports in Support Chat. + You can view your reports in Chat with admins. Image @@ -1767,7 +1767,7 @@ Remove member? Remove members? Remove member - Support chat + Chat with admins Send direct message Member will be removed from group - this cannot be undone! Members will be removed from group - this cannot be undone! @@ -2044,6 +2044,7 @@ Contact preferences Group preferences Set group preferences + Set member admission Your preferences Disappearing messages Direct messages @@ -2163,17 +2164,17 @@ Member admission - Review - Review new members before admitting to group. + Review members + Review members before admitting ("knocking"). off all - Member support - No support chats + Chats with members + No chats with members - Support + Chat with admins Remove Accept Accept member