diff --git a/app/src/main/java/de/jeanlucmakiola/calendula/ui/imports/ImportScreen.kt b/app/src/main/java/de/jeanlucmakiola/calendula/ui/imports/ImportScreen.kt index 71d67b1..7e27d71 100644 --- a/app/src/main/java/de/jeanlucmakiola/calendula/ui/imports/ImportScreen.kt +++ b/app/src/main/java/de/jeanlucmakiola/calendula/ui/imports/ImportScreen.kt @@ -85,18 +85,52 @@ fun ImportScreen( (state as? ImportUiState.Single)?.let { onOpenSingle(it.form); onClose() } } + // Hoisted target calendar so the always-visible top-bar Import action can + // read it without the user scrolling to a bottom button. Re-defaults to the + // first calendar when the "many" list first arrives (keyed on it), then + // holds the user's pick. + val many = state as? ImportUiState.Many + var selected by rememberSaveable(many?.calendars?.firstOrNull()?.id) { + mutableStateOf(many?.calendars?.firstOrNull()?.id) + } + Scaffold( modifier = Modifier .predictiveBack(onBack = onClose) .fillMaxSize(), topBar = { TopAppBar( - title = { Text(stringResource(R.string.import_title)) }, + title = { + Text( + if (many != null) { + pluralStringResource( + R.plurals.import_title_count, + many.events.size, + many.events.size, + ) + } else { + stringResource(R.string.import_title) + }, + ) + }, navigationIcon = { IconButton(onClick = onClose) { Icon(Icons.Default.Close, contentDescription = stringResource(R.string.event_edit_close)) } }, + actions = { + // Only meaningful in the multi-event picker with a writable + // target; every other state has nothing to confirm here. + if (many != null && many.calendars.isNotEmpty()) { + Button( + onClick = { selected?.let(viewModel::import) }, + enabled = selected != null, + modifier = Modifier.padding(end = 12.dp), + ) { + Text(stringResource(R.string.import_button)) + } + } + }, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.surface, ), @@ -112,7 +146,7 @@ fun ImportScreen( ImportUiState.Empty -> CenteredMessage(stringResource(R.string.import_empty), onClose) ImportUiState.Failed -> CenteredMessage(stringResource(R.string.import_failed), onClose) - is ImportUiState.Many -> ManyContent(s, onImport = viewModel::import) + is ImportUiState.Many -> ManyContent(s, selected, onSelect = { selected = it }) is ImportUiState.Done -> DoneContent(s, onClose) } } @@ -120,27 +154,21 @@ fun ImportScreen( } @Composable -private fun ManyContent(state: ImportUiState.Many, onImport: (Long) -> Unit) { +private fun ManyContent(state: ImportUiState.Many, selected: Long?, onSelect: (Long) -> Unit) { // No writable calendar to import into — tell the user honestly. if (state.calendars.isEmpty()) { CenteredMessage(stringResource(R.string.import_no_calendar), onClose = null) return } - var selected by rememberSaveable { mutableStateOf(state.calendars.first().id) } Column( Modifier.fillMaxSize().verticalScroll(rememberScrollState()) - .padding(vertical = 8.dp), + .padding(top = 8.dp, bottom = 24.dp), ) { - Text( - pluralStringResource(R.plurals.import_event_count, state.events.size, state.events.size), - style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.padding(start = 24.dp, end = 24.dp, top = 8.dp, bottom = 12.dp), - ) CalendarPickerGroups( calendars = state.calendars, selectedId = selected, - onSelect = { selected = it }, + onSelect = onSelect, ) if (state.warnings.isNotEmpty()) { Column( @@ -150,12 +178,6 @@ private fun ManyContent(state: ImportUiState.Many, onImport: (Long) -> Unit) { state.warnings.forEach { WarningText(it) } } } - Button( - onClick = { onImport(selected) }, - modifier = Modifier.fillMaxWidth().padding(start = 16.dp, end = 16.dp, top = 8.dp), - ) { - Text(pluralStringResource(R.plurals.import_action, state.events.size, state.events.size)) - } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c9f82e4..0609ca8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -473,6 +473,11 @@ An event without a start time was skipped. Guest lists weren\'t imported. An unknown time zone fell back to your device\'s. + Import + + Importing %d event + Importing %d events + %d event in this file. %d events in this file.