mail/front/src/store/store.js

117 lines
4.2 KiB
JavaScript

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;