Files
iOS/Sources/App/Thread/CredentialsSharing/ThreadCredentialsSharingView.swift
Bruno Pantaleão Gonçalves 781d8e228a Fix notification attachment issue (#2636)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->
I couldn't find the explanation for why this happens but having THClient
as a class variable inside ThreadClientService makes notifications
attachment to not be displayed.
Besides that this PR also clean up some ghosts folders that I created
and forgot to delete and rename THClientService protocol to not have
prefix TH avoiding confusion with Apple prefixes

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2024-03-08 17:18:41 +01:00

112 lines
2.8 KiB
Swift

import Shared
import SwiftUI
enum ThreadCredentialsAlertType {
case empty(title: String, message: String)
case error(title: String, message: String)
}
@available(iOS 16.4, *)
struct ThreadCredentialsSharingView<Model>: View where Model: ThreadCredentialsSharingViewModelProtocol {
@Environment(\.dismiss) private var dismiss
@StateObject private var viewModel: Model
init(viewModel: Model) {
self._viewModel = .init(wrappedValue: viewModel)
}
var body: some View {
VStack {
if viewModel.showOperationSuccess {
successView
.onAppear {
Haptics.shared.play(.medium)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
dismiss()
}
}
} else {
progressView
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.black.opacity(0.5))
.alert(alertTitle, isPresented: $viewModel.showAlert) {
alertActions
} message: {
Text(alertMessage)
}
.onAppear {
Task {
await viewModel.mainOperation()
}
}
}
private var successView: some View {
Image(systemName: "checkmark.circle.fill")
.resizable()
.frame(width: 65, height: 65)
.aspectRatio(contentMode: .fit)
.foregroundColor(.white)
}
private var alertTitle: String {
switch viewModel.alertType {
case let .empty(title, _):
return title
case let .error(title, _):
return title
case .none:
return ""
}
}
private var alertMessage: String {
switch viewModel.alertType {
case let .empty(_, message):
return message
case let .error(_, message):
return message
default:
return ""
}
}
private var doneButton: some View {
Button {
dismiss()
} label: {
Text(L10n.doneLabel)
}
}
private var retryButton: some View {
Button {
Task {
await viewModel.mainOperation()
}
} label: {
Text(L10n.retryLabel)
}
}
@ViewBuilder
private var alertActions: some View {
switch viewModel.alertType {
case .error, .empty:
doneButton
retryButton
default:
EmptyView()
}
}
private var progressView: some View {
ProgressView()
.progressViewStyle(.circular)
.scaleEffect(CGSize(width: 2, height: 2))
.tint(.white)
}
}