]> Repos - mime-chat/commitdiff
html bubbles, more simplifications, new session protocol latest
authorAndrew Gundersen <gundersena@xavier.edu>
Sat, 8 Jan 2022 22:53:45 +0000 (16:53 -0600)
committerAndrew Gundersen <gundersena@xavier.edu>
Sat, 8 Jan 2022 22:53:45 +0000 (16:53 -0600)
21 files changed:
src/account.js
src/audio.js
src/codec.js [new file with mode: 0644]
src/io.js
src/main.js
src/preview.html [new file with mode: 0644]
src/render/assets/crimataAvatar.svg [deleted file]
src/render/assets/mailAvatar.svg [deleted file]
src/render/assets/messageAvatar.svg [deleted file]
src/render/components/app.js
src/render/components/bubble.js
src/render/components/context.js
src/render/components/control/text.js
src/render/components/input.js
src/render/components/message.js
src/render/components/messenger.js
src/render/components/settings.js
src/render/main.css
src/render/preload.js
src/session.js
src/window.js

index d75d6497903c7e91331f64839e92f80562b947a6..239d89dc376affb787c6ea19127a658f535f70ac 100644 (file)
@@ -5,9 +5,8 @@ const { postLogin } = require("./api");
 const { ipcEmit } = require("./utils/emitter");
 const { launchSession, endSession } = require("./session");
 
