]> Repos - mime-chat/commitdiff
message grouping
authorAndrew Gundersen <gundersena@xavier.edu>
Sat, 13 Mar 2021 17:59:37 +0000 (11:59 -0600)
committerAndrew Gundersen <gundersena@xavier.edu>
Sat, 13 Mar 2021 17:59:37 +0000 (11:59 -0600)
src/components/inputItem/inputController.ts
src/components/messageItem.vue
src/modules/message.ts
src/modules/messages.ts
src/types/message/index.ts
src/views/messenger.vue

index 5bfefb54fd4c940d1370710c3a952c93d718c4d8..3b23dd28db1fde151db32ddf62e21ce749065d05 100644 (file)
@@ -10,12 +10,9 @@ import useMitt from "@/modules/mitt";
 import { useIpc } from '@/modules/ipc';
 import keyboardNameMap from "./keyBoardMaps/keyboardNameMap";
 import keyboardCharMap from "./keyBoardMaps/keyboardCharMap";
-import { RenderMessage, ClientMessage } from "@/types/message/index";
-import { v4 as uuidv4 } from 'uuid';
 import {clientMessage, initRenderMessage} from '@/modules/message';
 
 let textInput: HTMLInputElement | null;
-let uid: string;
 
 export default function useInputController() {
 
@@ -37,8 +34,8 @@ export default function useInputController() {
             emitter.emit("self-message", message);
 
             // Then send it to the backend for processing.
-            const clientMm = clientMessage(text, false, message.uid);
-            post('client-message', message);
+            const clientM = clientMessage(text, false, message.uid);
+            post('client-message', clientM);
 
             // Reset the text input.
             if (textInput) textInput.value = ''; 
index 5139176984e3245d237797747a6a4ed6fb534406..e8941fea91ee3379dcab03ace5d49bca494fe77d 100644 (file)
@@ -1,6 +1,7 @@
 <template>  
   <div
     class="message"
+    :class="`${message.isChild}ChildMessage`"
     :id="`${message.modifier}Message`"
     :key="message.id"
   >
     <!-- !denoted by the modifier attribute -->
 
     <!-- Includes bubble and context. -->
-    <div class="messageBox" :id="`${message.modifier}MessageBox`">
+    <div 
+      :id="`${message.modifier}MessageBox`"
+      class="messageBox"
+    >
 
       <!-- message bubble -->
       <div
         class="bubble"
+        :class="`${message.modifier}-${message.isChild}ChildBubble`"
         :id="`${message.modifier}Bubble`"
       >
         <!-- Show loader when audio is being transcribed. -->
@@ -42,7 +47,7 @@
       </div>
 
       <!-- message context -->
-      <span v-if="message.isChild === false" class="context">
+      <span v-if="message.isChild === 'last' || message.isChild === 'none'" class="context">
 
         <!-- Render Crimata icon or friend's initials. -->
         <div v-if="message.modifier == 'ai'" class="photo">
     margin-bottom: 18px;
   }
 
+  .firstChildMessage {
+    padding-bottom: 2px;
+  }
+
+  .middleChildMessage {
+    padding-top: 2px;
+    padding-bottom: 2px;
+  }
+
+  .lastChildMessage {
+    padding-top: 2px;
+  }
+
   #aiMessage {
     align-items: flex-start;
   }
     background-color: white;
   }
 
