diff --git a/src/components/Config.tsx b/src/components/Config.tsx index a0543e9..e254f4f 100644 --- a/src/components/Config.tsx +++ b/src/components/Config.tsx @@ -6,24 +6,10 @@ type ConfigProps = { }; const RelayConfig = () => { - const { config, setConfig } = useConfig(); + const { config, setConfig, addRelay, removeRelay } = useConfig(); const [relayUrlInput, setRelayUrlInput] = createSignal(''); - const addRelay = (relayUrl: string) => { - setConfig((current) => ({ - ...current, - relayUrls: [...current.relayUrls, relayUrl], - })); - }; - - const removeRelay = (relayUrl: string) => { - setConfig((current) => ({ - ...current, - relayUrls: current.relayUrls.filter((e) => e !== relayUrl), - })); - }; - const handleClickAddRelay: JSX.EventHandler = (ev) => { ev.preventDefault(); const relayUrl = ev.currentTarget?.relayUrl?.value as string | undefined; diff --git a/src/components/NotePostForm.tsx b/src/components/NotePostForm.tsx index f3fc237..9e8161c 100644 --- a/src/components/NotePostForm.tsx +++ b/src/components/NotePostForm.tsx @@ -1,25 +1,75 @@ -import { createSignal, createMemo, onMount, type Component, type JSX } from 'solid-js'; +import { createSignal, createMemo, onMount, For, type Component, type JSX, Show } from 'solid-js'; +import { Event as NostrEvent } from 'nostr-tools'; + import PaperAirplane from 'heroicons/24/solid/paper-airplane.svg'; +import XMark from 'heroicons/24/outline/x-mark.svg'; + +import UserNameDisplay from '@/components/UserDisplayName'; + +import eventWrapper from '@/core/event'; + +import useConfig from '@/nostr/useConfig'; +import useCommands from '@/nostr/useCommands'; +import usePubkey from '@/nostr/usePubkey'; type NotePostFormProps = { - ref?: HTMLTextAreaElement | undefined; - onPost: (textNote: { content: string }) => void; + replyTo?: NostrEvent; + mode?: 'normal' | 'reply'; onClose: () => void; }; -const NotePostForm: Component = (props) => { - const [text, setText] = createSignal(''); +const placeholder = (mode: NotePostFormProps['mode']) => { + switch (mode) { + case 'normal': + return 'いまどうしてる?'; + case 'reply': + return '返信を投稿'; + default: + return 'いまどうしてる?'; + } +}; +const NotePostForm: Component = (props) => { + let textAreaRef: HTMLTextAreaElement | undefined; + + const { config } = useConfig(); + const getPubkey = usePubkey(); + const commands = useCommands(); + + const [text, setText] = createSignal(''); const clearText = () => setText(''); + const replyTo = () => props.replyTo && eventWrapper(props.replyTo); + const mode = () => props.mode ?? 'normal'; + const notifyPubkeys = createMemo(() => replyTo()?.mentionedPubkeys() ?? []); + const handleChangeText: JSX.EventHandler = (ev) => { setText(ev.currentTarget.value); }; - // TODO 投稿完了したかどうかの検知をしたい const submit = () => { - props.onPost({ content: text() }); - clearText(); + const pubkey = getPubkey(); + if (pubkey == null) { + console.error('pubkey is not available'); + return; + } + commands + .publishTextNote({ + relayUrls: config().relayUrls, + pubkey, + content: text(), + notifyPubkeys: notifyPubkeys(), + rootEventId: replyTo()?.rootEvent()?.id ?? replyTo()?.id, + replyEventId: replyTo()?.id, + }) + .then(() => { + console.log('succeeded to post'); + clearText(); + props?.onClose(); + }) + .catch((err) => { + console.error('error', err); + }); }; const handleSubmit: JSX.EventHandler = (ev) => { @@ -37,23 +87,55 @@ const NotePostForm: Component = (props) => { const submitDisabled = createMemo(() => text().trim().length === 0); + onMount(() => { + setTimeout(() => { + textAreaRef?.focus(); + }, 50); + }); + return (
+ 0}> +
+ + {(pubkey) => ( + <> + {' '} + + )} + + に返信 +
+