import useScroll from "@/modules/scroll";
import { RenderMessage, Annotation } from "@/types/message/index";
-const messages = ref(new Map()); // ze messages.
+const messages = ref(new Map());
-//---Message Grouping-----------------------------------------------
+const addMessage = (message: RenderMessage) => {
+ messages.value.set(message.uid, message)
+}
-let prevRef: string;
-let activeGroup = false;
+const updateMessage = (annotation: Annotation) => {
+ const message = messages.value.get(annotation.uid)
+ message.context = annotation.context
+ message.content.text = annotation.text
+}
-const updateGrouping = (currentMessageRef: string) => {
- if (prevRef) {
+const loadMessages = () => {
+ const rawData = window.localStorage.getItem("crimata_messages");
+ if (rawData) {
+ const messageData = JSON.parse(rawData)
+ messages.value = new Map(Object.entries(messageData));
+ }
+}
- // Get references to the two most recent messages.
- const prev = messages.value.get(prevRef)
- const current = messages.value.get(currentMessageRef)
+const saveMessages = () => {
+ const messageData = Object.fromEntries(messages.value);
+ window.localStorage.setItem("crimata_messages", JSON.stringify(messageData));
+}
- // See if they should be grouped.
- if (current.time < prev.time + 20000) {
- if (prev.modifier === current.modifier) {
- if (prev.context === current.context) {
+const isSimmilar = (messageA: RenderMessage, messageB: RenderMessage) => {
+ if ((Math.abs(messageA.time - messageB.time) < 20000) && (messageA.modifier == messageB.modifier) && (messageA.context == messageB.context)) {
+ return true
+ }
+ return false
+}
- // Update grouping accordingly.
- if (activeGroup) {
- prev.isChild = "middle";
- }
+const updateGrouping = () => {
+ console.log("updating grouping")
+ const refs = Array.from(messages.value.keys())
- else {
- prev.isChild = "first";
- }
+ // Get the last three messages.
+ const first = messages.value.get(refs[refs.length - 1])
+ const second = messages.value.get(refs[refs.length - 2])
+ const third = messages.value.get(refs[refs.length - 3])
- current.isChild = "last";
- activeGroup = true;
- }
+ // If messages are simmilar, update the classes.
+ if ((first) && (second)) {
+ if (isSimmilar(first, second)) {
+ first.isChild = "last" // i.e. last in group.
+ second.isChild = "first"
- // If messages unrealated, reset activeGroup.
- else {
- activeGroup = false;
+ if (third) {
+ if ((third.isChild == "first") || (third.isChild == "middle")) {
+ second.isChild = "middle"
}
}
}
}
- prevRef = currentMessageRef;
}
-//------------------------------------------------------------------
+const { setScroll, updateScrollRef, adjustScroll } = useScroll("messenger");
+
+loadMessages()
+setTimeout(setScroll, 1000);
export default function useMessages() {
- // Control the scrolling.
- const {
- setScroll,
- updateScrollRef,
- adjustScroll
- } = useScroll("messenger");
-
- // Save message to local storage.
- const saveMessages = () => {
- const messageData = Object.fromEntries(messages.value);
- window.localStorage.setItem("crimata_messages", JSON.stringify(messageData));
- }
+ // Main function for updating the message view.
+ const updateMessageView = (message: RenderMessage | Annotation) => {
- // Load messages from local storage.
- const loadMessages = () => {
- const rawData = window.localStorage.getItem("crimata_messages");
+ // Step 1: See if user is scrolled down.
+ updateScrollRef()
- if (rawData) {
- const messageData = JSON.parse(rawData)
- messages.value = new Map(Object.entries(messageData));
+ // Step 2: Add the new content to the view.
+ if ("content" in message) {
+ addMessage(message)
+ } else {
+ updateMessage(message)
}
- }
-
- // Remove oldest message from the messages map.
- function popMessage() {
- const lastKey = Array.from(messages.value.keys()).shift();
- messages.value.delete(lastKey);
- }
-
- // Add a new message to the view.
- const addMessage = (message: RenderMessage) => {
- updateScrollRef()
-
- // Size limit of 200.
+ // Step 3: Pop off oldest message (if > 200).
if (messages.value.size >= 200) {
- popMessage();
- }
+ const oldest = Array.from(messages.value.keys()).shift();
+ messages.value.delete(oldest);
+ };
- messages.value.set(message.uid, message);
+ // Step 4: Update grouping.
+ updateGrouping()
+ // Setp 5: Scroll the view (if scrolled down).
setTimeout(adjustScroll, 20);
- updateGrouping(message.uid)
- saveMessages()
- }
-
- // Update an existing message in the view.
- const updateMessage = (a: Annotation) => {
- updateScrollRef()
- // update message if in the map.
- const message = messages.value.get(a.uid)
- message.context = a.context
- message.content.text = a.text
+ // Step 6: Save the view data.
+ saveMessages()
- setTimeout(adjustScroll, 20);
- saveMessages()
}
- loadMessages()
- setTimeout(setScroll, 1000);
- console.log("loaded messages")
-
return {
messages,
- saveMessages,
- addMessage,
- updateMessage,
- loadMessages
+ updateMessageView
}
-}
\ No newline at end of file
+};
\ No newline at end of file
const { emitter } = useMitt();
// Handle messages in view.
- const {
- messages,
- addMessage,
- updateMessage,
- } = useMessages();
-
- // Alter existing message.
- const onAnnotateMessage = (_event: any, payload: any) => {
- updateMessage(payload.message);
- }
+ const { messages, updateMessageView } = useMessages();
- // Render new message.
- const onRenderMessage = (_event: any, payload: any) => {
- addMessage(payload.message);
+ // Update message view on new content.
+ const onNewContent = (_event: any, payload: any) => {
+ updateMessageView(payload.message)
}
onMounted(() => {
// Front end listener.
- emitter.on('self-message', (message) => addMessage(message));
+ emitter.on('self-message', (message) => updateMessageView(message));
// Back end listener.
- window.ipcRenderer.on("render-message", onRenderMessage);
- window.ipcRenderer.on("annotate-message", onAnnotateMessage);
+ window.ipcRenderer.on("render-message", onNewContent);
});