chore(deps): update Compose Multiplatform from 1.6.11 to 1.7.0 (#42)

* update README

* update compose multiplatform from 1.6.11 to 1.7.0

* fix breaking changes

* migrate to Material3 PullToRefreshBox

* remove unwanted background from modal bottom sheet items
This commit is contained in:
akesi seli 2024-10-23 11:08:40 +02:00 committed by GitHub
parent 75c9e62909
commit 543bafd8ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 198 additions and 507 deletions

View File

@ -1,17 +1,17 @@
<div align="center">
<img src="https://img.shields.io/badge/Kotlin-2.0.21-7F52FF?logo=kotlin" />
<img src="https://img.shields.io/badge/Gradle-8.8-02303A?logo=gradle" />
<img src="https://img.shields.io/badge/Android-26+-34A853?logo=android" />
<img src="https://img.shields.io/badge/Compose-1.6.7-4285F4?logo=jetpackcompose" />
<img src="https://img.shields.io/github/license/LiveFastEatTrashRaccoon/RaccoonForLemmy" />
<img src="https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy/actions/workflows/build.yml/badge.svg" />
<img src="https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy/actions/workflows/unit_tests.yml/badge.svg" />
<img alt="badge for Kotlin" src="https://img.shields.io/badge/Kotlin-2.0.21-7F52FF?logo=kotlin" />
<img alt="badge for Gradle" src="https://img.shields.io/badge/Gradle-8.8-02303A?logo=gradle" />
<img alt="badge for Android" src="https://img.shields.io/badge/Android-26+-34A853?logo=android" />
<img alt="badge for Compose Multiplatform" src="https://img.shields.io/badge/Compose-1.7.0-4285F4?logo=jetpackcompose" />
<img alt="badge for project license" src="https://img.shields.io/github/license/LiveFastEatTrashRaccoon/RaccoonForLemmy" />
<img alt="badge for build status" src="https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy/actions/workflows/build.yml/badge.svg" />
<img alt="badge for unit test status" src="https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy/actions/workflows/unit_tests.yml/badge.svg" />
</div>
<br />
<div align="center">
<img src="https://github.com/user-attachments/assets/47265cc3-2bb0-4c9b-8dfa-4923dea22571" width="250" height="auto" />
<img alt="application icon" src="https://github.com/user-attachments/assets/47265cc3-2bb0-4c9b-8dfa-4923dea22571" width="250" height="auto" />
</div>
# Raccoon for Lemmy
@ -154,7 +154,7 @@ Here are some options to install the application on your device.
<div align="center">
<div style="display: flex; flex-flow: row wrap; justify-content: center; align-items: center;">
<a href="https://github.com/ImranR98/Obtainium/releases"><img width="200" src="https://github.com/user-attachments/assets/377575fe-a651-4420-afad-8dee21618c44" /></a>
<a href="https://github.com/ImranR98/Obtainium/releases"><img alt="Get it on Obtainium banner" width="200" src="https://github.com/user-attachments/assets/377575fe-a651-4420-afad-8dee21618c44" /></a>
</div>
</div>

View File

@ -1,5 +1,6 @@
package com.livefast.eattrash.raccoonforlemmy.core.commonui.components
import androidx.compose.animation.core.exponentialDecay
import androidx.compose.animation.core.tween
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
@ -58,7 +59,8 @@ fun DraggableSideMenu(
},
positionalThreshold = { distance: Float -> distance * 0.5f },
velocityThreshold = { with(density) { 100.dp.toPx() } },
animationSpec = tween(),
snapAnimationSpec = tween(),
decayAnimationSpec = exponentialDecay(),
)
}

View File

