import Vue from 'vue'; import Vuex, { Store } from "vuex"; import Services from '../services'; import CallManager, { ECallEvents } from "./classes/call.manager"; import WebsocketService from './scripts/websocket.service'; import { createContext } from 'vm'; Vue.use(Vuex); const store = new Store({ strict: true, state: { inCall: false, callManager: null as CallManager, user: { name: 'loading...', is_admin: false, id: null, books: [] }, notifications: [] }, getters: { user(state) { return state.user; }, notifications(state) { return state.notifications; }, callManager(state): CallManager { return state.callManager; }, inCall(state) { return state.inCall; } }, mutations: { setUser(state, user) { state.user = user; }, notify(state, notification) { const id = Math.ceil(Math.random() * 1000); state.notifications.push({ ...notification, id }); const dispatch = this.dispatch; setTimeout(() => { dispatch("dismissNotification", id); }, 5000); }, dismissNotification(state, noteId: number) { state.notifications = state.notifications.filter(n => n.id != noteId); }, callEnded(state) { state.callManager = null; state.inCall = false; }, connectToCall(state, options: { callId: number, ws: any }) { state.callManager = new CallManager(options.ws, options.callId, state.user.id); state.inCall = true; } }, actions: { async getUser(ctx, userId?: number) { const user = await Services.ApiService.getUser(userId); ctx.commit('setUser', user); }, notify(ctx, notification: { message: string, level?: "info" | "warning" | "success" | "danger" }) { ctx.commit("notify", notification); }, dismissNotification(ctx, id: number) { ctx.commit("dismissNotification", id); }, callEnded(ctx) { ctx.commit('callEnded'); }, async connectToCall(ctx, callId: string) { if (!ctx.state.inCall) { const ws = await WebsocketService.getInstance(); ctx.commit('connectToCall', { callId, ws }); return true; } return false; } } }); export default store;