rm Events.directMessagesByUser index

This commit is contained in:
Martti Malmi 2023-08-04 11:18:19 +03:00
parent ae904c26e1
commit 666d18dfa5
6 changed files with 63 additions and 62 deletions

View File

@ -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<any>(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 (
<PrivateMessage
{...innerEvent}
event={innerEvent}
showName={true}
selfAuthored={innerEvent.pubkey === Key.getPubKey()}
/>
@ -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) => {
>
<div className="w-full">
<div className="mb-2">
{props.showName && (
{showName && (
<small onClick={onNameClick} className="cursor-pointer text-xs">
<Name key={props.pubkey} pub={props.pubkey} />
<Name key={event.pubkey} pub={event.pubkey} />
</small>
)}
</div>
{props.torrentId && <Torrent torrentId={props.torrentId} />}
{torrentId && <Torrent torrentId={torrentId} />}
<div className={`preformatted-wrap text-base ${emojiOnly ? 'text-4xl' : ''}`}>
{formattedText}
</div>
<div className={`${props.selfAuthored ? 'text-right' : 'text-left'} text-xs text-white`}>
{props.id ? Helpers.getRelativeTimeText(time) : Helpers.formatTime(time)}
<div className={`${selfAuthored ? 'text-right' : 'text-left'} text-xs text-white`}>
{event.id ? Helpers.getRelativeTimeText(time) : Helpers.formatTime(time)}
</div>
</div>
</div>

View File

@ -426,9 +426,7 @@ const Events = {
}
}
} catch (e) {
if (maybeSecretChat) {
return;
}
// ignore
}
/*

View File

@ -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);

View File

@ -12,9 +12,17 @@ export default class SortedMap<K, V> {
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 {

View File

@ -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);
});

View File

@ -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(<div className="m-2" />);
showName = true;
}
previousFrom = msg.pubkey;
previousFrom = event.pubkey;
msgListContent.push(
<PrivateMessage
{...msg}
event={event}
showName={showName}
selfAuthored={msg.pubkey === myPub}
key={`${msg.created_at}${msg.pubkey}`}
chatId={id}
selfAuthored={event.pubkey === myPub}
key={`${event.created_at}${event.pubkey}`}
/>,
);
});
@ -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('{')),
});
}
}),
);
});