MappingsScreen.kt (2857B) - raw


      1 package me.rhunk.snapenhance.ui.setup.screens.impl
      2 
      3 import androidx.compose.foundation.layout.padding
      4 import androidx.compose.foundation.layout.size
      5 import androidx.compose.material3.CircularProgressIndicator
      6 import androidx.compose.material3.MaterialTheme
      7 import androidx.compose.runtime.*
      8 import androidx.compose.ui.Modifier
      9 import androidx.compose.ui.unit.dp
     10 import androidx.compose.ui.window.Dialog
     11 import kotlinx.coroutines.Dispatchers
     12 import kotlinx.coroutines.launch
     13 import kotlinx.coroutines.withContext
     14 import me.rhunk.snapenhance.ui.setup.screens.SetupScreen
     15 import me.rhunk.snapenhance.ui.util.AlertDialogs
     16 
     17 class MappingsScreen : SetupScreen() {
     18     @Composable
     19     override fun Content() {
     20         val coroutineScope = rememberCoroutineScope()
     21         var infoText by remember { mutableStateOf(null as String?) }
     22         var isGenerating by remember { mutableStateOf(false) }
     23 
     24         if (infoText != null) {
     25             fun dismiss() {
     26                 infoText = null
     27                 goNext()
     28             }
     29 
     30             Dialog(onDismissRequest = { dismiss() }) {
     31                 remember { AlertDialogs(context.translation) }.InfoDialog(title = infoText!!) {
     32                     dismiss()
     33                 }
     34             }
     35         }
     36 
     37         LaunchedEffect(Unit) {
     38             coroutineScope.launch(Dispatchers.IO) {
     39                 if (isGenerating) return@launch
     40                 isGenerating = true
     41                 runCatching {
     42                     if (context.installationSummary.snapchatInfo == null) {
     43                         throw Exception(context.translation["setup.mappings.generate_failure_no_snapchat"])
     44                     }
     45                     val warnings = context.mappings.refresh()
     46 
     47                     if (warnings.isNotEmpty()) {
     48                         isGenerating = false
     49                         infoText = "${warnings.size} warning(s) occurred while generating mappings:\n\n${warnings.joinToString("\n")}".also {
     50                             context.log.warn(it)
     51                         }
     52                         return@launch
     53                     }
     54 
     55                     withContext(Dispatchers.Main) {
     56                         goNext()
     57                     }
     58                 }.onFailure {
     59                     isGenerating = false
     60                     infoText = context.translation["setup.mappings.generate_failure"] + "\n\n" + it.message
     61                     context.log.error("Failed to generate mappings", it)
     62                 }
     63             }
     64         }
     65 
     66         if (isGenerating) {
     67             DialogText(text = context.translation["setup.mappings.dialog"])
     68             CircularProgressIndicator(
     69                 modifier = Modifier
     70                     .padding()
     71                     .size(50.dp),
     72                 strokeWidth = 3.dp,
     73                 color = MaterialTheme.colorScheme.onPrimary
     74             )
     75         }
     76     }
     77 }