From eb2f543f53c22b9a196550d9ff494fb87431be8e Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Wed, 6 May 2026 09:27:34 +0700 Subject: [PATCH] add bottom sheet --- .../kotlin/su/reya/coop/screens/HomeScreen.kt | 57 ++++++++++++++++++- .../commonMain/kotlin/su/reya/coop/Nostr.kt | 7 +++ .../kotlin/su/reya/coop/NostrViewModel.kt | 8 +++ 3 files changed, 71 insertions(+), 1 deletion(-) 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 195a12e..aa9bcf2 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt @@ -10,21 +10,28 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -45,6 +52,9 @@ fun HomeScreen(onOpenChat: (Long) -> Unit) { val userProfile by viewModel.getUserProfile().collectAsState(initial = null) val chatRooms by viewModel.chatRooms.collectAsState(initial = emptyList()) + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } + Scaffold( containerColor = MaterialTheme.colorScheme.surfaceContainer, topBar = { @@ -67,7 +77,7 @@ fun HomeScreen(onOpenChat: (Long) -> Unit) { ) } // User - IconButton(onClick = { /* TODO: Open profile */ }) { + IconButton(onClick = { showBottomSheet = true }) { if (userProfile?.asRecord()?.picture != null) { AsyncImage( model = userProfile?.asRecord()?.picture, @@ -125,6 +135,51 @@ fun HomeScreen(onOpenChat: (Long) -> Unit) { } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState, + ) { + val userName = + userProfile?.asRecord()?.displayName + ?: userProfile?.asRecord()?.name + ?: "No name" + + Column(modifier = Modifier.padding(16.dp)) { + ListItem( + headlineContent = { + Text( + text = userName, + style = MaterialTheme.typography.titleMediumEmphasized + ) + }, + leadingContent = { + if (userProfile?.asRecord()?.picture != null) { + AsyncImage( + model = userProfile?.asRecord()?.picture, + contentDescription = "User Avatar", + modifier = Modifier + .size(32.dp) + .clip(CircleShape), + contentScale = ContentScale.Crop + ) + } else { + Icon( + painter = painterResource(Res.drawable.ic_avatar), + contentDescription = "User" + ) + } + } + ) + HorizontalDivider() + Button( + onClick = { viewModel.logout() }, + content = { Text("Logout") } + ) + } + } + } } }, ) diff --git a/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt b/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt index 75169ba..2b64f3a 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt @@ -83,6 +83,13 @@ class Nostr { client?.shutdown() } + fun exit() { + signer = null + deviceSigner = null + userPubkey = null + contactList = emptyList() + } + suspend fun setKeySigner(keys: Keys) { try { signer = NostrSigner.keys(keys) diff --git a/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt b/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt index c75ac0c..b4f3532 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt @@ -187,6 +187,14 @@ class NostrViewModel( // TODO: Implement import } + fun logout() { + viewModelScope.launch { + _hasSecret.value = false + _chatRooms.value = emptySet() + secretStore.clear("user_signer") + nostr.exit() + } + } fun getChatRooms() { viewModelScope.launch {