adopt two-step NIP-29 group creation with confirmation

This commit is contained in:
2026-10-10 08:40:10 +07:00
parent 4b6f4b3797
commit 2a07773848
6 changed files with 317 additions and 49 deletions
+11 -35
View File
@@ -1,7 +1,7 @@
use std::rc::Rc;
use gpui::{App, AppContext, ClickEvent, Div, Entity, ParentElement, Styled, Window, px};
use nip29::{GroupId, GroupKey, GroupMetadata, GroupsRegistry};
use nip29::{GroupCreateOptions, GroupsRegistry};
use nostr_sdk::prelude::*;
use theme::{ActiveTheme, TextStyle, Typeset as _};
use ui::button::{Button, ButtonVariants, IconPosition};
@@ -90,20 +90,6 @@ fn create(
return false;
}
let id = if raw_id.is_empty() {
slug(&name_value)
} else {
raw_id
};
let id = match GroupId::new(id) {
Ok(id) => id,
Err(error) => {
window.push_notification(Notification::error(error.to_string()), cx);
return false;
}
};
let relay = match RelayUrl::parse(&raw_relay) {
Ok(relay) => relay,
Err(error) => {
@@ -112,30 +98,20 @@ fn create(
}
};
let mut metadata = GroupMetadata::default();
metadata.name = Some(name_value);
let options = GroupCreateOptions {
name: name_value,
custom_id: if raw_id.is_empty() {
None
} else {
Some(raw_id)
},
..Default::default()
};
let registry = GroupsRegistry::global(cx);
registry.update(cx, |registry, cx| {
registry.create(GroupKey::new(relay, id), metadata, cx);
registry.create(relay, options, cx);
});
true
}
fn slug(name: &str) -> String {
let mut slug = String::with_capacity(name.len());
let mut separator = false;
for character in name.chars() {
if character.is_ascii_alphanumeric() {
slug.push(character.to_ascii_lowercase());
separator = false;
} else if !separator && !slug.is_empty() {
slug.push('-');
separator = true;
}
}
slug.trim_end_matches('-').to_owned()
}
+6
View File
@@ -127,6 +127,12 @@ impl Sidebar {
GroupsEvent::Error(error) => {
window.push_notification(Notification::error(error.clone()), cx);
}
GroupsEvent::Created {
warning: Some(warning),
..
} => {
window.push_notification(Notification::warning(warning.clone()), cx);
}
_ => {}
};
}),