save messages on window close
This commit is contained in:
parent
61253f9cc2
commit
006a5d3d1c
4 changed files with 72 additions and 33 deletions
|
|
@ -25,8 +25,8 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
|
import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
|
||||||
import { useIpc } from "@/modules/ipc";
|
import { useIpc } from "@/modules/ipc";
|
||||||
import { useAuth } from "@/modules/auth";
|
|
||||||
import Splash from "@/components/splash.vue"
|
import Splash from "@/components/splash.vue"
|
||||||
|
import useMessages from '@/modules/messages';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { Splash },
|
components: { Splash },
|
||||||
|
|
@ -34,6 +34,7 @@ export default defineComponent({
|
||||||
setup() {
|
setup() {
|
||||||
const { invoke } = useIpc();
|
const { invoke } = useIpc();
|
||||||
const ready = ref(false);
|
const ready = ref(false);
|
||||||
|
const { saveMessages } = useMessages();
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
window.ipcRenderer.on('window-ready', (_event, payload: {message: boolean}) => {
|
window.ipcRenderer.on('window-ready', (_event, payload: {message: boolean}) => {
|
||||||
|
|
@ -46,6 +47,12 @@ export default defineComponent({
|
||||||
})
|
})
|
||||||
|
|
||||||
const callNavbar = (action: string) => {
|
const callNavbar = (action: string) => {
|
||||||
|
|
||||||
|
// save messages before closing.
|
||||||
|
if (action === 'close') {
|
||||||
|
saveMessages();
|
||||||
|
}
|
||||||
|
|
||||||
invoke('nav-bar', action);
|
invoke('nav-bar', action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
41
src/modules/messages.ts
Normal file
41
src/modules/messages.ts
Normal file
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -30,34 +30,34 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, reactive, ref, onMounted, onUnmounted } from "vue";
|
import { defineComponent, ref, onMounted, onUnmounted } from "vue";
|
||||||
import { RenderMessage , Annotation } from "@/types/message/index";
|
|
||||||
import MessageItem from "@/components/messageItem.vue";
|
import MessageItem from "@/components/messageItem.vue";
|
||||||
import InputItem from "@/components/inputItem/inputItem.vue";
|
import InputItem from "@/components/inputItem/inputItem.vue";
|
||||||
import useMitt from "@/modules/mitt";
|
import useMitt from "@/modules/mitt";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { useAuth } from "@/modules/auth";
|
import { useAuth } from "@/modules/auth";
|
||||||
import { useIpc } from "@/modules/ipc";
|
import { useIpc } from "@/modules/ipc";
|
||||||
|
import useMessages from '@/modules/messages';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "Messenger",
|
name: "Messenger",
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
MessageItem,
|
MessageItem,
|
||||||
InputItem,
|
InputItem,
|
||||||
},
|
},
|
||||||
|
|
||||||
setup() {
|
setup() {
|
||||||
|
|
||||||
const { post } = useIpc();
|
const { post } = useIpc();
|
||||||
const { logout } = useAuth();
|
const { logout } = useAuth();
|
||||||
const router = useRouter();
|
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);
|
const toggleSettings = ref(false);
|
||||||
|
|
||||||
// Listen for escape key to close settings.
|
// Listen for escape key to close settings.
|
||||||
const onEscape = (e: any) => {
|
const onEscape = (e: KeyboardEvent) => {
|
||||||
if(e.key === "Escape") {
|
if(e.key === "Escape") {
|
||||||
toggleSettings.value = false;
|
toggleSettings.value = false;
|
||||||
}
|
}
|
||||||
|
|
@ -74,42 +74,24 @@ export default defineComponent({
|
||||||
const onLogout = () => {
|
const onLogout = () => {
|
||||||
logout();
|
logout();
|
||||||
router.push({ name: "login" });
|
router.push({ name: "login" });
|
||||||
post("logout", "")
|
post("logout", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
const { emitter } = useMitt();
|
const onRenderMessage = (_event: any, payload: any) => {
|
||||||
|
|
||||||
// List of messages in the view.
|
|
||||||
// Oldest message first.
|
|
||||||
const messages = reactive(new Map());
|
|
||||||
|
|
||||||
let m: RenderMessage | Annotation;
|
|
||||||
|
|
||||||
const onRenderMessage = (event: any, payload: any) => {
|
|
||||||
|
|
||||||
// render message if there is content.
|
// render message if there is content.
|
||||||
if (payload.message.content) {
|
if (payload.message.content) {
|
||||||
m = payload.message as RenderMessage;
|
addMessage(payload.message);
|
||||||
|
|
||||||
messages.set(m.uid, m);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// must be an annotation, update messages.
|
// must be an annotation, update message.
|
||||||
m = payload.message as Annotation;
|
updateMessage(payload.message);
|
||||||
|
|
||||||
if (messages.has(m.uid)) {
|
|
||||||
messages.get(m.uid).context = m.context;
|
|
||||||
messages.get(m.uid).content.text = m.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleSettings.value = false;
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
emitter.on('self-message', (message) => messages.set(message.uid, message));
|
|
||||||
// Listen for new messages to render.
|
// Listen for new messages to render.
|
||||||
|
emitter.on('self-message', (message) => addMessage(message));
|
||||||
window.ipcRenderer.on("render-message", onRenderMessage);
|
window.ipcRenderer.on("render-message", onRenderMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ const WebSocket = require("ws");
|
||||||
const wss = new WebSocket.Server({
|
const wss = new WebSocket.Server({
|
||||||
port: 8760
|
port: 8760
|
||||||
});
|
});
|
||||||
|
let auth = false;
|
||||||
|
|
||||||
wss.on("connection", function connection(ws, req) {
|
wss.on("connection", function connection(ws, req) {
|
||||||
ws.on("message", function incoming(message) {
|
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") {
|
} else if (message instanceof String || typeof message === "string") {
|
||||||
// audio message
|
// audio message
|
||||||
console.log('caught the token', 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 {
|
} else {
|
||||||
const parsed = JSON.parse(message);
|
const parsed = JSON.parse(message);
|
||||||
console.log('parsed', parsed)
|
console.log('parsed', parsed)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue