]> Repos - mime-chat/commitdiff
merged stashed changes into main
authorAndrew Gundersen <gundersena@xavier.edu>
Wed, 24 Feb 2021 19:12:46 +0000 (13:12 -0600)
committerAndrew Gundersen <gundersena@xavier.edu>
Wed, 24 Feb 2021 19:12:46 +0000 (13:12 -0600)
17 files changed:
src/background/run.ts
src/background/session.ts
src/components/messageView/anime.ts [moved from src/components/messageView/viewDetails/anime.ts with 100% similarity]
src/components/messageView/messageView.vue [new file with mode: 0644]
src/components/messageView/offsetCalculator.ts [moved from src/components/messageView/viewDetails/offsetCalculator.ts with 100% similarity]
src/components/messageView/textBubble.vue [new file with mode: 0644]
src/components/messageView/textBubble/computed.ts [new file with mode: 0644]
src/components/messageView/textBubble/drawer.ts [moved from src/components/textBubble/bubbleDetails/drawer.ts with 100% similarity]
src/components/messageView/textBubble/textBubble.vue [moved from src/components/textBubble/index.vue with 70% similarity]
src/components/messageView/transitions.ts [moved from src/components/messageView/viewDetails/transitions.ts with 91% similarity]
src/components/taInput/inputController.ts
src/components/taInput/textDetails/text.vue
src/components/textBubble/bubbleDetails/computed.ts
src/modules/scrollView.ts
src/router.ts
src/views/home.vue [deleted file]
src/views/messenger.vue [new file with mode: 0644]

index eeafe21f423fd4fa0ec0066a67fcde62a9057fc3..d0cfde18efa10a1414b34779e1ecd66c4e0e959f 100644 (file)
@@ -23,6 +23,6 @@ export async function main() {
     socket = true;
 
     // Begin audio stream.
-    initRecorder();
+    // initRecorder();
 
 }
index ccf36e31afa759754827ca910031bc0a497f5d19..d2efc0befa1316336c28b9eea522ae96213ebcf4 100644 (file)
@@ -24,7 +24,7 @@ interface TextMessage {
 }
 
 const ip = 'ws://127.0.0.1';
-const port = 8081;
+const port = 8760;
 const reconnectTimeout = 3000; //ms
 let socket: WebSocket;
 let success = false;
