'init'
This commit is contained in:
88
app/providers/DialogListProvider/useDialogInfo.ts
Normal file
88
app/providers/DialogListProvider/useDialogInfo.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { useEffect, useState } from "react";
|
||||
import { DialogRow } from "./DialogListProvider";
|
||||
import { useDatabase } from "@/app/providers/DatabaseProvider/useDatabase";
|
||||
import { usePublicKey } from "../AccountProvider/usePublicKey";
|
||||
import { decodeWithPassword } from "@/app/crypto/crypto";
|
||||
import { constructLastMessageTextByAttachments } from "@/app/utils/constructLastMessageTextByAttachments";
|
||||
import { usePrivatePlain } from "../AccountProvider/usePrivatePlain";
|
||||
import { DeliveredMessageState, Message } from "../DialogProvider/DialogProvider";
|
||||
|
||||
/**
|
||||
* Получает информацию о последнем сообщении в диалоге и количестве непрочитанных сообщений,
|
||||
* работает как с групповыми диалогами, так и с личными.
|
||||
* Последнее сообщение содержит расшифрованный текст в поле plain_message.
|
||||
* @param row Диалог из списка диалогов
|
||||
* @returns информация о последнем сообщении и количестве непрочитанных сообщений
|
||||
*/
|
||||
export function useDialogInfo(row : DialogRow) : {
|
||||
lastMessage: Message;
|
||||
unreaded: number;
|
||||
loading: boolean;
|
||||
} {
|
||||
const {getQuery} = useDatabase();
|
||||
const publicKey = usePublicKey();
|
||||
const privatePlain = usePrivatePlain();
|
||||
const [lastMessage, setLastMessage] = useState<Message>({
|
||||
from_public_key: '',
|
||||
to_public_key: '',
|
||||
content: '',
|
||||
timestamp: 0,
|
||||
chacha_key: '',
|
||||
readed: 0,
|
||||
from_me: 0,
|
||||
delivered: DeliveredMessageState.WAITING,
|
||||
message_id: '',
|
||||
plain_message: '',
|
||||
attachments: [],
|
||||
});
|
||||
const [unreaded, setUnreaded] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
loadLastMessageInfo();
|
||||
}, [row.last_timestamp]);
|
||||
|
||||
const loadLastMessageInfo = async () => {
|
||||
let message = await getQuery(`SELECT * FROM messages WHERE message_id = ? AND account = ? LIMIT 1`, [row.last_message_id, publicKey]);
|
||||
if(!message){
|
||||
return;
|
||||
}
|
||||
|
||||
let lastMessage = '';
|
||||
try{
|
||||
lastMessage = await decodeWithPassword(privatePlain, message.plain_message);
|
||||
}catch(e){
|
||||
lastMessage = constructLastMessageTextByAttachments(message.attachments);
|
||||
}
|
||||
|
||||
setLastMessage({
|
||||
...message,
|
||||
plain_message: lastMessage,
|
||||
attachments: JSON.parse(message.attachments),
|
||||
});
|
||||
let unreadedCount = {
|
||||
count: 0
|
||||
};
|
||||
if(row.dialog_id.startsWith('#group:')){
|
||||
unreadedCount = await getQuery(`
|
||||
SELECT COUNT(*) as count
|
||||
FROM messages
|
||||
WHERE read = 0
|
||||
AND to_public_key = ?
|
||||
AND account = ?`, [row.dialog_id, publicKey]);
|
||||
}else{
|
||||
unreadedCount = await getQuery(`
|
||||
SELECT COUNT(*) as count
|
||||
FROM messages
|
||||
WHERE read = 0
|
||||
AND ((from_public_key = ? AND to_public_key = ?) OR (from_public_key = ? AND to_public_key = ?))
|
||||
AND account = ?`, [publicKey, row.dialog_id, row.dialog_id, publicKey, publicKey]);
|
||||
}
|
||||
setUnreaded(unreadedCount.count);
|
||||
}
|
||||
|
||||
return {
|
||||
lastMessage,
|
||||
unreaded,
|
||||
loading: lastMessage.message_id == '',
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user