Refactor(ToolView): Optimize preview code logic

This commit is contained in:
2024-08-14 17:18:18 +08:00
parent 6732eb6a22
commit 35a421472d
7 changed files with 28 additions and 16 deletions

View File

@@ -37,6 +37,7 @@ import top.fatweb.oxygen.toolbox.model.userdata.LaunchPageConfig
import top.fatweb.oxygen.toolbox.model.userdata.ThemeBrandConfig import top.fatweb.oxygen.toolbox.model.userdata.ThemeBrandConfig
import top.fatweb.oxygen.toolbox.monitor.NetworkMonitor import top.fatweb.oxygen.toolbox.monitor.NetworkMonitor
import top.fatweb.oxygen.toolbox.monitor.TimeZoneMonitor import top.fatweb.oxygen.toolbox.monitor.TimeZoneMonitor
import top.fatweb.oxygen.toolbox.navigation.PREVIEW_ARG
import top.fatweb.oxygen.toolbox.navigation.navigateToToolView import top.fatweb.oxygen.toolbox.navigation.navigateToToolView
import top.fatweb.oxygen.toolbox.repository.userdata.UserDataRepository import top.fatweb.oxygen.toolbox.repository.userdata.UserDataRepository
import top.fatweb.oxygen.toolbox.ui.OxygenApp import top.fatweb.oxygen.toolbox.ui.OxygenApp
@@ -122,8 +123,9 @@ class MainActivity : ComponentActivity() {
LaunchedEffect(intent.data) { LaunchedEffect(intent.data) {
intent.data?.run { intent.data?.run {
val pathSegments = pathSegments val pathSegments = pathSegments
val preview = getBooleanQueryParameter(PREVIEW_ARG, false)
if (pathSegments.size == 2) { if (pathSegments.size == 2) {
appState.navController.navigateToToolView(pathSegments[0], pathSegments[1]) appState.navController.navigateToToolView(pathSegments[0], pathSegments[1], preview)
} }
} }
} }

View File

@@ -11,7 +11,7 @@ const val TOOL_STORE_ROUTE = "tool_store_route"
fun NavController.navigateToToolStore(navOptions: NavOptions? = null) = navigate(TOOL_STORE_ROUTE, navOptions) fun NavController.navigateToToolStore(navOptions: NavOptions? = null) = navigate(TOOL_STORE_ROUTE, navOptions)
fun NavGraphBuilder.toolStoreScreen( fun NavGraphBuilder.toolStoreScreen(
onNavigateToToolView: (username: String, toolId: String) -> Unit onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit
) { ) {
composable( composable(
route = TOOL_STORE_ROUTE route = TOOL_STORE_ROUTE

View File

@@ -16,9 +16,10 @@ private val URL_CHARACTER_ENCODING = UTF_8.name()
internal const val USER_NAME_ARG = "username" internal const val USER_NAME_ARG = "username"
internal const val TOOL_ID_ARG = "toolId" internal const val TOOL_ID_ARG = "toolId"
internal const val PREVIEW_ARG = "preview"
const val TOOL_VIEW_ROUTE = "tool_view_route" const val TOOL_VIEW_ROUTE = "tool_view_route"
internal class ToolViewArgs(val username: String, val toolId: String) { internal class ToolViewArgs(val username: String, val toolId: String, val preview: Boolean) {
constructor(savedStateHandle: SavedStateHandle) : constructor(savedStateHandle: SavedStateHandle) :
this( this(
URLDecoder.decode( URLDecoder.decode(
@@ -28,18 +29,20 @@ internal class ToolViewArgs(val username: String, val toolId: String) {
URLDecoder.decode( URLDecoder.decode(
checkNotNull(savedStateHandle[TOOL_ID_ARG]), checkNotNull(savedStateHandle[TOOL_ID_ARG]),
URL_CHARACTER_ENCODING URL_CHARACTER_ENCODING
) ),
checkNotNull(savedStateHandle[PREVIEW_ARG])
) )
} }
fun NavController.navigateToToolView( fun NavController.navigateToToolView(
username: String, username: String,
toolId: String, toolId: String,
preview: Boolean,
navOptions: NavOptionsBuilder.() -> Unit = {} navOptions: NavOptionsBuilder.() -> Unit = {}
) { ) {
val encodedUsername = URLEncoder.encode(username, URL_CHARACTER_ENCODING) val encodedUsername = URLEncoder.encode(username, URL_CHARACTER_ENCODING)
val encodedToolId = URLEncoder.encode(toolId, URL_CHARACTER_ENCODING) val encodedToolId = URLEncoder.encode(toolId, URL_CHARACTER_ENCODING)
val newRoute = "$TOOL_VIEW_ROUTE/$encodedUsername/$encodedToolId" val newRoute = "$TOOL_VIEW_ROUTE/$encodedUsername/$encodedToolId?$PREVIEW_ARG=$preview"
navigate(newRoute) { navigate(newRoute) {
navOptions() navOptions()
} }
@@ -49,10 +52,11 @@ fun NavGraphBuilder.toolViewScreen(
onBackClick: () -> Unit onBackClick: () -> Unit
) { ) {
composable( composable(
route = "${TOOL_VIEW_ROUTE}/{$USER_NAME_ARG}/{$TOOL_ID_ARG}", route = "${TOOL_VIEW_ROUTE}/{$USER_NAME_ARG}/{$TOOL_ID_ARG}?$PREVIEW_ARG={$PREVIEW_ARG}",
arguments = listOf( arguments = listOf(
navArgument(USER_NAME_ARG) { type = NavType.StringType }, navArgument(USER_NAME_ARG) { type = NavType.StringType },
navArgument(TOOL_ID_ARG) { type = NavType.StringType } navArgument(TOOL_ID_ARG) { type = NavType.StringType },
navArgument(PREVIEW_ARG) { type = NavType.BoolType; defaultValue = false }
) )
) { ) {
ToolViewRoute( ToolViewRoute(

View File

@@ -12,7 +12,7 @@ fun NavController.navigateToTools(navOptions: NavOptions) = navigate(TOOLS_ROUTE
fun NavGraphBuilder.toolsScreen( fun NavGraphBuilder.toolsScreen(
onShowSnackbar: suspend (message: String, action: String?) -> Boolean, onShowSnackbar: suspend (message: String, action: String?) -> Boolean,
onNavigateToToolView: (username: String, toolId: String) -> Unit, onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit,
onNavigateToToolStore: () -> Unit onNavigateToToolStore: () -> Unit
) { ) {
composable( composable(

View File

@@ -64,7 +64,7 @@ import top.fatweb.oxygen.toolbox.ui.component.scrollbar.scrollbarState
internal fun ToolStoreRoute( internal fun ToolStoreRoute(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: ToolStoreViewModel = hiltViewModel(), viewModel: ToolStoreViewModel = hiltViewModel(),
onNavigateToToolView: (username: String, toolId: String) -> Unit, onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit,
) { ) {
val toolStorePagingItems = viewModel.storeData.collectAsLazyPagingItems() val toolStorePagingItems = viewModel.storeData.collectAsLazyPagingItems()
val installInfo by viewModel.installInfo.collectAsState() val installInfo by viewModel.installInfo.collectAsState()
@@ -85,7 +85,7 @@ internal fun ToolStoreRoute(
@Composable @Composable
internal fun ToolStoreScreen( internal fun ToolStoreScreen(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onNavigateToToolView: (username: String, toolId: String) -> Unit, onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit,
toolStorePagingItems: LazyPagingItems<ToolEntity>, toolStorePagingItems: LazyPagingItems<ToolEntity>,
onChangeInstallStatus: (status: ToolStoreUiState.InstallInfo.Status) -> Unit, onChangeInstallStatus: (status: ToolStoreUiState.InstallInfo.Status) -> Unit,
onChangeInstallType: (type: ToolStoreUiState.InstallInfo.Type) -> Unit, onChangeInstallType: (type: ToolStoreUiState.InstallInfo.Type) -> Unit,
@@ -125,7 +125,7 @@ internal fun ToolStoreScreen(
onChangeInstallType(installType) onChangeInstallType(installType)
}, },
onClick = { onClick = {
onNavigateToToolView(it.authorUsername, it.toolId) onNavigateToToolView(it.authorUsername, it.toolId, it.upgrade != null)
} }
) )

View File

@@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import top.fatweb.oxygen.toolbox.model.Result import top.fatweb.oxygen.toolbox.model.Result
import top.fatweb.oxygen.toolbox.navigation.ToolViewArgs import top.fatweb.oxygen.toolbox.navigation.ToolViewArgs
@@ -32,11 +33,14 @@ class ToolViewScreenViewModel @Inject constructor(
private val toolViewArgs = ToolViewArgs(savedStateHandle) private val toolViewArgs = ToolViewArgs(savedStateHandle)
private val username = toolViewArgs.username private val username = toolViewArgs.username
private val toolId = toolViewArgs.toolId private val toolId = toolViewArgs.toolId
private val preview = toolViewArgs.preview
val toolViewUiState: StateFlow<ToolViewUiState> = toolViewUiState( val toolViewUiState: StateFlow<ToolViewUiState> = toolViewUiState(
savedStateHandle = savedStateHandle, savedStateHandle = savedStateHandle,
username = username, username = username,
toolId = toolId, toolId = toolId,
preview = preview,
storeRepository = storeRepository, storeRepository = storeRepository,
toolRepository = toolRepository toolRepository = toolRepository
) )
@@ -51,11 +55,13 @@ private fun toolViewUiState(
savedStateHandle: SavedStateHandle, savedStateHandle: SavedStateHandle,
username: String, username: String,
toolId: String, toolId: String,
preview: Boolean,
storeRepository: StoreRepository, storeRepository: StoreRepository,
toolRepository: ToolRepository toolRepository: ToolRepository
): Flow<ToolViewUiState> { ): Flow<ToolViewUiState> {
val toolViewTemplate = toolRepository.toolViewTemplate val toolViewTemplate = toolRepository.toolViewTemplate
val entityFlow = toolRepository.getToolByUsernameAndToolId(username, toolId) val entityFlow =
if (!preview) toolRepository.getToolByUsernameAndToolId(username, toolId) else flowOf(null)
return flow { return flow {
combine(entityFlow, toolViewTemplate, ::Pair).collect { (entityFlow, toolViewTemplate) -> combine(entityFlow, toolViewTemplate, ::Pair).collect { (entityFlow, toolViewTemplate) ->

View File

@@ -68,7 +68,7 @@ internal fun ToolsRoute(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: ToolsScreenViewModel = hiltViewModel(), viewModel: ToolsScreenViewModel = hiltViewModel(),
onShowSnackbar: suspend (message: String, action: String?) -> Boolean, onShowSnackbar: suspend (message: String, action: String?) -> Boolean,
onNavigateToToolView: (username: String, toolId: String) -> Unit, onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit,
onNavigateToToolStore: () -> Unit onNavigateToToolStore: () -> Unit
) { ) {
val toolsScreenUiStateState by viewModel.toolsScreenUiState.collectAsStateWithLifecycle() val toolsScreenUiStateState by viewModel.toolsScreenUiState.collectAsStateWithLifecycle()
@@ -88,7 +88,7 @@ internal fun ToolsRoute(
internal fun ToolsScreen( internal fun ToolsScreen(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onShowSnackbar: suspend (message: String, action: String?) -> Boolean, onShowSnackbar: suspend (message: String, action: String?) -> Boolean,
onNavigateToToolView: (username: String, toolId: String) -> Unit, onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit,
onNavigateToToolStore: () -> Unit, onNavigateToToolStore: () -> Unit,
toolsScreenUiState: ToolsScreenUiState, toolsScreenUiState: ToolsScreenUiState,
onUninstall: (ToolEntity) -> Unit, onUninstall: (ToolEntity) -> Unit,
@@ -208,7 +208,7 @@ internal fun ToolsScreen(
private fun LazyStaggeredGridScope.toolsPanel( private fun LazyStaggeredGridScope.toolsPanel(
toolItems: List<ToolEntity>, toolItems: List<ToolEntity>,
onClick: (username: String, toolId: String) -> Unit, onClick: (username: String, toolId: String, preview: Boolean) -> Unit,
onLongClick: (ToolEntity) -> Unit onLongClick: (ToolEntity) -> Unit
) { ) {
items( items(
@@ -216,7 +216,7 @@ private fun LazyStaggeredGridScope.toolsPanel(
key = { it.id }, key = { it.id },
) { ) {
ToolCard(tool = it, ToolCard(tool = it,
onClick = { onClick(it.authorUsername, it.toolId) }, onClick = { onClick(it.authorUsername, it.toolId, false) },
onLongClick = { onLongClick(it) }) onLongClick = { onLongClick(it) })
} }
} }