diff --git a/src/components/messageView/messageView.vue b/src/components/messageView/messageView.vue
new file mode 100644 (file)
index 0000000..5b19dfa
--- /dev/null
@@ -0,0 +1,120 @@
+<!-- components/messageView/messageView.vue -->
+
+<template>
+
+  <svg 
+    xmlns="http://www.w3.org/2000/svg" 
+    width="500" 
+    height="500" 
+    viewBox="0 0 500 500"
+  >
+
+    <g id="messengerGroup">
+
+      <!-- Messages view bounding box -->
+      <rect id="messagesView" data-name="Rectangle 1496" width="500" height="500" rx="15" fill="#ff8e8e"/>
+
+      <!-- List of messages -->
+      <g id="messages" v-for="(item, index) in renderArr" :key="index">
+
+        <transition
+          appear
+          v-on:before-appear="get"
+          v-on:appear="enter"
+          v-on:after-enter="afterEnter"
+        >
+          <TextBubble :item="item" :key="index" />
+        </transition>
+
+      </g>
+
+    </g>
+
+  </svg>
+
+<!--   <svg
+    version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+  >
+    <g id="messagesView">
+      <g v-for="(item, index) in renderArr" :key="index" preserverAspectRatio="none">
+        <transition
+          appear
+          v-on:before-appear="beforeEnter"
+          v-on:appear="enter"
+          v-on:after-enter="afterEnter"
+        >
+          <TextBubble :item="item" :key="index" />
+        </transition>
+      </g>
+    </g>
+  </svg> -->
+</template>
+
+<script lang="ts">
+import TextBubble from "@/components/textBubble/index.vue";
+import { Message } from "@/types/message/index";
+import { Queue } from "@/modules/queue";
+import useTransitions from "./viewDetails/transitions";
+import useScrollView from "@/modules/scrollView";
+import { defineComponent, reactive, onMounted, onUnmounted, watch } from "vue";
+
+export default defineComponent({
+  name: "MessageView",
+  components: { TextBubble },
+
+  setup() {
+    const renderArr: Message[] = reactive([]);
+    const renderQ = new Queue();
+
+    // Each method will be called on their respective lifecycle event.
+    const { beforeEnter, enter, afterEnter, rendering } = useTransitions();
+    // const { scrollView } = useScrollView({
+    //   targetId: "messageView",
+    // });
+
+    const render = (m: Message) => {
+      if (rendering.value) {
+        renderQ.enqueue(m);
+      } else {
+        renderArr.push(m);
+      }
+    };
+
+    watch(rendering, (rendering, _prevRendering) => {
+      if (!rendering) {
+        const m = renderQ.dequeue() as Message | null;
+        if (m) renderArr.push(m);
+      }
+    });
+
+    onMounted(() => {
+      window.ipcRenderer.on("render-message", (event, payload) => {
+        const m = payload.message;
+        if (m.content) render(m);
+      });
+
+    });
+
+    onUnmounted(() => {
+      window.ipcRenderer.removeAllListeners("render-message");
+    });
+
+    return {
+      renderArr,
+      beforeEnter,
+      enter,
+      afterEnter,
+    };
+  },
+});
+</script>
+
+<style lang="scss" scoped>
+#messageView {
+  width: 1000px;
+  height: 100vh;
+  color: red;
+}
+</style>
diff --git a/src/components/messageView/textBubble.vue b/src/components/messageView/textBubble.vue
new file mode 100644 (file)
index 0000000..3e02ebb
--- /dev/null
@@ -0,0 +1,83 @@
+<template>
+
+  <svg 
+    xmlns="http://www.w3.org/2000/svg" 
+    width="width" 
+    height="height" 
+    viewBox="0 0 100 46"
+  >
+
+    <rect 
+      :id="item.id"
+      :class="item.modifier" 
+      :transform="position"
+
+      width="width" height="height" rx="10" fill="#58c4fd"
+    />
+
+  </svg>
+
+</template>
+
+<script lang="ts">
+
+import { defineComponent, computed, onMounted, ref, reactive } from "vue";
+
+export default defineComponent({
+  name: "TextBubble",
+
+  props: {
+
+    // Passing in the message contents.
+    message: {
+      type: Object,
+      required: true,
+    },
+
+  },
+
+  setup(props) {
+
+    // The position of the bubble.
+    const position = ref()
+
+    // Calculate the position.
+    computed(() => {
+
+      const calculateX = () => {
+        let x = 20 // side-padding
+
+        if (props.message.modifier == 'sf') {
+          x = window.innerWidth - 100 - 20
+        }
+
+        return x
+      }
+
+      const calculateY = () => {
+        let y = 45 // top-padding
+
+        if (previousMessage) {
+          prev = document.getElementById(previousMessage)
+          prevPosition = prev.getBoundingClientRect().height
+
+          y = prevPosition + 15 // message-message padding
+        }
+
+        return y
+      }
+
+      let X = calculateX();
+      let Y = calculateY();
+
+      position.value = `translate(${X} ${Y})`;
+
+    })
+
+    return {
+      position
+    }
+  },
+
+});
+</script>
diff --git a/src/components/messageView/textBubble/computed.ts b/src/components/messageView/textBubble/computed.ts
new file mode 100644 (file)
index 0000000..c6a9c86
--- /dev/null
@@ -0,0 +1,79 @@
+import { computed, onMounted, ref } from "vue";
+
+/**
+ * single message svg item computed properties
+ */
+export default function useComputedBubble(m: string, id: string) {
+    const yMargin = 0;
+    const messageMargin = 20;
+    const messageWidth = ref(0);
+
+
+    // const textFill = computed(() => {
+    //     switch (m) {
+    //         case "sf":
+    //             return "#fff";
+    //         default:
+    //             return "#000";
+    //     }
+    // });
+
+    // const bubbleFill = computed(() => {
+    //     switch (m) {
+    //         case "sf":
+    //             return "#61b4f4";
+    //         default:
+    //             return "#fff";
+    //     }
+    // });
+
+    // const setMessageWidthRef = () => {
+    //     const msg = document.getElementById(id);
+
+    //     if (msg) {
+    //         messageWidth.value = msg.getBoundingClientRect().width;
+    //     }
+
+    // }
+
+    const calculateXoffset = (w: number) => {
+        let offset = messageMargin;
+
+        // If self message, render on righthand side.
+        if (m == "sf") {
+            offset = w - messageMargin - 232
+
+        // Else, render on left.
+        }
+
+        console.log(`${m} : ${offset}`);
+        return offset
+    }
+
+    const calculateYoffset = (h: number) => {
+
+        // Bubble will render a little bit below the screen.
+        return h + yMargin
+    }
+
+    // Where the textBubble is going to initially render.
+    const startingOffset = computed(() => {
+
+        // Get current dimensions of the messenger.
+        const parentView = document.getElementById('messagesView');
+
+        if (parentView) {
+            const dimensions = parentView.getBoundingClientRect();
+
+            let X = calculateXoffset(dimensions.width);
+            let Y = calculateYoffset(dimensions.height);
+
+            return `translate(${X} ${Y})`;
+        }
+
+    });
+
+    return {
+        startingOffset
+    };
+}
similarity index 70%
rename from src/components/textBubble/index.vue
rename to src/components/messageView/textBubble/textBubble.vue
index 5ac976f21956fac94a2e9c9d305a3609663ed180..fd778f910339532fd47dfe058dde050aea1caaaa 100644 (file)
@@ -1,9 +1,30 @@
 <template>
