package eu.kanade.presentation.more.settings.screen.browse.components import androidx.compose.foundation.layout.Column import androidx.compose.material3.AlertDialog import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import kotlinx.collections.immutable.ImmutableSet import kotlinx.coroutines.delay import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import kotlin.time.Duration.Companion.seconds @Composable fun ExtensionRepoCreateDialog( onDismissRequest: () -> Unit, onCreate: (String) -> Unit, repos: ImmutableSet, ) { var name by remember { mutableStateOf("") } val focusRequester = remember { FocusRequester() } val nameAlreadyExists = remember(name) { repos.contains(name) } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( enabled = name.isNotEmpty() && !nameAlreadyExists, onClick = { onCreate(name) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_add)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_add_repo)) }, text = { Column { Text(text = stringResource(MR.strings.action_add_repo_message)) OutlinedTextField( modifier = Modifier .focusRequester(focusRequester), value = name, onValueChange = { name = it }, label = { Text(text = stringResource(MR.strings.label_add_repo_input)) }, supportingText = { val msgRes = if (name.isNotEmpty() && nameAlreadyExists) { MR.strings.error_repo_exists } else { MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, isError = name.isNotEmpty() && nameAlreadyExists, singleLine = true, ) } }, ) LaunchedEffect(focusRequester) { // TODO: https://issuetracker.google.com/issues/204502668 delay(0.1.seconds) focusRequester.requestFocus() } } @Composable fun ExtensionRepoDeleteDialog( onDismissRequest: () -> Unit, onDelete: () -> Unit, repo: String, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_delete_repo)) }, text = { Text(text = stringResource(MR.strings.delete_repo_confirmation, repo)) }, ) }