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
@@ -11,7 +11,15 @@ import com.vitorpamplona.amethyst.ui.dal.GlobalFeedFilter
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.screen.NostrGlobalFeedViewModel import com.vitorpamplona.amethyst.ui.screen.NostrGlobalFeedViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel 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.SearchScreen
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ThreadScreen
@Composable @Composable
fun AppNavigation( fun AppNavigation(
@@ -38,10 +46,59 @@ fun AppNavigation(
}) })
} }
Routes.forEach { Route.Home.let { route ->
it.buildScreen?.let { fn -> composable(route.route, route.arguments, content = {
composable(it.route, it.arguments, content = fn(accountViewModel, accountStateViewModel, navController)) 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
)
})
} }
} }
@@ -4,8 +4,6 @@ import android.content.Context
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.navigation.NamedNavArgument import androidx.navigation.NamedNavArgument
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.compose.currentBackStackEntryAsState 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.ChatroomListKnownFeedFilter
import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter
import com.vitorpamplona.amethyst.ui.dal.NotificationFeedFilter 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( sealed class Route(
val route: String, val route: String,
val icon: Int, val icon: Int,
val hasNewItems: (Account, NotificationCache, Context) -> Boolean = { _, _, _ -> false }, val hasNewItems: (Account, NotificationCache, Context) -> Boolean = { _, _, _ -> false },
val arguments: List<NamedNavArgument> = emptyList(), val arguments: List<NamedNavArgument> = emptyList()
val buildScreen: ((AccountViewModel, AccountStateViewModel, NavController) -> @Composable (NavBackStackEntry) -> Unit)? = null
) { ) {
val base: String val base: String
get() = route.substringBefore("?") get() = route.substringBefore("?")
object Home : Route( object Home : Route(
"Home?scrollToTop={scrollToTop}", route = "Home?scrollToTop={scrollToTop}",
R.drawable.ic_home, icon = R.drawable.ic_home,
arguments = listOf(navArgument("scrollToTop") { type = NavType.BoolType; defaultValue = false }), arguments = listOf(navArgument("scrollToTop") { type = NavType.BoolType; defaultValue = false }),
hasNewItems = { accountViewModel, cache, context -> homeHasNewItems(accountViewModel, cache, context) }, hasNewItems = { accountViewModel, cache, context -> homeHasNewItems(accountViewModel, cache, context) }
buildScreen = { accountViewModel, _, navController ->
{ HomeScreen(accountViewModel, navController, it.arguments?.getBoolean("scrollToTop", false) ?: false) }
}
) )
object Search : Route( object Search : Route(
@@ -58,9 +42,6 @@ sealed class Route(
icon = R.drawable.ic_notifications, icon = R.drawable.ic_notifications,
hasNewItems = { accountViewModel, cache, context -> hasNewItems = { accountViewModel, cache, context ->
notificationHasNewItems(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, icon = R.drawable.ic_dm,
hasNewItems = { accountViewModel, cache, context -> hasNewItems = { accountViewModel, cache, context ->
messagesHasNewItems(accountViewModel, cache, context) messagesHasNewItems(accountViewModel, cache, context)
},
buildScreen = { accountViewModel, _, navController ->
{ ChatroomListScreen(accountViewModel, navController) }
} }
) )
object Filters : Route( object Filters : Route(
route = "Filters", route = "Filters",
icon = R.drawable.ic_security, icon = R.drawable.ic_security
buildScreen = { accountViewModel, _, navController ->
{ FiltersScreen(accountViewModel, navController) }
}
) )
object Profile : Route( object Profile : Route(
route = "User/{id}", route = "User/{id}",
icon = R.drawable.ic_profile, icon = R.drawable.ic_profile,
arguments = listOf(navArgument("id") { type = NavType.StringType }), arguments = listOf(navArgument("id") { type = NavType.StringType })
buildScreen = { accountViewModel, _, navController ->
{ ProfileScreen(it.arguments?.getString("id"), accountViewModel, navController) }
}
) )
object Note : Route( object Note : Route(
route = "Note/{id}", route = "Note/{id}",
icon = R.drawable.ic_moments, icon = R.drawable.ic_moments,
arguments = listOf(navArgument("id") { type = NavType.StringType }), arguments = listOf(navArgument("id") { type = NavType.StringType })
buildScreen = { accountViewModel, _, navController ->
{ ThreadScreen(it.arguments?.getString("id"), accountViewModel, navController) }
}
) )
object Room : Route( object Room : Route(
route = "Room/{id}", route = "Room/{id}",
icon = R.drawable.ic_moments, icon = R.drawable.ic_moments,
arguments = listOf(navArgument("id") { type = NavType.StringType }), arguments = listOf(navArgument("id") { type = NavType.StringType })
buildScreen = { accountViewModel, _, navController ->
{ ChatroomScreen(it.arguments?.getString("id"), accountViewModel, navController) }
}
) )
object Channel : Route( object Channel : Route(
route = "Channel/{id}", route = "Channel/{id}",
icon = R.drawable.ic_moments, icon = R.drawable.ic_moments,
arguments = listOf(navArgument("id") { type = NavType.StringType }), arguments = listOf(navArgument("id") { type = NavType.StringType })
buildScreen = { accountViewModel, accountStateViewModel, navController ->
{
ChannelScreen(
it.arguments?.getString("id"),
accountViewModel,
accountStateViewModel,
navController
)
}
}
) )
} }
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. // * Functions below only exist because we have not broken the datasource classes into backend and frontend.
// ** // **