Files
VRCT/src-ui/logics/common/useMessage.js

127 lines
3.6 KiB
JavaScript

import {
useStore_MessageLogs,
useStore_MessageInputValue,
store,
} from "@store";
import { useStdoutToPython } from "@useStdoutToPython";
const COOLDOWN = 2000; // 2 seconds
export const useMessage = () => {
const { currentMessageLogs, addMessageLogs, updateMessageLogs } = useStore_MessageLogs();
const { currentMessageInputValue, updateMessageInputValue } = useStore_MessageInputValue();
const { asyncStdoutToPython } = useStdoutToPython();
const sendMessage = (message) => {
const uuid = crypto.randomUUID();
const send_message_object = {
id: uuid,
message: message,
};
asyncStdoutToPython("/run/send_message_box", send_message_object);
addMessageLogs({
id: uuid,
category: "sent",
status: "pending",
created_at: generateTimeData(),
messages: {
original: { message: message, transliteration: [] },
translations: [],
},
});
};
const addSystemMessageLog = (message) => {
const uuid = crypto.randomUUID();
const date = generateTimeData();
addMessageLogs({
id: uuid,
category: "system",
status: "system",
created_at: date,
messages: {
original: { message: message, transliteration: [] },
translations: [],
},
});
};
const addSystemMessageLog_FromBackend = (payload) => {
addSystemMessageLog(payload.message);
};
const updateSentMessageLogById = (payload) => {
updateMessageLogs(updateItemById(payload.id, payload));
};
const addSentMessageLog = (payload) => {
const message_object = generateMessageObject(payload, "sent");
addMessageLogs(message_object);
};
const addReceivedMessageLog = (payload) => {
const message_object = generateMessageObject(payload, "received");
addMessageLogs(message_object);
};
const startTyping = () => {
const now = Date.now();
if (now - store.last_executed_time_startTyping >= 2000) {
store.last_executed_time_startTyping = now;
asyncStdoutToPython("/run/typing_message_box");
}
};
const stopTyping = () => {
asyncStdoutToPython("/run/stop_typing_message_box");
};
return {
currentMessageLogs,
sendMessage,
addSystemMessageLog,
addSystemMessageLog_FromBackend,
updateSentMessageLogById,
addSentMessageLog,
addReceivedMessageLog,
currentMessageInputValue,
updateMessageInputValue,
startTyping,
stopTyping,
};
};
const generateTimeData = () => {
return new Date().toLocaleTimeString(
"ja-JP",
{ hour12: false, hour: "2-digit", minute: "2-digit" }
);
};
const generateMessageObject = (data, category) => {
return {
id: crypto.randomUUID(),
created_at: generateTimeData(),
category: category,
status: "ok",
messages: {
original: data.original,
translations: data.translations ?? [],
},
};
};
const updateItemById = (id, updated_data) => (current_items) => {
return current_items.data.map(item => {
if (item.id === id) {
item.status = "ok";
if (updated_data.translations) item.messages.translations = updated_data.translations;
}
return item;
});
};