-store.set("account", "smith12@gmail.com");
-// store.set("account", "adgundersen@gmail.com");
-// store.delete("account");
+// store.set("account", "smith12@gmail.com");
+store.set("account", "adgundersen@gmail.com");
 
 async function login(_e, email, password) 
 {
index a10c1621564adb7cb5771e4dbe9e658b19c41d11..3736ee9f336f89708db6dd4b112b2201f3846bb4 100644 (file)
@@ -1,9 +1,9 @@
 const nodeAudio = require("@crimata/nodeaudio");
-const { encode, decode } = require("base64-arraybuffer");
 const { globalShortcut, ipcMain } = require("electron");
 
 const { sendMessage } = require("./io");
 const { updateTray } = require("./tray");
+const { encode, decode } = require("./codec");
 const { backgroundMitt, ipcEmit } = require("./utils/emitter");
 
 let inputDevice;
@@ -67,8 +67,9 @@ function stopRecording()
     setRecordingStatus(false);
 
     sendMessage({
-        text: false,
-        audio: encode(nodeAudio.utils.mergeChunks(chunks).buffer)
+        category: "audio/L16",
+        text: null,
+        blob: encode(nodeAudio.utils.mergeChunks(chunks).buffer)
     });
     
     chunks.length = 0;
@@ -129,3 +130,8 @@ exports.initAudio = initAudio;
 exports.terminateAudio = terminateAudio;
 exports.playback = playback;
 exports.streamState = streamState;
+
+
+// setWriteId = setTimeout(() => {
+//     setPlaybackStatus(false);
+// }, 500);
diff --git a/src/codec.js b/src/codec.js
new file mode 100644 (file)
index 0000000..3a9a8bf
--- /dev/null
@@ -0,0 +1,13 @@
+const { ipcMain } = require("electron");
+const { encode, decode } = require("base64-arraybuffer");
+
+ipcMain.handle("encode", (_e, arrayBuffer) => {
+    return encode(arrayBuffer);
+});
+
+ipcMain.handle("decode", (_e, b64string) => {
+    return decode(b64string);
+});
+
+exports.encode = encode;
+exports.decode = decode;
\ No newline at end of file
index b5b2751bdac82073cf6940131f475cae4f55197a..a269d493e363f06289e5cd3897ce3ae0ee4550eb 100644 (file)
--- a/src/io.js
+++ b/src/io.js
@@ -1,7 +1,7 @@
 const WebSocket = require("ws");
+const { ipcMain } = require("electron");
 
 const config = require("./config");
-const { ipcMain } = require("electron");
 const { updateTray } = require("./tray");
 const { backgroundMitt, ipcEmit } = require("./utils/emitter");
 
@@ -22,7 +22,7 @@ function connectToPlatform(account)
 
     .on("error", () => {}) /** keep silent on error */
 
-    .on("message", (payload) => backgroundMitt.emit("ws-message", JSON.parse(payload)))
+    .on("message", (payload) => backgroundMitt.emit("message", JSON.parse(payload)))
 
     .on("close", (code, reason) => {
         setConnectionStatus(1);
@@ -55,4 +55,26 @@ ipcMain.on("message", (_e, message) => sendMessage(message));
 
 exports.connectToPlatform = connectToPlatform;
 exports.sendMessage = sendMessage;
-exports.disconnectFromPlatform = disconnectFromPlatform;
\ No newline at end of file
+exports.disconnectFromPlatform = disconnectFromPlatform;
+
+
+
+/* ------------- Test Messages------------- */
+
+
+
+setTimeout(() => {
+
+    // sendMessage({
+    //     category: "text/plain", 
+    //     text: "show contacts",
+    //     blob: null
+    // })
+
+    sendMessage({
+        category: "text/plain", 
+        text: "add contact John Smith, john.smith97@gmail.com",
+        blob: null
+    })
+
+}, 2000);
index 28b60bda75c6ba8acf23b1e5c5188d5bfd7035e0..841579ecdcb781a841b57c61410a61959b8861a5 100644 (file)
@@ -20,7 +20,7 @@ app.on("ready", () =>
     initAccount();
 });
 
-app.on("will-quit", terminateAudio);
+// app.on("will-quit", terminateAudio);
 
 // When user clicks app icon (re-open)
 app.on("activate", createWin);
diff --git a/src/preview.html b/src/preview.html
new file mode 100644 (file)
index 0000000..8c8fc48
--- /dev/null
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <style>
+        html, body {
+            margin: 0;
+            padding: 0;
+            font-family: "SF Pro Text";
+            font-size: 14px;
+        }
+
+        #titlebar {
+            position: fixed;
+            width: 100vw;
+            height: 54px;
+            opacity: 0;
+            -webkit-app-region: drag;
+            border: none;
+            outline: none;
+            z-index: 1;
+        }
+
+        .building {
+            width: 250px;
+            height: 150px;
+        }
+
+        .email {
+            padding: 15px;
+        }
+
+        .email-subject {
+            font-size: 16px;
+            margin-top: 10px;
+        }
+    </style>
+</head>
+<body>
+
+    <button id="titlebar"></button>
+
+    <div id="content"></div>
+    
+    <script>
+        window.mainApi.on("preview-init", (content) => {
+            document.getElementById("content").innerHTML = content;
+        });
+    </script>
+
+</body>
+</html>
diff --git a/src/render/assets/crimataAvatar.svg b/src/render/assets/crimataAvatar.svg
deleted file mode 100644 (file)
index b4f3fd6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30">
-  <g id="Group_604" data-name="Group 604" transform="translate(-366 -464)">
-    <circle id="Ellipse_69" data-name="Ellipse 69" cx="15" cy="15" r="15" transform="translate(366 464)" fill="#fff"/>
-    <g id="Group_603" data-name="Group 603">
-      <circle id="Ellipse_50" data-name="Ellipse 50" cx="3.116" cy="3.116" r="3.116" transform="translate(374 479.252)" fill="#383838"/>
-      <circle id="Ellipse_51" data-name="Ellipse 51" cx="3.116" cy="3.116" r="3.116" transform="translate(381.789 479.252)" fill="#383838"/>
-      <circle id="Ellipse_52" data-name="Ellipse 52" cx="3.116" cy="3.116" r="3.116" transform="translate(377.889 472.517)" fill="#383838"/>
-    </g>
-  </g>
-</svg>
diff --git a/src/render/assets/mailAvatar.svg b/src/render/assets/mailAvatar.svg
deleted file mode 100644 (file)
index e9ac882..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="12" viewBox="0 0 16 12">
-  <g id="Group_618" data-name="Group 618" transform="translate(-777 -3651)">
-    <g id="Rectangle_1621" data-name="Rectangle 1621" transform="translate(777 3651)" fill="none" stroke="#58c4fd" stroke-width="2.3">
-      <rect width="16" height="12" rx="4" stroke="none"/>
-      <rect x="1.15" y="1.15" width="13.7" height="9.7" rx="2.85" fill="none"/>
-    </g>
-    <g id="Group_617" data-name="Group 617">
-      <path id="Polygon_6" data-name="Polygon 6" d="M6.419.415a1,1,0,0,1,1.162,0l3.88,2.771A1,1,0,0,1,10.88,5H3.12a1,1,0,0,1-.581-1.814Z" transform="translate(792 3656) rotate(180)" fill="#58c4fd"/>
-    </g>
-  </g>
-</svg>
diff --git a/src/render/assets/messageAvatar.svg b/src/render/assets/messageAvatar.svg
deleted file mode 100644 (file)
index f187eef..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="13.691" viewBox="0 0 16 13.691">
-  <g id="Group_754" data-name="Group 754" transform="translate(-4671 -921)">
-    <ellipse id="Ellipse_114" data-name="Ellipse 114" cx="8" cy="6" rx="8" ry="6" transform="translate(4671 921)" fill="#58fd84"/>
-    <path id="Path_193" data-name="Path 193" d="M4693.211,699.285v3.906l3.449-2.126Z" transform="translate(-19.217 231)" fill="#58fd84" stroke="#58fd84" stroke-linejoin="round" stroke-width="1"/>
-  </g>
-</svg>
index 49abb6e1e8cf09cbb9a5ab917bca919b582ad62c..08909a6b585cb315027a33de2474edf567cf4a64 100644 (file)
@@ -1,7 +1,6 @@
 import Splash from "./splash.js";
 import Messenger from "./messenger.js";
 import Login from "./login.js";
-import Header from "./header.js";
 
 const account = Vue.ref(null);
 
@@ -10,8 +9,7 @@ const App =
     components: {
         Splash,
         Messenger,
-        Login,
-        Header
+        Login
     },
 
     setup()
@@ -22,7 +20,7 @@ const App =
     template: `
         <main id="app" v-if="account !== null">
 
-            <Header />
+            <button id="header-titlebar" />
 
             <Messenger v-if="account"/>
             <Login v-else />
index bdd64bec928cc2f85b0e1fdcb99d331ef08f576c..16f79835440f9bfafb5ac9853fb11437fd3c73b4 100644 (file)
@@ -1,23 +1,36 @@
 const Bubble =
 {
-    props: ["modifier", "text", "child"],
+    props: ["category", "text", "blob", "modifier", "child"],
 
     setup(props)
     {
-        Vue.onMounted(() => {
-
-            const messengerEl = document.getElementById("messenger");
-
-            if (messengerEl) {
-                messengerEl.dispatchEvent(new CustomEvent('adjust-scroll'));
-            }
+        const getUrl = () => {
+            return `data:${props.category};base64,${props.blob}`;
+        }
 
+        Vue.onMounted(() => {
+            document.getElementById("messenger").dispatchEvent(new CustomEvent('adjust-scroll'));
         });
+
+        return { getUrl };
     },
 
     template: `
-        <div :class="'bubble ' + modifier + '-bubble ' + modifier +'-'+ child" v-html="text">
-        </div> `
+        <div :class="'bubble ' + modifier + '-bubble ' + modifier +'-'+ child">
+
+            <p v-if="category=='text/plain'">{{ text }}</p>
+
+            <p v-else-if="category=='audio/L16'">{{ text }}</p>
+
+            <div v-else-if="category=='text/html'" v-html="text"></div>
+
+            <img v-else-if="category.startsWith('image/')" :src="getUrl()" />
+
+            <a v-else :href="getUrl()">{{ text }}</a>
+
+        </div>`
 };
 
 export default Bubble;
