refactor: bottom sheet overhaul • part 4 (#57)

* remove PostLayoutBottomSheet

* remove ReportListTypeSheet

* remove LikedTypeSheet
This commit is contained in:
akesi seli 2024-10-29 21:00:45 +01:00 committed by GitHub
parent b7d35d3a35
commit e2b8a3342b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 144 additions and 372 deletions

View File

@ -1,106 +0,0 @@
package com.livefast.eattrash.raccoonforlemmy.core.commonui.modals
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import cafe.adriel.voyager.core.screen.Screen
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.CornerSize
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.Spacing
import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.BottomSheetHeader
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
import com.livefast.eattrash.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.livefast.eattrash.raccoonforlemmy.core.notifications.di.getNotificationCenter
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
class LikedTypeSheet : Screen {
@Composable
override fun Content() {
val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() }
Surface {
Column(
modifier =
Modifier
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(
top = Spacing.s,
start = Spacing.s,
end = Spacing.s,
bottom = Spacing.m,
),
verticalArrangement = Arrangement.spacedBy(Spacing.s),
) {
BottomSheetHeader(LocalStrings.current.filteredContentsType)
Column(
modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(Spacing.xxs),
) {
Row(
modifier =
Modifier
.clip(RoundedCornerShape(CornerSize.xxl))
.onClick(
onClick = {
notificationCenter.send(
NotificationCenterEvent.ChangedLikedType(true),
)
navigationCoordinator.hideBottomSheet()
},
).padding(
horizontal = Spacing.s,
vertical = Spacing.s,
).fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = LocalStrings.current.actionUpvote,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
Row(
modifier =
Modifier
.fillMaxWidth()
.padding(
horizontal = Spacing.s,
vertical = Spacing.s,
).onClick(
onClick = {
notificationCenter.send(
NotificationCenterEvent.ChangedLikedType(false),
)
navigationCoordinator.hideBottomSheet()
},
),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = LocalStrings.current.actionDownvote,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
}
}

View File

@ -1,93 +0,0 @@
package com.livefast.eattrash.raccoonforlemmy.core.commonui.modals
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import cafe.adriel.voyager.core.screen.Screen
import com.livefast.eattrash.raccoonforlemmy.core.appearance.data.PostLayout
import com.livefast.eattrash.raccoonforlemmy.core.appearance.data.toReadableName
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.CornerSize
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.Spacing
import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.BottomSheetHeader
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
import com.livefast.eattrash.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.livefast.eattrash.raccoonforlemmy.core.notifications.di.getNotificationCenter
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
class PostLayoutBottomSheet : Screen {
@Composable
override fun Content() {
val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() }
Surface {
Column(
modifier =
Modifier
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(
top = Spacing.s,
start = Spacing.s,
end = Spacing.s,
bottom = Spacing.m,
),
verticalArrangement = Arrangement.spacedBy(Spacing.s),
) {
BottomSheetHeader(LocalStrings.current.settingsPostLayout)
val values =
listOf(
PostLayout.Card,
PostLayout.Compact,
PostLayout.Full,
)
Column(
modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(Spacing.xxs),
) {
for (value in values) {
Row(
modifier =
Modifier
.clip(RoundedCornerShape(CornerSize.xxl))
.onClick(
onClick = {
notificationCenter.send(
NotificationCenterEvent.ChangePostLayout(value),
)
navigationCoordinator.hideBottomSheet()
},
).padding(
horizontal = Spacing.s,
vertical = Spacing.s,
).fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = value.toReadableName(),
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
}
}
}

View File

@ -1,107 +0,0 @@
package com.livefast.eattrash.raccoonforlemmy.core.commonui.modals
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import cafe.adriel.voyager.core.screen.Screen
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.CornerSize
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.Spacing
import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.BottomSheetHeader
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
import com.livefast.eattrash.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.livefast.eattrash.raccoonforlemmy.core.notifications.di.getNotificationCenter
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
class ReportListTypeSheet : Screen {
@Composable
override fun Content() {
val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() }
Surface {
Column(
modifier =
Modifier
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(
top = Spacing.s,
start = Spacing.s,
end = Spacing.s,
bottom = Spacing.m,
),
verticalArrangement = Arrangement.spacedBy(Spacing.s),
) {
BottomSheetHeader(LocalStrings.current.reportListTypeTitle)
Column(
modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(Spacing.xxs),
) {
Row(
modifier =
Modifier
.padding(
horizontal = Spacing.s,
vertical = Spacing.s,
).fillMaxWidth()
.onClick(
onClick = {
notificationCenter.send(
NotificationCenterEvent.ChangeReportListType(true),
)
navigationCoordinator.hideBottomSheet()
},
),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = LocalStrings.current.reportListTypeUnresolved,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
Row(
modifier =
Modifier
.clip(RoundedCornerShape(CornerSize.xxl))
.onClick(
onClick = {
notificationCenter.send(
NotificationCenterEvent.ChangeReportListType(false),
)
navigationCoordinator.hideBottomSheet()
},
).fillMaxWidth()
.padding(
horizontal = Spacing.s,
vertical = Spacing.s,
),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = LocalStrings.current.reportListTypeAll,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
}
}

View File

@ -46,7 +46,6 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.SettingsRow
import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.SettingsSwitchRow
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.CustomModalBottomSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.CustomModalBottomSheetItem
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.PostLayoutBottomSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.SelectNumberBottomSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.SelectNumberBottomSheetType
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
@ -68,6 +67,7 @@ class ConfigureContentViewScreen : Screen {
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(topAppBarState)
val scrollState = rememberScrollState()
var voteFormatBottomSheetOpened by remember { mutableStateOf(false) }
var postLayoutBottomSheetOpened by remember { mutableStateOf(false) }
Scaffold(
modifier =
@ -185,8 +185,7 @@ class ConfigureContentViewScreen : Screen {
title = LocalStrings.current.settingsPostLayout,
value = uiState.postLayout.toReadableName(),
onTap = {
val sheet = PostLayoutBottomSheet()
navigationCoordinator.showBottomSheet(sheet)
postLayoutBottomSheetOpened = true
},
)
@ -309,7 +308,7 @@ class ConfigureContentViewScreen : Screen {
VoteFormat.Hidden,
)
CustomModalBottomSheet(
title = LocalStrings.current.inboxListingTypeTitle,
title = LocalStrings.current.settingsVoteFormat,
items =
values.map { value ->
CustomModalBottomSheetItem(label = value.toReadableName())
@ -324,5 +323,29 @@ class ConfigureContentViewScreen : Screen {
},
)
}
if (postLayoutBottomSheetOpened) {
val values =
listOf(
PostLayout.Card,
PostLayout.Compact,
PostLayout.Full,
)
CustomModalBottomSheet(
title = LocalStrings.current.settingsPostLayout,
items =
values.map { value ->
CustomModalBottomSheetItem(label = value.toReadableName())
},
onSelected = { index ->
postLayoutBottomSheetOpened = false
if (index != null) {
notificationCenter.send(
NotificationCenterEvent.ChangePostLayout(value = values[index]),
)
}
},
)
}
}
}

View File

@ -74,10 +74,13 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.OptionId
import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.PostCard
import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.PostCardPlaceholder
import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.LikedTypeSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.CustomModalBottomSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.CustomModalBottomSheetItem
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
import com.livefast.eattrash.raccoonforlemmy.core.navigation.di.getDrawerCoordinator
import com.livefast.eattrash.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.livefast.eattrash.raccoonforlemmy.core.notifications.di.getNotificationCenter
import com.livefast.eattrash.raccoonforlemmy.core.persistence.data.ActionOnSwipe
import com.livefast.eattrash.raccoonforlemmy.core.persistence.di.getSettingsRepository
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
@ -118,6 +121,7 @@ class FilteredContentsScreen(
val settings by settingsRepository.currentSettings.collectAsState()
val lazyListState = rememberLazyListState()
val detailOpener = remember { getDetailOpener() }
val notificationCenter = remember { getNotificationCenter() }
var rawContent by remember { mutableStateOf<Any?>(null) }
val themeRepository = remember { getThemeRepository() }
val upVoteColor by themeRepository.upVoteColor.collectAsState()
@ -142,6 +146,7 @@ class FilteredContentsScreen(
with(LocalDensity.current) {
WindowInsets.navigationBars.getBottom(this).toDp()
}
var likedTypeBottomSheetOpened by remember { mutableStateOf(false) }
LaunchedEffect(model) {
model.effects
@ -232,7 +237,7 @@ class FilteredContentsScreen(
modifier =
Modifier.onClick(
onClick = {
navigationCoordinator.showBottomSheet(LikedTypeSheet())
likedTypeBottomSheetOpened = true
},
),
text = text,
@ -991,67 +996,90 @@ class FilteredContentsScreen(
}
}
}
}
if (rawContent != null) {
when (val content = rawContent) {
is PostModel -> {
RawContentDialog(
title = content.title,
publishDate = content.publishDate,
updateDate = content.updateDate,
url = content.originalUrl,
text = content.text,
upVotes = content.upvotes,
downVotes = content.downvotes,
onDismiss = {
rawContent = null
},
onQuote = { quotation ->
rawContent = null
if (quotation != null) {
detailOpener.openReply(
originalPost = content,
initialText =
buildString {
append("> ")
append(quotation)
append("\n\n")
},
)
}
},
)
}
if (rawContent != null) {
when (val content = rawContent) {
is PostModel -> {
RawContentDialog(
title = content.title,
publishDate = content.publishDate,
updateDate = content.updateDate,
url = content.originalUrl,
text = content.text,
upVotes = content.upvotes,
downVotes = content.downvotes,
onDismiss = {
rawContent = null
},
onQuote = { quotation ->
rawContent = null
if (quotation != null) {
detailOpener.openReply(
originalPost = content,
initialText =
buildString {
append("> ")
append(quotation)
append("\n\n")
},
)
}
},
)
}
is CommentModel -> {
RawContentDialog(
publishDate = content.publishDate,
updateDate = content.updateDate,
text = content.text,
upVotes = content.upvotes,
downVotes = content.downvotes,
onDismiss = {
rawContent = null
},
onQuote = { quotation ->
rawContent = null
if (quotation != null) {
detailOpener.openReply(
originalPost = PostModel(id = content.postId),
originalComment = content,
initialText =
buildString {
append("> ")
append(quotation)
append("\n\n")
},
)
}
},
)
}
is CommentModel -> {
RawContentDialog(
publishDate = content.publishDate,
updateDate = content.updateDate,
text = content.text,
upVotes = content.upvotes,
downVotes = content.downvotes,
onDismiss = {
rawContent = null
},
onQuote = { quotation ->
rawContent = null
if (quotation != null) {
detailOpener.openReply(
originalPost = PostModel(id = content.postId),
originalComment = content,
initialText =
buildString {
append("> ")
append(quotation)
append("\n\n")
},
)
}
},
)
}
}
}
if (likedTypeBottomSheetOpened) {
val values =
listOf(
LocalStrings.current.actionUpvote,
LocalStrings.current.actionDownvote,
)
CustomModalBottomSheet(
title = LocalStrings.current.inboxListingTypeTitle,
items =
values.map { value ->
CustomModalBottomSheetItem(label = value)
},
onSelected = { index ->
likedTypeBottomSheetOpened = false
if (index != null) {
notificationCenter.send(
NotificationCenterEvent.ChangedLikedType(value = index == 0),
)
}
},
)
}
}
}

View File

@ -54,9 +54,12 @@ import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.SwipeActio
import com.livefast.eattrash.raccoonforlemmy.core.commonui.detailopener.api.getDetailOpener
import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.Option
import com.livefast.eattrash.raccoonforlemmy.core.commonui.lemmyui.OptionId
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.ReportListTypeSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.CustomModalBottomSheet
import com.livefast.eattrash.raccoonforlemmy.core.commonui.modals.CustomModalBottomSheetItem
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
import com.livefast.eattrash.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.livefast.eattrash.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.livefast.eattrash.raccoonforlemmy.core.notifications.di.getNotificationCenter
import com.livefast.eattrash.raccoonforlemmy.core.persistence.di.getSettingsRepository
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
import com.livefast.eattrash.raccoonforlemmy.domain.lemmy.data.CommentReportModel
@ -81,12 +84,14 @@ class ReportListScreen(
val topAppBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(topAppBarState)
val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() }
var rawContent by remember { mutableStateOf<Any?>(null) }
val settingsRepository = remember { getSettingsRepository() }
val settings by settingsRepository.currentSettings.collectAsState()
val lazyListState = rememberLazyListState()
val detailOpener = remember { getDetailOpener() }
val defaultResolveColor = MaterialTheme.colorScheme.secondary
var reportTypeBottomSheetOpened by remember { mutableStateOf(false) }
LaunchedEffect(model) {
model.effects
@ -137,8 +142,7 @@ class ReportListScreen(
modifier =
Modifier.onClick(
onClick = {
val sheet = ReportListTypeSheet()
navigationCoordinator.showBottomSheet(sheet)
reportTypeBottomSheetOpened = true
},
),
text = text,
@ -489,5 +493,28 @@ class ReportListScreen(
}
}
}
if (reportTypeBottomSheetOpened) {
val values =
listOf(
LocalStrings.current.reportListTypeUnresolved,
LocalStrings.current.reportListTypeAll,
)
CustomModalBottomSheet(
title = LocalStrings.current.reportListTypeTitle,
items =
values.map { value ->
CustomModalBottomSheetItem(label = value)
},
onSelected = { index ->
reportTypeBottomSheetOpened = false
if (index != null) {
notificationCenter.send(
NotificationCenterEvent.ChangeReportListType(unresolvedOnly = index == 0),
)
}
},
)
}
}
}