Compare commits

..

38 Commits

Author SHA1 Message Date
grimhilt
569c271c6c show description in room header 2023-04-03 20:11:07 +02:00
grimhilt
833eacc91d start message to bottom 2023-04-02 17:39:04 +02:00
grimhilt
6ea0d4e02e use strict front 2023-04-02 16:52:19 +02:00
grimhilt
4b5bd9da67 switch front to typescript 2023-04-02 16:44:54 +02:00
grimhilt
8258581435 fix some errors on front 2023-04-02 13:36:59 +02:00
grimhilt
02e0e05c76 improve logger 2023-04-02 12:59:11 +02:00
grimhilt
7ba1ee083d run server as typescript 2023-04-02 12:35:55 +02:00
grimhilt
a5d325818b tests in typescript 2023-04-01 22:36:51 +02:00
grimhilt
9fbf5e5cf3 started to convert to typescript 2023-04-01 16:32:29 +02:00
grimhilt
1d761fa6df add logic and more test to saveMessage 2023-04-01 15:07:49 +02:00
grimhilt
7f28823758 implement save of thread and members 2023-03-31 16:07:02 +02:00
grimhilt
e2bd0bafea improve tests saveMessage 2023-03-30 09:16:10 +02:00
grimhilt
1a63b3154a improve saveMessage (switch to class) and started to test 2023-03-29 21:00:43 +02:00
grimhilt
053213eecb logic pseudo code 2023-03-29 17:43:46 +02:00
grimhilt
34c6a43fdc get members 2023-03-29 16:48:28 +02:00
grimhilt
d39d66195a fix duplicate content header 2023-03-29 16:34:30 +02:00
grimhilt
e0482eb511 improve syncing and storing 2023-03-29 16:23:24 +02:00
grimhilt
94c7a7176b change logger 2023-03-28 16:57:44 +02:00
grimhilt
bffcdafe7a display mail in iframe, add design for thread and unseen 2023-03-27 01:04:43 +02:00
grimhilt
a9d15027aa apply difference between mailbox and account 2023-03-26 14:55:13 +02:00
grimhilt
d0d666f4cb link imap sync to server and show email on front 2023-03-26 14:20:16 +02:00
grimhilt
b156c5954d advancements in tests and storing messages 2023-03-25 16:47:23 +01:00
grimhilt
097dd8bf21 load message in front 2023-03-25 13:06:59 +01:00
grimhilt
cb5021750a fix modal background opacity 2023-03-23 23:59:49 +01:00
grimhilt
7008e24941 start to load messages from rooms 2023-03-20 21:28:13 +01:00
grimhilt
0f87bdc715 basic routing for roomview 2023-03-20 15:00:15 +01:00
grimhilt
47b8c54122 fetch rooms 2023-03-20 14:43:07 +01:00
grimhilt
ace2063309 fetching mailboxes from api 2023-03-17 13:31:27 +01:00
grimhilt
6b96815b93 save message working without reply 2023-03-16 16:14:25 +01:00
grimhilt
520eb95d37 save message sync 2023-03-15 14:48:15 +01:00
grimhilt
3e029a26d4 advancement on logic of app 2023-03-13 19:12:57 +01:00
grimhilt
28b2b69dc8 add queries for app functionnalities 2023-03-13 00:54:44 +01:00
grimhilt
c81042a223 started some app structure 2023-03-13 00:13:17 +01:00
grimhilt
749127ac19 update database structure 2023-03-11 14:52:08 +01:00
grimhilt
61d7eb386c gloablly save messages 2023-03-10 17:07:05 +01:00
grimhilt
02e3af693a solution clean not working 2023-03-10 16:18:04 +01:00
grimhilt
ac8211defd save 2023-03-10 16:08:50 +01:00
grimhilt
5f2cbd82b6 remove password 2023-03-01 16:57:11 +01:00
7 changed files with 55 additions and 69 deletions

View File