+  .sf-firstChildBubble {
+    border-bottom-right-radius: 9px;
+  }
+
+  .sf-middleChildBubble {
+    border-top-right-radius: 9px;
+    border-bottom-right-radius: 9px;
+  }
+
+  .sf-lastChildBubble {
+    border-top-right-radius: 9px;
+  }
+
+  .ai-firstChildBubble, .fr-firstChildBubble {
+    border-bottom-left-radius: 9px;
+  }
+
+  .ai-middleChildBubble, .fr-middleChildBubble {
+    border-top-left-radius: 9px;
+    border-bottom-left-radius: 9px;
+  }
+
+  .ai-lastChildBubble, .fr-lastChildBubble {
+    border-top-left-radius: 9px;
+  }
+
   .context {
     display: flex;
     align-items: center;
index 58233a37883db72db676dcb4b68ea55c842f2f09..069ef9d443fb76409723cc922ed988c5ea44db67 100644 (file)
@@ -2,13 +2,13 @@ import { RenderMessage, ClientMessage } from "@/types/message/index";
 import { v4 as uuidv4 } from 'uuid';
 
 // Create a RenderMessage object directly from json string.
-export function initRenderMessageFromString(message_str: string) {
+export function initRenderMessageFromString(messageStr: string) {
 
   // Parse the string.
-  const m = JSON.parse(message_str);
+  const m = JSON.parse(messageStr);
 
   // Auto set uid and time.
-  let currentdate = new Date();
+  const currentdate = new Date();
 
   const message: RenderMessage = {
     content: m.content,
@@ -16,7 +16,7 @@ export function initRenderMessageFromString(message_str: string) {
     modifier: m.modifier,
     time: currentdate.getTime(),
     uid: uuidv4(),
-    isChild: false
+    isChild: "none"
   }
 
   return message
@@ -26,7 +26,7 @@ export function initRenderMessageFromString(message_str: string) {
 export function initRenderMessage(text: string, audio: string, context: string, modifier: string) {
 
   // Auto set uid and time.
-  let currentdate = new Date();
+  const currentdate = new Date();
 
   const message: RenderMessage = {
     content: {
@@ -37,7 +37,7 @@ export function initRenderMessage(text: string, audio: string, context: string,
     modifier: modifier,
     time: currentdate.getTime(),
     uid: uuidv4(),
-    isChild: false
+    isChild: "none"
   }
 
   return message
index e3c9286327510f6300d9d40abba8d5c7c53bca0c..a8bf5cf90f65865977561eceeadea33c8499e75d 100644 (file)
@@ -16,14 +16,20 @@ if (messagesString) {
 
 export default function useMessages() {
 
-    const addMessage = (m: RenderMessage) => messages.value.set(m.uid, m);
-
-    const updateMessage = (m: Annotation) => {
-        // update message if in the map.
-        if (messages.value.has(m.uid)) {
-            messages.value.get(m.uid).context = m.context;
-            messages.value.get(m.uid).content.text = m.text;
-        }
+    // Add new message and update previous message if nessesary.
+    const addMessage = (m: RenderMessage) => {
+      console.log(`Adding message: ${m.content.text}`)
+      messages.value.set(m.uid, m);
+    }
+
+    const updateMessage = (a: Annotation) => {
+        console.log("Updating message...")
+
+        const m = messages.value.get(a.uid)
+        m.context = a.context
+        m.text = a.text
+
+        return m
     }
 
     const saveMessages = () => {
index 7c74fca405267e14350f37da1749d8681e48d390..40023969fc7b9c867e5c910197a2ca6bd7abb59b 100644 (file)
@@ -12,7 +12,7 @@ export interface RenderMessage {
     modifier: string;
     time: number;
     uid: string;
-    isChild: boolean;
+    isChild: string;
 }
 
 export interface ClientMessage {
index 28c13529c3ac7503b8fb2e72a5d85f97354e7c3e..7763b3bcfc6462032c0430ac1e3ef2f0c3977478 100644 (file)
@@ -11,7 +11,6 @@
 
 <script lang="ts">
 import { defineComponent, onMounted, onUnmounted } from "vue";
-import { RenderMessage } from "@/types/message/index";
 import MessageItem from "@/components/messageItem.vue";
 import InputItem from "@/components/inputItem/inputItem.vue";
 import Settings from "@/components/settings.vue";
@@ -30,35 +29,62 @@ export default defineComponent({
     const { emitter } = useMitt();
     const { messages, addMessage, updateMessage } = useMessages();
 
-    // Reference to previous message for grouping purposes.
-    let prevMessage: RenderMessage;
+    let prevRef: string; // ref to previous message
+    let activeGroup = false; // if active group exists.
 
+    // When backend has new message.
     const onRenderMessage = (_event: any, payload: any) => { 
-      const message = payload.message; // cleaner
+      let message = payload.message; // cleaner
 
-      // render message if there is content.
+      // Check type and handle accordingly.
       if (message.content) {
         addMessage(message);
-      } 
-
-      // must be an annotation, update message.
-      else {
-        updateMessage(message);
+      } else {
+        message = updateMessage(message);
       }
 
-      // Also want to check if message should be grouped.
-      // Message context and modifier needs to be same as previous message while also having close times (20s).
-      if (message.time < prevMessage.time + 20000 && message.context == prevMessage.context && message.modifier == prevMessage.modifier) {
+      // Check for grouping.
+      if (prevRef) {
+        const prev = messages.value.get(prevRef)
+        const current = messages.value.get(message.uid)
+
+        console.log(`${message.modifier}, ${prev.modifier}`)
+        console.log(`${message.context}, ${prev.context}`)
+        
+        // If last two messages go together...group accordingly.
+        if (current.time < prev.time + 20000 && current.modifier === prev.modifier && current.context === prev.context) {
+
+          if (activeGroup) {
+            prev.isChild = "middle"
+          } else {
+            prev.isChild = "first"
+          }
+
+          // Current always last child.
+          current.isChild = "last"
+          activeGroup = true
+        }
+
+        // Else...reset activeGroup.
+        else {
+          activeGroup = false
+        }
 
-        prevMessage.isChild = true;
       }
 
+      // Set previous message for next time.
+      prevRef = message.uid
+
     }
 
     onMounted(() => {
-      // Listen for new messages to render.
+
+      // Front end listener.
       emitter.on('self-message', (message) => addMessage(message));
+
+      // Back end listener.
       window.ipcRenderer.on("render-message", onRenderMessage);
+
     });
 
     onUnmounted(() => {