-  <g :id="item.id" :class="item.modifier" :transform="startingOffset">
-    <rect ref="messageRect" x="30" y="10" width="196" height="63" rx="10" :fill="bubbleFill" />
-    <text font-size="14" font-family="SF Pro Text" ref="messageText" :fill="textFill">
-      <tspan dy="16" x="0" v-for="(item, index) in textArr" :key="index">{{ item }}</tspan>
+  <g 
+    :id="item.id" 
+    :class="item.modifier" 
+    :transform="startingOffset"
+  >
+    <rect 
+      ref="messageRect" 
+      x="30"
+      y="10" 
+      width="196" 
+      height="63"
+      rx="10" 
+      :fill="bubbleFill" 
+    />
+    <text 
+      font-size="14" 
+      font-family="SF Pro Text" 
+      ref="messageText" 
+      :fill="textFill">
+
+      <tspan dy="16" x="0" v-for="(item, index) in textArr" :key="index">
+        {{ item }}
+      </tspan>
+
     </text>
+
     <g :transform="signatureTranslate">
       <text
         transform="translate(0, 5)"
         font-family="SFCompactDisplay-Bold, SF Compact Display"
         font-weight="700"
       >
-        <tspan xml:space="preserve">{{ item.context }}</tspan>
+
+        <tspan xml:space="preserve">
+          {{ item.context }}
+        </tspan>
+
       </text>
+
       <text
         transform="translate(0, 20)"
         fill="#6f6f6f"
         font-size="9"
         font-family="SFCompactDisplay, SF Compact Display"
       >
-        <tspan v-if="item.subContext">{{item.subContext}}</tspan>
+
+        <tspan v-if="item.subContext">
+          {{item.subContext}}
+        </tspan>
+
       </text>
     </g>
   </g>
 </template>
 
 <script lang="ts">
