Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/src/main/java/dev/dimension/flare/ui/route/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ internal sealed interface Route : NavKey {
@Serializable
data object AppearanceMedia : Settings

@Serializable
data object Behavior : Settings

@Serializable
data object LinkOpenDefaults : Settings

@Serializable
data object Storage : Settings

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,18 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.Checkbox
import androidx.compose.material3.ListItem
import androidx.compose.material3.ListItemDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
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.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ClipEntry
import androidx.compose.ui.platform.LocalClipboard
import androidx.compose.ui.res.stringResource
Expand All @@ -28,7 +33,9 @@ import dev.dimension.flare.model.MicroBlogKey
import dev.dimension.flare.ui.component.FAIcon
import dev.dimension.flare.ui.component.listCard
import dev.dimension.flare.ui.presenter.home.UserPresenter
import dev.dimension.flare.ui.presenter.home.UserState
import dev.dimension.flare.ui.presenter.invoke
import dev.dimension.flare.ui.presenter.settings.LinkOpenDefaultsActionsPresenter
import dev.dimension.flare.ui.route.Route
import dev.dimension.flare.ui.screen.settings.AccountItem
import dev.dimension.flare.ui.theme.screenHorizontalPadding
Expand All @@ -47,6 +54,12 @@ internal fun DeepLinkAccountPickerModal(
val scope = rememberCoroutineScope()
val clipboard = LocalClipboard.current
val accounts by producePresenter { presenter(data) }
val defaultsActions by producePresenter("link_open_defaults_picker") {
remember(originalUrl) { LinkOpenDefaultsActionsPresenter(originalUrl) }.invoke()
}
var saveAsDefault by remember(defaultsActions.canSaveDefault) {
mutableStateOf(defaultsActions.canSaveDefault)
}
LazyColumn(
contentPadding =
PaddingValues(
Expand All @@ -60,12 +73,15 @@ internal fun DeepLinkAccountPickerModal(
item {
Spacer(modifier = Modifier.height(12.dp))
}
itemsIndexed(accounts) { index, (userState, route) ->
itemsIndexed(accounts) { index, item ->
AccountItem(
userState.user,
item.userState.user,
onClick = {
if (saveAsDefault && defaultsActions.canSaveDefault) {
defaultsActions.setAccountDefault(item.accountKey)
}
onDismissRequest()
onNavigate(route)
onNavigate(item.route)
},
toLogin = {},
modifier =
Expand All @@ -80,12 +96,12 @@ internal fun DeepLinkAccountPickerModal(
val text = stringResource(R.string.media_menu_copy_link)
ListItem(
headlineContent = {
Text(stringResource(R.string.media_menu_copy_link))
Text(text)
},
leadingContent = {
FAIcon(
FontAwesomeIcons.Solid.Globe,
contentDescription = stringResource(R.string.media_menu_copy_link),
contentDescription = text,
)
},
modifier =
Expand All @@ -109,20 +125,56 @@ internal fun DeepLinkAccountPickerModal(
},
)
}
if (defaultsActions.canSaveDefault) {
item {
ListItem(
headlineContent = {
Text(stringResource(R.string.deeplink_account_selection_save_default))
},
colors =
ListItemDefaults.colors(
containerColor = Color.Transparent,
),
trailingContent = {
Checkbox(
checked = saveAsDefault,
onCheckedChange = {
saveAsDefault = it
},
)
},
modifier =
Modifier
.clickable {
saveAsDefault = !saveAsDefault
},
)
}
}
item {
Spacer(modifier = Modifier.height(14.dp))
}
}
}

private data class DeepLinkAccountItem(
val accountKey: MicroBlogKey,
val userState: UserState,
val route: Route,
)

@Composable
private fun presenter(data: ImmutableMap<MicroBlogKey, Route>) =
run {
remember(data) {
data.map {
UserPresenter(AccountType.Specific(it.key), null) to it.value
data.map { (accountKey, route) ->
accountKey to (UserPresenter(AccountType.Specific(accountKey), null) to route)
}
}.map {
it.first.invoke() to it.second
}.map { (accountKey, presenterAndRoute) ->
DeepLinkAccountItem(
accountKey = accountKey,
userState = presenterAndRoute.first.invoke(),
route = presenterAndRoute.second,
)
}.toImmutableList()
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ import dev.dimension.flare.data.model.appearance.AppearanceKeys
import dev.dimension.flare.ui.component.BackButton
import dev.dimension.flare.ui.component.FlareLargeFlexibleTopAppBar
import dev.dimension.flare.ui.component.FlareScaffold
import dev.dimension.flare.ui.component.LocalGlobalAppearance
import dev.dimension.flare.ui.component.LocalTimelineAppearance
import dev.dimension.flare.ui.component.status.StatusItem
import dev.dimension.flare.ui.model.isSuccess
import dev.dimension.flare.ui.model.onSuccess
import dev.dimension.flare.ui.presenter.invoke
import dev.dimension.flare.ui.theme.first
import dev.dimension.flare.ui.theme.item
import dev.dimension.flare.ui.theme.last
Expand All @@ -43,7 +43,6 @@ import moe.tlaster.precompose.molecule.producePresenter
internal fun AppearanceDisplayScreen(onBack: () -> Unit) {
val topAppBarScrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
val state by producePresenter { appearancePresenter() }
val globalAppearance = LocalGlobalAppearance.current
val timelineAppearance = LocalTimelineAppearance.current
FlareScaffold(
topBar = {
Expand Down Expand Up @@ -132,7 +131,12 @@ internal fun AppearanceDisplayScreen(onBack: () -> Unit) {
onClick = {
state.update(AppearanceKeys.ShowLinkPreview, !timelineAppearance.showLinkPreview)
},
shapes = ListItemDefaults.item(),
shapes =
if (timelineAppearance.showLinkPreview) {
ListItemDefaults.item()
} else {
ListItemDefaults.last()
},
content = {
Text(text = stringResource(id = R.string.settings_appearance_show_link_previews))
},
Expand All @@ -153,7 +157,7 @@ internal fun AppearanceDisplayScreen(onBack: () -> Unit) {
onClick = {
state.update(AppearanceKeys.CompatLinkPreview, !timelineAppearance.compatLinkPreview)
},
shapes = ListItemDefaults.item(),
shapes = ListItemDefaults.last(),
content = {
Text(text = stringResource(id = R.string.settings_appearance_compat_link_previews))
},
Expand All @@ -170,26 +174,6 @@ internal fun AppearanceDisplayScreen(onBack: () -> Unit) {
},
)
}
SegmentedListItem(
onClick = {
state.update(AppearanceKeys.InAppBrowser, !globalAppearance.inAppBrowser)
},
shapes = ListItemDefaults.last(),
content = {
Text(text = stringResource(id = R.string.settings_appearance_in_app_browser))
},
supportingContent = {
Text(text = stringResource(id = R.string.settings_appearance_in_app_browser_description))
},
trailingContent = {
Switch(
checked = globalAppearance.inAppBrowser,
onCheckedChange = {
state.update(AppearanceKeys.InAppBrowser, it)
},
)
},
)
}
}
}
Loading
Loading