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