ux: pull-to-refresh на всех списках (Этап 2 п.12)

Раньше свайп-обновление было только в Файлах. Добавлено (Material3
PullToRefreshBox): Почта (входящие/исходящие, force-обновление), Конференции
(список бесед — заменяет убранную кнопку ↻), Контакты (force + CTag — дёшево),
Задачи (список), Карточки (доски и открытая доска). Контакты: refresh()
получил параметр force (pull-to-refresh форсит sync мимо TTL; с CTag-проверкой
это 1 лёгкий PROPFIND).
This commit is contained in:
b-dev-mobile
2026-07-09 12:48:08 +00:00
parent 286ab9c8bf
commit d1d61d0cf8
6 changed files with 88 additions and 32 deletions
@@ -1,10 +1,13 @@
package ru.forbion.f7cloud.feature.deck
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@@ -17,6 +20,7 @@ import ru.forbion.f7cloud.core.designsystem.F7ModuleScreen
import ru.forbion.f7cloud.core.designsystem.F7OverlayDismissHandler
import ru.forbion.f7cloud.core.designsystem.F7SecondaryButton
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DeckScreen(
session: AuthSession,
@@ -57,23 +61,33 @@ fun DeckScreen(
},
) {
val detail = state.boardDetail
if (detail != null) {
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(detail.stacks, key = { it.id }) { stack ->
F7ListCard {
Text(stack.title, style = MaterialTheme.typography.titleSmall)
stack.cards.forEach { card ->
val prefix = if (card.done) "" else ""
Text(prefix + card.title, style = MaterialTheme.typography.bodyMedium)
PullToRefreshBox(
isRefreshing = state.loading && (state.boards.isNotEmpty() || detail != null),
onRefresh = {
if (detail != null) vm.openBoard(session, detail.boardId) else vm.load(session)
},
modifier = Modifier
.weight(1f)
.fillMaxWidth(),
) {
if (detail != null) {
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(detail.stacks, key = { it.id }) { stack ->
F7ListCard {
Text(stack.title, style = MaterialTheme.typography.titleSmall)
stack.cards.forEach { card ->
val prefix = if (card.done) "" else ""
Text(prefix + card.title, style = MaterialTheme.typography.bodyMedium)
}
}
}
}
}
} else {
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(state.boards, key = { it.id }) { board ->
F7ListCard(onClick = { vm.openBoard(session, board.id) }) {
Text(board.title, style = MaterialTheme.typography.titleSmall)
} else {
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(state.boards, key = { it.id }) { board ->
F7ListCard(onClick = { vm.openBoard(session, board.id) }) {
Text(board.title, style = MaterialTheme.typography.titleSmall)
}
}
}
}