build: S15 location preview

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-17 13:52:42 +02:00
co-authored by Claude Opus 5.5
parent a9f2f69398
commit c5c1483544
@@ -0,0 +1,49 @@
package app.wetter.ui.screens
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
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.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import app.wetter.R
import app.wetter.data.Forecast
import app.wetter.data.Graph
import app.wetter.data.Place
import app.wetter.data.Settings
import kotlinx.coroutines.launch
/** S15: a searched place, shown in full before it is saved. */
@Composable
fun PreviewScreen(place: Place, settings: Settings, onBack: () -> Unit, onSaved: (Long) -> Unit) {
var forecast by remember { mutableStateOf<Forecast?>(null) }
var failed by remember { mutableStateOf(false) }
var attempt by remember { mutableStateOf(0) }
val scope = rememberCoroutineScope()
LaunchedEffect(place, attempt) {
failed = false
runCatching { Graph.repo.preview(place) }.onSuccess { forecast = it }.onFailure { failed = true }
}
ForecastPage(
title = place.name,
isCurrent = false,
forecast = forecast,
settings = settings,
animate = true,
refreshing = false,
failed = failed,
onRefresh = { attempt++ },
navigation = { IconButton(onClick = onBack) { Icon(Icons.AutoMirrored.Rounded.ArrowBack, stringResource(R.string.back)) } },
actions = {
FilledTonalButton(onClick = { scope.launch { onSaved(Graph.repo.save(place)) } }) { Text(stringResource(R.string.save)) }
},
)
}