НЕ ПРОВЕРЕНО: DM-вложения, upload файлов и ревизии личных сообщений

This commit is contained in:
AidarKC
2026-06-18 11:46:58 +04:00
parent 2225c2d173
commit 92fd315505
25 changed files with 1910 additions and 516 deletions
+45 -16
View File
@@ -1,5 +1,5 @@
import { AuthService } from './services/auth-service.js';
import { listStoredMessages, putStoredMessage, clearStoredMessages } from './services/message-store.js';
import { listStoredMessages, putStoredMessage, deleteStoredMessage, clearStoredMessages } from './services/message-store.js';
import { SOLANA_ENDPOINT_DEFAULT } from './solana-programs.js';
import {
DEFAULT_SHINE_SERVER_HTTP,
@@ -378,15 +378,22 @@ function persistMessageRecord(chatId, row) {
baseKey: String(row.baseKey || ''),
messageType: Number(row.messageType || 0),
rawBlobB64: String(row.rawBlobB64 || ''),
revisionTimeMs: Number(row.revisionTimeMs || 0),
unread: Boolean(row.unread),
firstTick: Boolean(row.firstTick),
secondTick: Boolean(row.secondTick),
readReceiptSent: Boolean(row.readReceiptSent),
refBaseKey: String(row.refBaseKey || ''),
attachments: Array.isArray(row.attachments) ? row.attachments : [],
ts: resolvedTs > 0 ? resolvedTs : Date.now(),
}).catch(() => {});
}
function removeStoredMessageRecord(messageKey) {
if (!messageKey) return;
void deleteStoredMessage(messageKey).catch(() => {});
}
export async function hydrateMessagesFromStore() {
try {
const rows = await listStoredMessages();
@@ -407,11 +414,13 @@ export async function hydrateMessagesFromStore() {
baseKey: String(row.baseKey || ''),
messageType: Number(row.messageType || 0),
rawBlobB64: String(row.rawBlobB64 || ''),
revisionTimeMs: Number(row.revisionTimeMs || 0),
unread: Boolean(row.unread),
firstTick: Boolean(row.firstTick),
secondTick: Boolean(row.secondTick),
readReceiptSent: Boolean(row.readReceiptSent),
refBaseKey: String(row.refBaseKey || ''),
attachments: Array.isArray(row.attachments) ? row.attachments : [],
createdAtMs: Number(row.ts || 0),
});
});
@@ -565,25 +574,45 @@ export function addSignedMessageToChat({
unread = false,
rawBlobB64 = '',
refBaseKey = '',
revisionTimeMs = 0,
attachments = [],
deleted = false,
} = {}) {
const id = String(messageKey || '').trim();
if (!chatId || !id) return false;
if (state.knownMessageKeys[id]) return false;
state.knownMessageKeys[id] = true;
const list = getChatMessages(chatId);
const existingIndex = list.findIndex((row) => String(row?.messageKey || '').trim() === id);
const existing = existingIndex >= 0 ? list[existingIndex] : null;
const row = {
from: from === 'out' ? 'out' : 'in',
text: String(text || ''),
messageKey: id,
baseKey: String(baseKey || ''),
messageType: Number(messageType || 0),
rawBlobB64: String(rawBlobB64 || ''),
unread: Boolean(unread),
refBaseKey: String(refBaseKey || ''),
firstTick: from === 'out',
secondTick: false,
};
getChatMessages(chatId).push(row);
if (deleted) {
if (existingIndex >= 0) {
list.splice(existingIndex, 1);
removeStoredMessageRecord(id);
sortChatMessagesInPlace(chatId);
return true;
}
return false;
}
state.knownMessageKeys[id] = true;
const row = existing || {};
row.from = from === 'out' ? 'out' : 'in';
row.text = String(text || '');
row.messageKey = id;
row.baseKey = String(baseKey || '');
row.messageType = Number(messageType || 0);
row.rawBlobB64 = String(rawBlobB64 || '');
row.revisionTimeMs = Number(revisionTimeMs || 0);
row.attachments = Array.isArray(attachments) ? attachments : [];
row.unread = row.from === 'in' ? Boolean(unread) : false;
row.refBaseKey = String(refBaseKey || '');
row.firstTick = row.from === 'out';
row.secondTick = Boolean(existing?.secondTick);
row.readReceiptSent = Boolean(existing?.readReceiptSent);
if (existingIndex < 0) {
list.push(row);
}
sortChatMessagesInPlace(chatId);
persistMessageRecord(chatId, row);
return true;