Feat(ToolView): Add ToolView to support execute tool

This commit is contained in:
2024-05-11 16:28:11 +08:00
parent 3d8bc944e3
commit 3a91e834b7
24 changed files with 489 additions and 137 deletions

View File

@@ -14,8 +14,8 @@ fun NavController.navigateToAbout(navOptions: NavOptions? = null) =
navigate(ABOUT_ROUTE, navOptions)
fun NavGraphBuilder.aboutScreen(
onBackClick: () -> Unit,
onNavigateToLibraries: () -> Unit
onNavigateToLibraries: () -> Unit,
onBackClick: () -> Unit
) {
composable(
route = ABOUT_ROUTE,
@@ -28,8 +28,8 @@ fun NavGraphBuilder.aboutScreen(
}
) {
AboutRoute(
onBackClick = onBackClick,
onNavigateToLibraries = onNavigateToLibraries
onNavigateToLibraries = onNavigateToLibraries,
onBackClick = onBackClick
)
}
}

View File

@@ -30,9 +30,13 @@ fun OxygenNavHost(
onBackClick = navController::popBackStack
)
toolsScreen(
onNavigateToToolView = navController::navigateToToolView,
onShowSnackbar = onShowSnackbar,
handleOnCanScrollChange = handleOnCanScrollChange
)
toolViewScreen(
onBackClick = navController::popBackStack
)
starScreen(
)

View File

@@ -0,0 +1,62 @@
package top.fatweb.oxygen.toolbox.navigation
import androidx.lifecycle.SavedStateHandle
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import top.fatweb.oxygen.toolbox.ui.tool.ToolViewRoute
import java.net.URLDecoder
import java.net.URLEncoder
import kotlin.text.Charsets.UTF_8
private val URL_CHARACTER_ENCODING = UTF_8.name()
internal const val USER_NAME_ARG = "username"
internal const val TOOL_ID_ARG = "toolId"
const val TOOL_VIEW_ROUTE = "tool_view_route"
internal class ToolViewArgs(val username: String, val toolId: String) {
constructor(savedStateHandle: SavedStateHandle) :
this(
URLDecoder.decode(
checkNotNull(savedStateHandle[USER_NAME_ARG]),
URL_CHARACTER_ENCODING
),
URLDecoder.decode(
checkNotNull(savedStateHandle[TOOL_ID_ARG]),
URL_CHARACTER_ENCODING
)
)
}
fun NavController.navigateToToolView(
username: String,
toolId: String,
navOptions: NavOptionsBuilder.() -> Unit = {}
) {
val encodedUsername = URLEncoder.encode(username, URL_CHARACTER_ENCODING)
val encodedToolId = URLEncoder.encode(toolId, URL_CHARACTER_ENCODING)
val newRoute = "$TOOL_VIEW_ROUTE/$encodedUsername/$encodedToolId"
navigate(newRoute) {
navOptions()
}
}
fun NavGraphBuilder.toolViewScreen(
onBackClick: () -> Unit
) {
composable(
route = "${TOOL_VIEW_ROUTE}/{$USER_NAME_ARG}/{$TOOL_ID_ARG}",
arguments = listOf(
navArgument(USER_NAME_ARG) { type = NavType.StringType },
navArgument(TOOL_ID_ARG) { type = NavType.StringType }
)
) {
ToolViewRoute(
onBackClick = onBackClick
)
}
}

View File

@@ -11,6 +11,7 @@ const val TOOLS_ROUTE = "tools_route"
fun NavController.navigateToTools(navOptions: NavOptions) = navigate(TOOLS_ROUTE, navOptions)
fun NavGraphBuilder.toolsScreen(
onNavigateToToolView: (username: String, toolId: String) -> Unit,
onShowSnackbar: suspend (String, String?) -> Boolean,
handleOnCanScrollChange: (Boolean) -> Unit
) {
@@ -18,6 +19,7 @@ fun NavGraphBuilder.toolsScreen(
route = TOOLS_ROUTE
) {
ToolsRoute(
onNavigateToToolView = onNavigateToToolView,
onShowSnackbar = onShowSnackbar,
handleOnCanScrollChange = handleOnCanScrollChange
)