mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-09-09 20:26:19 +00:00
The effect that turns on the progress indicator after a delay was copied into 5 Kotlin and 4 Swift views. Two of the Swift copies had drifted: the deferred write captured the value that started the delay rather than reading the current one, so an operation that finished before the delay elapsed left the indicator on with nothing to turn it off. Timing is unchanged.
90 lines
3.0 KiB
Swift
90 lines
3.0 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 theme: AppTheme
|
|
var contactRequestId: Int64
|
|
@UserDefault(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
|
|
@State private var inProgress = false
|
|
@State private var progressByTimeout = false
|
|
|
|
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)
|
|
}
|
|
}
|
|
.progressByTimeout(inProgress, $progressByTimeout)
|
|
}
|
|
|
|
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, inProgress: $inProgress)
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
ContextContactRequestActionsView(
|
|
contactRequestId: 1
|
|
)
|
|
}
|