From 99537864bd528534a719394e15a96c7438e86d49 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Sat, 18 Nov 2023 10:24:20 -0600 Subject: [PATCH] rebuild translation modal to support multiple DVMs --- .../note-translation-modal/index.tsx | 171 +++++++++--------- 1 file changed, 90 insertions(+), 81 deletions(-) diff --git a/src/components/note-translation-modal/index.tsx b/src/components/note-translation-modal/index.tsx index 9c86dd21b..5d50403f6 100644 --- a/src/components/note-translation-modal/index.tsx +++ b/src/components/note-translation-modal/index.tsx @@ -1,5 +1,11 @@ -import { useCallback, useState } from "react"; +import { MouseEventHandler, useCallback, useState } from "react"; import { + Accordion, + AccordionButton, + AccordionIcon, + AccordionItem, + AccordionPanel, + Box, Button, Card, CardBody, @@ -14,6 +20,7 @@ import { ModalOverlay, ModalProps, Select, + Spacer, Spinner, Text, useToast, @@ -43,65 +50,53 @@ function getTranslationRequestLanguage(request: NostrEvent) { return codes.find((code) => code.iso639_1 === targetLanguage); } -function TranslationResult({ result, request }: { result: NostrEvent; request?: NostrEvent }) { - const requester = result.tags.find(isPTag)?.[1]; - const lang = request && getTranslationRequestLanguage(request); - - return ( - - - - - {lang && Translated to {lang.nativeName}} - - - - {requester && ( - - Requested by - - )} - - - - ); -} - function TranslationRequest({ request }: { request: NostrEvent }) { const lang = getTranslationRequestLanguage(request); const requestRelays = request.tags.find((t) => t[0] === "relays")?.slice(1); const readRelays = useReadRelayUrls(); - const timeline = useTimelineLoader(`${getEventUID(request)}-offers`, requestRelays || readRelays, { - kinds: [DMV_STATUS_KIND], + const timeline = useTimelineLoader(`${getEventUID(request)}-offers-results`, requestRelays || readRelays, { + kinds: [DMV_STATUS_KIND, DMV_TRANSLATE_RESULT_KIND], "#e": [request.id], }); - const offers = useSubject(timeline.timeline); + const events = useSubject(timeline.timeline); + const dvmStatuses: Record = {}; + for (const event of events) { + if ( + (event.kind === DMV_STATUS_KIND || event.kind === DMV_TRANSLATE_RESULT_KIND) && + (!dvmStatuses[event.pubkey] || dvmStatuses[event.pubkey].created_at < event.created_at) + ) { + dvmStatuses[event.pubkey] = event; + } + } return ( - Requested translation to {lang?.nativeName} + + Requested translation to {lang?.nativeName} + - - {offers.length === 0 ? ( - - - Waiting for offers - - ) : ( - - Offers ({offers.length}) - - )} - {offers.map((offer) => ( - - ))} - + {Object.keys(dvmStatuses).length === 0 && ( + + + Waiting for offers + + )} + + {Object.values(dvmStatuses).map((event) => { + switch (event.kind) { + case DMV_STATUS_KIND: + return ; + case DMV_TRANSLATE_RESULT_KIND: + return ; + } + })} + ); } @@ -115,10 +110,11 @@ function TranslationOffer({ offer }: { offer: NostrEvent }) { const [paid, setPaid] = useState(false); const [paying, setPaying] = useState(false); - const payInvoice = async () => { + const payInvoice: MouseEventHandler = async (e) => { try { if (window.webln && invoice) { setPaying(true); + e.stopPropagation(); await window.webln.sendPayment(invoice); setPaid(true); } @@ -129,27 +125,51 @@ function TranslationOffer({ offer }: { offer: NostrEvent }) { }; return ( - - - - + + + + + + Offered + - {invoice && amountMsat && ( - - )} - - {offer.content} - + {invoice && amountMsat && ( + + )} + + + + + {offer.content} + + + ); +} + +function TranslationResult({ result }: { result: NostrEvent }) { + return ( + + + + + + Translated Note + + + + + + + ); } @@ -187,16 +207,12 @@ export default function NoteTranslationModal({ }, [requestSignature, note, readRelays]); const timeline = useTimelineLoader(`${getEventUID(note)}-translations`, readRelays, { - kinds: [DMV_TRANSLATE_JOB_KIND, DMV_TRANSLATE_RESULT_KIND], + kinds: [DMV_TRANSLATE_JOB_KIND], "#i": [note.id], }); const events = useSubject(timeline.timeline); - const filteredEvents = events.filter( - (e, i, arr) => - e.kind === DMV_TRANSLATE_RESULT_KIND || - (e.kind === DMV_TRANSLATE_JOB_KIND && !arr.some((r) => r.tags.some((t) => isETag(t) && t[1] === e.id))), - ); + const jobs = events.filter((e) => e.kind === DMV_TRANSLATE_JOB_KIND); return ( @@ -217,16 +233,9 @@ export default function NoteTranslationModal({ Request new translation - {filteredEvents.map((event) => { - switch (event.kind) { - case DMV_TRANSLATE_JOB_KIND: - return ; - case DMV_TRANSLATE_RESULT_KIND: - const requestId = event.tags.find(isETag)?.[1]; - const request = events.find((e) => e.id === requestId); - return ; - } - })} + {jobs.map((event) => ( + + ))}