@ -101,9 +101,9 @@ export async function getMessages(roomId) {
export async function getMembers(roomId) { export async function getMembers(roomId) {
const query = ` const query = `
SELECT SELECT
address.address_id AS id, address.address_id,
address.address_name AS name, address.address_name,
address.email AS email address.email
FROM app_room_member FROM app_room_member
INNER JOIN address ON address.address_id = app_room_member.member_id INNER JOIN address ON address.address_id = app_room_member.member_id
WHERE app_room_member.room_id = ? WHERE app_room_member.room_id = ?

View File

@ -1,5 +1,5 @@
export function removeDuplicates(array: []) { export function removeDuplicates(array: []) {
const unique = []; let unique = [];
for (let i = 0; i < array.length; i++) { for (let i = 0; i < array.length; i++) {
if (!unique.includes(array[i])) { if (!unique.includes(array[i])) {
unique.push(array[i]); unique.push(array[i]);

View File

@ -30,7 +30,5 @@ export interface Account {
} }
export interface Address { export interface Address {
id: number; todo: boolean;
name: string | null;
email: string;
} }

View File

@ -1,6 +1,5 @@
import API from "@/services/imapAPI"; import API from "@/services/imapAPI";
import { decodeEmojis } from "@/utils/string"; import { decodeEmojis } from "@/utils/string";
import { AxiosError, AxiosResponse } from "axios";
import { createStore, Store } from "vuex"; import { createStore, Store } from "vuex";
import { Room, Account, Address, RoomType, Message } from "./models/model"; import { Room, Account, Address, RoomType, Message } from "./models/model";
@ -104,12 +103,6 @@ const store = createStore<State>({
const room = state.rooms.find((room) => room.id == roomId); const room = state.rooms.find((room) => room.id == roomId);
return room; return room;
}, },
address:
(state) =>
(addressId: number): Address | undefined => {
const address = state.addresses.find((address) => address.id == addressId);
return address;
},
messages: messages:
(state) => (state) =>
(roomId: number): Message[] => { (roomId: number): Message[] => {
@ -124,21 +117,21 @@ const store = createStore<State>({
actions: { actions: {
fetchAccounts: async (context) => { fetchAccounts: async (context) => {
API.getAccounts() API.getAccounts()
.then((res: AxiosResponse) => { .then((res) => {
context.commit("addAccounts", res.data); context.commit("addAccounts", res.data);
}) })
.catch((err: AxiosError) => { .catch((err) => {
console.log(err); console.log(err);
}); });
}, },
fetchRooms: async (context, data) => { fetchRooms: async (context, data) => {
if (data.account?.fetched == false) { if (data.account?.fetched == false) {
API.getRooms(data.accountId) API.getRooms(data.accountId)
.then((res: AxiosResponse) => { .then((res) => {
data.account.fetched = true; data.account.fetched = true;
context.commit("addRooms", { rooms: res.data }); context.commit("addRooms", { rooms: res.data });
}) })
.catch((err: AxiosError) => { .catch((err) => {
console.log(err); console.log(err);
}); });
} }
@ -147,20 +140,20 @@ const store = createStore<State>({
if (!data.room || data.room?.fetched == false) { if (!data.room || data.room?.fetched == false) {
store.dispatch("fetchRoomMembers", { roomId: data.roomId }); store.dispatch("fetchRoomMembers", { roomId: data.roomId });
API.getMessages(data.roomId) API.getMessages(data.roomId)
.then((res: AxiosResponse) => { .then((res) => {
context.commit("addMessages", { messages: res.data, roomId: data.roomId }); context.commit("addMessages", { messages: res.data, roomId: data.roomId });
}) })
.catch((err: AxiosError) => { .catch((err) => {
console.log(err); console.log(err);
}); });
} }
}, },
fetchRoomMembers: async (context, data) => { fetchRoomMembers: async (context, data) => {
API.getMembers(data.roomId) API.getMembers(data.roomId)
.then((res: AxiosResponse) => { .then((res) => {
context.commit("addAddress", { addresses: res.data, roomId: data.roomId }); context.commit("addAddress", { addresses: res.data, roomId: data.roomId });
}) })
.catch((err: AxiosError) => { .catch((err) => {
console.log(err); console.log(err);
}); });
}, },

View File

@ -1,9 +0,0 @@
export function removeDuplicates(array: []) {
const unique: [] = [];
for (let i = 0; i < array.length; i++) {
if (!unique.includes(array[i])) {
unique.push(array[i]);
}
}
return unique;
}

View File

@ -1,9 +1,7 @@
<script setup> <script setup>
import { defineProps, onMounted, ref } from "vue"; import { defineProps, onMounted, ref } from "vue";
import { decodeEmojis } from "../../utils/string"; import { decodeEmojis } from "../../utils/string";
import { removeDuplicates } from "../../utils/array";
import DOMPurify from "dompurify"; import DOMPurify from "dompurify";
import store from "@/store/store";
const props = defineProps({ data: Object }); const props = defineProps({ data: Object });
const date = new Date(props.data.date); const date = new Date(props.data.date);
@ -32,17 +30,6 @@ onMounted(() => {
`); `);
doc.close(); doc.close();
}); });
const displayAddresses = (addressesId) => {
// todo store members in rooms ?
addressesId = removeDuplicates(addressesId);
let res = "";
addressesId.forEach((addressId) => {
const address = store.getters.address(addressId);
if (address) res += address.email;
});
return res;
};
</script> </script>
<!-- to if to is more than me <!-- to if to is more than me
cc --> cc -->
@ -52,9 +39,7 @@ const displayAddresses = (addressesId) => {
<template> <template>
<div class="message"> <div class="message">
<div id="context"> <div id="context">
<div class="left" id="profile"> <div class="left" id="profile">{{ props.data.fromA }}</div>
{{ displayAddresses(props.data.fromA?.split(",")) }} - {{ props.data.fromA }}
</div>
<div class="middle">{{ decodeEmojis(props.data.subject) }}</div> <div class="middle">{{ decodeEmojis(props.data.subject) }}</div>
<div class="right" id="date"> <div class="right" id="date">
{{ {{

View File

@ -14,12 +14,31 @@
"useDefineForClassFields": true, "useDefineForClassFields": true,
"sourceMap": true, "sourceMap": true,
"baseUrl": ".", "baseUrl": ".",
"types": ["webpack-env", "jest"], "types": [
"webpack-env",
"jest"
],
"paths": { "paths": {
"@/*": ["src/*"] "@/*": [
"src/*",
]
}, },
"lib": ["esnext", "dom", "dom.iterable", "scripthost"] "lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
}, },
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "tests/**/*.ts", "tests/**/*.tsx"], "include": [
"exclude": ["node_modules"] "src/**/*.ts",
} "src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts",
"tests/**/*.tsx"
],
"exclude": [
"node_modules"
]
}