128 lines
3.7 KiB
TypeScript
128 lines
3.7 KiB
TypeScript
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}
|
||
} |