diff --git a/apps/ios/Shared/Views/Database/DatabaseErrorView.swift b/apps/ios/Shared/Views/Database/DatabaseErrorView.swift index 9610b4a24d..f7f253a617 100644 --- a/apps/ios/Shared/Views/Database/DatabaseErrorView.swift +++ b/apps/ios/Shared/Views/Database/DatabaseErrorView.swift @@ -79,12 +79,25 @@ struct DatabaseErrorView: View { fileNameText(dbFile) } case let .downgrade(downMigrations): + let warnings = downMigrationWarnings(downMigrations).reversed() titleText("Database downgrade") + Spacer() + Image(systemName: "exclamationmark.triangle.fill") + .resizable() + .frame(width: 40, height: 36) + .foregroundColor(.red) Text("Warning: you may lose some data!") .bold() .padding(.horizontal, 25) .multilineTextAlignment(.center) - + if !warnings.isEmpty { + ForEach(warnings, id: \.self) { warning in + Text(warning) + .bold() + .multilineTextAlignment(.center) + .padding(.horizontal, 25) + } + } migrationsText(downMigrations) Spacer() VStack(spacing: 10) { diff --git a/apps/ios/Shared/Views/Migration/MigrateToDevice.swift b/apps/ios/Shared/Views/Migration/MigrateToDevice.swift index a28acfcba1..cb3832b727 100644 --- a/apps/ios/Shared/Views/Migration/MigrateToDevice.swift +++ b/apps/ios/Shared/Views/Migration/MigrateToDevice.swift @@ -374,10 +374,12 @@ struct MigrateToDevice: View { "Upgrade and open chat", "", .yesUp) - case .downgrade: + case let .downgrade(downMigrations): ("Database downgrade", "Downgrade and open chat", - NSLocalizedString("Warning: you may lose some data!", comment: ""), + ([NSLocalizedString("Warning: you may lose some data!", comment: "")] + + downMigrationWarnings(downMigrations).reversed()) + .joined(separator: "\n"), .yesUpDown) case let .migrationError(mtrError): ("Incompatible database version", diff --git a/apps/ios/SimpleXChat/API.swift b/apps/ios/SimpleXChat/API.swift index 85c84a6f45..6bf46fb0dd 100644 --- a/apps/ios/SimpleXChat/API.swift +++ b/apps/ios/SimpleXChat/API.swift @@ -369,6 +369,15 @@ public struct UpMigration: Decodable, Equatable { // public var withDown: Bool } +public func downMigrationWarnings(_ downMigrations: [String]) -> [String] { + let warnings: [(String, String)] = [ + ("20260222_chat_relays", NSLocalizedString("If you joined or created channels, they will stop working permanently.", comment: "down migration warning")) + ] + return warnings.compactMap { (key, message) in + downMigrations.contains(key) ? message : nil + } +} + public enum MTRError: Decodable, Equatable { case noDown(dbMigrations: [String]) case different(appMigration: String, dbMigration: String) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseErrorView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseErrorView.kt index 9264ca69af..4aeb929624 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseErrorView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseErrorView.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment +import androidx.compose.ui.graphics.Color import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester @@ -117,12 +118,25 @@ fun DatabaseErrorView( OpenDatabaseDirectoryButton() } is MigrationError.Downgrade -> { + val warnings = downMigrationWarnings(err.downMigrations).reversed() DatabaseErrorDetails(MR.strings.database_downgrade) { TextButton({ callRunChat(confirmMigrations = MigrationConfirmation.YesUpDown) }, Modifier.align(Alignment.CenterHorizontally), enabled = !progressIndicator.value) { Text(generalGetString(MR.strings.downgrade_and_open_chat)) } Spacer(Modifier.height(20.dp)) + Icon( + painterResource(MR.images.ic_warning_filled), + contentDescription = null, + Modifier.size(40.dp).align(Alignment.CenterHorizontally), + tint = Color.Red + ) + Spacer(Modifier.height(12.dp)) Text(generalGetString(MR.strings.database_downgrade_warning), fontWeight = FontWeight.Bold) + if (warnings.isNotEmpty()) { + warnings.forEach { warning -> + Text(warning, fontWeight = FontWeight.Bold) + } + } FileNameText(status.dbFile) MigrationsText(err.downMigrations) AppVersionText() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DatabaseUtils.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DatabaseUtils.kt index 300e5f44fe..e584fcc11c 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DatabaseUtils.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DatabaseUtils.kt @@ -2,6 +2,7 @@ package chat.simplex.common.views.helpers import chat.simplex.common.model.* import chat.simplex.common.platform.* +import chat.simplex.res.MR import kotlinx.serialization.* import java.io.File import java.security.SecureRandom @@ -108,6 +109,15 @@ data class UpMigration( // val withDown: Boolean ) +fun downMigrationWarnings(downMigrations: List): List { + val warnings = listOf( + "20260222_chat_relays" to MR.strings.down_migration_warning_chat_relays + ) + return warnings.mapNotNull { (key, res) -> + if (downMigrations.contains(key)) generalGetString(res) else null + } +} + @Serializable sealed class MTRError { @Serializable @SerialName("noDown") class NoDown(val dbMigrations: List): MTRError() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt index 6199621c39..cabfbf031e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt @@ -474,7 +474,9 @@ private fun MutableState.MigrationConfirmationView(status: DB Tuple4( generalGetString(MR.strings.database_downgrade), generalGetString(MR.strings.downgrade_and_open_chat), - generalGetString(MR.strings.database_downgrade_warning), + (listOf(generalGetString(MR.strings.database_downgrade_warning)) + + downMigrationWarnings(err.downMigrations).reversed()) + .joinToString("\n"), MigrationConfirmation.YesUpDown ) is MigrationError.Error -> diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 67816bcd69..27fe7c85c7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1647,6 +1647,7 @@ different migration in the app/database: %s / %s Migrations: %s Warning: you may lose some data! + If you joined or created channels, they will stop working permanently. Chat is stopped