fix: some issues with publish new note
This commit is contained in:
16
src-tauri/Cargo.lock
generated
16
src-tauri/Cargo.lock
generated
@@ -3481,7 +3481,7 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr"
|
name = "nostr"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@@ -3512,7 +3512,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-connect"
|
name = "nostr-connect"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"async-utility",
|
"async-utility",
|
||||||
@@ -3526,7 +3526,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-database"
|
name = "nostr-database"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"flatbuffers",
|
"flatbuffers",
|
||||||
@@ -3540,7 +3540,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-lmdb"
|
name = "nostr-lmdb"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heed",
|
"heed",
|
||||||
"nostr",
|
"nostr",
|
||||||
@@ -3553,7 +3553,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-relay-pool"
|
name = "nostr-relay-pool"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-utility",
|
"async-utility",
|
||||||
"async-wsocket",
|
"async-wsocket",
|
||||||
@@ -3571,7 +3571,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-sdk"
|
name = "nostr-sdk"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-utility",
|
"async-utility",
|
||||||
"atomic-destructor",
|
"atomic-destructor",
|
||||||
@@ -3590,7 +3590,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-zapper"
|
name = "nostr-zapper"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"nostr",
|
"nostr",
|
||||||
@@ -3734,7 +3734,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "nwc"
|
name = "nwc"
|
||||||
version = "0.35.0"
|
version = "0.35.0"
|
||||||
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
|
source = "git+https://github.com/rust-nostr/nostr#7587fba8ee72041689aa46c1436ecfa73d75d381"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"async-utility",
|
"async-utility",
|
||||||
|
|||||||
@@ -35,29 +35,29 @@ pub async fn get_event(id: String, state: State<'_, Nostr>) -> Result<RichEvent,
|
|||||||
|
|
||||||
Ok(RichEvent { raw, parsed })
|
Ok(RichEvent { raw, parsed })
|
||||||
} else {
|
} else {
|
||||||
let filter = Filter::new().id(event_id);
|
let filter = Filter::new().id(event_id).limit(1);
|
||||||
|
let mut events = Events::new(&[filter.clone()]);
|
||||||
let mut rich_event = RichEvent {
|
|
||||||
raw: "".to_string(),
|
|
||||||
parsed: None,
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut rx = client
|
let mut rx = client
|
||||||
.stream_events(vec![filter], Some(Duration::from_secs(5)))
|
.stream_events(vec![filter], Some(Duration::from_secs(5)))
|
||||||
.await
|
.await
|
||||||
.map_err(|e| e.to_string())?;
|
.map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
while let Some(event) = rx.next().await {
|
while let Some(event) = rx.next().await {
|
||||||
|
events.insert(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(event) = events.first() {
|
||||||
let raw = event.as_json();
|
let raw = event.as_json();
|
||||||
let parsed = if event.kind == Kind::TextNote {
|
let parsed = if event.kind == Kind::TextNote {
|
||||||
Some(parse_event(&event.content).await)
|
Some(parse_event(&event.content).await)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
rich_event = RichEvent { raw, parsed }
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(rich_event)
|
Ok(RichEvent { raw, parsed })
|
||||||
|
} else {
|
||||||
|
Err("Event not found.".into())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,12 +332,7 @@ pub async fn publish(
|
|||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
#[specta::specta]
|
#[specta::specta]
|
||||||
pub async fn reply(
|
pub async fn reply(content: String, to: String, state: State<'_, Nostr>) -> Result<String, String> {
|
||||||
content: String,
|
|
||||||
to: String,
|
|
||||||
root: Option<String>,
|
|
||||||
state: State<'_, Nostr>,
|
|
||||||
) -> Result<String, String> {
|
|
||||||
let client = &state.client;
|
let client = &state.client;
|
||||||
|
|
||||||
// Create event tags from content
|
// Create event tags from content
|
||||||
@@ -349,6 +344,7 @@ pub async fn reply(
|
|||||||
|
|
||||||
// Get reply event
|
// Get reply event
|
||||||
let reply_id = EventId::parse(&to).map_err(|err| err.to_string())?;
|
let reply_id = EventId::parse(&to).map_err(|err| err.to_string())?;
|
||||||
|
|
||||||
let reply_to = match client.database().event_by_id(&reply_id).await {
|
let reply_to = match client.database().event_by_id(&reply_id).await {
|
||||||
Ok(event) => {
|
Ok(event) => {
|
||||||
if let Some(event) = event {
|
if let Some(event) = event {
|
||||||
@@ -360,12 +356,35 @@ pub async fn reply(
|
|||||||
Err(e) => return Err(e.to_string()),
|
Err(e) => return Err(e.to_string()),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get root event if exist
|
// Detect root event from reply
|
||||||
let root = match root {
|
let root_ids: Vec<&EventId> = reply_to
|
||||||
Some(id) => {
|
.tags
|
||||||
let root_id = EventId::parse(&id).map_err(|err| err.to_string())?;
|
.filter_standardized(TagKind::e())
|
||||||
(client.database().event_by_id(&root_id).await).unwrap_or_default()
|
.filter_map(|t| match t {
|
||||||
|
TagStandard::Event {
|
||||||
|
event_id, marker, ..
|
||||||
|
} => {
|
||||||
|
if let Some(mkr) = marker {
|
||||||
|
match mkr {
|
||||||
|
Marker::Root => Some(event_id),
|
||||||
|
Marker::Reply => Some(event_id),
|
||||||
|
_ => None,
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Some(event_id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// Get root event if exist
|
||||||
|
let root = match root_ids.first() {
|
||||||
|
Some(&id) => client
|
||||||
|
.database()
|
||||||
|
.event_by_id(id)
|
||||||
|
.await
|
||||||
|
.map_err(|err| err.to_string())?,
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use border::WebviewWindowExt as BorderWebviewWindowExt;
|
|||||||
use nostr_sdk::prelude::*;
|
use nostr_sdk::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use specta::Type;
|
use specta::Type;
|
||||||
use std::{path::PathBuf, str::FromStr};
|
use std::path::PathBuf;
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
use tauri::TitleBarStyle;
|
use tauri::TitleBarStyle;
|
||||||
use tauri::{
|
use tauri::{
|
||||||
@@ -68,7 +68,7 @@ pub async fn create_column(
|
|||||||
.on_page_load(|webview, payload| match payload.event() {
|
.on_page_load(|webview, payload| match payload.event() {
|
||||||
PageLoadEvent::Started => {
|
PageLoadEvent::Started => {
|
||||||
if let Ok(id) = get_last_segment(payload.url()) {
|
if let Ok(id) = get_last_segment(payload.url()) {
|
||||||
if let Ok(public_key) = PublicKey::from_str(&id) {
|
if let Ok(public_key) = PublicKey::parse(&id) {
|
||||||
let is_newsfeed = payload.url().to_string().contains("newsfeed");
|
let is_newsfeed = payload.url().to_string().contains("newsfeed");
|
||||||
|
|
||||||
tauri::async_runtime::spawn(async move {
|
tauri::async_runtime::spawn(async move {
|
||||||
@@ -104,7 +104,7 @@ pub async fn create_column(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if let Ok(event_id) = EventId::from_str(&id) {
|
} else if let Ok(event_id) = EventId::parse(&id) {
|
||||||
tauri::async_runtime::spawn(async move {
|
tauri::async_runtime::spawn(async move {
|
||||||
let state = webview.state::<Nostr>();
|
let state = webview.state::<Nostr>();
|
||||||
let client = &state.client;
|
let client = &state.client;
|
||||||
@@ -117,11 +117,7 @@ pub async fn create_column(
|
|||||||
.since(Timestamp::now());
|
.since(Timestamp::now());
|
||||||
|
|
||||||
if let Err(e) = client
|
if let Err(e) = client
|
||||||
.subscribe_with_id(
|
.subscribe_with_id(subscription_id, vec![filter], None)
|
||||||
subscription_id,
|
|
||||||
vec![filter.clone().since(Timestamp::now())],
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
println!("Subscription error: {}", e);
|
println!("Subscription error: {}", e);
|
||||||
|
|||||||
@@ -457,7 +457,7 @@ fn main() {
|
|||||||
if let Err(e) = handle_clone.emit("metadata", event.as_json()) {
|
if let Err(e) = handle_clone.emit("metadata", event.as_json()) {
|
||||||
println!("Emit error: {}", e)
|
println!("Emit error: {}", e)
|
||||||
}
|
}
|
||||||
} else if event.kind != Kind::RelayList {
|
} else if event.kind == Kind::TextNote {
|
||||||
let payload = RichEvent {
|
let payload = RichEvent {
|
||||||
raw: event.as_json(),
|
raw: event.as_json(),
|
||||||
parsed: if event.kind == Kind::TextNote {
|
parsed: if event.kind == Kind::TextNote {
|
||||||
|
|||||||
@@ -400,9 +400,9 @@ async publish(content: string, warning: string | null, difficulty: number | null
|
|||||||
else return { status: "error", error: e as any };
|
else return { status: "error", error: e as any };
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async reply(content: string, to: string, root: string | null) : Promise<Result<string, string>> {
|
async reply(content: string, to: string) : Promise<Result<string, string>> {
|
||||||
try {
|
try {
|
||||||
return { status: "ok", data: await TAURI_INVOKE("reply", { content, to, root }) };
|
return { status: "ok", data: await TAURI_INVOKE("reply", { content, to }) };
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if(e instanceof Error) throw e;
|
if(e instanceof Error) throw e;
|
||||||
else return { status: "error", error: e as any };
|
else return { status: "error", error: e as any };
|
||||||
|
|||||||
@@ -12,7 +12,14 @@ export function NoteOpenThread() {
|
|||||||
<Tooltip.Trigger asChild>
|
<Tooltip.Trigger asChild>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => LumeWindow.openEvent(event)}
|
onClick={() =>
|
||||||
|
LumeWindow.openColumn({
|
||||||
|
name: "Thread",
|
||||||
|
label: event.id.slice(0, 6),
|
||||||
|
account: event.pubkey,
|
||||||
|
url: `/columns/events/${event.id}`,
|
||||||
|
})
|
||||||
|
}
|
||||||
className="group inline-flex h-7 w-14 bg-neutral-100 dark:bg-white/10 rounded-full items-center justify-center text-sm font-medium text-neutral-800 dark:text-neutral-200 hover:text-blue-500 hover:bg-neutral-200 dark:hover:bg-white/20"
|
className="group inline-flex h-7 w-14 bg-neutral-100 dark:bg-white/10 rounded-full items-center justify-center text-sm font-medium text-neutral-800 dark:text-neutral-200 hover:text-blue-500 hover:bg-neutral-200 dark:hover:bg-white/20"
|
||||||
>
|
>
|
||||||
<ListPlus className="shrink-0 size-4" />
|
<ListPlus className="shrink-0 size-4" />
|
||||||
|
|||||||
@@ -56,7 +56,14 @@ export const MentionNote = memo(function MentionNote({
|
|||||||
<div className="invisible group-hover:visible flex items-center justify-end">
|
<div className="invisible group-hover:visible flex items-center justify-end">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => LumeWindow.openEvent(event)}
|
onClick={() =>
|
||||||
|
LumeWindow.openColumn({
|
||||||
|
name: "Thread",
|
||||||
|
label: eventId.slice(0, 6),
|
||||||
|
account: event.pubkey,
|
||||||
|
url: `/columns/events/${eventId}`,
|
||||||
|
})
|
||||||
|
}
|
||||||
className="mr-3 text-sm font-medium text-blue-500 hover:text-blue-600"
|
className="mr-3 text-sm font-medium text-blue-500 hover:text-blue-600"
|
||||||
>
|
>
|
||||||
Show all
|
Show all
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ export const RepostNote = memo(function RepostNote({
|
|||||||
}) {
|
}) {
|
||||||
const { isLoading, isError, data } = useEvent(event.repostId, event.content);
|
const { isLoading, isError, data } = useEvent(event.repostId, event.content);
|
||||||
|
|
||||||
console.log("Repost: ", event);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Note.Root className={cn("", className)}>
|
<Note.Root className={cn("", className)}>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ function Screen() {
|
|||||||
>
|
>
|
||||||
<ScrollArea.Viewport
|
<ScrollArea.Viewport
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className="relative h-full bg-white dark:bg-neutral-800 rounded-t-xl shadow shadow-neutral-300/50 dark:shadow-none border-[.5px] border-neutral-300 dark:border-neutral-700"
|
className="pb-3 relative h-full bg-white dark:bg-neutral-800 rounded-t-xl shadow shadow-neutral-300/50 dark:shadow-none border-[.5px] border-neutral-300 dark:border-neutral-700"
|
||||||
>
|
>
|
||||||
<Virtualizer scrollRef={ref as unknown as RefObject<HTMLElement>}>
|
<Virtualizer scrollRef={ref as unknown as RefObject<HTMLElement>}>
|
||||||
<RootEvent />
|
<RootEvent />
|
||||||
@@ -57,16 +57,16 @@ function RootEvent() {
|
|||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center gap-2 text-sm">
|
<div className="h-20 flex items-center justify-center gap-2 border-b-[.5px] border-neutral-300 dark:border-neutral-700">
|
||||||
<Spinner />
|
<Spinner className="size-4" />
|
||||||
Loading...
|
<p className="text-sm">Loading...</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isError || !event) {
|
if (isError || !event) {
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center gap-2 text-sm text-red-500">
|
<div className="flex items-center gap-2 text-sm text-red-500 border-b-[.5px] border-neutral-300 dark:border-neutral-700">
|
||||||
{error?.message || "Event not found within your current relay set"}
|
{error?.message || "Event not found within your current relay set"}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -80,7 +80,7 @@ function RootEvent() {
|
|||||||
<Note.Menu />
|
<Note.Menu />
|
||||||
</div>
|
</div>
|
||||||
<Note.ContentLarge className="px-3" />
|
<Note.ContentLarge className="px-3" />
|
||||||
<div className="flex items-center gap-2 px-3 mt-6 h-12 rounded-b-xl bg-neutral-50 dark:bg-white/5">
|
<div className="select-text flex items-center gap-2 px-3 mt-6 h-12 bg-neutral-50 dark:bg-white/5">
|
||||||
<Note.Reply label />
|
<Note.Reply label />
|
||||||
<Note.Repost label />
|
<Note.Repost label />
|
||||||
<Note.Zap label />
|
<Note.Zap label />
|
||||||
@@ -94,7 +94,7 @@ function ReplyList() {
|
|||||||
const { id } = Route.useParams();
|
const { id } = Route.useParams();
|
||||||
const { queryClient } = Route.useRouteContext();
|
const { queryClient } = Route.useRouteContext();
|
||||||
const { data, isLoading } = useQuery({
|
const { data, isLoading } = useQuery({
|
||||||
queryKey: ["reply", id],
|
queryKey: ["replies", id],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const res = await commands.getReplies(id);
|
const res = await commands.getReplies(id);
|
||||||
|
|
||||||
@@ -183,8 +183,10 @@ function ReplyList() {
|
|||||||
"event",
|
"event",
|
||||||
async (data) => {
|
async (data) => {
|
||||||
const event = LumeEvent.from(data.payload.raw, data.payload.parsed);
|
const event = LumeEvent.from(data.payload.raw, data.payload.parsed);
|
||||||
|
console.log(event);
|
||||||
|
|
||||||
await queryClient.setQueryData(
|
await queryClient.setQueryData(
|
||||||
["reply", id],
|
["replies", id],
|
||||||
(prevEvents: LumeEvent[]) => {
|
(prevEvents: LumeEvent[]) => {
|
||||||
if (!prevEvents) return [event];
|
if (!prevEvents) return [event];
|
||||||
return [event, ...prevEvents];
|
return [event, ...prevEvents];
|
||||||
@@ -204,12 +206,10 @@ function ReplyList() {
|
|||||||
All replies
|
All replies
|
||||||
</div>
|
</div>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div className="flex items-center justify-center w-full mb-3 h-12 bg-black/5 dark:bg-white/5 rounded-xl">
|
|
||||||
<div className="flex items-center justify-center gap-2">
|
<div className="flex items-center justify-center gap-2">
|
||||||
<Spinner className="size-4" />
|
<Spinner className="size-4" />
|
||||||
<span className="text-sm font-medium">Getting replies...</span>
|
<span className="text-sm font-medium">Getting replies...</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
) : (
|
) : (
|
||||||
<div className="flex flex-col gap-3">
|
<div className="flex flex-col gap-3">
|
||||||
{!data?.length ? (
|
{!data?.length ? (
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { type Mention, type Result, commands } from "@/commands.gen";
|
import { type Mention, commands } from "@/commands.gen";
|
||||||
import { cn, displayNpub } from "@/commons";
|
import { cn, displayNpub } from "@/commons";
|
||||||
import { PublishIcon, Spinner } from "@/components";
|
import { PublishIcon, Spinner } from "@/components";
|
||||||
import { Note } from "@/components/note";
|
import { Note } from "@/components/note";
|
||||||
import { User } from "@/components/user";
|
import { User } from "@/components/user";
|
||||||
import { useEvent } from "@/system";
|
import { LumeWindow, useEvent } from "@/system";
|
||||||
import type { Metadata } from "@/types";
|
import type { Metadata } from "@/types";
|
||||||
import { CaretDown } from "@phosphor-icons/react";
|
import { CaretDown } from "@phosphor-icons/react";
|
||||||
import { createLazyFileRoute, useAwaited } from "@tanstack/react-router";
|
import { createLazyFileRoute, useAwaited } from "@tanstack/react-router";
|
||||||
@@ -69,7 +69,7 @@ export const Route = createLazyFileRoute("/new-post/")({
|
|||||||
|
|
||||||
function Screen() {
|
function Screen() {
|
||||||
const { reply_to } = Route.useSearch();
|
const { reply_to } = Route.useSearch();
|
||||||
const { accounts, initialValue } = Route.useRouteContext();
|
const { accounts, initialValue, queryClient } = Route.useRouteContext();
|
||||||
const { deferMentionList } = Route.useLoaderData();
|
const { deferMentionList } = Route.useLoaderData();
|
||||||
const users = useAwaited({ promise: deferMentionList })[0];
|
const users = useAwaited({ promise: deferMentionList })[0];
|
||||||
|
|
||||||
@@ -163,20 +163,36 @@ function Screen() {
|
|||||||
const warn = warning.enable ? warning.reason : null;
|
const warn = warning.enable ? warning.reason : null;
|
||||||
const diff = difficulty.enable ? difficulty.num : null;
|
const diff = difficulty.enable ? difficulty.num : null;
|
||||||
|
|
||||||
let res: Result<string, string>;
|
|
||||||
|
|
||||||
if (reply_to?.length) {
|
if (reply_to?.length) {
|
||||||
res = await commands.reply(content, reply_to, null);
|
const res = await commands.reply(content, reply_to);
|
||||||
} else {
|
|
||||||
res = await commands.publish(content, warn, diff);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res.status === "ok") {
|
if (res.status === "ok") {
|
||||||
setText("");
|
setText("");
|
||||||
setIsPublish(true);
|
setIsPublish(true);
|
||||||
|
|
||||||
|
await queryClient.invalidateQueries({
|
||||||
|
queryKey: ["replies", reply_to],
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
setError(res.error);
|
setError(res.error);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
const res = await commands.publish(content, warn, diff);
|
||||||
|
|
||||||
|
if (res.status === "ok") {
|
||||||
|
setText("");
|
||||||
|
setIsPublish(true);
|
||||||
|
|
||||||
|
await LumeWindow.openColumn({
|
||||||
|
name: "Thread",
|
||||||
|
label: res.data.slice(0, 6),
|
||||||
|
account: currentUser,
|
||||||
|
url: `/columns/events/${res.data}`,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setError(res.error);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -207,15 +223,16 @@ function Screen() {
|
|||||||
<div className="flex flex-col w-full h-full">
|
<div className="flex flex-col w-full h-full">
|
||||||
<div data-tauri-drag-region className="h-11 shrink-0" />
|
<div data-tauri-drag-region className="h-11 shrink-0" />
|
||||||
<div className="flex flex-col flex-1 overflow-y-auto">
|
<div className="flex flex-col flex-1 overflow-y-auto">
|
||||||
|
{error?.length ? (
|
||||||
|
<div className="flex flex-col gap-2 px-3.5 py-3 border-b border-black/5 dark:border-white/5">
|
||||||
|
<p className="text-sm font-medium text-red-600">Error: {error}</p>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
{reply_to?.length ? (
|
{reply_to?.length ? (
|
||||||
<div className="flex flex-col gap-2 px-3.5 pb-3 border-b border-black/5 dark:border-white/5">
|
<div className="flex flex-col gap-2 px-3.5 py-3 border-b border-black/5 dark:border-white/5">
|
||||||
<span className="text-sm font-semibold">Reply to:</span>
|
<span className="text-sm font-semibold">Reply to:</span>
|
||||||
<EmbedNote id={reply_to} />
|
<EmbedNote id={reply_to} />
|
||||||
</div>
|
</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}
|
) : null}
|
||||||
<div className="p-4 overflow-y-auto h-full">
|
<div className="p-4 overflow-y-auto h-full">
|
||||||
<RichTextarea
|
<RichTextarea
|
||||||
|
|||||||
Reference in New Issue
Block a user