feat: handle error when publish note

This commit is contained in:
2024-10-11 14:09:15 +07:00
parent adad048873
commit cb6006f596
4 changed files with 43 additions and 12 deletions

View File

@@ -353,7 +353,14 @@ pub async fn login(
{
let keys: Vec<&str> = events
.iter()
.flat_map(|event| event.get_tags_content(TagKind::p()))
.flat_map(|event| {
event
.tags
.iter()
.filter(|t| t.kind() == TagKind::p())
.filter_map(|t| t.content())
.collect::<Vec<&str>>()
})
.collect();
let trusted_list: HashSet<PublicKey> = keys

View File

@@ -372,7 +372,7 @@ pub async fn publish(
// Publish
match client.send_event_builder(builder).await {
Ok(event_id) => Ok(event_id.to_bech32().unwrap()),
Ok(event_id) => Ok(event_id.to_hex()),
Err(err) => Err(err.to_string()),
}
}

View File

@@ -164,7 +164,14 @@ pub async fn process_event(client: &Client, events: Vec<Event>) -> Vec<RichEvent
if !requests.is_empty() {
let ids: Vec<&str> = requests
.iter()
.flat_map(|ev| ev.get_tags_content(TagKind::e()))
.flat_map(|event| {
event
.tags
.iter()
.filter(|t| t.kind() == TagKind::e())
.filter_map(|t| t.content())
.collect::<Vec<&str>>()
})
.collect();
// Remove event if event is deleted by author

View File

@@ -7,6 +7,7 @@ import { User } from "@/components/user";
import { LumeEvent, useEvent } from "@/system";
import { Feather } from "@phosphor-icons/react";
import { createFileRoute } from "@tanstack/react-router";
import { getCurrentWindow } from "@tauri-apps/api/window";
import { nip19 } from "nostr-tools";
import { useEffect, useMemo, useRef, useState, useTransition } from "react";
import { createPortal } from "react-dom";
@@ -84,8 +85,9 @@ function Screen() {
const { reply_to } = Route.useSearch();
const { users, initialValue } = Route.useRouteContext();
const [isPending, startTransition] = useTransition();
const [text, setText] = useState("");
const [error, setError] = useState("");
const [isPending, startTransition] = useTransition();
const [attaches, setAttaches] = useState<string[]>(null);
const [warning, setWarning] = useState({ enable: false, reason: "" });
const [difficulty, setDifficulty] = useState({ enable: false, num: 21 });
@@ -127,16 +129,26 @@ function Screen() {
const publish = async () => {
startTransition(async () => {
try {
const content = text.trim();
// Temporary hide window
await getCurrentWindow().hide();
await LumeEvent.publish(
content,
warning.enable && warning.reason.length ? warning.reason : null,
difficulty.num,
reply_to,
);
let res: Result<string, string>;
setText("");
if (reply_to) {
res = await commands.reply(content, reply_to, root_to);
} else {
res = await commands.publish(content, warning, difficulty);
}
if (res.status === "ok") {
setText("");
// Close window
await getCurrentWindow().close();
} else {
setError(res.error);
// Focus window
await getCurrentWindow().setFocus();
}
} catch {
return;
}
@@ -158,6 +170,10 @@ function Screen() {
<span className="text-sm font-semibold">Reply to:</span>
<EmbedNote id={reply_to} />
</div>
) : error?.length ? (
<div className="flex flex-col gap-2 px-3.5 pb-3 border-b border-black/5 dark:border-white/5">
<p className="text-sm font-medium text-red-600">{error}</p>
</div>
) : null}
<div className="p-4 overflow-y-auto h-full">
<RichTextarea
@@ -332,6 +348,7 @@ function Menu({
{u.avatar?.length ? (
<img
src={u.avatar}
alt=""
className="size-7 rounded-full outline outline-1 -outline-offset-1 outline-black/15"
loading="lazy"
decoding="async"