]> Repos - mime-chat/commitdiff
save messages on window close
authorEnrique Hernandez <hernandeze2@xavier.edu>
Fri, 12 Mar 2021 03:34:21 +0000 (21:34 -0600)
committerEnrique Hernandez <hernandeze2@xavier.edu>
Fri, 12 Mar 2021 03:34:21 +0000 (21:34 -0600)
src/App.vue
src/modules/messages.ts [new file with mode: 0644]
src/views/messenger.vue
tests/server.js

index 97e50a9e5b23de823672f91e15feb72c783ababa..165d108c732ca7afd94978993bbf6f97594c0cb7 100644 (file)
@@ -25,8 +25,8 @@
 <script lang="ts">
 import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
 import { useIpc } from "@/modules/ipc";
-import { useAuth } from "@/modules/auth";
 import Splash from "@/components/splash.vue"
+import useMessages from '@/modules/messages';
 
 export default defineComponent({
   components: { Splash },
@@ -34,6 +34,7 @@ export default defineComponent({
   setup() {
     const { invoke } = useIpc();
     const ready = ref(false);
+    const { saveMessages } = useMessages();
 
     onMounted(() => {
         window.ipcRenderer.on('window-ready', (_event, payload: {message: boolean}) => {
@@ -46,6 +47,12 @@ export default defineComponent({
     })
 
     const callNavbar = (action: string) => {
+
+      // save messages before closing.
+      if (action === 'close') {
+        saveMessages();
+      }
+
       invoke('nav-bar', action);
     }
 
diff --git a/src/modules/messages.ts b/src/modules/messages.ts
new file mode 100644 (file)
index 0000000..e3c9286
--- /dev/null
@@ -0,0 +1,41 @@
+import { ref } from 'vue';
+import { RenderMessage, Annotation } from "@/types/message/index";
+
+const messages = ref(new Map());
+
+const messagesKey = "CRIMATA_MESSAGES";
+
+const messagesString = window.localStorage.getItem(messagesKey);
+
+if (messagesString) {
+  // parse stored messages.
+  const parsed = JSON.parse(messagesString);
+  // set messages.
+  messages.value = new Map(Object.entries(parsed));
+}
+
+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;
+        }
+    }
+
+    const saveMessages = () => {
+        // de-reactivate message data before saving.
+        const messageData = Object.fromEntries(messages.value);
+        window.localStorage.setItem(messagesKey, JSON.stringify(messageData));
+    }
+
+    return {
+      messages,
+      saveMessages,
+      addMessage,
+      updateMessage
+    }
+}
\ No newline at end of file
index c19d690f6e3cfa44eeb9c9a9d228c887bbe4a2ad..0da4d5e0927585a5c4c68c43e06f6661bddb6ad5 100644 (file)
 </template>
 
 <script lang="ts">
-import { defineComponent, reactive, ref, onMounted, onUnmounted } from "vue";
-import { RenderMessage , Annotation } from "@/types/message/index";
+import { defineComponent, ref, onMounted, onUnmounted } from "vue";
 import MessageItem from "@/components/messageItem.vue";
 import InputItem from "@/components/inputItem/inputItem.vue";
 import useMitt from "@/modules/mitt";
 import { useRouter } from "vue-router";
 import { useAuth } from "@/modules/auth";
 import  { useIpc } from "@/modules/ipc";
+import useMessages from '@/modules/messages';
 
 export default defineComponent({
   name: "Messenger",
-
   components: {
     MessageItem,
     InputItem,
   },
-
   setup() {
 
     const { post } = useIpc();
     const { logout } = useAuth();
     const router = useRouter();
+    const { emitter } = useMitt();
+    const { messages, addMessage, updateMessage } = useMessages();
 
-    // Whether or not to show the settings.
+    // controls settings rendering. 
     const toggleSettings = ref(false);
 
     // Listen for escape key to close settings.
-    const onEscape = (e: any) => {
+    const onEscape = (e: KeyboardEvent) => {
       if(e.key === "Escape") {
         toggleSettings.value = false;
       }
@@ -74,42 +74,24 @@ export default defineComponent({
     const onLogout = () => {
       logout();
       router.push({ name: "login" });
-      post("logout", "")
+      post("logout", "");
     } 
 
-    const { emitter } = useMitt();
-
-    // List of messages in the view.
-    // Oldest message first.
-    const messages = reactive(new Map());
-
-    let m: RenderMessage | Annotation;
-
-    const onRenderMessage = (event: any, payload: any) => { 
+    const onRenderMessage = (_event: any, payload: any) => { 
 
       // render message if there is content.
       if (payload.message.content) {
-        m = payload.message as RenderMessage;
-
-        messages.set(m.uid, m);
-
+        addMessage(payload.message);
       } else {
-        // must be an annotation, update messages.
-        m = payload.message as Annotation;
-
-        if (messages.has(m.uid)) {
-          messages.get(m.uid).context = m.context;
-          messages.get(m.uid).content.text = m.text;
-        }
-
+        // must be an annotation, update message.
+        updateMessage(payload.message);
       }
-    }
 
-    toggleSettings.value = false;
+    }
 
     onMounted(() => {
-      emitter.on('self-message', (message) => messages.set(message.uid, message));
       // Listen for new messages to render.
+      emitter.on('self-message', (message) => addMessage(message));
       window.ipcRenderer.on("render-message", onRenderMessage);
     });
 
index edbee04a484736612d8c09d9c36df4f1aae9364f..6731be96178d94f479a9eb5a2d5c163a381b26b7 100644 (file)
@@ -3,6 +3,7 @@ const WebSocket = require("ws");
 const wss = new WebSocket.Server({
   port: 8760
 });
+let auth = false;
 
 wss.on("connection", function connection(ws, req) {
   ws.on("message", function incoming(message) {
@@ -13,7 +14,15 @@ wss.on("connection", function connection(ws, req) {
     } else if (message instanceof String || typeof message === "string") {
       // audio message
       console.log('caught the token', message)
-      ws.send('success');
+      if (!auth) {
+        ws.send('success');
+        auth = true;
+      } else {
+        const parsed = JSON.parse(message);
+        console.log('got a message', message)
+
+      }
+
     } else {
       const parsed = JSON.parse(message);
       console.log('parsed', parsed)