Adds online search when typing the username in the new Post field.
This commit is contained in:
@@ -75,6 +75,7 @@ import kotlinx.coroutines.withContext
|
|||||||
@Composable
|
@Composable
|
||||||
fun JoinUserOrChannelView(onClose: () -> Unit, account: Account, navController: NavController) {
|
fun JoinUserOrChannelView(onClose: () -> Unit, account: Account, navController: NavController) {
|
||||||
val searchBarViewModel: SearchBarViewModel = viewModel()
|
val searchBarViewModel: SearchBarViewModel = viewModel()
|
||||||
|
searchBarViewModel.account = account
|
||||||
|
|
||||||
Dialog(
|
Dialog(
|
||||||
onDismissRequest = {
|
onDismissRequest = {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import androidx.compose.material.icons.filled.CurrencyBitcoin
|
|||||||
import androidx.compose.material.icons.outlined.ArrowForwardIos
|
import androidx.compose.material.icons.outlined.ArrowForwardIos
|
||||||
import androidx.compose.material.icons.outlined.Bolt
|
import androidx.compose.material.icons.outlined.Bolt
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.DisposableEffect
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
@@ -62,6 +63,7 @@ import com.vitorpamplona.amethyst.R
|
|||||||
import com.vitorpamplona.amethyst.model.Account
|
import com.vitorpamplona.amethyst.model.Account
|
||||||
import com.vitorpamplona.amethyst.model.Note
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.model.User
|
import com.vitorpamplona.amethyst.model.User
|
||||||
|
import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource
|
||||||
import com.vitorpamplona.amethyst.ui.components.*
|
import com.vitorpamplona.amethyst.ui.components.*
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner
|
||||||
@@ -95,6 +97,12 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisposableEffect(Unit) {
|
||||||
|
onDispose {
|
||||||
|
NostrSearchEventOrUserDataSource.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Dialog(
|
Dialog(
|
||||||
onDismissRequest = { onClose() },
|
onDismissRequest = { onClose() },
|
||||||
properties = DialogProperties(
|
properties = DialogProperties(
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.vitorpamplona.amethyst.model.*
|
import com.vitorpamplona.amethyst.model.*
|
||||||
import com.vitorpamplona.amethyst.service.FileHeader
|
import com.vitorpamplona.amethyst.service.FileHeader
|
||||||
|
import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource
|
||||||
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent
|
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent
|
||||||
import com.vitorpamplona.amethyst.service.model.TextNoteEvent
|
import com.vitorpamplona.amethyst.service.model.TextNoteEvent
|
||||||
import com.vitorpamplona.amethyst.ui.components.isValidURL
|
import com.vitorpamplona.amethyst.ui.components.isValidURL
|
||||||
@@ -188,6 +189,8 @@ open class NewPostViewModel : ViewModel() {
|
|||||||
userSuggestions = emptyList()
|
userSuggestions = emptyList()
|
||||||
userSuggestionAnchor = null
|
userSuggestionAnchor = null
|
||||||
userSuggestionsMainMessage = null
|
userSuggestionsMainMessage = null
|
||||||
|
|
||||||
|
NostrSearchEventOrUserDataSource.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun findUrlInMessage(): String? {
|
open fun findUrlInMessage(): String? {
|
||||||
@@ -211,8 +214,10 @@ open class NewPostViewModel : ViewModel() {
|
|||||||
userSuggestionAnchor = it.selection
|
userSuggestionAnchor = it.selection
|
||||||
userSuggestionsMainMessage = true
|
userSuggestionsMainMessage = true
|
||||||
if (lastWord.startsWith("@") && lastWord.length > 2) {
|
if (lastWord.startsWith("@") && lastWord.length > 2) {
|
||||||
userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@"))
|
userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed()
|
||||||
|
println("AAAA" + lastWord.removePrefix("@") + userSuggestions.size)
|
||||||
} else {
|
} else {
|
||||||
|
NostrSearchEventOrUserDataSource.clear()
|
||||||
userSuggestions = emptyList()
|
userSuggestions = emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,8 +230,10 @@ open class NewPostViewModel : ViewModel() {
|
|||||||
userSuggestionAnchor = it.selection
|
userSuggestionAnchor = it.selection
|
||||||
userSuggestionsMainMessage = false
|
userSuggestionsMainMessage = false
|
||||||
if (lastWord.startsWith("@") && lastWord.length > 2) {
|
if (lastWord.startsWith("@") && lastWord.length > 2) {
|
||||||
userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@"))
|
NostrSearchEventOrUserDataSource.search(lastWord.removePrefix("@"))
|
||||||
|
userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed()
|
||||||
} else {
|
} else {
|
||||||
|
NostrSearchEventOrUserDataSource.clear()
|
||||||
userSuggestions = emptyList()
|
userSuggestions = emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,6 +131,8 @@ fun SearchScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
class SearchBarViewModel : ViewModel() {
|
class SearchBarViewModel : ViewModel() {
|
||||||
|
var account: Account? = null
|
||||||
|
|
||||||
var searchValue by mutableStateOf("")
|
var searchValue by mutableStateOf("")
|
||||||
val searchResults = mutableStateOf<List<User>>(emptyList())
|
val searchResults = mutableStateOf<List<User>>(emptyList())
|
||||||
val searchResultsNotes = mutableStateOf<List<Note>>(emptyList())
|
val searchResultsNotes = mutableStateOf<List<Note>>(emptyList())
|
||||||
@@ -156,7 +158,7 @@ class SearchBarViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hashtagResults.value = findHashtags(searchValue)
|
hashtagResults.value = findHashtags(searchValue)
|
||||||
searchResults.value = LocalCache.findUsersStartingWith(searchValue)
|
searchResults.value = LocalCache.findUsersStartingWith(searchValue).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed()
|
||||||
searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed()
|
searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed()
|
||||||
searchResultsChannels.value = LocalCache.findChannelsStartingWith(searchValue)
|
searchResultsChannels.value = LocalCache.findChannelsStartingWith(searchValue)
|
||||||
}
|
}
|
||||||
@@ -185,6 +187,7 @@ class SearchBarViewModel : ViewModel() {
|
|||||||
@Composable
|
@Composable
|
||||||
private fun SearchBar(accountViewModel: AccountViewModel, navController: NavController) {
|
private fun SearchBar(accountViewModel: AccountViewModel, navController: NavController) {
|
||||||
val searchBarViewModel: SearchBarViewModel = viewModel()
|
val searchBarViewModel: SearchBarViewModel = viewModel()
|
||||||
|
searchBarViewModel.account = accountViewModel.accountLiveData.value?.account
|
||||||
|
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val listState = rememberLazyListState()
|
val listState = rememberLazyListState()
|
||||||
|
|||||||
Reference in New Issue
Block a user