mirror of
https://github.com/irislib/iris-messenger.git
synced 2024-10-18 14:13:21 +00:00
rm Events.directMessagesByUser index
This commit is contained in:
parent
ae904c26e1
commit
666d18dfa5
@ -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>
|
||||
|
@ -426,9 +426,7 @@ const Events = {
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
if (maybeSecretChat) {
|
||||
return;
|
||||
}
|
||||
// ignore
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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('{')),
|
||||
});
|
||||
}
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user