diff --git a/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift b/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift index 68a3536..919b82b 100644 --- a/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift +++ b/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift @@ -173,7 +173,10 @@ public struct ChatListView: View { } } detail: { if let selectedChat { - ChatDetailView(viewModel: ChatViewModel(chat: selectedChat, bridge: bridge), bridge: bridge) + ChatDetailView(viewModel: ChatViewModel(chat: selectedChat, bridge: bridge), bridge: bridge) { + self.selectedChat = nil + Task { await viewModel.load() } + } } else { Text("Select a chat") } @@ -327,15 +330,18 @@ public struct ChatDetailView: View { @State private var deleteCandidate: Message? @State private var forwardCandidate: Message? @State private var forwardChatIdText = "" + private let onChatLeft: () -> Void public init( viewModel: ChatViewModel, bridge: SessionBridge, - clipboard: ClipboardWriting = SystemClipboardWriter() + clipboard: ClipboardWriting = SystemClipboardWriter(), + onChatLeft: @escaping () -> Void = {} ) { _viewModel = StateObject(wrappedValue: viewModel) self.bridge = bridge self.clipboard = clipboard + self.onChatLeft = onChatLeft _profileViewModel = StateObject(wrappedValue: ProfileViewModel(bridge: bridge)) } @@ -437,7 +443,10 @@ public struct ChatDetailView: View { } } .sheet(isPresented: $showsProfile) { - ProfileView(viewModel: profileViewModel) + ProfileView(viewModel: profileViewModel, chatId: viewModel.chat.id) { + showsProfile = false + onChatLeft() + } } .alert("Edit Message", isPresented: editAlertBinding) { TextField("Message", text: $editedText) @@ -852,9 +861,14 @@ public struct ComposeBar: View { public struct ProfileView: View { @ObservedObject public var viewModel: ProfileViewModel + public var chatId: Int64? + public var onLeave: () -> Void + @State private var confirmsLeave = false - public init(viewModel: ProfileViewModel) { + public init(viewModel: ProfileViewModel, chatId: Int64? = nil, onLeave: @escaping () -> Void = {}) { self.viewModel = viewModel + self.chatId = chatId + self.onLeave = onLeave } public var body: some View { @@ -877,11 +891,33 @@ public struct ProfileView: View { Text("\(memberCount) members") } } + if profile.isGroup, chatId != nil { + Section { + Button(role: .destructive) { + confirmsLeave = true + } label: { + Label("Leave Chat", systemImage: "rectangle.portrait.and.arrow.right") + } + } + } } else { ProgressView() } } .navigationTitle("Profile") + .alert("Leave Chat", isPresented: $confirmsLeave) { + Button("Leave", role: .destructive) { + if let chatId { + Task { + await viewModel.leave(chatId: chatId) + if viewModel.errorMessage == nil { + onLeave() + } + } + } + } + Button("Cancel", role: .cancel) {} + } } } }