diff --git a/plugins/socket.client.ts b/plugins/socket.client.ts index 29c1c31..5467fb1 100644 --- a/plugins/socket.client.ts +++ b/plugins/socket.client.ts @@ -1,9 +1,19 @@ import io from 'socket.io-client'; +import { useUserStore } from '~/stores/userStore'; export default defineNuxtPlugin(() => { - const socket = io('http://localhost:3000', { - auth: (cb) => cb({ token: useCookie('sessionToken').value }) - }); + const { $listen } = useNuxtApp(); + + async function initializeSocket() { + await useUserStore().userLoggedIn; + return io('http://localhost:3000', { + auth: (cb) => cb({ token: useCookie('sessionToken').value }) + }); + } + + const socket = initializeSocket(); + + $listen('userLogout', initializeSocket); return { provide: { diff --git a/server/middleware/socket.ts b/server/middleware/socket.ts index 9198d93..23fb917 100755 --- a/server/middleware/socket.ts +++ b/server/middleware/socket.ts @@ -12,6 +12,8 @@ export default defineEventHandler(({ node }) => { global.io.on('connection', async (socket: Socket) => { const token = socket.handshake.auth.token; + console.log(token); + if (!token) { socket.disconnect(); return; diff --git a/stores/userStore.ts b/stores/userStore.ts index 00bd5b7..3a2295f 100644 --- a/stores/userStore.ts +++ b/stores/userStore.ts @@ -5,18 +5,42 @@ export const useUserStore = defineStore('userStore', { user: null as SafeUser | null, isLoggedIn: false, }), + getters: { + // computed property that returns a promise that resolves when the user logs in + userLoggedIn() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const that = this; + + return new Promise(resolve => { + function checkFlag() { + if(that.isLoggedIn === true) { + resolve(true); + } + + setTimeout(checkFlag, 100); + } + checkFlag(); + }); + }, + }, actions: { setUser(user: SafeUser) { this.user = user; this.isLoggedIn = true; }, async logout() { + const { $io, $emit } = useNuxtApp(); + + (await $io).disconnect(); await $fetch('/api/user/logout'); useCookie('sessionToken').value = null; useCookie('userId').value = null; this.user = null; this.isLoggedIn = false; + + $emit('userLogout', true); + return navigateTo('/login'); } }