import CardContainer from './CardContainer'; import { ArrowUpTrayIcon, CpuChipIcon } from '@heroicons/react/24/outline'; import { useState, useEffect, useMemo } from 'react'; import { generatePrivateKey, getPublicKey, finishEvent } from 'nostr-tools'; import { minePow } from '../../utils/mine'; import { publish } from '../../utils/relays'; import NostrImg from '../../utils/ImgUpload'; const difficulty = 20 const NewThreadCard: React.FC = () => { const [comment, setComment] = useState(""); const [file, setFile] = useState(""); const [sk, setSk] = useState(generatePrivateKey()); const [messageFromWorker, setMessageFromWorker] = useState(null); // Initialize the worker outside of any effects const worker = useMemo(() => new Worker(new URL('../../powWorker', import.meta.url)), []); useEffect(() => { worker.onmessage = (event) => { setMessageFromWorker(event.data); }; }, []); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); worker.postMessage({ unsigned: { kind: 1, tags: [], content: comment + " " + file, created_at: Math.floor(Date.now() / 1000), pubkey: getPublicKey(sk), }, difficulty }); }; useEffect(() => { if (messageFromWorker) { try { const signedEvent = finishEvent(messageFromWorker, sk); publish(signedEvent); setComment(""); setFile(""); setSk(generatePrivateKey()) return () => { worker.terminate(); }; } catch (error) { setComment(error + ' ' + comment); } } }, [messageFromWorker]); async function attachFile(file_input: File | null) { try { if (file_input) { const rx = await NostrImg(file_input); if (rx.url) { setFile(rx.url); } else if (rx?.error) { setFile(rx.error); } } } catch (error: unknown) { if (error instanceof Error) { setFile(error?.message); } } } return ( <> {/*

Message from worker: {messageFromWorker}

*/}