From 940a891943a8dc8ed1f58846a4a622223993b13a Mon Sep 17 00:00:00 2001 From: smolgrrr Date: Wed, 8 Nov 2023 22:23:57 +1100 Subject: [PATCH] good enough --- client/src/components/Forms/PostFormCard.tsx | 59 +++-- client/src/components/Forms/ThreadPost.tsx | 226 ------------------ client/src/components/Home.tsx | 2 +- client/src/components/Modals/Card.tsx | 4 +- .../Modals/CardModals/QuoteEmbed.tsx | 2 +- client/src/components/Thread.tsx | 26 +- client/src/utils/{utils.ts => otherUtils.ts} | 0 client/src/utils/postNote.ts | 32 --- client/src/utils/useWorkers.ts | 42 ---- 9 files changed, 57 insertions(+), 336 deletions(-) delete mode 100644 client/src/components/Forms/ThreadPost.tsx rename client/src/utils/{utils.ts => otherUtils.ts} (100%) delete mode 100644 client/src/utils/postNote.ts delete mode 100644 client/src/utils/useWorkers.ts diff --git a/client/src/components/Forms/PostFormCard.tsx b/client/src/components/Forms/PostFormCard.tsx index 6bad7df..cb9ca6b 100644 --- a/client/src/components/Forms/PostFormCard.tsx +++ b/client/src/components/Forms/PostFormCard.tsx @@ -5,7 +5,7 @@ import { } from "@heroicons/react/24/outline"; import { XCircleIcon } from "@heroicons/react/24/solid"; import { useState, useEffect, useMemo } from "react"; -import { generatePrivateKey, getPublicKey, finishEvent, UnsignedEvent } from "nostr-tools"; +import { generatePrivateKey, getPublicKey, finishEvent, UnsignedEvent, Event as NostrEvent, nip19 } from "nostr-tools"; import { publish } from "../../utils/relays"; import { renderMedia, attachFile } from "../../utils/FileUpload"; @@ -40,7 +40,20 @@ const useWorkers = (numCores: number, unsigned: UnsignedEvent, difficulty: strin return { startWork, messageFromWorker, doingWorkProgress }; }; -const NewNoteCard: React.FC = () => { +interface FormProps { + refEvent?: NostrEvent; + tagType?: 'Reply' | 'Quote' | ''; +} + +const tagMapping = { + 'Reply': ['e', 'p'], + 'Quote': ['q', 'p'] +}; + +const NewNoteCard = ({ + refEvent, + tagType + }: FormProps) => { const [comment, setComment] = useState(""); const [file, setFile] = useState(""); const [sk, setSk] = useState(generatePrivateKey()); @@ -65,6 +78,17 @@ const NewNoteCard: React.FC = () => { useEffect(() => { + if (refEvent && tagType && unsigned.tags.length === 0) { + const tags = tagMapping[tagType]; + if (tags) { + tags.forEach(tag => unsigned.tags.push([tag, refEvent[tag === 'p' ? 'pubkey' : 'id']])); + } + + if (tagType === 'Quote') { + setComment(comment + ' nostr:' + nip19.noteEncode(refEvent.id)); + } + } + const handleDifficultyChange = (event: Event) => { const customEvent = event as CustomEvent; const { difficulty } = customEvent.detail; @@ -79,15 +103,12 @@ const NewNoteCard: React.FC = () => { }, []); useEffect(() => { - setUnsigned( - { - kind: 1, - tags: [], - content: comment + " " + file, - created_at: Math.floor(Date.now() / 1000), - pubkey: getPublicKey(sk), - } - ); + setUnsigned(prevUnsigned => ({ + ...prevUnsigned, + content: `${comment} ${file}`, + created_at: Math.floor(Date.now() / 1000), + pubkey: getPublicKey(sk), + })); }, [comment, file]); useEffect(() => { @@ -100,16 +121,12 @@ const NewNoteCard: React.FC = () => { setComment(""); setFile(""); setSk(generatePrivateKey()); - setUnsigned( - { - kind: 1, - tags: [], - content: "", - created_at: Math.floor(Date.now() / 1000), - pubkey: getPublicKey(sk), - } - ); - + setUnsigned(prevUnsigned => ({ + ...prevUnsigned, + content: '', + created_at: Math.floor(Date.now() / 1000), + pubkey: getPublicKey(sk), + })); } catch (error) { setComment(error + " " + comment); } diff --git a/client/src/components/Forms/ThreadPost.tsx b/client/src/components/Forms/ThreadPost.tsx deleted file mode 100644 index 71087c4..0000000 --- a/client/src/components/Forms/ThreadPost.tsx +++ /dev/null @@ -1,226 +0,0 @@ -import { useParams } from 'react-router-dom'; -import { useState, useMemo, useEffect } from "react"; -import { ArrowUpTrayIcon, CpuChipIcon, ArrowPathIcon } from '@heroicons/react/24/outline'; -import { XCircleIcon } from '@heroicons/react/24/solid'; -import { generatePrivateKey, getPublicKey, finishEvent, Event as NostrEvent } from 'nostr-tools'; -import { publish } from '../../utils/relays'; -import FileUpload from '../../utils/FileUpload'; -import { nip19 } from 'nostr-tools'; -import { renderMedia } from '../../utils/FileUpload'; - - -const ThreadPost = ({ OPEvent, state, type }: { OPEvent: NostrEvent, state: Boolean, type: String }) => { - const { id } = useParams(); - const [comment, setComment] = useState(""); - const [file, setFile] = useState(""); - const [difficulty, setDifficulty] = useState(localStorage.getItem('difficulty') || '21'); - const [uploadingFile, setUploadingFile] = useState(false); - let decodeResult = nip19.decode(id as string); - - const [sk, setSk] = useState(generatePrivateKey()); - - const [messageFromWorker, setMessageFromWorker] = useState(null); - const [doingWorkProp, setDoingWorkProp] = useState(false); - const [doingWorkProgress, setDoingWorkProgress] = useState(0); - - // Initialize the worker outside of any effects - const numCores = navigator.hardwareConcurrency || 4; - - const workers = useMemo( - () => Array(numCores).fill(null).map(() => new Worker(new URL("../../powWorker", import.meta.url))), - [] - ); - - useEffect(() => { - workers.forEach((worker) => { - worker.onmessage = (event) => { - if (event.data.status === 'progress') { - console.log(`Worker progress: Checked ${event.data.currentNonce} nonces.`); - setDoingWorkProgress(event.data.currentNonce); - } else if (event.data.found) { - setMessageFromWorker(event.data.event); - // Terminate all workers once a solution is found - workers.forEach(w => w.terminate()); - } - }; - }); - - const handleDifficultyChange = (event: Event) => { - const customEvent = event as CustomEvent; - setDifficulty(customEvent.detail); - }; - - window.addEventListener('difficultyChanged', handleDifficultyChange); - - return () => { - window.removeEventListener('difficultyChanged', handleDifficultyChange); - }; - }, []); - - const handleSubmit = async (event: React.FormEvent) => { - event.preventDefault(); - let id = decodeResult.data as string - - workers.forEach((worker, index) => { - let tags = []; - let modifiedComment = comment + " " + file; - if (type === 'r') { - tags.push(["e", id as string]) - tags.push(["p", OPEvent.pubkey]) - } else if (type === 'q') { - tags.push(["q", id as string]) - tags.push(["p", OPEvent.pubkey]) - modifiedComment += ' nostr:' + nip19.noteEncode(id); - } - - try { - worker.postMessage({ - unsigned: { - kind: 1, - tags, - content: modifiedComment, - created_at: Math.floor(Date.now() / 1000), - pubkey: getPublicKey(sk), - }, - difficulty, - nonceStart: index, // Each worker starts from its index - nonceStep: numCores // Each worker increments by the total number of workers - }); - - } catch (error) { - setComment(comment + " " + error); - } - }); - }; - - useEffect(() => { - setDoingWorkProp(false) - if (messageFromWorker) { - try { - const signedEvent = finishEvent(messageFromWorker, sk); - publish(signedEvent); - - setComment(""); - setFile(""); - setSk(generatePrivateKey()) - setMessageFromWorker(null); - } catch (error) { - setComment(error + ' ' + comment); - } - } - }, [messageFromWorker]); - - async function attachFile(file_input: File | null) { - setUploadingFile(true); // start loading - try { - if (file_input) { - const rx = await FileUpload(file_input); - setUploadingFile(false); // stop loading - if (rx.url) { - setFile(rx.url); - } else if (rx?.error) { - setFile(rx.error); - } - } - } catch (error: unknown) { - setUploadingFile(false); // stop loading - if (error instanceof Error) { - setFile(error?.message); - } - } - } - - - return ( - <> - {state && ( -
{ - handleSubmit(event); - setDoingWorkProp(true); - }} - > - - -
-
-