diff --git a/src/js/components/PrivateMessage.tsx b/src/js/components/PrivateMessage.tsx index 09f6d7a2..d0caa923 100644 --- a/src/js/components/PrivateMessage.tsx +++ b/src/js/components/PrivateMessage.tsx @@ -6,12 +6,20 @@ import { route } from 'preact-router'; import Helpers from '../Helpers'; import Key from '../nostr/Key'; +import { DecryptedEvent } from '../views/chat/ChatMessages'; import Name from './user/Name'; import Torrent from './Torrent'; -const PrivateMessage = (props) => { - const [text, setText] = useState(props.text || ''); +type Props = { + event: DecryptedEvent; + selfAuthored?: boolean; + showName?: boolean; + torrentId?: string; +}; + +const PrivateMessage = ({ event, selfAuthored, showName, torrentId }: Props) => { + const [text, setText] = useState(event.text || ''); const [innerEvent, setInnerEvent] = useState(null as any); const [checked, setChecked] = useState(false); @@ -26,27 +34,24 @@ const PrivateMessage = (props) => { let initialText = text; if (!initialText) { - Key.decryptMessage(props.id, (decryptedText) => { + Key.decryptMessage(event, (decryptedText) => { initialText = decryptedText; checkTextForJson(initialText); }); } else { checkTextForJson(initialText); } - }, [props.id, text]); + }, [event.id, text]); const checkTextForJson = (textContent) => { try { const maybeJson = textContent.slice(textContent.indexOf('{')); - const event = JSON.parse(maybeJson); - if (validateEvent(event) && verifySignature(event)) { - if ( - event.tags.length === 1 && - event.tags[0][0] === 'p' && - event.tags[0][1] === props.pubkey - ) { - event.text = event.content; - setInnerEvent(event); + const e = JSON.parse(maybeJson); + if (validateEvent(e) && verifySignature(e)) { + console.log(111, e.tags.length === 1, e.tags[0][0] === 'p', e.tags[0][1] === e.pubkey); + if (e.tags.length === 1 && e.tags[0][0] === 'p' && e.tags[0][1] === event.pubkey) { + e.text = e.content; + setInnerEvent(e); return; } } @@ -60,7 +65,7 @@ const PrivateMessage = (props) => { if (innerEvent) { return ( @@ -72,7 +77,7 @@ const PrivateMessage = (props) => { } const onNameClick = () => { - route(`/${Key.toNostrBech32Address(props.pubkey, 'npub')}`); + route(`/${Key.toNostrBech32Address(event.pubkey, 'npub')}`); }; const emojiOnly = text && text.length === 2 && Helpers.isEmoji(text); @@ -80,12 +85,12 @@ const PrivateMessage = (props) => { // TODO opts.onImageClick show image in modal const time = - typeof props.created_at === 'object' ? props.created_at : new Date(props.created_at * 1000); + typeof event.created_at === 'object' ? event.created_at : new Date(event.created_at * 1000); const status: any = ''; // this.getSeenStatus(); const seen = status.seen ? 'text-green-500' : 'text-neutral-500'; const delivered = status.delivered ? 'border-green-500' : 'border-neutral-500'; - const whose = props.selfAuthored + const whose = selfAuthored ? 'self-end bg-iris-blue text-white' : 'self-start bg-neutral-700 text-white'; @@ -95,18 +100,18 @@ const PrivateMessage = (props) => { >
- {props.showName && ( + {showName && ( - + )}
- {props.torrentId && } + {torrentId && }
{formattedText}
-
- {props.id ? Helpers.getRelativeTimeText(time) : Helpers.formatTime(time)} +
+ {event.id ? Helpers.getRelativeTimeText(time) : Helpers.formatTime(time)}
diff --git a/src/js/nostr/Events.ts b/src/js/nostr/Events.ts index 89e72b1c..1a53769c 100644 --- a/src/js/nostr/Events.ts +++ b/src/js/nostr/Events.ts @@ -426,9 +426,7 @@ const Events = { } } } catch (e) { - if (maybeSecretChat) { - return; - } + // ignore } /* diff --git a/src/js/nostr/Key.ts b/src/js/nostr/Key.ts index 2b2d9b52..b11e3934 100644 --- a/src/js/nostr/Key.ts +++ b/src/js/nostr/Key.ts @@ -169,26 +169,25 @@ export default { callback(null); }); }, - async decryptMessage(id, cb: (decrypted: string) => void) { - const existing = Events.decryptedMessages.get(id); + async decryptMessage(event: Event, cb: (decrypted: string) => void) { + const existing = Events.decryptedMessages.get(event.id); if (existing) { cb(existing); return; } try { const myPub = this.getPubKey(); - const msg = Events.db.by('id', id); const theirPub = - msg.pubkey === myPub ? msg.tags?.find((tag: any) => tag[0] === 'p')[1] : msg.pubkey; - if (!(msg && theirPub)) { + event.pubkey === myPub ? event.tags?.find((tag: any) => tag[0] === 'p')?.[1] : event.pubkey; + if (!(event && theirPub)) { return; } - let decrypted = (await this.decrypt(msg.content, theirPub)) as any; + let decrypted = (await this.decrypt(event.content, theirPub)) as any; if (decrypted?.content) { decrypted = decrypted.content; // what? TODO debug } - Events.decryptedMessages.set(id, decrypted); + Events.decryptedMessages.set(event.id, decrypted); cb(decrypted); } catch (e) { console.error(e); diff --git a/src/js/utils/SortedMap.tsx b/src/js/utils/SortedMap.tsx index f856257f..a55d6162 100644 --- a/src/js/utils/SortedMap.tsx +++ b/src/js/utils/SortedMap.tsx @@ -12,9 +12,17 @@ export default class SortedMap { if (typeof compare === 'string') { this.compare = (a, b) => { if (direction === 'desc') { - return a.value[compare] > b.value[compare] ? -1 : a.value[compare] < b.value[compare] ? 1 : 0; + return a.value[compare] > b.value[compare] + ? -1 + : a.value[compare] < b.value[compare] + ? 1 + : 0; } else { - return a.value[compare] > b.value[compare] ? 1 : a.value[compare] < b.value[compare] ? -1 : 0; + return a.value[compare] > b.value[compare] + ? 1 + : a.value[compare] < b.value[compare] + ? -1 + : 0; } }; } else { diff --git a/src/js/views/chat/ChatListItem.tsx b/src/js/views/chat/ChatListItem.tsx index 82af096e..d6a80643 100644 --- a/src/js/views/chat/ChatListItem.tsx +++ b/src/js/views/chat/ChatListItem.tsx @@ -35,7 +35,7 @@ const ChatListItem = ({ chat, active = false, latestMsg = {} as any }) => { } Events.getEventById(latestMsg.id, false, (event) => { if (event) { - Key.decryptMessage(latestMsg.id, (text: string) => { + Key.decryptMessage(latestMsg, (text: string) => { setLatestText(text); localState.get('chats').get(chat).get('latest').get('text').put(text); }); diff --git a/src/js/views/chat/ChatMessages.tsx b/src/js/views/chat/ChatMessages.tsx index 8b209b21..eaa29eb2 100644 --- a/src/js/views/chat/ChatMessages.tsx +++ b/src/js/views/chat/ChatMessages.tsx @@ -13,7 +13,6 @@ import PrivateMessage from '../../components/PrivateMessage'; import QrCode from '../../components/QrCode'; import Helpers from '../../Helpers'; import localState from '../../LocalState'; -import Events from '../../nostr/Events'; import Key from '../../nostr/Key'; import PubSub from '../../nostr/PubSub'; import { translate as t } from '../../translations/Translation.mjs'; @@ -22,7 +21,7 @@ import SortedMap from '../../utils/SortedMap'; import ChatMessageForm from './ChatMessageForm.tsx'; import { addGroup, sendSecretInvite } from './NewChat'; -type DecryptedEvent = Event & { text?: string }; +export type DecryptedEvent = Event & { text?: string }; function ChatMessages({ id }) { const ref = useRef(null); @@ -105,17 +104,11 @@ function ChatMessages({ id }) { const msgListContent = [] as any[]; if (id && id.length > 4) { - sortedMessages.forEach((msgOrId) => { - let msg; - if (typeof msgOrId === 'string') { - msg = Events.db.by('id', msgOrId); - } else { - msg = msgOrId; - } - if (!msg) { + sortedMessages.forEach((event) => { + if (!event) { return null; } - const date = new Date(msg.created_at * 1000); + const date = new Date(event.created_at * 1000); let isDifferentDay; if (date) { const dateStr = date.toLocaleDateString(); @@ -132,18 +125,17 @@ function ChatMessages({ id }) { } let showName = isDifferentDay; - if (!isDifferentDay && previousFrom && msg.pubkey !== previousFrom) { + if (!isDifferentDay && previousFrom && event.pubkey !== previousFrom) { msgListContent.push(
); showName = true; } - previousFrom = msg.pubkey; + previousFrom = event.pubkey; msgListContent.push( , ); }); @@ -257,18 +249,17 @@ function ChatMessages({ id }) { subs.push( PubSub.subscribe({ kinds: [4], '#p': [pubKey], authors: [pubKey] }, async (event) => { const decrypted = await nip04.decrypt(privKey, pubKey, event.content); - messages.current.set(event.id, event); + messages.current.set(event.id, { ...event, text: decrypted }); setSortedMessages(Array.from(messages.current.values())); const latest = node.get('latest'); - latest.once((e) => { - if (!e || !e.created_at || e.created_at < event.created_at) { - latest.put({ - id: event.id, - created_at: event.created_at, - text: decrypted.slice(0, decrypted.indexOf('{')), - }); - } - }); + const e = await latest.once(); + if (!e || !e.created_at || e.created_at < event.created_at) { + latest.put({ + id: event.id, + created_at: event.created_at, + text: decrypted.slice(0, decrypted.indexOf('{')), + }); + } }), ); });