@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@ -17,13 +16,13 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.SheetState
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.CornerSize
@ -55,7 +54,6 @@ fun CustomModalBottomSheet(
ModalBottomSheet(
sheetState = sheetState,
windowInsets = WindowInsets(0, 0, 0, 0),
onDismissRequest = {
onSelected?.invoke(null)
},
@ -73,20 +71,19 @@ fun CustomModalBottomSheet(
Spacer(modifier = Modifier.height(Spacing.xs))
LazyColumn {
itemsIndexed(items = items) { idx, item ->
Surface(
shape = RoundedCornerShape(CornerSize.xl),
) {
Row(
modifier =
Modifier
.fillMaxWidth()
.combinedClickable(
onClick = {
sheetScope.launch {
.clip(shape = RoundedCornerShape(CornerSize.xl))
.combinedClickable(
onClick = {
sheetScope
.launch {
sheetState.hide()
}.invokeOnCompletion {
onSelected?.invoke(idx)
}
}.invokeOnCompletion {
onSelected?.invoke(idx)
}
},
onLongClick =
if (onLongPress != null) {
@ -133,7 +130,6 @@ fun CustomModalBottomSheet(
}
}
}
}
},
)
}

View File

@ -10,7 +10,7 @@ androidx-work = "2.9.1"
android-gradle = "8.5.2"
coil = "2.7.0"
colorpicker = "1.1.2"
compose = "1.6.11"
compose = "1.7.0"
detekt = "1.23.6"
kamel = "1.0.1"
koin = "4.0.0"

View File

@ -2,7 +2,6 @@ package com.livefast.eattrash.raccoonforlemmy.unit.acknowledgements
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@ -10,12 +9,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -24,12 +19,12 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalUriHandler
@ -44,7 +39,7 @@ import com.livefast.eattrash.raccoonforlemmy.unit.acknowledgements.components.Ac
import com.livefast.eattrash.raccoonforlemmy.unit.acknowledgements.components.AcknoledgementItemPlaceholder
class AcknowledgementsScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<AcknowledgementsMviModel>()
@ -86,21 +81,17 @@ class AcknowledgementsScreen : Screen {
)
},
) { padding ->
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(AcknowledgementsMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(
top = padding.calculateTopPadding(),
).nestedScroll(scrollBehavior.nestedScrollConnection)
.fillMaxSize()
.pullRefresh(pullRefreshState),
.fillMaxSize(),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(AcknowledgementsMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier =
@ -144,14 +135,6 @@ class AcknowledgementsScreen : Screen {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.Reply
@ -38,9 +37,6 @@ import androidx.compose.material.icons.filled.SyncDisabled
import androidx.compose.material.icons.outlined.AddCircleOutline
import androidx.compose.material.icons.outlined.CheckCircle
import androidx.compose.material.icons.outlined.Pending
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@ -57,6 +53,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -148,7 +145,7 @@ class CommunityDetailScreen(
override val key: ScreenKey
get() = super.key + communityId.toString()
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model =
@ -760,14 +757,7 @@ class CommunityDetailScreen(
)
}
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(CommunityDetailMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.fillMaxSize()
@ -778,8 +768,11 @@ class CommunityDetailScreen(
Modifier
},
).nestedScroll(fabNestedScrollConnection)
.nestedScroll(keyboardScrollConnection)
.pullRefresh(pullRefreshState),
.nestedScroll(keyboardScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(CommunityDetailMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -1425,14 +1418,6 @@ class CommunityDetailScreen(
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
if (uiState.asyncInProgress) {
ProgressHud()
}

View File

@ -14,12 +14,8 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@ -32,6 +28,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
@ -61,7 +58,7 @@ import com.livefast.eattrash.raccoonforlemmy.unit.drafts.components.DraftCard
import com.livefast.eattrash.raccoonforlemmy.unit.drafts.components.DraftCardPlaceHolder
class DraftsScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<DraftsMviModel>()
@ -71,13 +68,6 @@ class DraftsScreen : Screen {
val settingsRepository = remember { getSettingsRepository() }
val settings by settingsRepository.currentSettings.collectAsState()
val lazyListState = rememberLazyListState()
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(DraftsMviModel.Intent.Refresh)
},
)
val detailOpener = remember { getDetailOpener() }
var itemToDelete by remember { mutableStateOf<DraftModel?>(null) }
@ -147,7 +137,7 @@ class DraftsScreen : Screen {
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.then(
@ -156,7 +146,11 @@ class DraftsScreen : Screen {
} else {
Modifier
},
).pullRefresh(pullRefreshState),
),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(DraftsMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier =
@ -317,13 +311,6 @@ class DraftsScreen : Screen {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -1,22 +1,19 @@
package com.livefast.eattrash.raccoonforlemmy.unit.drawer
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalDrawerSheet
import androidx.compose.material3.Text
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@ -25,7 +22,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.geometry.Offset
@ -67,7 +63,7 @@ object ModalDrawerContent : Tab {
return TabOptions(0u, "")
}
@OptIn(ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<ModalDrawerMviModel>()
@ -136,19 +132,15 @@ object ModalDrawerContent : Tab {
)
if (uiState.user != null) {
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(ModalDrawerMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.weight(1f)
.nestedScroll(keyboardScrollConnection)
.pullRefresh(pullRefreshState),
.nestedScroll(keyboardScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(ModalDrawerMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize().padding(horizontal = Spacing.xxs),
@ -296,13 +288,6 @@ object ModalDrawerContent : Tab {
)
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
} else {
Text(

View File

@ -13,15 +13,11 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Reply
import androidx.compose.material.icons.filled.ArrowCircleDown
import androidx.compose.material.icons.filled.ArrowCircleUp
import androidx.compose.material.icons.filled.Bookmark
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
@ -33,6 +29,7 @@ import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -91,7 +88,7 @@ import org.koin.core.parameter.parametersOf
class ExploreScreen(
private val otherInstance: String = "",
) : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model =
@ -260,12 +257,7 @@ class ExploreScreen(
},
)
val pullRefreshState =
rememberPullRefreshState(
uiState.refreshing,
{ model.reduce(ExploreMviModel.Intent.Refresh) },
)
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(top = Spacing.xs)
@ -281,8 +273,9 @@ class ExploreScreen(
} else {
Modifier
},
).nestedScroll(keyboardScrollConnection)
.pullRefresh(pullRefreshState),
).nestedScroll(keyboardScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = { model.reduce(ExploreMviModel.Intent.Refresh) },
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -761,14 +754,6 @@ class ExploreScreen(
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.Reply
@ -27,9 +26,6 @@ import androidx.compose.material.icons.filled.ArrowCircleUp
import androidx.compose.material.icons.filled.Bookmark
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
@ -43,6 +39,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -106,7 +103,7 @@ import kotlin.math.roundToInt
class FilteredContentsScreen(
private val type: Int,
) : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<FilteredContentsMviModel>(parameters = { parametersOf(type) })
@ -120,13 +117,6 @@ class FilteredContentsScreen(
val settingsRepository = remember { getSettingsRepository() }
val settings by settingsRepository.currentSettings.collectAsState()
val lazyListState = rememberLazyListState()
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(FilteredContentsMviModel.Intent.Refresh)
},
)
val detailOpener = remember { getDetailOpener() }
var rawContent by remember { mutableStateOf<Any?>(null) }
val themeRepository = remember { getThemeRepository() }
@ -306,7 +296,7 @@ class FilteredContentsScreen(
}
},
) { padding ->
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(
@ -324,8 +314,11 @@ class FilteredContentsScreen(
} else {
Modifier
},
).nestedScroll(fabNestedScrollConnection)
.pullRefresh(pullRefreshState),
).nestedScroll(fabNestedScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(FilteredContentsMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -997,14 +990,6 @@ class FilteredContentsScreen(
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
if (rawContent != null) {

View File

@ -2,7 +2,6 @@ package com.livefast.eattrash.raccoonforlemmy.unit.instanceinfo
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
@ -11,12 +10,8 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -25,6 +20,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@ -56,10 +52,7 @@ import org.koin.core.parameter.parametersOf
class InstanceInfoScreen(
private val url: String,
) : Screen {
@OptIn(
ExperimentalMaterial3Api::class,
ExperimentalMaterialApi::class,
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val instanceName = url.replace("https://", "")
@ -154,14 +147,7 @@ class InstanceInfoScreen(
)
},
) { padding ->
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(InstanceInfoMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.then(
@ -172,7 +158,11 @@ class InstanceInfoScreen(
},
).padding(
top = padding.calculateTopPadding(),
).pullRefresh(pullRefreshState),
),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(InstanceInfoMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.padding(top = Spacing.xs, start = Spacing.s, end = Spacing.s),
@ -240,14 +230,6 @@ class InstanceInfoScreen(
}
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -5,7 +5,6 @@ import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@ -14,14 +13,10 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.AddCircle
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -33,6 +28,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -42,7 +38,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
@ -74,7 +69,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
class ManageBanScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<ManageBanMviModel>()
@ -221,13 +216,6 @@ class ManageBanScreen : Screen {
}
},
) { padding ->
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(ManageBanMviModel.Intent.Refresh)
},
)
Column(
modifier =
Modifier
@ -278,7 +266,7 @@ class ManageBanScreen : Screen {
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.then(
@ -287,8 +275,11 @@ class ManageBanScreen : Screen {
} else {
Modifier
},
).nestedScroll(keyboardScrollConnection)
.pullRefresh(pullRefreshState),
).nestedScroll(keyboardScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(ManageBanMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -566,14 +557,6 @@ class ManageBanScreen : Screen {
}
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -16,14 +16,10 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.AddCircle
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@ -38,6 +34,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -79,7 +76,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
class ManageSubscriptionsScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<ManageSubscriptionsMviModel>()
@ -219,21 +216,17 @@ class ManageSubscriptionsScreen : Screen {
},
)
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(ManageSubscriptionsMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection)
.nestedScroll(fabNestedScrollConnection)
.nestedScroll(keyboardScrollConnection)
.pullRefresh(pullRefreshState),
.nestedScroll(keyboardScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(ManageSubscriptionsMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -415,16 +408,6 @@ class ManageSubscriptionsScreen : Screen {
}
}
}
if (!uiState.initial) {
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}

View File

@ -11,12 +11,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@ -31,6 +27,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -58,7 +55,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
class MediaListScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<MediaListMviModel>()
@ -122,21 +119,17 @@ class MediaListScreen : Screen {
}
},
) { padding ->
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(MediaListMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(
top = padding.calculateTopPadding(),
).nestedScroll(scrollBehavior.nestedScrollConnection)
.fillMaxSize()
.pullRefresh(pullRefreshState),
.fillMaxSize(),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(MediaListMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -209,14 +202,6 @@ class MediaListScreen : Screen {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}

View File

@ -10,20 +10,18 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowCircleDown
import androidx.compose.material.icons.filled.ArrowCircleUp
import androidx.compose.material.icons.filled.MarkChatRead
import androidx.compose.material.icons.filled.MarkChatUnread
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@ -61,7 +59,7 @@ class InboxMentionsScreen : Tab {
return TabOptions(1u, "")
}
@OptIn(ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<InboxMentionsMviModel>()
@ -104,15 +102,11 @@ class InboxMentionsScreen : Tab {
}.launchIn(this)
}
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(InboxMentionsMviModel.Intent.Refresh)
},
)
Box(
modifier = Modifier.pullRefresh(pullRefreshState),
PullToRefreshBox(
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(InboxMentionsMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -313,14 +307,6 @@ class InboxMentionsScreen : Tab {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -10,13 +10,11 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@ -47,7 +45,7 @@ class InboxMessagesScreen : Tab {
return TabOptions(2u, "")
}
@OptIn(ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<InboxMessagesMviModel>()
@ -83,15 +81,11 @@ class InboxMessagesScreen : Tab {
}.launchIn(this)
}
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(InboxMessagesMviModel.Intent.Refresh)
},
)
Box(
modifier = Modifier.pullRefresh(pullRefreshState),
PullToRefreshBox(
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(InboxMessagesMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -157,14 +151,6 @@ class InboxMessagesScreen : Tab {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -2,7 +2,6 @@ package com.livefast.eattrash.raccoonforlemmy.unit.modlog
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
@ -12,12 +11,9 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@ -26,6 +22,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -67,7 +64,7 @@ import org.koin.core.parameter.parametersOf
class ModlogScreen(
private val communityId: Long? = null,
) : Screen {
@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<ModlogMviModel> { parametersOf(communityId) }
@ -78,13 +75,6 @@ class ModlogScreen(
val settingsRepository = remember { getSettingsRepository() }
val settings by settingsRepository.currentSettings.collectAsState()
val lazyListState = rememberLazyListState()
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(ModlogMviModel.Intent.Refresh)
},
)
val detailOpener = remember { getDetailOpener() }
LaunchedEffect(model) {
@ -146,7 +136,7 @@ class ModlogScreen(
),
verticalArrangement = Arrangement.spacedBy(Spacing.s),
) {
Box(
PullToRefreshBox(
modifier =
Modifier
.then(
@ -155,7 +145,11 @@ class ModlogScreen(
} else {
Modifier
},
).pullRefresh(pullRefreshState),
),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(ModlogMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),

View File

@ -17,7 +17,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.Reply
@ -26,9 +25,6 @@ import androidx.compose.material.icons.filled.ArrowCircleUp
import androidx.compose.material.icons.filled.Bookmark
import androidx.compose.material.icons.filled.ClearAll
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
@ -40,6 +36,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -100,7 +97,7 @@ import kotlin.math.roundToInt
class MultiCommunityScreen(
private val communityId: Long,
) : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<MultiCommunityMviModel>(parameters = { parametersOf(communityId) })
@ -265,14 +262,7 @@ class MultiCommunityScreen(
}
},
) { padding ->
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(MultiCommunityMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(
@ -283,8 +273,11 @@ class MultiCommunityScreen(
} else {
Modifier
},
).nestedScroll(fabNestedScrollConnection)
.pullRefresh(pullRefreshState),
).nestedScroll(fabNestedScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(MultiCommunityMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -606,14 +599,6 @@ class MultiCommunityScreen(
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -16,17 +16,14 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@ -36,6 +33,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.LinkAnnotation
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextAlign
@ -75,7 +73,6 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
private object AuthIssueAnnotations {
const val ANNOTATION_ACTION = "action"
const val ACTION_REFRESH = "refresh"
const val ACTION_LOGIN = "login"
}
@ -86,7 +83,7 @@ object ProfileLoggedScreen : Tab {
return TabOptions(0u, "")
}
@OptIn(ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<ProfileLoggedMviModel>()
@ -135,15 +132,11 @@ object ProfileLoggedScreen : Tab {
verticalArrangement = Arrangement.spacedBy(Spacing.s),
horizontalAlignment = Alignment.CenterHorizontally,
) {
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(ProfileLoggedMviModel.Intent.Refresh)
},
)
Box(
modifier = Modifier.pullRefresh(pullRefreshState),
PullToRefreshBox(
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(ProfileLoggedMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -169,18 +162,28 @@ object ProfileLoggedScreen : Tab {
withStyle(SpanStyle(color = MaterialTheme.colorScheme.onBackground)) {
append(LocalStrings.current.messageAuthIssueSegue0)
append("\n")
pushStringAnnotation(
AuthIssueAnnotations.ANNOTATION_ACTION,
AuthIssueAnnotations.ACTION_REFRESH,
pushLink(
LinkAnnotation.Clickable(
tag = AuthIssueAnnotations.ACTION_REFRESH,
linkInteractionListener = {
model.reduce(ProfileLoggedMviModel.Intent.Refresh)
},
),
)
withStyle(linkStyle) {
append(LocalStrings.current.messageAuthIssueSegue1)
}
pop()
append("\n")
pushStringAnnotation(
AuthIssueAnnotations.ANNOTATION_ACTION,
AuthIssueAnnotations.ACTION_LOGIN,
pushLink(
LinkAnnotation.Clickable(
tag = AuthIssueAnnotations.ACTION_LOGIN,
linkInteractionListener = {
notificationCenter.send(
NotificationCenterEvent.ProfileSideMenuAction.Logout,
)
},
),
)
withStyle(linkStyle) {
append(LocalStrings.current.messageAuthIssueSegue2)
@ -205,31 +208,11 @@ object ProfileLoggedScreen : Tab {
horizontal = Spacing.m,
),
) {
ClickableText(
Text(
modifier =
Modifier.fillMaxWidth(),
text = annotatedString,
style = MaterialTheme.typography.bodyLarge,
onClick = { offset ->
val annotation =
annotatedString
.getStringAnnotations(
tag = AuthIssueAnnotations.ANNOTATION_ACTION,
start = offset,
end = offset,
).firstOrNull()
if (annotation != null) {
when (annotation.item) {
AuthIssueAnnotations.ACTION_REFRESH ->
model.reduce(ProfileLoggedMviModel.Intent.Refresh)
AuthIssueAnnotations.ACTION_LOGIN ->
notificationCenter.send(
NotificationCenterEvent.ProfileSideMenuAction.Logout,
)
}
}
},
)
}
}
@ -677,14 +660,6 @@ object ProfileLoggedScreen : Tab {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}

View File

@ -28,7 +28,6 @@ import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.NavigateBefore
@ -42,9 +41,6 @@ import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@ -61,6 +57,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable
@ -154,11 +151,7 @@ class PostDetailScreen(
override val key: ScreenKey
get() = super.key + postId.toString()
@OptIn(
ExperimentalMaterial3Api::class,
ExperimentalMaterialApi::class,
ExperimentalLayoutApi::class,
)
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
@Composable
override fun Content() {
val model =
@ -784,15 +777,8 @@ class PostDetailScreen(
},
)
}
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(PostDetailMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.then(
@ -802,8 +788,11 @@ class PostDetailScreen(
Modifier
},
).nestedScroll(fabNestedScrollConnection)
.nestedScroll(keyboardScrollConnection)
.pullRefresh(pullRefreshState),
.nestedScroll(keyboardScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(PostDetailMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -1796,14 +1785,6 @@ class PostDetailScreen(
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}

View File

@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Reply
import androidx.compose.material.icons.filled.ArrowCircleDown
@ -33,9 +32,6 @@ import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material.icons.filled.SyncDisabled
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
@ -46,6 +42,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -107,7 +104,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
class PostListScreen : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<PostListMviModel>()
@ -319,14 +316,7 @@ class PostListScreen : Screen {
},
) { padding ->
if (uiState.currentUserId != null) {
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(PostListMviModel.Intent.Refresh())
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(
@ -343,8 +333,11 @@ class PostListScreen : Screen {
} else {
Modifier
},
).nestedScroll(fabNestedScrollConnection)
.pullRefresh(pullRefreshState),
).nestedScroll(fabNestedScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(PostListMviModel.Intent.Refresh())
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -774,14 +767,6 @@ class PostListScreen : Screen {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
} else if (!uiState.initial) {
Column(

View File

@ -10,21 +10,18 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowCircleDown
import androidx.compose.material.icons.filled.ArrowCircleUp
import androidx.compose.material.icons.filled.MarkChatRead
import androidx.compose.material.icons.filled.MarkChatUnread
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@ -62,7 +59,7 @@ class InboxRepliesScreen : Tab {
return TabOptions(0u, "")
}
@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<InboxRepliesMviModel>()
@ -105,15 +102,11 @@ class InboxRepliesScreen : Tab {
}.launchIn(this)
}
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(InboxRepliesMviModel.Intent.Refresh)
},
)
Box(
modifier = Modifier.pullRefresh(pullRefreshState),
PullToRefreshBox(
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(InboxRepliesMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -312,14 +305,6 @@ class InboxRepliesScreen : Tab {
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -14,14 +14,10 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.Report
import androidx.compose.material.icons.filled.ReportOff
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
@ -32,6 +28,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -76,7 +73,7 @@ import org.koin.core.parameter.parametersOf
class ReportListScreen(
private val communityId: Long? = null,
) : Screen {
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model = getScreenModel<ReportListMviModel> { parametersOf(communityId) }
@ -88,13 +85,6 @@ class ReportListScreen(
val settingsRepository = remember { getSettingsRepository() }
val settings by settingsRepository.currentSettings.collectAsState()
val lazyListState = rememberLazyListState()
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(ReportListMviModel.Intent.Refresh)
},
)
val detailOpener = remember { getDetailOpener() }
val defaultResolveColor = MaterialTheme.colorScheme.secondary
@ -195,7 +185,7 @@ class ReportListScreen(
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.then(
@ -204,7 +194,11 @@ class ReportListScreen(
} else {
Modifier
},
).pullRefresh(pullRefreshState),
),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(ReportListMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -464,13 +458,6 @@ class ReportListScreen(
if (uiState.asyncInProgress) {
ProgressHud()
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
}
}
}

View File

@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.Chat
@ -28,9 +27,6 @@ import androidx.compose.material.icons.filled.ArrowCircleUp
import androidx.compose.material.icons.filled.Bookmark
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.DropdownMenuItem
@ -46,6 +42,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -129,7 +126,7 @@ class UserDetailScreen(
override val key: ScreenKey
get() = super.key + userId.toString()
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val model =
@ -446,14 +443,7 @@ class UserDetailScreen(
}
},
) { padding ->
val pullRefreshState =
rememberPullRefreshState(
refreshing = uiState.refreshing,
onRefresh = {
model.reduce(UserDetailMviModel.Intent.Refresh)
},
)
Box(
PullToRefreshBox(
modifier =
Modifier
.padding(
@ -465,8 +455,11 @@ class UserDetailScreen(
Modifier
},
).navigationBarsPadding()
.nestedScroll(fabNestedScrollConnection)
.pullRefresh(pullRefreshState),
.nestedScroll(fabNestedScrollConnection),
isRefreshing = uiState.refreshing,
onRefresh = {
model.reduce(UserDetailMviModel.Intent.Refresh)
},
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
@ -1145,13 +1138,6 @@ class UserDetailScreen(
Spacer(modifier = Modifier.height(Spacing.xxxl))
}
}
PullRefreshIndicator(
refreshing = uiState.refreshing,
state = pullRefreshState,
modifier = Modifier.align(Alignment.TopCenter),
backgroundColor = MaterialTheme.colorScheme.background,
contentColor = MaterialTheme.colorScheme.onBackground,
)
if (uiState.asyncInProgress) {
ProgressHud()