diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index 98b01dfa..2aae0420 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -1,7 +1,7 @@ import "./NoteCreator.css"; -import { useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; -import { RawEvent, TaggedRawEvent } from "@snort/nostr"; +import { useDispatch, useSelector } from "react-redux"; +import { TaggedRawEvent } from "@snort/nostr"; import Icon from "Icons/Icon"; import useEventPublisher from "Feed/EventPublisher"; @@ -11,6 +11,18 @@ import Modal from "Element/Modal"; import ProfileImage from "Element/ProfileImage"; import useFileUpload from "Upload"; import Note from "Element/Note"; +import { + setShow, + setNote, + setError, + setActive, + setPreview, + setShowAdvanced, + setZapForward, + setSensitive, + reset, +} from "State/NoteCreator"; +import type { RootState } from "State/Store"; import { LNURL } from "LNURL"; import messages from "./messages"; @@ -31,26 +43,20 @@ function NotePreview({ note }: NotePreviewProps) { ); } -export interface NoteCreatorProps { - show: boolean; - setShow: (s: boolean) => void; - replyTo?: TaggedRawEvent; - onSend?: () => void; - autoFocus: boolean; -} - -export function NoteCreator(props: NoteCreatorProps) { - const { show, setShow, replyTo, onSend, autoFocus } = props; +export function NoteCreator() { const { formatMessage } = useIntl(); const publisher = useEventPublisher(); - const [note, setNote] = useState(""); - const [error, setError] = useState(""); - const [active, setActive] = useState(false); - const [preview, setPreview] = useState(); - const [showAdvanced, setShowAdvanced] = useState(false); - const [zapForward, setZapForward] = useState(""); - const [sensitive, setSensitiveContent] = useState(); const uploader = useFileUpload(); + const note = useSelector((s: RootState) => s.noteCreator.note); + const show = useSelector((s: RootState) => s.noteCreator.show); + const error = useSelector((s: RootState) => s.noteCreator.error); + const active = useSelector((s: RootState) => s.noteCreator.active); + const preview = useSelector((s: RootState) => s.noteCreator.preview); + const replyTo = useSelector((s: RootState) => s.noteCreator.replyTo); + const showAdvanced = useSelector((s: RootState) => s.noteCreator.showAdvanced); + const zapForward = useSelector((s: RootState) => s.noteCreator.zapForward); + const sensitive = useSelector((s: RootState) => s.noteCreator.sensitive); + const dispatch = useDispatch(); async function sendNote() { if (note) { @@ -61,10 +67,12 @@ export function NoteCreator(props: NoteCreatorProps) { await svc.load(); extraTags = [svc.getZapTag()]; } catch { - setError( - formatMessage({ - defaultMessage: "Invalid LNURL", - }) + dispatch( + setError( + formatMessage({ + defaultMessage: "Invalid LNURL", + }) + ) ); return; } @@ -76,12 +84,7 @@ export function NoteCreator(props: NoteCreatorProps) { const ev = replyTo ? await publisher.reply(replyTo, note, extraTags) : await publisher.note(note, extraTags); console.debug("Sending note: ", ev); publisher.broadcast(ev); - setNote(""); - setShow(false); - if (typeof onSend === "function") { - onSend(); - } - setActive(false); + dispatch(reset()); } } @@ -91,34 +94,30 @@ export function NoteCreator(props: NoteCreatorProps) { if (file) { const rx = await uploader.upload(file, file.name); if (rx.url) { - setNote(n => `${n ? `${n}\n` : ""}${rx.url}`); + dispatch(setNote(`${note ? `${note}\n` : ""}${rx.url}`)); } else if (rx?.error) { - setError(rx.error); + dispatch(setError(rx.error)); } } } catch (error: unknown) { if (error instanceof Error) { - setError(error?.message); + dispatch(setError(error?.message)); } } } function onChange(ev: React.ChangeEvent) { const { value } = ev.target; - setNote(value); + dispatch(setNote(value)); if (value) { - setActive(true); + dispatch(setActive(true)); } else { - setActive(false); + dispatch(setActive(false)); } } function cancel() { - setShow(false); - setNote(""); - setShowAdvanced(false); - setPreview(undefined); - setZapForward(""); + dispatch(reset()); } function onSubmit(ev: React.MouseEvent) { @@ -128,11 +127,11 @@ export function NoteCreator(props: NoteCreatorProps) { async function loadPreview() { if (preview) { - setPreview(undefined); + dispatch(setPreview(null)); } else { const tmpNote = await publisher.note(note); if (tmpNote) { - setPreview(tmpNote); + dispatch(setPreview(tmpNote)); } } } @@ -155,18 +154,18 @@ export function NoteCreator(props: NoteCreatorProps) { return ( <> {show && ( - setShow(false)}> + dispatch(setShow(false))}> {replyTo && } {preview && getPreviewNote()} {!preview && (