From f0df4c7297a05bd592d8717b8997284c80fd0500 Mon Sep 17 00:00:00 2001 From: polwex Date: Wed, 17 Sep 2025 15:56:00 +0700 Subject: argh --- front/src/components/composer/Composer.tsx | 67 ++++++++++++++++++++++++++++++ front/src/components/composer/Snippets.tsx | 62 +++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 front/src/components/composer/Composer.tsx create mode 100644 front/src/components/composer/Snippets.tsx (limited to 'front/src/components/composer') diff --git a/front/src/components/composer/Composer.tsx b/front/src/components/composer/Composer.tsx new file mode 100644 index 0000000..795188e --- /dev/null +++ b/front/src/components/composer/Composer.tsx @@ -0,0 +1,67 @@ +import useLocalState from "@/state/state"; +import type { Poast } from "@/types/trill"; +import Sigil from "@/components/Sigil"; +import { useState, type FormEvent } from "react"; +import type { ComposerData } from "@/types/ui"; +import Snippets, { ReplySnippet } from "./Snippets"; +import toast from "react-hot-toast"; +import { useLocation } from "wouter"; + +function Composer({ + isAnon, + replying, +}: { + isAnon?: boolean; + replying?: Poast; +}) { + const [loc, navigate] = useLocation(); + const { api, composerData } = useLocalState(); + const our = api!.airlock.our!; + const [input, setInput] = useState(replying ? `${replying}: ` : ""); + async function poast(e: FormEvent) { + e.preventDefault(); + // TODO + // const parent = replying ? replying : null; + // const tokens = tokenize(input); + // const post: SentPoast = { + // host: parent ? parent.host : our, + // author: our, + // thread: parent ? parent.thread : null, + // parent: parent ? parent.id : null, + // contents: input, + // read: openLock, + // write: openLock, + // tags: input.match(HASHTAGS_REGEX) || [], + // }; + // TODO make it user choosable + const res = await api!.addPost(input); + if (res) { + setInput(""); + toast.success("post sent"); + navigate(`/feed/${our}`); + } + } + const placeHolder = isAnon ? "> be me" : "What's going on in Urbit"; + return ( +
+
+ +
+ + {composerData && composerData.type === "reply" && ( + + )} + setInput(e.currentTarget.value)} + placeholder={placeHolder} + /> + {composerData && composerData.type === "quote" && ( + + )} + + + ); +} + +export default Composer; diff --git a/front/src/components/composer/Snippets.tsx b/front/src/components/composer/Snippets.tsx new file mode 100644 index 0000000..30498d0 --- /dev/null +++ b/front/src/components/composer/Snippets.tsx @@ -0,0 +1,62 @@ +import Quote from "@/components/post/Quote"; +import type { ComposerData, SPID } from "@/types/ui"; +import { NostrSnippet } from "../post/wrappers/Nostr"; + +export default Snippets; +function Snippets({ post }: { post: SPID }) { + return ( + + + + ); +} + +export function ComposerSnippet({ + onClick, + children, +}: { + onClick?: any; + children: any; +}) { + function onc(e: React.MouseEvent) { + e.stopPropagation(); + onClick(); + } + return ( +
+
+ {children} +
+ ); +} +function PostSnippet({ post }: { post: SPID }) { + if ("trill" in post) return ; + else if ("nostr" in post) return ; + // else if ("twatter" in post) + // return ( + //
+ // + //
+ // ); + // else if ("rumors" in post) + // return ( + //
+ //
+ // + // {}} /> + // {date_diff(post.post.time, "short")} + //
+ //
+ // ); + else return <>; +} + +export function ReplySnippet({ post }: { post: SPID }) { + if ("trill" in post) + return ( +
+ +
+ ); + else return
; +} -- cgit v1.2.3