Files
simplex-chat/apps/ios/Shared/Views/Chat/ComposeMessage/ContextContactRequestActionsView.swift
Narasimha-sc 1462b8e012 android, desktop, ios: change only the progress indicator timeout
Reverts the shared helper the timeout change was extracted into, leaving the
effect where each view already had it. NewChatView and ViewModifiers are no
longer touched by this branch at all - the first was already at 0.5s.
2026-08-20 15:37:29 +00:00

100 lines
3.3 KiB
Swift

//
// ContextContactRequestActionsView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 02.05.2025.
// Copyright © 2025 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct ContextContactRequestActionsView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
var contactRequestId: Int64
@UserDefault(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
@State private var progressByTimeout = false
private var inProgress: Bool { chatModel.acceptingContactRequests.contains(contactRequestId) }
var body: some View {
HStack(spacing: 0) {
Button(role: .destructive, action: showRejectRequestAlert) {
Label("Reject", systemImage: "multiply")
}
.frame(maxWidth: .infinity, minHeight: 60)
Button {
if ChatModel.shared.addressShortLinkDataSet {
acceptRequest()
} else {
showAcceptRequestAlert()
}
} label: {
Label("Accept", systemImage: "checkmark")
}
.frame(maxWidth: .infinity, minHeight: 60)
}
.disabled(inProgress)
.frame(maxWidth: .infinity)
.background(ToolbarMaterial.material(toolbarMaterial))
.opacity(progressByTimeout ? 0.4 : 1)
.overlay {
if progressByTimeout {
ProgressView()
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
.onChange(of: inProgress) { inPrgrs in
if inPrgrs {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
progressByTimeout = inProgress
}
} else {
progressByTimeout = false
}
}
}
private func showRejectRequestAlert() {
showAlert(
NSLocalizedString("Reject contact request", comment: "alert title"),
message: NSLocalizedString("The sender will NOT be notified", comment: "alert message"),
actions: {[
UIAlertAction(title: NSLocalizedString("Reject", comment: "alert action"), style: .destructive) { _ in
Task { await rejectContactRequest(contactRequestId, dismissToChatList: true) }
},
cancelAlertAction
]}
)
}
private func showAcceptRequestAlert() {
showAlert(
NSLocalizedString("Accept contact request", comment: "alert title"),
actions: {[
UIAlertAction(title: NSLocalizedString("Accept", comment: "alert action"), style: .default) { _ in
acceptRequest()
},
UIAlertAction(title: NSLocalizedString("Accept incognito", comment: "alert action"), style: .default) { _ in
acceptRequest(incognito: true)
},
cancelAlertAction
]}
)
}
private func acceptRequest(incognito: Bool = false) {
Task {
await acceptContactRequest(incognito: incognito, contactRequestId: contactRequestId)
}
}
}
#Preview {
ContextContactRequestActionsView(
contactRequestId: 1
)
}