ErrorView.swift 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //
  2. // ErrorView.swift
  3. // OmniKit
  4. //
  5. // Created by Pete Schwamb on 3/12/20.
  6. // Copyright © 2021 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. import LoopKitUI
  10. struct ErrorView: View {
  11. var error: LocalizedError
  12. var criticality: ErrorCriticality
  13. @Environment(\.guidanceColors) var guidanceColors
  14. public enum ErrorCriticality {
  15. case critical
  16. case normal
  17. func symbolColor(using guidanceColors: GuidanceColors) -> Color {
  18. switch self {
  19. case .critical:
  20. return guidanceColors.critical
  21. case .normal:
  22. return guidanceColors.warning
  23. }
  24. }
  25. }
  26. init(_ error: LocalizedError, errorClass: ErrorCriticality = .normal) {
  27. self.error = error
  28. self.criticality = errorClass
  29. }
  30. var body: some View {
  31. VStack(alignment: .leading, spacing: 15) {
  32. HStack {
  33. Image(systemName: "exclamationmark.triangle.fill")
  34. .foregroundColor(self.criticality.symbolColor(using: guidanceColors))
  35. Text(self.error.errorDescription ?? "")
  36. .bold()
  37. .accessibility(identifier: "label_error_description")
  38. .fixedSize(horizontal: false, vertical: true)
  39. }
  40. .accessibilityElement(children: .ignore)
  41. .accessibility(label: FrameworkLocalText("Error", comment: "Accessibility label indicating an error occurred"))
  42. Text(self.error.recoverySuggestion ?? "")
  43. .foregroundColor(.secondary)
  44. .font(.footnote)
  45. .accessibility(identifier: "label_recovery_suggestion")
  46. .fixedSize(horizontal: false, vertical: true)
  47. }
  48. .padding(.bottom)
  49. .accessibilityElement(children: .combine)
  50. }
  51. }
  52. struct ErrorView_Previews: PreviewProvider {
  53. enum ErrorViewPreviewError: LocalizedError {
  54. case someError
  55. var localizedDescription: String { "It didn't work" }
  56. var recoverySuggestion: String { "Maybe try turning it on and off." }
  57. }
  58. static var previews: some View {
  59. ErrorView(ErrorViewPreviewError.someError)
  60. }
  61. }