import API from "@/services/imapAPI"; import { createStore } from "vuex"; import Room from "./models/Room"; const store = createStore({ state() { return { rooms: [ new Room(1, "clemence", 0, "Est ex adipisicing non ipsum voluptate duis enim adipisicing labore.", 1), new Room(2, "laurance", 0, "Est ex adipisicing non ipsum voluptate duis enim adipisicing labore.", 2), new Room(3, "mathilde", 0, "Est ex adipisicing non ipsum voluptate duis enim adipisicing labore.", 1), ], messages: [], mailboxes: [], activeMailbox: 0, activeRoom: 0, }; }, mutations: { setActiveMailbox(state, payload) { state.activeMailbox = payload; // todo call actions // fetch rooms for this mailboxes if not already fetched const mailbox = state.mailboxes.find((mailbox) => mailbox.id == payload); // todo fetched mailbox all if (mailbox?.fetched == false) { console.log(payload) API.getRooms(payload) .then((res) => { // todo add if not exist console.log(res.data) mailbox.fetched = true; res.data.forEach((room) => { state.rooms.push(new Room(room.id, room.user, room.userId, room.roomName, room.mailboxId)); }); }) .catch((err) => { console.log(err); }); } }, setActiveRoom(state, payload) { state.activeRoom = payload; // todo call actions // fetch messages for this room if not already fetched const room = state.rooms.find((room) => room.id == payload); if (!room || room?.fetched == false) { console.log("add messages"); API.getMessages(payload) .then((res) => { // todo add if not exist room.fetched = true; res.data.forEach((msg) => { state.messages.push(msg); }); }) .catch((err) => { console.log(err); }); } }, addMailboxes(state, payload) { console.log(payload) payload.forEach((mailbox) => { mailbox.fetched = false; state.mailboxes.push(mailbox); }); }, addMessages(state, payload) { const room = state.rooms.find((room) => room.id == payload.roomId); payload.messages.forEach((message) => { room.messages.push(message); }); room.messagesFetched = true; console.log(room.messages) }, }, getters: { rooms: (state) => () => { if (state.activeMailbox === 0) return state.rooms; return state.rooms.filter((room) => room.mailboxId == state.activeMailbox); }, messages: (state) => (roomId) => { const room = state.rooms.find((room) => room.id == roomId); if (!room.messagesFetched) { console.log("fetched Messages") store.dispatch("fetchMessages", { roomId: room.id }); } return room.messages; }, }, actions: { fetchMailboxes: async (context) => { API.getAccounts() .then((res) => { context.commit("addMailboxes", res.data); }) .catch((err) => { console.log(err); }); }, fetchMessages: async (context, data) => { API.getMessages(data.roomId) .then((res) => { console.log(res.data) context.commit("addMessages", { messages: res.data, roomId: data.roomId }); }) .catch((err) => { console.log(err); }); }, }, }); export default store;