From 79616a214c46e0ecea3c86d7c2823345968badb8 Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Mon, 20 Jul 2026 09:39:53 +0700 Subject: [PATCH] add settings screen --- .../androidMain/kotlin/su/reya/coop/App.kt | 4 ++ .../kotlin/su/reya/coop/Navigation.kt | 3 + .../kotlin/su/reya/coop/screens/HomeScreen.kt | 2 +- .../su/reya/coop/screens/RelayScreen.kt | 8 +-- .../su/reya/coop/screens/SettingsScreen.kt | 55 +++++++++++++++++++ 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 composeApp/src/androidMain/kotlin/su/reya/coop/screens/SettingsScreen.kt diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt index 3570b27..786d339 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt @@ -51,6 +51,7 @@ import su.reya.coop.screens.ProfileScreen import su.reya.coop.screens.RelayScreen import su.reya.coop.screens.RequestListScreen import su.reya.coop.screens.ScanScreen +import su.reya.coop.screens.SettingsScreen import su.reya.coop.screens.UpdateProfileScreen import su.reya.coop.screens.chat.ChatScreen import su.reya.coop.viewmodel.AccountViewModel @@ -293,6 +294,9 @@ fun App( entry { RelayScreen(accountViewModel) } + entry { + SettingsScreen(settingsViewModel) + } } ) } diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt index e7b72a9..cc3b4e0 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt @@ -58,4 +58,7 @@ sealed interface Screen : NavKey { @Serializable data object Relay : Screen + + @Serializable + data object Settings : Screen } diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt index 400c708..91fe388 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt @@ -760,7 +760,7 @@ fun BottomMenuList( "Update Profile" to { navigator.navigate(Screen.UpdateProfile) }, "Contact List" to { navigator.navigate(Screen.ContactList) }, "Relay Management" to { navigator.navigate(Screen.Relay) }, - "Settings" to { } + "Settings" to { navigator.navigate(Screen.Settings) } ) Column( diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/RelayScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/RelayScreen.kt index 5048959..d74dba9 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/RelayScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/RelayScreen.kt @@ -95,15 +95,15 @@ fun RelayScreen(viewModel: AccountViewModel) { var openAddRelayDialog by remember { mutableStateOf(false) } var relayToDelete by remember { mutableStateOf(null) } + val accountState by viewModel.state.collectAsStateWithLifecycle() + val loadedRelayList = accountState.userRelayList + val loadedMsgRelayList = accountState.userMsgRelayList + LaunchedEffect(Unit) { viewModel.loadCurrentUserRelayList() viewModel.loadCurrentUserMsgRelayList() } - val accountState by viewModel.state.collectAsStateWithLifecycle() - val loadedRelayList = accountState.userRelayList - val loadedMsgRelayList = accountState.userMsgRelayList - LaunchedEffect(loadedRelayList) { if (loadedRelayList.isNotEmpty()) { relayList.clear() diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/SettingsScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/SettingsScreen.kt new file mode 100644 index 0000000..fd09a91 --- /dev/null +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/SettingsScreen.kt @@ -0,0 +1,55 @@ +package su.reya.coop.screens + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import coop.composeapp.generated.resources.Res +import coop.composeapp.generated.resources.ic_arrow_back +import org.jetbrains.compose.resources.painterResource +import su.reya.coop.LocalNavigator +import su.reya.coop.LocalSnackbarHostState +import su.reya.coop.viewmodel.SettingsViewModel + +@Composable +fun SettingsScreen(viewModel: SettingsViewModel) { + val navigator = LocalNavigator.current + val snackbarHostState = LocalSnackbarHostState.current + + Scaffold( + snackbarHost = { SnackbarHost(snackbarHostState) }, + topBar = { + TopAppBar( + title = { + Text( + text = "Settings", + style = MaterialTheme.typography.titleMediumEmphasized + ) + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.surfaceContainer, + ), + navigationIcon = { + IconButton(onClick = { navigator.goBack() }) { + Icon( + painter = painterResource(Res.drawable.ic_arrow_back), + contentDescription = "Back" + ) + } + }, + ) + }, + ) { innerPadding -> + Box(modifier = Modifier.fillMaxSize()) { + Text("Settings") + } + } +} \ No newline at end of file