+
+// TODO: should include other styling/actions for audio bubbles
\ No newline at end of file
index fbfb2c702379e3ac8a963f1a55812cb2356ec61b..b6879ae0ba7735da654097c4b915a8baebbab3c0 100644 (file)
@@ -1,7 +1,7 @@
 
 const Context = 
 {
-    props: ["modifier", "context", "avatar", "audio", "id"],
+    props: ["modifier", "context", "avatar", "id"],
 
     setup(props) {
         const playback = Vue.ref(false);
@@ -9,7 +9,6 @@ const Context =
         Vue.onMounted(() => {
             window.mainApi.on("playback", (id, status) => {
                 if (id === props.id) {
-                    console.log(id, status);
                     playback.value = status;
                 }
             });
@@ -25,10 +24,10 @@ const Context =
                 v-show="avatar"
                 class="context-avatar"
                 :class="{ audio: playback }"
-            >      
+            >    
+
+                <img :src="'data:image/png;base64,' + avatar" />
 
-                <img :src="avatar">
-                
             </div>
 
             {{ context }}
index 9439df8815cd182cd5b62e504bc3813354f6df4c..626746f2dca7b245dd4a3c5811afa2e1c4afdc76 100644 (file)
@@ -47,7 +47,10 @@ function useText(elementId, left, typing)
             if (e.key === "Enter" && el.value)
             {
                 window.mainApi.send("message", { 
-                    text: el.value, audio: null });
+                    category: "text/plain", 
+                    text: el.value,
+                    blob: null
+                });
                 show.value = false;
             }
         });
