chore: merge the develop branch into master #1
@@ -10,21 +10,28 @@ import androidx.compose.foundation.lazy.LazyColumn
|
|||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||||
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.ListItem
|
import androidx.compose.material3.ListItem
|
||||||
import androidx.compose.material3.ListItemDefaults
|
import androidx.compose.material3.ListItemDefaults
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.ModalBottomSheet
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TopAppBar
|
import androidx.compose.material3.TopAppBar
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
|
import androidx.compose.material3.rememberModalBottomSheetState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
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.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
@@ -45,6 +52,9 @@ fun HomeScreen(onOpenChat: (Long) -> Unit) {
|
|||||||
val userProfile by viewModel.getUserProfile().collectAsState(initial = null)
|
val userProfile by viewModel.getUserProfile().collectAsState(initial = null)
|
||||||
val chatRooms by viewModel.chatRooms.collectAsState(initial = emptyList())
|
val chatRooms by viewModel.chatRooms.collectAsState(initial = emptyList())
|
||||||
|
|
||||||
|
val sheetState = rememberModalBottomSheetState()
|
||||||
|
var showBottomSheet by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
containerColor = MaterialTheme.colorScheme.surfaceContainer,
|
containerColor = MaterialTheme.colorScheme.surfaceContainer,
|
||||||
topBar = {
|
topBar = {
|
||||||
@@ -67,7 +77,7 @@ fun HomeScreen(onOpenChat: (Long) -> Unit) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
// User
|
// User
|
||||||
IconButton(onClick = { /* TODO: Open profile */ }) {
|
IconButton(onClick = { showBottomSheet = true }) {
|
||||||
if (userProfile?.asRecord()?.picture != null) {
|
if (userProfile?.asRecord()?.picture != null) {
|
||||||
AsyncImage(
|
AsyncImage(
|
||||||
model = userProfile?.asRecord()?.picture,
|
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") }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -83,6 +83,13 @@ class Nostr {
|
|||||||
client?.shutdown()
|
client?.shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun exit() {
|
||||||
|
signer = null
|
||||||
|
deviceSigner = null
|
||||||
|
userPubkey = null
|
||||||
|
contactList = emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun setKeySigner(keys: Keys) {
|
suspend fun setKeySigner(keys: Keys) {
|
||||||
try {
|
try {
|
||||||
signer = NostrSigner.keys(keys)
|
signer = NostrSigner.keys(keys)
|
||||||
|
|||||||
@@ -187,6 +187,14 @@ class NostrViewModel(
|
|||||||
// TODO: Implement import
|
// TODO: Implement import
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun logout() {
|
||||||
|
viewModelScope.launch {
|
||||||
|
_hasSecret.value = false
|
||||||
|
_chatRooms.value = emptySet()
|
||||||
|
secretStore.clear("user_signer")
|
||||||
|
nostr.exit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun getChatRooms() {
|
fun getChatRooms() {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
|
|||||||
Reference in New Issue
Block a user