-import useComputedBubble from "./bubbleDetails/computed";
-import useBubbleDrawer from "./bubbleDetails/drawer";
+
+import useBubbleDrawer from "./drawer";
+import useComputedBubble from "./computed";
+
 import useTextWrap from "@/modules/textWrap";
+
 import { defineComponent, onMounted, ref, reactive } from "vue";
 
 export default defineComponent({
@@ -47,10 +80,12 @@ export default defineComponent({
     const messageRect = ref(`message${msgID.value}`);
     const messageText = ref(`text${msgID.value}`);
 
+    // Visual attribues of bubble.
     const { textFill, bubbleFill, startingOffset } = useComputedBubble(
       props.item.modifier,
       props.item.id
     );
+
     const { textWrap } = useTextWrap();
     const { drawMessage, signatureTranslate } = useBubbleDrawer({
       mr: messageRect,
similarity index 91%
rename from src/components/messageView/viewDetails/transitions.ts
rename to src/components/messageView/transitions.ts
index bd3ce6dc658eacab9e0bb9cf9dec70dcce7785d1..43e3078c35fa606fed6150132e6acf28c823032c 100644 (file)
@@ -47,6 +47,17 @@ export default function useTransitions() {
         rendering.value = false;
     }
 
+    // const beforeEnter: VueTransitionCallback = () => {
+    //     const parentView = document.getElementById('messagesView');
+
+    //     if (parentView) {
+    //         const dimensions = parentView.getBoundingClientRect();
+
+    //     }
+    // }
+
+
+
     // Get height of messageView.
     const beforeEnter: VueTransitionCallback = () => {
         rendering.value = true;
index 1f79bb21ddf5d325e5f5924f2b5aa771969ed4a6..d95f7dc97fd5c095948ce7b9bb7a81d0d8d0ad45 100644 (file)
@@ -29,6 +29,7 @@ export default function useInputController() {
             audio: 0,
             text: input
         };
+<<<<<<< Updated upstream
 
         // trigger send animation
         emitter.emit("animate-send");
@@ -39,6 +40,13 @@ export default function useInputController() {
 
     const {
         visualizeStreamAsPaths,
+=======
+        emitter.emit("animate-send", message);
+    }
+
+    const { 
+        visualizeStreamAsPaths, 
+>>>>>>> Stashed changes
         expandBubble
     } = useAudioVisualizer(visualizeStream);
 
index eb16b7748e32ed4dc2ea91ab043534e1ae461bf7..dbede01c8a7f5b72f6d1341c2831fb7f6f0d824b 100644 (file)
@@ -35,6 +35,7 @@ export default defineComponent({
 
 <style lang="scss" scoped>
 .inputBubble {
+  position: fixed;
 
   max-width: 180px;
   min-height: 32px;
@@ -47,6 +48,9 @@ export default defineComponent({
 
   font-size: 14px;
 
+  bottom: 20px;
+  margin-left: 50%;
+
   p {
     max-width: 150px;
     overflow-wrap: break-word;
index fb660c4072dbc53f09d5839a1457cd02412c272c..7c3eacffcde9cd67e6fa24ed2d65aea9a81ce326 100644 (file)
@@ -7,7 +7,7 @@ export default function useComputedBubble(m: string, id: string) {
     const x = ref(0)
     const paddingLeft = 30;
 
-    const winW = 350;
+    let winW = 350;
     const messageWidth = ref(0);
     const messageMarginTop = 75;
 
@@ -29,6 +29,13 @@ export default function useComputedBubble(m: string, id: string) {
         }
     });
 
+    const updatewinW = computed(() => {
+        const parentView = document.getElementById('messageView');
+        if (parentView) {
+            winW = parentView.getBoundingClientRect().width;
+        }
+    })
+
     const setMessageWidthRef = async () => {
         const msg = await document.getElementById(id);
         if (msg) {
index 7184f72157fe1eaeda73346942ef706901a40d90..271d6b9c585484ce3b635ca172784855d9e37e62 100644 (file)
@@ -50,6 +50,9 @@ export default function useScrollView({ targetId }: { targetId: string }) {
       const heightResult = getHeight();
       const widthResult = getWidth();
 
+      console.log(heightResult);
+      console.log(widthResult);
+
       if (heightResult) {
         // only scroll if renderer scrollStart
         if (heightResult > scrollStartHeight) {
@@ -66,7 +69,7 @@ export default function useScrollView({ targetId }: { targetId: string }) {
   }
 
   onMounted(() => {
-    scrollTarget = document.getElementById(targetId);
+    scrollTarget = document.getElementById("targetId");
     if (scrollTarget) {
       window.addEventListener("wheel", scrollUpdate);
     }
index 8f24e80ca79baea85e06a7aacfcf33c113162437..d3459dc8813a36d2113a84019344cbb0fc85bd17 100644 (file)
@@ -4,7 +4,7 @@ import {
   createWebHashHistory,
   RouteRecordRaw
 } from "vue-router";
-import Home from "@/views/home.vue";
+import Home from "@/views/messenger.vue";
 import Splash from "@/views/splash.vue";
 import { useAuth } from '@/modules/auth';
 
diff --git a/src/views/home.vue b/src/views/home.vue
deleted file mode 100644 (file)
index 401b35a..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<template>
-  <svg
-    id="messenger"
-    version="1.1"
-    xmlns="http://www.w3.org/2000/svg"
-    xmlns:xlink="http://www.w3.org/1999/xlink"
-    @click="emittMessage"
-  >
-    <MessageView />
-    <TextAudioInput />
-  </svg>
-</template>
-
-<script lang="ts">
-
-// Home consists on MessageView and Text/Audio imput component.
-import MessageView from "@/components/messageView/index.vue";
-import TextAudioInput from "@/components/taInput/index.vue";
-
-import { defineComponent } from "vue";
-
-export default defineComponent({
-  name: "Messenger",
-  components: { MessageView, TextAudioInput },
-});
-
-</script>
-
-<style lang="scss" scoped>
-
-  #messenger {
-    width: 100vw;
-    height: 100vh;
-    background-color: #EBEBEB;
-  }
-
-</style>
diff --git a/src/views/messenger.vue b/src/views/messenger.vue
new file mode 100644 (file)
index 0000000..c15f332
--- /dev/null
@@ -0,0 +1,67 @@
+<template>
+
+    <TextAudioInput />
+
+    <!-- List of text bubbles. -->
+    <div id="messenger" v-for="message in messages">
+      <!-- <TextBubble :message="message"/> -->
+      <div>Hello</div>
+    </div>
+
+</template>
+
+<script lang="ts">
+
+import { defineComponent, reactive, onMounted } from "vue";
+
+import TextAudioInput from "@/components/taInput/index.vue";
+// import TextBubble from "@/components/messageView/textBubble.vue";
+import { Message } from "@/types/message/index";
+
+export default defineComponent({
+  name: "Messenger",
+
+  components: { 
+    // TextBubble
+    TextAudioInput 
+  },
+
+  setup() {
+
+    // List of messages in the view.
+    const messages: Message[] = reactive([])
+
+    // Render a message.
+    const render = (message: Message) => {
+      messages.push(message)
+    }
+
+    onMounted(() => {
+
+      // Listen for new messages to render.
+      window.ipcRenderer.on("render-message", (event, payload) => {
+        if (payload.message.content) render(payload.message);
+      });
+
+    })
+
+    return {
+      messages
+    }
+
+  }
+
+});
+
+</script>
+
+<style lang="scss" scoped>
+
+  #messenger {
+    width: 100vw;
+    height: 100vh;
+
+    background-color: #EBEBEB;
+  }
+
+</style>