This commit is contained in:
rosetta
2026-01-30 05:01:05 +02:00
commit 83f38dc63f
327 changed files with 18725 additions and 0 deletions

View File

@@ -0,0 +1,128 @@
import { useContext, useEffect } from "react";
import { useMemory } from "../MemoryProvider/useMemory";
import { Attachment } from "../ProtocolProvider/protocol/packets/packet.message";
import { DialogContext } from "./DialogProvider";
export interface Reply {
publicKey: string;
messages: MessageReply[];
/**
* Флаг, указывающи, что выбранные сообщения уже перемещены в
* поле ввода диалога
*/
inDialogInput?: string;
}
export interface MessageReply {
timestamp: number;
publicKey: string;
message: string;
attachments: Attachment[];
message_id: string;
}
export function useReplyMessages() {
const [replyMessages, setReplyMessages] = useMemory<Reply>("replyMessages", {
publicKey: "",
messages: [],
inDialogInput: ""
}, true);
const context = useContext(DialogContext);
if(!context){
throw new Error("useReplyMessages must be used within a DialogProvider");
}
const {dialog} = context;
const selectMessage = (message : MessageReply) => {
console.info(message);
if(replyMessages.publicKey != dialog){
/**
* Сброс выбора сообщений из другого диалога
*/
setReplyMessages({
publicKey: dialog,
messages: [message]
});
return;
}
if(replyMessages.messages.find(m => m.timestamp == message.timestamp)){
/**
* Уже выбранное сообщение
*/
return;
}
replyMessages.messages.push(message);
const sortedByTime = replyMessages.messages.sort((a, b) => a.timestamp - b.timestamp);
setReplyMessages({
publicKey: dialog,
messages: sortedByTime
});
}
const deselectMessage = (message : MessageReply) => {
const filtered = replyMessages.messages.filter(m => m.timestamp != message.timestamp);
setReplyMessages({
publicKey: dialog,
messages: filtered
});
}
const deselectAllMessages = () => {
setReplyMessages({
publicKey: "",
messages: []
});
}
const isSelectionStarted = () => {
if(replyMessages.inDialogInput){
return false;
}
return replyMessages.publicKey == dialog && replyMessages.messages.length > 0;
}
const isSelectionInCurrentDialog = () => {
if(replyMessages.inDialogInput){
return false;
}
return replyMessages.publicKey == dialog;
}
const isMessageSelected = (message : MessageReply) => {
if(replyMessages.publicKey != dialog ||
replyMessages.inDialogInput
){
return false;
}
return replyMessages.messages.find(m => m.timestamp == message.timestamp) != undefined;
}
const translateMessagesToDialogInput = (publicKey: string) => {
setReplyMessages((prev) => ({
...prev,
inDialogInput: publicKey
}));
}
useEffect(() => {
if(replyMessages.publicKey != dialog
&& replyMessages.inDialogInput != dialog){
/**
* Сброс выбора сообщений при смене диалога
*/
deselectAllMessages();
}
}, [dialog]);
return {replyMessages,
translateMessagesToDialogInput,
isSelectionInCurrentDialog,
isSelectionStarted,
selectMessage,
deselectMessage,
dialog,
deselectAllMessages,
isMessageSelected}
}