diff --git a/RIADigiDoc/Assets.xcassets/ic_m3_error_48pt_wght400.imageset/Contents.json b/RIADigiDoc/Assets.xcassets/ic_m3_error_48pt_wght400.imageset/Contents.json
new file mode 100644
index 00000000..1485e57a
--- /dev/null
+++ b/RIADigiDoc/Assets.xcassets/ic_m3_error_48pt_wght400.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "ic_m3_error_48pt_wght400.svg",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "template"
+ }
+}
diff --git a/RIADigiDoc/Assets.xcassets/ic_m3_error_48pt_wght400.imageset/ic_m3_error_48pt_wght400.svg b/RIADigiDoc/Assets.xcassets/ic_m3_error_48pt_wght400.imageset/ic_m3_error_48pt_wght400.svg
new file mode 100644
index 00000000..ea821517
--- /dev/null
+++ b/RIADigiDoc/Assets.xcassets/ic_m3_error_48pt_wght400.imageset/ic_m3_error_48pt_wght400.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/RIADigiDoc/Domain/Model/Error/FileOpeningErrors.swift b/RIADigiDoc/Domain/Model/Error/FileOpeningErrors.swift
index 6c896d24..d8763b9c 100644
--- a/RIADigiDoc/Domain/Model/Error/FileOpeningErrors.swift
+++ b/RIADigiDoc/Domain/Model/Error/FileOpeningErrors.swift
@@ -25,14 +25,3 @@ public enum FileOpeningError: Error {
case emptyFile
case noDataFiles
}
-
-extension FileOpeningError: LocalizedError {
- public var errorDescription: String? {
- switch self {
- case .unableToRetrieveFileSize, .invalidFileSize:
- return NSLocalizedString("Invalid file size", comment: "")
- case .emptyFile, .noDataFiles:
- return NSLocalizedString("Could not load selected files", comment: "")
- }
- }
-}
diff --git a/RIADigiDoc/Supporting files/Localizable.xcstrings b/RIADigiDoc/Supporting files/Localizable.xcstrings
index b45583a1..c7bae94d 100644
--- a/RIADigiDoc/Supporting files/Localizable.xcstrings
+++ b/RIADigiDoc/Supporting files/Localizable.xcstrings
@@ -747,7 +747,7 @@
"et" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Palun kontrolli internetiühendust ja võrgu sätteid"
+ "value" : "Palun kontrolli internetiühendust ja võrgusätteid"
}
}
}
diff --git a/RIADigiDoc/UI/Component/Container/ContainerNameView.swift b/RIADigiDoc/UI/Component/Container/ContainerNameView.swift
index d79af3dd..70021c2e 100644
--- a/RIADigiDoc/UI/Component/Container/ContainerNameView.swift
+++ b/RIADigiDoc/UI/Component/Container/ContainerNameView.swift
@@ -112,7 +112,7 @@ struct ContainerNameView: View {
width: Dimensions.Icon.IconSizeXXS,
height: Dimensions.Icon.IconSizeXXS
)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
})
.accessibilityFocusRestore(
focusedField: $focusedField,
diff --git a/RIADigiDoc/UI/Component/Container/ContainerNotificationsView.swift b/RIADigiDoc/UI/Component/Container/ContainerNotificationsView.swift
index 394d6481..134391e4 100644
--- a/RIADigiDoc/UI/Component/Container/ContainerNotificationsView.swift
+++ b/RIADigiDoc/UI/Component/Container/ContainerNotificationsView.swift
@@ -46,7 +46,7 @@ struct ContainerNotificationsView: View {
Image("ic_m3_notifications_48pt_wght400")
.resizable()
.scaledToFit()
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
.padding(Dimensions.Padding.XSPadding)
.accessibilityHidden(true)
diff --git a/RIADigiDoc/UI/Component/Container/Crypto/CryptoDataFilesView.swift b/RIADigiDoc/UI/Component/Container/Crypto/CryptoDataFilesView.swift
index 931e1ad5..7b1e1378 100644
--- a/RIADigiDoc/UI/Component/Container/Crypto/CryptoDataFilesView.swift
+++ b/RIADigiDoc/UI/Component/Container/Crypto/CryptoDataFilesView.swift
@@ -93,7 +93,7 @@ struct CryptoDataFilesView: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityLabel(
Text(
verbatim: "\(languageSettings.localized("File")) " +
diff --git a/RIADigiDoc/UI/Component/Container/Crypto/Recipient/EncryptRecipientView.swift b/RIADigiDoc/UI/Component/Container/Crypto/Recipient/EncryptRecipientView.swift
index b65af7b7..becca3f3 100644
--- a/RIADigiDoc/UI/Component/Container/Crypto/Recipient/EncryptRecipientView.swift
+++ b/RIADigiDoc/UI/Component/Container/Crypto/Recipient/EncryptRecipientView.swift
@@ -62,6 +62,10 @@ struct EncryptRecipientView: View {
viewModel.searchText.isEmpty
}
+ var encryptLabel: String {
+ languageSettings.localized("Encrypt")
+ }
+
var body: some View {
TopBarContainer(
isTopBarHidden: isSearchExpanded,
@@ -244,27 +248,48 @@ struct EncryptRecipientView: View {
}
}
.safeAreaInset(edge: .bottom) {
- UnsignedBottomBarView(
- showLeftButton: false,
- leftButtonIconName: "ic_m3_add_48pt_wght400",
- leftButtonLabel: "",
- leftButtonAccessibilityLabel: "",
- leftButtonAction: {
- // do nothing
- },
-
- rightButtonEnabled: encryptionButtonEnabled,
- rightButtonIconName: "ic_m3_encrypted_48pt_wght400",
- rightButtonLabel: languageSettings.localized("Encrypt"),
- rightButtonAccessibilityLabel: languageSettings.localized("Encrypt").lowercased(),
- rightButtonAction: {
+ HStack(spacing: Dimensions.Padding.XSPadding) {
+ Button(action: {
if encryptionButtonEnabled {
encryptionButtonEnabled = false
pathManager.replaceLast(to: .encryptView(isWithEncryption: true))
encryptionButtonEnabled = true
}
- }
+ }, label: {
+ HStack(spacing: Dimensions.Padding.XSPadding) {
+ Image("ic_m3_encrypted_48pt_wght400")
+ .resizable()
+ .scaledToFit()
+ .frame(
+ width: Dimensions.Icon.IconSizeXXS,
+ height: Dimensions.Icon.IconSizeXXS
+ )
+ .foregroundStyle(theme.onPrimaryContainer)
+ .accessibilityHidden(true)
+
+ Text(verbatim: encryptLabel)
+ .foregroundStyle(theme.onPrimaryContainer)
+ .font(typography.bodyLarge)
+ .accessibilityHidden(true)
+ }
+ })
+ }
+ .padding(Dimensions.Padding.MSPadding)
+ .background(
+ RoundedRectangle(cornerRadius: Dimensions.Corner.MSCornerRadius)
+ .fill(theme.primaryContainer)
+ .shadow(
+ color: theme.onSurfaceVariant.opacity(Dimensions.Shadow.SOpacity),
+ radius: Dimensions.Shadow.radius,
+ x: Dimensions.Shadow.xOffset,
+ y: Dimensions.Shadow.yOffset
+ )
)
+ .frame(maxWidth: .infinity, alignment: .trailing)
+ .padding(Dimensions.Padding.MPadding)
+ .accessibilityElement(children: .ignore)
+ .accessibilityLabel(encryptLabel.lowercased())
+ .accessibilityIdentifier("bottomEncryptButton")
}
.onAppear {
Task { @MainActor in
diff --git a/RIADigiDoc/UI/Component/Container/Crypto/RecipientView.swift b/RIADigiDoc/UI/Component/Container/Crypto/RecipientView.swift
index 8d3e5e91..6b9d9030 100644
--- a/RIADigiDoc/UI/Component/Container/Crypto/RecipientView.swift
+++ b/RIADigiDoc/UI/Component/Container/Crypto/RecipientView.swift
@@ -171,7 +171,7 @@ struct RecipientView: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityLabel(
Text(verbatim:
"\(languageSettings.localized("Recipient")) " +
diff --git a/RIADigiDoc/UI/Component/Container/DataFilesView.swift b/RIADigiDoc/UI/Component/Container/DataFilesView.swift
index 24b46c33..89e1f1c3 100644
--- a/RIADigiDoc/UI/Component/Container/DataFilesView.swift
+++ b/RIADigiDoc/UI/Component/Container/DataFilesView.swift
@@ -91,7 +91,7 @@ struct DataFilesView: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityLabel(
Text(
verbatim: "\(languageSettings.localized("File")) " +
diff --git a/RIADigiDoc/UI/Component/Container/Signing/ActionInputScreen.swift b/RIADigiDoc/UI/Component/Container/Signing/ActionInputScreen.swift
index 15f8d499..0c2d2a75 100644
--- a/RIADigiDoc/UI/Component/Container/Signing/ActionInputScreen.swift
+++ b/RIADigiDoc/UI/Component/Container/Signing/ActionInputScreen.swift
@@ -145,7 +145,7 @@ struct ActionInputScreen: View {
width: Dimensions.Icon.IconSizeXXS,
height: Dimensions.Icon.IconSizeXXS
)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityHidden(true)
}
}
diff --git a/RIADigiDoc/UI/Component/Container/Signing/ControlCodeView.swift b/RIADigiDoc/UI/Component/Container/Signing/ControlCodeView.swift
index 5bb03422..567b3027 100644
--- a/RIADigiDoc/UI/Component/Container/Signing/ControlCodeView.swift
+++ b/RIADigiDoc/UI/Component/Container/Signing/ControlCodeView.swift
@@ -36,7 +36,7 @@ struct ControlCodeView: View {
Image(icon)
.resizable()
.scaledToFit()
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.frame(width: Dimensions.Icon.IconSizeXXL, height: Dimensions.Icon.IconSizeXXL)
.padding(.vertical, Dimensions.Padding.LPadding)
.padding(.top, Dimensions.Padding.SPadding)
diff --git a/RIADigiDoc/UI/Component/Container/Signing/IdCard/IdCardActionView.swift b/RIADigiDoc/UI/Component/Container/Signing/IdCard/IdCardActionView.swift
index 2fd0ce15..360d5f4f 100644
--- a/RIADigiDoc/UI/Component/Container/Signing/IdCard/IdCardActionView.swift
+++ b/RIADigiDoc/UI/Component/Container/Signing/IdCard/IdCardActionView.swift
@@ -37,7 +37,7 @@ struct IdCardActionView: View {
Image(icon)
.resizable()
.scaledToFit()
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.frame(
width: Dimensions.Icon.IconSizeXXL,
height: Dimensions.Icon.IconSizeXXL
diff --git a/RIADigiDoc/UI/Component/Container/Signing/NFC/NFCActionView.swift b/RIADigiDoc/UI/Component/Container/Signing/NFC/NFCActionView.swift
index 4d87c052..ab84ff39 100644
--- a/RIADigiDoc/UI/Component/Container/Signing/NFC/NFCActionView.swift
+++ b/RIADigiDoc/UI/Component/Container/Signing/NFC/NFCActionView.swift
@@ -37,14 +37,14 @@ struct NFCActionView: View {
Image(leftIcon)
.resizable()
.scaledToFit()
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.frame(width: Dimensions.Icon.IconSizeXXL, height: Dimensions.Icon.IconSizeXXL)
.accessibilityHidden(true)
Image(rightIcon)
.resizable()
.scaledToFit()
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.frame(width: Dimensions.Icon.IconSizeXXL, height: Dimensions.Icon.IconSizeXXL)
.accessibilityHidden(true)
}
diff --git a/RIADigiDoc/UI/Component/Container/Signing/SignatureView.swift b/RIADigiDoc/UI/Component/Container/Signing/SignatureView.swift
index e355f266..debd2135 100644
--- a/RIADigiDoc/UI/Component/Container/Signing/SignatureView.swift
+++ b/RIADigiDoc/UI/Component/Container/Signing/SignatureView.swift
@@ -175,7 +175,7 @@ struct SignatureView: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityLabel(
Text(verbatim:
"\(languageSettings.localized(isTimestamp ? "Timestamp" : "Signature")) " +
diff --git a/RIADigiDoc/UI/Component/Container/Signing/SignerDetailView.swift b/RIADigiDoc/UI/Component/Container/Signing/SignerDetailView.swift
index 62837db5..a9429274 100644
--- a/RIADigiDoc/UI/Component/Container/Signing/SignerDetailView.swift
+++ b/RIADigiDoc/UI/Component/Container/Signing/SignerDetailView.swift
@@ -58,7 +58,7 @@ struct SignerDetailView: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityHidden(true)
}
}
diff --git a/RIADigiDoc/UI/Component/Container/UnsignedBottomBarView.swift b/RIADigiDoc/UI/Component/Container/UnsignedBottomBarView.swift
index 82b837b8..0b55894d 100644
--- a/RIADigiDoc/UI/Component/Container/UnsignedBottomBarView.swift
+++ b/RIADigiDoc/UI/Component/Container/UnsignedBottomBarView.swift
@@ -84,7 +84,8 @@ struct UnsignedBottomBarView: View {
.disabled(!rightButtonEnabled)
.foregroundStyle(theme.surfaceContainer)
}
- .padding(Dimensions.Padding.SPadding)
+ .padding(.vertical,Dimensions.Padding.SPadding)
+ .padding(.horizontal,Dimensions.Padding.MPadding)
.background(theme.surfaceContainer)
}
}
diff --git a/RIADigiDoc/UI/Component/DiagnosticsView.swift b/RIADigiDoc/UI/Component/DiagnosticsView.swift
index 2611444d..f371d217 100644
--- a/RIADigiDoc/UI/Component/DiagnosticsView.swift
+++ b/RIADigiDoc/UI/Component/DiagnosticsView.swift
@@ -180,7 +180,7 @@ struct DiagnosticsView: View {
let updateMessage = languageSettings.localized(messageKey)
- Toast.show(updateMessage, type: .success)
+ Toast.show(updateMessage, type: isUpdated ? .success : .error)
if voiceOverEnabled {
var saveButtonAccessibilityAnnouncement = AttributedString(updateMessage)
diff --git a/RIADigiDoc/UI/Component/InitView.swift b/RIADigiDoc/UI/Component/InitView.swift
index fc39b575..b7b6d890 100644
--- a/RIADigiDoc/UI/Component/InitView.swift
+++ b/RIADigiDoc/UI/Component/InitView.swift
@@ -40,7 +40,7 @@ struct InitView: View {
var body: some View {
ZStack {
- AppColors.BlueBackground.ignoresSafeArea()
+ AppColors.initialLaunchScreenBackground.ignoresSafeArea()
GeometryReader { geometry in
ScrollView {
VStack(
diff --git a/RIADigiDoc/UI/Component/My eID/MyEidPinChangeView.swift b/RIADigiDoc/UI/Component/My eID/MyEidPinChangeView.swift
index e268ed07..081710d0 100644
--- a/RIADigiDoc/UI/Component/My eID/MyEidPinChangeView.swift
+++ b/RIADigiDoc/UI/Component/My eID/MyEidPinChangeView.swift
@@ -215,7 +215,7 @@ struct MyEidPinChangeView: View {
width: Dimensions.Icon.IconSizeM,
height: Dimensions.Icon.IconSizeM
)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityHidden(true)
Text(verbatim: stepTitle)
diff --git a/RIADigiDoc/UI/Component/Shared/LaunchScreenView.swift b/RIADigiDoc/UI/Component/Shared/LaunchScreenView.swift
index 6f2061a5..2dde2274 100644
--- a/RIADigiDoc/UI/Component/Shared/LaunchScreenView.swift
+++ b/RIADigiDoc/UI/Component/Shared/LaunchScreenView.swift
@@ -31,7 +31,7 @@ struct LaunchScreenView: View {
var body: some View {
ZStack {
- AppColors.BlueBackground.ignoresSafeArea()
+ AppColors.initialLaunchScreenBackground.ignoresSafeArea()
VStack(spacing: Dimensions.Padding.ZeroPadding) {
Image("image_eesti_shield")
.resizable()
diff --git a/RIADigiDoc/UI/Component/Shared/SaveButton.swift b/RIADigiDoc/UI/Component/Shared/SaveButton.swift
index 4ad5b457..897887cb 100644
--- a/RIADigiDoc/UI/Component/Shared/SaveButton.swift
+++ b/RIADigiDoc/UI/Component/Shared/SaveButton.swift
@@ -33,7 +33,7 @@ struct SaveButton: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
.accessibilityLabel(languageSettings.localized("Save"))
}
.foregroundStyle(theme.onSurface)
diff --git a/RIADigiDoc/UI/Component/Shared/ShareButton.swift b/RIADigiDoc/UI/Component/Shared/ShareButton.swift
index 24a8da31..ebefd581 100644
--- a/RIADigiDoc/UI/Component/Shared/ShareButton.swift
+++ b/RIADigiDoc/UI/Component/Shared/ShareButton.swift
@@ -46,7 +46,7 @@ struct ShareButton: View {
RoundedRectangle(cornerRadius: Dimensions.Corner.MSCornerRadius)
.fill(theme.surfaceContainerHigh)
.shadow(
- color: theme.onBackground.opacity(Dimensions.Shadow.SOpacity),
+ color: theme.onSurfaceVariant.opacity(Dimensions.Shadow.SOpacity),
radius: Dimensions.Shadow.radius,
x: Dimensions.Shadow.xOffset,
y: Dimensions.Shadow.yOffset
diff --git a/RIADigiDoc/UI/Component/Shared/ShareButtonBottomBar.swift b/RIADigiDoc/UI/Component/Shared/ShareButtonBottomBar.swift
index 59c8b479..cc48661f 100644
--- a/RIADigiDoc/UI/Component/Shared/ShareButtonBottomBar.swift
+++ b/RIADigiDoc/UI/Component/Shared/ShareButtonBottomBar.swift
@@ -45,7 +45,7 @@ struct ShareButtonBottomBar: View {
)
}
}
- .padding(.horizontal, Dimensions.Padding.SPadding)
+ .padding(.horizontal, Dimensions.Padding.MPadding)
.padding(.top, Dimensions.Padding.XSPadding)
.padding(.bottom, Dimensions.Padding.SPadding)
.sheet(isPresented: $showingShareSheet) {
diff --git a/RIADigiDoc/UI/Component/Shared/TopBar/TopBar.swift b/RIADigiDoc/UI/Component/Shared/TopBar/TopBar.swift
index d68c71b2..4da227c4 100644
--- a/RIADigiDoc/UI/Component/Shared/TopBar/TopBar.swift
+++ b/RIADigiDoc/UI/Component/Shared/TopBar/TopBar.swift
@@ -212,7 +212,7 @@ struct TopBar: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
}
.accessibilityLabel(languageSettings.localized(leftIconAccessibility))
.accessibilityInputLabels(getInputLabels(leftIconAccessibilityInput, leftIconAccessibility))
@@ -237,7 +237,7 @@ struct TopBar: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
if extraBadgeCount > 0 {
Text(verbatim: "\(extraBadgeCount)")
.frame(
@@ -264,7 +264,7 @@ struct TopBar: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
}
.accessibilityLabel(languageSettings.localized(rightPrimaryIconAccessibility))
.accessibilityInputLabels(getInputLabels(rightPrimaryIconAccessibilityInput,
@@ -278,7 +278,7 @@ struct TopBar: View {
.resizable()
.scaledToFit()
.frame(width: Dimensions.Icon.IconSizeXXS, height: Dimensions.Icon.IconSizeXXS)
- .foregroundStyle(theme.onBackground)
+ .foregroundStyle(theme.onSurfaceVariant)
}
.accessibilityLabel(languageSettings.localized(rightSecondaryIconAccessibility))
.accessibilityInputLabels(getInputLabels(rightSecondaryIconAccessibilityInput,
diff --git a/RIADigiDoc/UI/Component/Toast/ToastOverlay.swift b/RIADigiDoc/UI/Component/Toast/ToastOverlay.swift
index a9f6ba35..e99b848e 100644
--- a/RIADigiDoc/UI/Component/Toast/ToastOverlay.swift
+++ b/RIADigiDoc/UI/Component/Toast/ToastOverlay.swift
@@ -24,20 +24,37 @@ struct ToastOverlay: View {
@AppTheme private var theme
+ private var style: (icon: String, background: Color, foreground: Color) {
+ switch toast.type {
+ case .success:
+ return (
+ icon: "ic_m3_check_48pt_wght400",
+ background: theme.successContainer,
+ foreground: theme.onSuccessContainer
+ )
+ case .error:
+ return (
+ icon: "ic_m3_error_48pt_wght400",
+ background: theme.errorContainer,
+ foreground: theme.onErrorContainer
+ )
+ }
+ }
+
var body: some View {
VStack(alignment: .leading) {
Spacer()
if toast.isVisible, let message = toast.message {
HStack(spacing: Dimensions.Padding.XSPadding) {
- Image("ic_m3_info_48pt_wght400")
+ Image(style.icon)
.resizable()
.scaledToFit()
.frame(
width: Dimensions.Icon.IconSizeXXS,
height: Dimensions.Icon.IconSizeXXS
)
- .foregroundStyle(getForegroundColor(toast.type))
+ .foregroundStyle(style.foreground)
Text(verbatim: message)
.lineLimit(nil)
@@ -46,8 +63,8 @@ struct ToastOverlay: View {
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, Dimensions.Padding.SPadding)
.padding(.vertical, Dimensions.Padding.MSPadding)
- .background(getBackgroundColor(toast.type).opacity(0.9))
- .foregroundStyle(getForegroundColor(toast.type))
+ .background(style.background.opacity(0.9))
+ .foregroundStyle(style.foreground)
.clipShape(RoundedRectangle(cornerRadius: Dimensions.Corner.MSCornerRadius))
.shadow(radius: Dimensions.Corner.XXSCornerRadius)
.padding(.horizontal, Dimensions.Padding.MSPadding)
@@ -66,22 +83,4 @@ struct ToastOverlay: View {
.allowsHitTesting(false)
.zIndex(999)
}
-
- private func getBackgroundColor(_ type: ToastType) -> Color {
- switch type {
- case .success:
- return theme.successContainer
- case .error:
- return theme.errorContainer
- }
- }
-
- private func getForegroundColor(_ type: ToastType) -> Color {
- switch type {
- case .success:
- return theme.onSuccessContainer
- case .error:
- return theme.onErrorContainer
- }
- }
}
diff --git a/RIADigiDoc/UI/Theme/AppColors.swift b/RIADigiDoc/UI/Theme/AppColors.swift
index 1bff3335..4555aed7 100644
--- a/RIADigiDoc/UI/Theme/AppColors.swift
+++ b/RIADigiDoc/UI/Theme/AppColors.swift
@@ -21,14 +21,13 @@ import SwiftUI
enum AppColors {
- static let BlueBackground = Color(hex: 0xFF003168)
+ static let initialLaunchScreenBackground = Color(hex: 0x103064)
static let light: ColorPalette = {
- let primary = Color(hex: 0xFF002048)
- let primaryContainer = Color(hex: 0xFF194178)
- let secondaryContainer = Color(hex: 0xFFD9E4FF)
- let tertiary = Color(hex: 0xFF300e41)
- let tertiaryContainer = Color(hex: 0xFF533166)
+ let primary = Color(hex: 0x002048)
+ let primaryContainer = Color(hex: 0x194178)
+ let secondary = Color(hex: 0x535F77)
+ let secondaryContainer = Color(hex: 0xD9E4FF)
let error = Color(hex: 0xB00020)
let errorContainer = Color(hex: 0xFFDAD6)
let success = Color(hex: 0x0F6B38)
@@ -37,10 +36,9 @@ enum AppColors {
let warningContainer = Color(hex: 0xFFDEA6)
let onPrimary = Color.white
- let onPrimaryContainer = Color(hex: 0xFFC5D7FF)
- let onSecondaryContainer = Color(hex: 0xFF3D4960)
- let onTertiary = Color.white
- let onTertiaryContainer = Color(hex: 0xFFF3C7FF)
+ let onPrimaryContainer = Color(hex: 0xC5D7FF)
+ let onSecondaryContainer = Color(hex: 0x3D4960)
+ let onSecondary = Color.white
let onError = Color.white
let onErrorContainer = Color(hex: 0x410002)
let onSuccess = Color.white
@@ -48,30 +46,27 @@ enum AppColors {
let onWarning = Color.white
let onWarningContainer = Color(hex: 0x2A1400)
- let background = Color.white
- let onBackground = Color.black
-
- let outline = Color(hex: 0xFF747781)
- let outlineVariant = Color(hex: 0xFFC3C6D1)
- let surface = Color(hex: 0xFFFAF9FE)
- let surfaceContainer = Color(hex: 0xFFEEEDF3)
- let surfaceContainerLow = Color(hex: 0xFFF4F3F8)
- let surfaceContainerHigh = Color(hex: 0xFFE8E7ED)
- let surfaceContainerHighest = Color(hex: 0xFFE2E2E7)
- let surfaceVariant = Color(hex: 0xFFEEEDF3)
- let onSurface = Color(hex: 0xFF1A1C1F)
- let onSurfaceVariant = Color(hex: 0xFF434750)
-
- let inversePrimary = Color(hex: 0xFFAAC7FF)
- let inverseSurface = Color(hex: 0xFF2F3034)
- let inverseOnSurface = Color(hex: 0xFFF1F0F5)
+ let outline = Color(hex: 0x747781)
+ let outlineVariant = Color(hex: 0xC3C6D1)
+ let surface = Color(hex: 0xFAF9FE)
+ let surfaceContainer = Color(hex: 0xEEEDF3)
+ let surfaceContainerLowest = Color.white
+ let surfaceContainerLow = Color(hex: 0xF4F3F8)
+ let surfaceContainerHigh = Color(hex: 0xE8E7ED)
+ let surfaceContainerHighest = Color(hex: 0xE2E2E7)
+ let surfaceVariant = Color(hex: 0xE0E2ED)
+ let onSurface = Color(hex: 0x1A1C1F)
+ let onSurfaceVariant = Color(hex: 0x434750)
+
+ let inversePrimary = Color(hex: 0xAAC7FF)
+ let inverseSurface = Color(hex: 0x2F3034)
+ let inverseOnSurface = Color(hex: 0xF1F0F5)
return ColorPalette(
primary: primary,
primaryContainer: primaryContainer,
+ secondary: secondary,
secondaryContainer: secondaryContainer,
- tertiary: tertiary,
- tertiaryContainer: tertiaryContainer,
error: error,
errorContainer: errorContainer,
success: success,
@@ -81,20 +76,17 @@ enum AppColors {
onPrimary: onPrimary,
onPrimaryContainer: onPrimaryContainer,
onSecondaryContainer: onSecondaryContainer,
- onTertiary: onTertiary,
- onTertiaryContainer: onTertiaryContainer,
onError: onError,
onErrorContainer: onErrorContainer,
onSuccess: onSuccess,
onSuccessContainer: onSuccessContainer,
onWarning: onWarning,
onWarningContainer: onWarningContainer,
- background: background,
- onBackground: onBackground,
outline: outline,
outlineVariant: outlineVariant,
surface: surface,
surfaceContainer: surfaceContainer,
+ surfaceContainerLowest: surfaceContainerLowest,
surfaceContainerLow: surfaceContainerLow,
surfaceContainerHigh: surfaceContainerHigh,
surfaceContainerHighest: surfaceContainerHighest,
@@ -108,11 +100,10 @@ enum AppColors {
}()
static let dark: ColorPalette = {
- let primary = Color(hex: 0xFFAAC7FF)
- let primaryContainer = Color(hex: 0xFF002958)
- let secondaryContainer = Color(hex: 0xFF313D54)
- let tertiary = Color(hex: 0xFFE8B4F8)
- let tertiaryContainer = Color(hex: 0xFF401750)
+ let primary = Color(hex: 0xAAC7FF)
+ let primaryContainer = Color(hex: 0x002958)
+ let secondary = Color(hex: 0xBAC7E3)
+ let secondaryContainer = Color(hex: 0x313D54)
let error = Color(hex: 0xFF6F70)
let errorContainer = Color(hex: 0x7A1818)
let success = Color(hex: 0x4DD17A)
@@ -120,14 +111,10 @@ enum AppColors {
let warning = Color(hex: 0xFFBC57)
let warningContainer = Color(hex: 0x5A2E00)
- let background = Color.black
- let onBackground = Color.white
-
- let onPrimary = Color(hex: 0xFF002F65)
- let onPrimaryContainer = Color(hex: 0xFF95B6F5)
- let onSecondaryContainer = Color(hex: 0xFFC4D1ED)
- let onTertiary = Color(hex: 0xFF471E57)
- let onTertiaryContainer = Color(hex: 0xFFD7A4E6)
+ let onPrimary = Color(hex: 0x002F65)
+ let onPrimaryContainer = Color(hex: 0x95B6F5)
+ let onSecondary = Color(hex: 0x253146)
+ let onSecondaryContainer = Color(hex: 0xC4D1ED)
let onError = Color(hex: 0x690005)
let onErrorContainer = Color(hex: 0xFFB0B0)
let onSuccess = Color(hex: 0x00210F)
@@ -135,27 +122,27 @@ enum AppColors {
let onWarning = Color(hex: 0x2A1400)
let onWarningContainer = Color(hex: 0xFFC87A)
- let outline = Color(hex: 0xFF8D909B)
- let outlineVariant = Color(hex: 0xFF434750)
- let surface = Color(hex: 0xFF121317)
- let surfaceContainer = Color(hex: 0xFF1E2023)
- let surfaceContainerLow = Color(hex: 0xFF1A1C1F)
- let surfaceContainerHigh = Color(hex: 0xFF282A2E)
- let surfaceContainerHighest = Color(hex: 0xFF333539)
- let surfaceVariant = Color(hex: 0xFF1E2023)
- let onSurface = Color(hex: 0xFFE2E2E7)
- let onSurfaceVariant = Color(hex: 0xFFC3C6D1)
-
- let inversePrimary = Color(hex: 0xFF3B5E97)
- let inverseSurface = Color(hex: 0xFFE2E2E7)
- let inverseOnSurface = Color(hex: 0xFF2F3034)
+ let outline = Color(hex: 0x8D909B)
+ let outlineVariant = Color(hex: 0x434750)
+ let surface = Color(hex: 0x121317)
+ let surfaceContainer = Color(hex: 0x1E2023)
+ let surfaceContainerLowest = Color(hex: 0x0D0E12)
+ let surfaceContainerLow = Color(hex: 0x1A1C1F)
+ let surfaceContainerHigh = Color(hex: 0x282A2E)
+ let surfaceContainerHighest = Color(hex: 0x333539)
+ let surfaceVariant = Color(hex: 0x434750)
+ let onSurface = Color(hex: 0xE2E2E7)
+ let onSurfaceVariant = Color(hex: 0xC3C6D1)
+
+ let inversePrimary = Color(hex: 0x3B5E97)
+ let inverseSurface = Color(hex: 0xE2E2E7)
+ let inverseOnSurface = Color(hex: 0x2F3034)
return ColorPalette(
primary: primary,
primaryContainer: primaryContainer,
+ secondary: secondary,
secondaryContainer: secondaryContainer,
- tertiary: tertiary,
- tertiaryContainer: tertiaryContainer,
error: error,
errorContainer: errorContainer,
success: success,
@@ -165,20 +152,17 @@ enum AppColors {
onPrimary: onPrimary,
onPrimaryContainer: onPrimaryContainer,
onSecondaryContainer: onSecondaryContainer,
- onTertiary: onTertiary,
- onTertiaryContainer: onTertiaryContainer,
onError: onError,
onErrorContainer: onErrorContainer,
onSuccess: onSuccess,
onSuccessContainer: onSuccessContainer,
onWarning: onWarning,
onWarningContainer: onWarningContainer,
- background: background,
- onBackground: onBackground,
outline: outline,
outlineVariant: outlineVariant,
surface: surface,
surfaceContainer: surfaceContainer,
+ surfaceContainerLowest: surfaceContainerLowest,
surfaceContainerLow: surfaceContainerLow,
surfaceContainerHigh: surfaceContainerHigh,
surfaceContainerHighest: surfaceContainerHighest,
diff --git a/RIADigiDoc/UI/Theme/Model/ColorPalette.swift b/RIADigiDoc/UI/Theme/Model/ColorPalette.swift
index 60a7c60b..92547456 100644
--- a/RIADigiDoc/UI/Theme/Model/ColorPalette.swift
+++ b/RIADigiDoc/UI/Theme/Model/ColorPalette.swift
@@ -23,11 +23,9 @@ struct ColorPalette {
let primary: Color
let primaryContainer: Color
+ let secondary: Color
let secondaryContainer: Color
- let tertiary: Color
- let tertiaryContainer: Color
-
let error: Color
let errorContainer: Color
let success: Color
@@ -38,8 +36,6 @@ struct ColorPalette {
let onPrimary: Color
let onPrimaryContainer: Color
let onSecondaryContainer: Color
- let onTertiary: Color
- let onTertiaryContainer: Color
let onError: Color
let onErrorContainer: Color
let onSuccess: Color
@@ -47,14 +43,12 @@ struct ColorPalette {
let onWarning: Color
let onWarningContainer: Color
- let background: Color
- let onBackground: Color
-
let outline: Color
let outlineVariant: Color
let surface: Color
let surfaceContainer: Color
+ let surfaceContainerLowest: Color
let surfaceContainerLow: Color
let surfaceContainerHigh: Color
let surfaceContainerHighest: Color
diff --git a/RIADigiDoc/ViewModel/FileOpeningViewModel.swift b/RIADigiDoc/ViewModel/FileOpeningViewModel.swift
index b7b65b7d..b60eb841 100644
--- a/RIADigiDoc/ViewModel/FileOpeningViewModel.swift
+++ b/RIADigiDoc/ViewModel/FileOpeningViewModel.swift
@@ -270,17 +270,22 @@ class FileOpeningViewModel: FileOpeningViewModelProtocol, Loggable {
}
private func handleError(_ error: Error) {
- let ddeMessage = (error as? DigiDocError)?.description ?? error.localizedDescription
- FileOpeningViewModel.logger().error("\(ddeMessage, privacy: .public)")
-
if let dde = error as? DigiDocError {
FileOpeningViewModel.logger().error("\(String(reflecting: dde), privacy: .public)")
errorMessage = createToastMessage(for: dde)
let fileName = dde.errorDetail.userInfo["fileName"] as? String
guard let file = fileName else { return }
removeUnsuccessfulContainer(fileName: file)
+ } else if let foe = error as? FileOpeningError {
+ FileOpeningViewModel.logger().error(
+ "\(String(reflecting: foe), privacy: .public)"
+ )
+ errorMessage = createToastMessage(for: foe)
} else {
- errorMessage = ToastMessage(key: error.localizedDescription)
+ FileOpeningViewModel.logger().error(
+ "\(String(reflecting: error.localizedDescription), privacy: .public)"
+ )
+ errorMessage = ToastMessage(key: "General error")
}
}
@@ -342,4 +347,13 @@ class FileOpeningViewModel: FileOpeningViewModelProtocol, Loggable {
return ToastMessage(key: "General error")
}
}
+
+ private func createToastMessage(for error: FileOpeningError) -> ToastMessage {
+ switch error {
+ case .unableToRetrieveFileSize, .invalidFileSize:
+ return ToastMessage(key: "Invalid file size")
+ case .emptyFile, .noDataFiles:
+ return ToastMessage(key: "Could not load selected files")
+ }
+ }
}
diff --git a/RIADigiDocTests/ViewModel/FileOpeningViewModelTests.swift b/RIADigiDocTests/ViewModel/FileOpeningViewModelTests.swift
index 4821bd02..c39a880c 100644
--- a/RIADigiDocTests/ViewModel/FileOpeningViewModelTests.swift
+++ b/RIADigiDocTests/ViewModel/FileOpeningViewModelTests.swift
@@ -96,7 +96,7 @@ struct FileOpeningViewModelTests {
@Test
func handleFiles_throwNoDataFilesErrorWhenNoFileOpeningResultNil() async throws {
- let error = FileOpeningError.noDataFiles
+ let expectedError = "Could not load selected files"
mockSharedContainerViewModel.getFileOpeningResultHandler = {
return nil
@@ -124,7 +124,7 @@ struct FileOpeningViewModelTests {
#expect(!isFileOpeningLoading)
#expect(!isNavigatingToSigningView)
- #expect(error.localizedDescription == errorMessage)
+ #expect(expectedError == errorMessage)
}
@Test
@@ -148,12 +148,11 @@ struct FileOpeningViewModelTests {
#expect(!isFileOpeningLoading)
#expect(!isNavigatingToSigningView)
- #expect(error.localizedDescription == errorMessage)
+ #expect(errorMessage == "Could not load selected files")
}
@Test
func handleFiles_throwNoDataFilesWhenValidFilesEmpty() async throws {
- let error = FileOpeningError.noDataFiles
let result: Result<[URL], Error> = .success([])
mockSharedContainerViewModel.getFileOpeningResultHandler = {
@@ -182,7 +181,7 @@ struct FileOpeningViewModelTests {
#expect(!isFileOpeningLoading)
#expect(!isNavigatingToSigningView)
- #expect(error.localizedDescription == errorMessage)
+ #expect(errorMessage == "Could not load selected files")
}
@Test