diff --git a/app/src/main/java/to/bitkit/services/MigrationService.kt b/app/src/main/java/to/bitkit/services/MigrationService.kt index 3167b738b..51dbc2f43 100644 --- a/app/src/main/java/to/bitkit/services/MigrationService.kt +++ b/app/src/main/java/to/bitkit/services/MigrationService.kt @@ -38,6 +38,7 @@ import to.bitkit.env.Env import to.bitkit.models.BitcoinDisplayUnit import to.bitkit.models.CoinSelectionPreference import to.bitkit.models.PrimaryDisplay +import to.bitkit.models.Suggestion import to.bitkit.models.TransactionSpeed import to.bitkit.models.WidgetType import to.bitkit.models.WidgetWithPosition @@ -520,6 +521,24 @@ class MigrationService @Inject constructor( } } + @Suppress("TooGenericExceptionCaught") + private suspend fun extractRNTodos(mmkvData: Map): RNTodos? { + val rootJson = mmkvData["persist:root"] ?: return null + + return try { + val jsonStart = rootJson.indexOf("{") + val jsonString = if (jsonStart >= 0) rootJson.substring(jsonStart) else rootJson + + val root = json.parseToJsonElement(jsonString).jsonObject + val todosJsonString = root["todos"]?.jsonPrimitive?.content ?: return null + + json.decodeFromString(todosJsonString) + } catch (e: Exception) { + Logger.error("Failed to decode RN todos: $e", e, context = TAG) + null + } + } + @Suppress("TooGenericExceptionCaught") private suspend fun extractRNWidgets(mmkvData: Map): RNWidgetsWithOptions? { val rootJson = mmkvData["persist:root"] ?: return null @@ -759,6 +778,26 @@ class MigrationService @Inject constructor( } } + private suspend fun applyRNTodos(todos: RNTodos) { + val mapping = mapOf( + "backupSeedPhrase" to Suggestion.BACK_UP, + "buyBitcoin" to Suggestion.BUY, + "lightning" to Suggestion.LIGHTNING, + "quickpay" to Suggestion.QUICK_PAY, + "shop" to Suggestion.SHOP, + "slashtagsProfile" to Suggestion.PROFILE, + "support" to Suggestion.SUPPORT, + "invite" to Suggestion.INVITE, + "pin" to Suggestion.SECURE, + ) + + todos.hide?.keys?.forEach { rnTodoType -> + mapping[rnTodoType]?.let { suggestion -> + settingsStore.addDismissedSuggestion(suggestion) + } + } + } + private suspend fun applyRNActivities(items: List) { val activities = items.filter { it.activityType == "lightning" }.map { item -> val txType = if (item.txType == "sent") PaymentType.SENT else PaymentType.RECEIVED @@ -1020,6 +1059,10 @@ class MigrationService @Inject constructor( extractRNWidgets(mmkvData)?.let { widgets -> applyRNWidgets(widgets) } + + extractRNTodos(mmkvData)?.let { todos -> + applyRNTodos(todos) + } } suspend fun hasRNRemoteBackup(): Boolean = runCatching { @@ -1602,6 +1645,11 @@ data class RNMetadata( val lastUsedTags: List? = null, ) +@Serializable +data class RNTodos( + val hide: Map? = null, +) + @Serializable data class RNActivityState( val items: List? = null,