@@ -70,4 +73,4 @@ function useText(elementId, left, typing)
     return { leftSide, show };
 }
 
-export default useText;
\ No newline at end of file
+export default useText;
index 0bfe8e7f406d0386ddd03f67ce14bc0165edefce..5bc8144281a9f27608dc113b62dac2d034b785f5 100644 (file)
@@ -53,5 +53,3 @@ function getInitials(name)
 }
 
 export default Input;
-
-
index 28605c5cf3263ac4799b99fcdf8c050fb65e0b76..fd1b41c87a27fc9ae1942f26c4a367df1cc961ff 100644 (file)
@@ -8,7 +8,7 @@ const Message =
         Context
     },
 
-    props: ["modifier", "content", "context", "avatar", "audio", "id"],
+    props: ["modifier", "content", "context", "avatar", "id"],
 
     setup(props)
     {
@@ -19,9 +19,11 @@ const Message =
         <div :id="id" :class="'message ' + modifier + '-message'">
 
             <Bubble
-                v-for="(text, index) in content"
+                v-for="(c, index) in content"
+                :category="c.category"
+                :text="c.text"
+                :blob="c.blob"
                 :modifier="modifier"
-                :text="text"
                 :child="calcChild(index, content.length)"
             />
 
@@ -29,7 +31,6 @@ const Message =
                 :modifier="modifier"
                 :context="context"
                 :avatar="avatar"
-                :audio="audio"
                 :id="id"
             />
 
@@ -56,4 +57,4 @@ function calcChild(index, len)
   }
 }
 
