diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 97fd92232..284e7abdc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -94,7 +94,15 @@ object LocalCache { val noteEvent = note.event return if (noteEvent is AddressableEvent) { // upgrade to the latest - checkGetOrCreateAddressableNote(noteEvent.address().toTag()) + val newNote = checkGetOrCreateAddressableNote(noteEvent.address().toTag()) + + if (newNote != null && noteEvent is Event && newNote.event == null) { + val author = note.author ?: getOrCreateUser(noteEvent.pubKey) + newNote.loadEvent(noteEvent as Event, author, emptyList()) + note.moveAllReferencesTo(newNote) + } + + newNote } else { note } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt index 2cae8f0df..90467bf12 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -147,6 +147,8 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { latestEOSEs.addOrUpdate(account.userProfile(), account.defaultNotificationFollowList, relayUrl, time) } else { hasLoadedTheBasics[account.userProfile()] = true + + invalidateFilters() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index faf9adf2c..6eee2b03f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -212,6 +212,7 @@ import kotlinx.coroutines.launch import java.io.File import java.math.BigDecimal import java.net.URL +import java.net.URLEncoder import java.util.Locale import kotlin.time.measureTimedValue @@ -1276,16 +1277,16 @@ fun routeFor(note: Note, loggedIn: User): String? { } } else if (noteEvent is LiveActivitiesEvent || noteEvent is LiveActivitiesChatMessageEvent) { note.channelHex()?.let { - return "Channel/$it" + return "Channel/${URLEncoder.encode(it, "utf-8")}" } } else if (noteEvent is ChatroomKeyable) { val room = noteEvent.chatroomKey(loggedIn.pubkeyHex) loggedIn.createChatroom(room) return "Room/${room.hashCode()}" } else if (noteEvent is CommunityDefinitionEvent) { - return "Community/${note.idHex}" + return "Community/${URLEncoder.encode(note.idHex, "utf-8")}" } else { - return "Note/${note.idHex}" + return "Note/${URLEncoder.encode(note.idHex, "utf-8")}" } return null diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt index 160a0eb49..05875bf09 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -26,7 +26,6 @@ import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf @@ -269,7 +268,10 @@ fun MainScreen( } } - WatchNavStateToUpdateBarVisibility(navState, bottomBarOffsetHeightPx) + WatchNavStateToUpdateBarVisibility(navState) { + bottomBarOffsetHeightPx.value = 0f + shouldShow.value = true + } ModalNavigationDrawer( drawerState = drawerState, @@ -402,16 +404,16 @@ private fun DisplayErrorMessages(accountViewModel: AccountViewModel) { } @Composable -fun WatchNavStateToUpdateBarVisibility(navState: State, bottomBarOffsetHeightPx: MutableState) { +fun WatchNavStateToUpdateBarVisibility(navState: State, onReset: () -> Unit) { LaunchedEffect(key1 = navState.value) { - bottomBarOffsetHeightPx.value = 0f + onReset() } val lifeCycleOwner = LocalLifecycleOwner.current DisposableEffect(lifeCycleOwner) { val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { - bottomBarOffsetHeightPx.value = 0f + onReset() } } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c3746d50e..9afddef6f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -36,6 +36,8 @@ Connectez vous avec une clé privée pour pouvoir envoyer des zaps Connectez-vous avec une clé privée pour Suivre Connectez-vous avec une clé privée pour ne plus Suivre + Vous utilisez une clé publique et les clés publiques sont en lecture seule. Connectez-vous avec une clé privée pour pouvoir masquer un mot ou une phrase + Vous utilisez une clé publique et les clés publiques sont en lecture seule. Connectez-vous avec une clé privée pour pouvoir afficher un mot ou une phrase Zaps Nombre de vues Boost @@ -191,6 +193,8 @@ Clé secrète (nsec) copiée dans le presse-papiers Copier ma clé secrète Échec de l\'authentification + La biométrie n\'a pas pu authentifier le propriétaire de ce téléphone + La biométrie n\'a pas pu authentifier le propriétaire de ce téléphone. Erreur : %1$s Erreur "Créé par %1$s" "Image de badge pour %1$s" @@ -270,6 +274,8 @@ (0–100)% Clôturer après jours + Impossible de voter + Le Sondage est fermé aux nouveaux votes Montant des Zap Un seul vote par utilisateur est autorisé sur ce type de sondage "Recherche de l'Événement %1$s" @@ -279,6 +285,7 @@ Merci pour tout votre travail ! Créer et Ajouter Les auteurs du sondage ne peuvent pas voter dans leurs propres sondages. + Qu\'est-ce que cela signifie ? Ce contenu est le même depuis le message Ce contenu a changé. L\'auteur n\'a peut-être pas vu ou approuvé le changement Ajouter une Image @@ -491,6 +498,7 @@ Les clients supportés vont diviser et transférer les zaps aux utilisateurs ajoutés ici au lieu du vôtre Rechercher et Ajouter un Utilisateur Nom d\'utilisateur ou nom affiché + Configuration lightning manquante L\'utilisateur %1$s n\'a pas configuré d\'adresse Lightning pour recevoir des sats Pourcentage 25 @@ -505,4 +513,25 @@ Aucun portefeuille trouvé pour payer une facture lightning. Veuillez installer un portefeuille Lightning pour utiliser les zaps Mots Masqués Masquer un nouveau mot ou une phrase + Photo de profil + Afficher les photos de profil + Sélectionnez une option + Impossible de payer la facture + Impossible de retirer + Impossible de configurer Wallet Connect + %1$s sats ont été envoyés à votre portefeuille. (Frais : %2$s sats) + Impossible de se connecter à Tor + Téléchargement du document relais indisponible + Impossible d\'assembler LNUrl à partir de l\'adresse Lightning \"%1$s\". Vérifiez la configuration de l\'utilisateur + Le service lightning du récepteur à %1$s n\'est pas disponible. Il a été calculé à partir de l\'adresse lightning \"%2$s\". Erreur: %3$s. Vérifiez si le serveur est en ligne et si l\'adresse lightning est correcte + Impossible de résoudre %1$s. Vérifiez si vous êtes connecté, si le serveur est en ligne et si l\'adresse lightning %2$s est correcte + Impossible de récupérer la facture depuis %1$s + Erreur lors de l\'analyse du JSON à partir de l\'Adresse Lightning. Vérifiez la configuration lightning de l\'utilisateur + URL de callback introuvable dans la configuration serveur de l\'adresse lightning de l\'utilisateur + Erreur lors de l\'analyse du JSON à partir de la récupération de la facture de l\'Adresse Lightning. Vérifiez la configuration Lightning de l\'utilisateur + Montant de la facture (%1$s sats) incorrect de %2$s. Il aurait dû être %3$s + Impossible de créer une facture lightning avant d\'envoyer le zap. Le portefeuille lightning du destinataire a envoyé l\'erreur suivante : %1$s + Impossible de créer une facture lightning avant d\'envoyer le zap. Élément pr introuvable dans le JSON résultant. + Utilisateur en lecture seule + Aucune réaction configurée