Refactor(ToolView): Optimize preview code logic
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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) ->
|
||||||
|
|||||||
@@ -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) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user