This commit is contained in:
2026-07-23 16:12:36 +07:00
parent bf6ae65b05
commit 40166fd071
5 changed files with 129 additions and 85 deletions

View File

@@ -3,7 +3,7 @@ use std::time::Duration;
use anyhow::{Error, anyhow};
use common::config_dir;
use gpui::{App, AppContext, Context, Entity, EventEmitter, Global, SharedString, Task, Window};
use gpui::{App, AppContext, Context, Entity, EventEmitter, Global, Task, Window};
use nostr_gossip_memory::prelude::*;
#[cfg(not(target_arch = "wasm32"))]
use nostr_lmdb::prelude::*;
@@ -53,17 +53,25 @@ pub enum StateEvent {
/// Connected to the bootstrapping relay
Connected,
/// An error occurred
Error(SharedString),
Error(String),
}
impl StateEvent {
pub fn error<T>(error: T) -> Self
where
T: Into<SharedString>,
T: Into<String>,
{
Self::Error(error.into())
}
pub fn is_connecting(&self) -> bool {
matches!(self, StateEvent::Connecting)
}
pub fn is_connected(&self) -> bool {
matches!(self, StateEvent::Connected)
}
pub fn signer_changed(&self) -> bool {
matches!(self, StateEvent::SignerChanged)
}
@@ -126,9 +134,10 @@ impl NostrRegistry {
})
.build();
// Run at the end of current cycle
// Connect to bootstrap relays after the window is ready
cx.defer_in(window, |this, _window, cx| {
this.connect(cx);
this.connect_bootstrap_relays(cx);
this.check_credential(cx);
});
Self {
@@ -163,20 +172,34 @@ impl NostrRegistry {
<T as AsyncNip44>::Error: std::error::Error + Send + Sync + 'static,
{
cx.spawn(async move |this, cx| {
let current_user = new_signer.get_public_key_async().await.ok();
this.update(cx, |this, cx| {
this.current_user = current_user;
cx.emit(StateEvent::SignerChanged);
})
.ok();
match new_signer.get_public_key_async().await {
Ok(public_key) => {
this.update(cx, |this, cx| {
this.signer.swap_inner(new_signer);
this.current_user = Some(public_key);
cx.emit(StateEvent::SignerChanged);
cx.notify();
})
.ok();
}
Err(e) => {
this.update(cx, |_this, cx| {
cx.emit(StateEvent::error(e.to_string()));
})
.ok();
}
};
})
.detach();
}
/// Connect to the bootstrapping relays
fn connect(&mut self, cx: &mut Context<Self>) {
fn connect_bootstrap_relays(&mut self, cx: &mut Context<Self>) {
let client = self.client();
// Emit connecting event
cx.emit(StateEvent::Connecting);
let task: Task<Result<(), Error>> = cx.background_spawn(async move {
// Add indexer relay to the relay pool
for url in INDEXER_RELAYS.into_iter() {
@@ -197,9 +220,6 @@ impl NostrRegistry {
Ok(())
});
// Emit connecting event
cx.emit(StateEvent::Connecting);
self.tasks.push(cx.spawn(async move |this, cx| {
if let Err(e) = task.await {
this.update(cx, |_this, cx| {
@@ -215,6 +235,17 @@ impl NostrRegistry {
}));
}
fn check_credential(&mut self, cx: &mut Context<Self>) {
self.tasks.push(cx.spawn(async move |this, cx| {
this.update(cx, |this, cx| {
// TODO: check credential
cx.notify();
})?;
Ok(())
}));
}
/// Get the public key of a NIP-05 address
pub fn query_address(&self, addr: Nip05Address, cx: &App) -> Task<Result<PublicKey, Error>> {
let client = self.client();