Remove Route buildScreen member

This commit is contained in:
maxmoney21m 2023-03-13 20:17:35 +08:00
parent 85d722f96d
commit 70434eb244
2 changed files with 70 additions and 72 deletions

View File

@ -11,7 +11,15 @@ import com.vitorpamplona.amethyst.ui.dal.GlobalFeedFilter
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.screen.NostrGlobalFeedViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChannelScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChatroomListScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChatroomScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.FiltersScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.HomeScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.NotificationScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ProfileScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.SearchScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ThreadScreen
@Composable
fun AppNavigation(
@ -38,10 +46,59 @@ fun AppNavigation(
})
}
Routes.forEach {
it.buildScreen?.let { fn ->
composable(it.route, it.arguments, content = fn(accountViewModel, accountStateViewModel, navController))
}
Route.Home.let { route ->
composable(route.route, route.arguments, content = {
HomeScreen(
accountViewModel = accountViewModel,
navController = navController,
scrollToTop = it.arguments?.getBoolean("scrollToTop") ?: false
)
})
}
composable(Route.Message.route, content = { ChatroomListScreen(accountViewModel, navController) })
composable(Route.Notification.route, content = { NotificationScreen(accountViewModel, navController) })
composable(Route.Filters.route, content = { FiltersScreen(accountViewModel, navController) })
Route.Profile.let { route ->
composable(route.route, route.arguments, content = {
ProfileScreen(
userId = it.arguments?.getString("id"),
accountViewModel = accountViewModel,
navController = navController
)
})
}
Route.Note.let { route ->
composable(route.route, route.arguments, content = {
ThreadScreen(
noteId = it.arguments?.getString("id"),
accountViewModel = accountViewModel,
navController = navController
)
})
}
Route.Room.let { route ->
composable(route.route, route.arguments, content = {
ChatroomScreen(
userId = it.arguments?.getString("id"),
accountViewModel = accountViewModel,
navController = navController
)
})
}
Route.Channel.let { route ->
composable(route.route, route.arguments, content = {
ChannelScreen(
channelId = it.arguments?.getString("id"),
accountViewModel = accountViewModel,
accountStateViewModel = accountStateViewModel,
navController = navController
)
})
}
}

View File

@ -4,8 +4,6 @@ import android.content.Context
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.currentBackStackEntryAsState
@ -16,35 +14,21 @@ import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.ui.dal.ChatroomListKnownFeedFilter
import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter
import com.vitorpamplona.amethyst.ui.dal.NotificationFeedFilter
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChannelScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChatroomListScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChatroomScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.FiltersScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.HomeScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.NotificationScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ProfileScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ThreadScreen
sealed class Route(
val route: String,
val icon: Int,
val hasNewItems: (Account, NotificationCache, Context) -> Boolean = { _, _, _ -> false },
val arguments: List<NamedNavArgument> = emptyList(),
val buildScreen: ((AccountViewModel, AccountStateViewModel, NavController) -> @Composable (NavBackStackEntry) -> Unit)? = null
val arguments: List<NamedNavArgument> = emptyList()
) {
val base: String
get() = route.substringBefore("?")
object Home : Route(
"Home?scrollToTop={scrollToTop}",
R.drawable.ic_home,
route = "Home?scrollToTop={scrollToTop}",
icon = R.drawable.ic_home,
arguments = listOf(navArgument("scrollToTop") { type = NavType.BoolType; defaultValue = false }),
hasNewItems = { accountViewModel, cache, context -> homeHasNewItems(accountViewModel, cache, context) },
buildScreen = { accountViewModel, _, navController ->
{ HomeScreen(accountViewModel, navController, it.arguments?.getBoolean("scrollToTop", false) ?: false) }
}
hasNewItems = { accountViewModel, cache, context -> homeHasNewItems(accountViewModel, cache, context) }
)
object Search : Route(
@ -58,9 +42,6 @@ sealed class Route(
icon = R.drawable.ic_notifications,
hasNewItems = { accountViewModel, cache, context ->
notificationHasNewItems(accountViewModel, cache, context)
},
buildScreen = { accountViewModel, _, navController ->
{ NotificationScreen(accountViewModel, navController) }
}
)
@ -69,79 +50,39 @@ sealed class Route(
icon = R.drawable.ic_dm,
hasNewItems = { accountViewModel, cache, context ->
messagesHasNewItems(accountViewModel, cache, context)
},
buildScreen = { accountViewModel, _, navController ->
{ ChatroomListScreen(accountViewModel, navController) }
}
)
object Filters : Route(
route = "Filters",
icon = R.drawable.ic_security,
buildScreen = { accountViewModel, _, navController ->
{ FiltersScreen(accountViewModel, navController) }
}
icon = R.drawable.ic_security
)
object Profile : Route(
route = "User/{id}",
icon = R.drawable.ic_profile,
arguments = listOf(navArgument("id") { type = NavType.StringType }),
buildScreen = { accountViewModel, _, navController ->
{ ProfileScreen(it.arguments?.getString("id"), accountViewModel, navController) }
}
arguments = listOf(navArgument("id") { type = NavType.StringType })
)
object Note : Route(
route = "Note/{id}",
icon = R.drawable.ic_moments,
arguments = listOf(navArgument("id") { type = NavType.StringType }),
buildScreen = { accountViewModel, _, navController ->
{ ThreadScreen(it.arguments?.getString("id"), accountViewModel, navController) }
}
arguments = listOf(navArgument("id") { type = NavType.StringType })
)
object Room : Route(
route = "Room/{id}",
icon = R.drawable.ic_moments,
arguments = listOf(navArgument("id") { type = NavType.StringType }),
buildScreen = { accountViewModel, _, navController ->
{ ChatroomScreen(it.arguments?.getString("id"), accountViewModel, navController) }
}
arguments = listOf(navArgument("id") { type = NavType.StringType })
)
object Channel : Route(
route = "Channel/{id}",
icon = R.drawable.ic_moments,
arguments = listOf(navArgument("id") { type = NavType.StringType }),
buildScreen = { accountViewModel, accountStateViewModel, navController ->
{
ChannelScreen(
it.arguments?.getString("id"),
accountViewModel,
accountStateViewModel,
navController
)
}
}
arguments = listOf(navArgument("id") { type = NavType.StringType })
)
}
val Routes = listOf(
// bottom
Route.Home,
Route.Message,
Route.Search,
Route.Notification,
// drawer
Route.Profile,
Route.Note,
Route.Room,
Route.Channel,
Route.Filters
)
// **
// * Functions below only exist because we have not broken the datasource classes into backend and frontend.
// **