-export default Message;
\ No newline at end of file
+export default Message;
index dcf009d13ac95dca78960853a1bc842e14362daa..668b50585a7e665497e4e4631f26899ec80e6f1a 100644 (file)
@@ -17,33 +17,54 @@ const Messenger = {
     setup()
     {
         const person = Vue.ref("");
-        const messages = Vue.ref([]);
-
-        Vue.onMounted(() => {
-
-            window.mainApi.on("ui-init", (ui) => {
-                person.value = ui.person;
-                messages.value = ui.messages;
+        const messages = Vue.ref([{
+            modifier: "ai",
+            content: [{
+                category: "text/html",
+                text: `<div class="mail">
+                           <h4>About HTML Parser</h4>
+                           <p>Return the text of the most recently opened start tag. This should not normally be needed for structured processing, but may be useful in dealing with HTML “as deployed” or for re-generating input with minimal changes (whitespace between attributes can be preserved, etc.).</p>
+                       </div>`,
+                blob: null
+            }],
+            context: "Email from David Spade",
+            avatar: null,
+            id: 0
+        }]);
+
+        const onDrop = async (e) => {
+            const file = e.dataTransfer.items[0].getAsFile();
+
+            const buffer = await file.arrayBuffer();
+            const b64String = await window.mainApi.invoke("encode", buffer);
+
+            window.mainApi.send("message", {
+                category: file.type,
+                text: file.name,
+                blob: b64String
             });
+        }
 
-            window.mainApi.on("ui-update", (message) => {
+        Vue.onMounted(() => {
 
-                if (message.hasOwnProperty("person"))
+            window.mainApi.on("message", (message) => {
+                if (message.person)
                 {
                     person.value = message.person;
-                    return;
+                    messages.value = message.messages;
                 }
-
-                let index = messages.value.findIndex(m => m.id===message.id);
-                if (index >= 0) 
+                else if (message.name) 
                 {
-                    messages.value[index] = message;
-                } 
-                else 
+                    person.value = message;
+                }
+                else if (message.content)
                 {
                     messages.value.push(message);
                 }
-
+                else
+                {
+                    messages.value[messages.value.length - 1].content.push(message);
+                }
             });
 
             initScroll("messenger");
@@ -54,7 +75,7 @@ const Messenger = {
             messages.value = [];
         });
 
-        return { person, messages };
+        return { person, messages, onDrop };
     },
 
     template: `
@@ -62,28 +83,20 @@ const Messenger = {
         <WS />
         <Input :person="person" />
 
-        <div id="messenger">
+        <div id="messenger"
+            @drop="onDrop($event)"
+            @dragover.prevent
+            @dragenter.prevent
+        >
             <Message
                 v-for="message in messages"
                 :modifier="message.modifier"
                 :content="message.content"
                 :context="message.context"
                 :avatar="message.avatar"
-                :audio="message.audio"
                 :id="message.id"
             />
         </div> `
 }
 
 export default Messenger;
-
-// {
-//     modifier: "ai",
-//     content: [
-//         "This is test 2\r\n"
-//     ],
-//     context: "Email from adgundersen@gmail.com",
-//     avatar: "./assets/mailAvatar.svg",
-//     audio: null,
-//     id: 0
-// }
\ No newline at end of file
index c1f9a8176e1e5ea368d78765dc45e5403b1a90d7..68d69f2579e33d1a51d857e7afb97affbc42369a 100644 (file)
@@ -4,23 +4,15 @@ const Settings =
     setup() {
         const active = Vue.ref(false);
 
-        function hideSettings(e) {
-            if (e.key == "Escape") {
-                active.value = false;
-                window.removeEventListener("keydown", hideSettings);
-            }
-        }
-
-        function showSettings() {
-            active.value = true;
-            window.addEventListener("keydown", hideSettings);
-        }
+        window.addEventListener("keydown", (e) => {
+            console.log("toggle settings");
+        })
 
-        async function logout() {
+        const logout = async () => {
             await window.mainApi.send("logout");
         }
 
-      return { showSettings, active, logout };
+      return { active, logout };
     },
 
     template: `
@@ -30,11 +22,7 @@ const Settings =
                 Logout
             </button>
 
-        </div>
-
-        <button v-else class="settings-icon" @click="showSettings">
-            <img src="./assets/settingsIcon.svg">
-        </button> `
+        </div>`
 }
 
 export default Settings;
\ No newline at end of file
index 51e599640e02bdc16d49508b2e4b414299575ff1..f25adda87d93e296a1f6d6b228ea141031281963 100644 (file)
@@ -33,6 +33,53 @@ html, body {
   z-index: 1;
 }
 
+.contacts {
+  margin: 0;
+  padding: 0;
+  border-radius: inherit;
+  background-color: #DBDBDB;
+}
+
+.contacts > li {
+  padding: 12px;
+  display: flex; 
+}
+
+.contacts img {
+  border-radius: 50%;
+}
+
+.contacts .info {
+  margin-left: 10px;
+  margin-right: 10px;
+}
+
+.contacts .name {
+
+}
+
+.contacts .email {
+  font-family: SF Compact Display;
+  font-weight: bold;
+  font-size: 12px;
+  color: #898989;
+}
+
+.mail {
+  padding: 12px;
+  margin: 0px;
+  background-color: #D6F2FF;
+  border-radius: inherit;
+}
+
+.mail h4 {
+  margin-top: 0px;
+}
+
+.mail p {
+  margin-bottom: 0px;
+}
+
 #header-menu {
   position: fixed;
   margin-left: 20px;
@@ -389,7 +436,6 @@ html, body {
   max-width: 66vw;
   font-family: "SF Pro Text";
   font-size: 14px;
-  padding: 10px;
   border-radius: 18px;
   margin-bottom: 4px;
 }
@@ -431,15 +477,29 @@ html, body {
   border-top-right-radius: 9px;
 }
 
-.bubble-notify {
-  position: absolute;
-  width: 12px;
-  height: 12px;
-  border-radius: 50%;
-  background-color: #58D9FF;
-  top: -5px;
-  left: -5px;
-  border: 2px solid #EBEBEB;
+.bubble > p {
+  margin: 0px;
+  padding: 10px;
+}
+
+.bubble > div {
+  border-radius: inherit;
+}
+
+.bubble > img {
+  border-radius: inherit;
+  display: block;
+  max-width: inherit;
+}
+
+.bubble a {
+  border-radius: inherit;
+  font-family: "SF Compact Rounded";
+  background-color: #D9D9D9;
+  font-weight: bold;
+  padding: 12px;
+  color: #727272;
+  margin: 0px;
 }
 
 .context {
@@ -472,6 +532,10 @@ html, body {
   margin-right: 5px;
 }
 
+.context-avatar img {
+  border-radius: 50%;
+}
+
 /* ---------- shared between components ---------- */
 
 .button {
index 93bd7e65124af0bde23ee7d2899c964bb8dc96c2..9b50adf51a4c028fade4458613e22a3a2925c752 100644 (file)
@@ -4,8 +4,7 @@ const { contextBridge, ipcRenderer } = require("electron");
 
 const validFromMainChannels = [
     "set-account", 
-    "ui-init", 
-    "ui-update",
+    "message", 
     "ws-status",
     "record",
     "playback"
@@ -14,9 +13,10 @@ const validFromMainChannels = [
 const validToMain = [
     "messenger",
     "message",
-    "nav-bar",
     "login",
-    "logout"
+    "logout",
+    "encode",
+    "decode"
 ]
 
 ipcRenderer.setMaxListeners(250);
index 9fcbf114ac4b7dfc41e6301bbe3917753f015b46..08ece17a3c032dc5736d15fcdea69de484b83a33 100644 (file)
@@ -7,78 +7,91 @@ const { initAudio, terminateAudio, playback, streamState } = require("./audio");
 
 let ui; /* wait to receive ui from the platform */
 
-const updateQueue = [];
+const messageQueue = [];
 
 let processContentId;
 
-backgroundMitt.on("ws-message", (message) => 
-{
-    if (message.hasOwnProperty("ui"))
-    {
-        ui = message.ui;
-        ipcEmit("ui-init", ui);
-    }
-    else if (message.hasOwnProperty("person"))
-    {
-        ui.person = message.person;
-        ipcEmit("ui-update", message);
-    }
-    else
-    {
-        updateQueue.push(message);
-    }
-});
+/* Possible messages:
+ *    - New UI (set ui)
+ *    - New message (add message to ui.messages)
+ *    - New content (add content to existing message)
+ *    - Update person
+ */
+backgroundMitt.on("message", (message) => messageQueue.push(message));
 
-function handleMessage()
+function handleMessageQueue()
 {
-    if (!streamState.pb && !streamState.rec) /* if user is not "busy" */
+    if (!streamState.pb && !streamState.rec)
     {
-        const message = updateQueue.shift();
-        if (message)
+        const update = messageQueue.shift();
+
+        if (update)
         {
-            let index = ui.messages.findIndex(m => m.id === message.id);
+            console.log("Handling UI Update:", update);
 
-            if (index >= 0)
+            if (update.person)
             {
-                ui.messages[index] = message;
+                ui = update;
             }
-            else
+            else if (update.name)
             {
-                ui.messages.push(message)
+                ui.person = update;
             }
-
-            if (message.modifier === "ai" && !store.get("focus"))
+            else if (update.content)
+            {
+                ui.messages.push(update); 
+            }
+            else
             {
-                new Notification({title: message.context, body: message.content[message.content.length - 1]}).show();
+                ui.messages[ui.messages.length - 1].content.push(update); 
             }
 
-            ipcEmit("ui-update", message);
+            ipcEmit("message", update);
 
-            if (message.audio) playback(message.audio, message.id);
+            // notify();
         }
     }
 }
 
+
+function notify()
+{
+    const message = ui.messages[ui.messages.length - 1];
+
+    const content = message.content[message.content.length -1];
+
+    new Notification(
+    {
+        title: message.context, 
+        body: content.text
+    }
+    ).show();
+
+    if (content.category == "audio/L16") playback(content.blob, message.id);
+}
+
 function launchSession(account)
 {
     connectToPlatform(account);
-    initAudio();
-    processContentId = setInterval(handleMessage, 100);
+    // initAudio();
+    processContentId = setInterval(handleMessageQueue, 100);
 }
 
 function endSession()
 {
     clearInterval(processContentId);
-    terminateAudio();
+    // terminateAudio();
     disconnectFromPlatform();
     ui = null;
 }
 
 ipcMain.on("messenger", () => {
     if (ui) {
-        ipcEmit("ui-init", ui);
+        ipcEmit("message", ui);
     }
 });
 
 exports.launchSession = launchSession;
 exports.endSession = endSession;
+
+// ui.messages[ui.messages.findIndex(m => m.id === message.id)].content.push(message);
index 15258192bad398fe6594a216b364da1206c4f38c..77db4ea38b9b1dd10926f12b2bf235f8804a672c 100644 (file)
@@ -20,12 +20,29 @@ function updateWindowPosition()
     })
 }
 
-// Called when a NavBar button is pressed.
-function onNavBar(_e, cmd) 
+
+function createPreviewWin(_e, content)
 {
-    cmd === "close" ? win.close() : win.minimize();
+    console.log("Creating preview window");
+
+    const preview = new BrowserWindow({
+        width:           500,
+        height:          300,
+        x:               null,
+        y:               null,
+        resizable:       true,
+        frame:           false,
+        webPreferences:  { preload: path.join(__dirname, "/render/preload.js") }
+    });
+    
+    preview.loadFile(path.join(__dirname, "preview.html"));
+
+    preview.webContents.on("did-finish-load", () => {
+        preview.webContents.send("preview-init", content);
+    });
 }
 
+
 function createWin()
 {
     if (win) return;
@@ -75,7 +92,6 @@ function createWin()
     });
 }
 
-ipcMain.on("nav-bar", onNavBar);
-ipcMain.on("create-win", createWin);
+ipcMain.on("preview", createPreviewWin);
 
 exports.createWin = createWin;