Compare commits

..

No commits in common. "569c271c6c1ceb984ecdbfdfc7888e4a343a871b" and "6ea0d4e02eba6fe5a8a9c82b667c0a982ddeafbd" have entirely different histories.

11 changed files with 55 additions and 123 deletions

View File

@ -1,9 +1,8 @@
import statusCode from "../utils/statusCodes"; import statusCode from "../utils/statusCodes";
import { getMessages } from "../db/api"; import { getMessages } from "../db/api";
import logger from "../system/Logger"; import logger from "../system/Logger";
import { Response } from "express";
export async function messages(body, res: Response) { export async function messages(body, res) {
const { roomId } = body; const { roomId } = body;
getMessages(roomId).then((messages) => { getMessages(roomId).then((messages) => {
res.status(statusCode.OK).json(messages); res.status(statusCode.OK).json(messages);

View File

@ -35,7 +35,6 @@ export async function getRooms(mailboxId) {
address.email AS user, address.email AS user,
app_room.owner_id AS userId, app_room.owner_id AS userId,
app_room.notSeen, app_room.notSeen,
app_room.room_type AS roomType,
mailbox_message.mailbox_id AS mailboxId mailbox_message.mailbox_id AS mailboxId
FROM app_room FROM app_room
INNER JOIN message INNER JOIN message
@ -92,7 +91,7 @@ export async function getMessages(roomId) {
WHERE msg.room_id = ? WHERE msg.room_id = ?
GROUP BY msg.message_id GROUP BY msg.message_id
ORDER BY message.idate DESC; ORDER BY message.idate;
`; `;
const values = [roomId]; const values = [roomId];
return await execQueryAsync(query, values); return await execQueryAsync(query, values);

View File

@ -1,45 +1,25 @@
<template> <template>
<span :class="['badge', type]" :style="{ backgroundColor: color }"> <div class="wrapper">
{{ value }} <slot class="badge" name="body"> 0 </slot>
</span> </div>
</template> </template>
<script>
export default {
props: {
value: {
type: [Number, String],
default: 0,
},
color: {
type: String,
default: "#007bff",
},
type: {
type: String,
default: "badge-primary",
},
},
};
</script>
<style scoped> <style scoped>
.wrapper {
display: flex;
justify-content: center;
align-items: center;
background-color: #4d5970;
height: 1.6rem;
width: 1.6rem;
min-width: 1.6rem;
min-height: 1.6rem;
border-radius: 1.6rem;
}
.badge { .badge {
display: inline-block;
padding: 0.25em 0.4em;
font-size: 75%;
font-weight: 700;
/* line-height: 1; */
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: 0.25rem;
}
.badge-primary {
color: #fff; color: #fff;
background-color: #007bff; font-size: 1.1rem;
line-height: 1.4rem;
} }
/* add more type classes for other types/colors */
</style> </style>

View File

@ -1,13 +1,14 @@
export enum RoomType { export enum RoomType {
ROOM = 0, ROOM = 0,
CHANNEL = 1, CHANNEL = 1,
GROUP = 2, GROUP = 2,
DM = 3, DM = 3,
THREAD = 4, THREAD = 4,
} };
export interface Message { export interface Message {
todo: true;
} }
export interface Room { export interface Room {

View File

@ -1,5 +1,4 @@
import API from "@/services/imapAPI"; import API from "@/services/imapAPI";
import { decodeEmojis } from "@/utils/string";
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";
@ -20,10 +19,9 @@ interface AccountFromBack {
} }
function createRoom(options: RoomFromBack): Room { function createRoom(options: RoomFromBack): Room {
console.log(options.roomType);
return { return {
id: options.id, id: options.id,
roomName: decodeEmojis(options.roomName), roomName: options.roomName,
roomType: options.roomType, roomType: options.roomType,
mailboxId: options.mailboxId, mailboxId: options.mailboxId,
userId: options.userId, userId: options.userId,
@ -93,19 +91,11 @@ const store = createStore<State>({
}, },
}, },
getters: { getters: {
rooms: (state) => (): Room[] => { rooms: (state) => () => {
if (state.activeAccount === 0) return state.rooms; if (state.activeAccount === 0) return state.rooms;
return state.rooms.filter((room) => room.mailboxId == state.activeAccount); return state.rooms.filter((room) => room.mailboxId == state.activeAccount);
}, },
room: messages: (state) => (roomId: number) => {
(state) =>
(roomId: number): Room | undefined => {
const room = state.rooms.find((room) => room.id == roomId);
return room;
},
messages:
(state) =>
(roomId: number): Message[] => {
const room = state.rooms.find((room) => room.id == roomId); const room = state.rooms.find((room) => room.id == roomId);
if (!room) return []; if (!room) return [];
if (!room.messagesFetched) { if (!room.messagesFetched) {

View File

@ -1,5 +1,3 @@
// todo optimize
export function decodeEmojis(text: string): string { export function decodeEmojis(text: string): string {
if (!text) return text; if (!text) return text;
const regex = /\\u{([^}]+)}/g; const regex = /\\u{([^}]+)}/g;

View File

@ -1,54 +1,22 @@
<script setup lang="ts"> <script setup>
import store from "../../store/store"; import { defineProps } from "vue";
import { defineProps, ref, watch } from "vue"; const props = defineProps({ room: Object });
import Badge from "@/components/Badge.vue";
import { RoomType } from "@/store/models/model";
const props = defineProps({ id: Number });
const room = ref(store.getters.room(props.id));
watch(
() => props.id,
(newId) => {
room.value = store.getters.room(newId);
},
);
const roomTitle = () => {
const type = room.value?.roomType;
if (type === RoomType.DM || type == RoomType.CHANNEL || type == RoomType.ROOM) {
return room.value?.user;
}
return room.value?.roomName;
};
</script> </script>
<template> <template>
<div class="main"> <div class="main">
<div class="infos"> <div>
<Badge :value="RoomType[room?.roomType]" /> {{ props }}
{{ roomTitle() }} type: name / sender
</div> </div>
<div class="action">action: threads message important</div> <div>action: threads message important</div>
</div> </div>
</template> </template>
<style scoped> <style scoped>
.main { .main {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #505050; border-bottom: 1px solid #505050;
width: 100%; width: 100%;
height: 51px; height: 51px;
} }
.infos {
margin-left: 15px;
}
.action {
margin-right: 15px;
}
</style> </style>

View File

@ -1,17 +1,17 @@
<script setup> <script setup>
import { useStore } from "vuex"; import { useStore } from "vuex";
import { useRoute, onBeforeRouteUpdate } from "vue-router"; import { useRoute, onBeforeRouteUpdate } from "vue-router";
import { onBeforeMount, ref } from "vue"; import { onBeforeMount } from "vue";
import Header from "./Header.vue"; import Header from "./Header.vue";
import Message from "./Message.vue"; import Message from "./Message.vue";
const store = useStore(); const store = useStore();
const route = useRoute(); const route = useRoute();
const id = ref(parseInt(route.params?.id)); let { id } = route.params;
onBeforeMount(async () => { onBeforeMount(async () => {
console.log(id);
// get data // get data
let room = store.getters.room(id); let room = store.state.rooms.find((room) => room.id === id);
console.log(room);
if (!room || room?.fetched === false) { if (!room || room?.fetched === false) {
// todo // todo
// await store.dispatch("fetchMessages", ); // await store.dispatch("fetchMessages", );
@ -21,8 +21,7 @@ onBeforeMount(async () => {
onBeforeRouteUpdate(async (to, from) => { onBeforeRouteUpdate(async (to, from) => {
if (to.params.id !== from.params.id) { if (to.params.id !== from.params.id) {
id.value = parseInt(to.params.id); id = to.params.id;
console.log(id);
store.commit("setActiveRoom", id); store.commit("setActiveRoom", id);
} }
}); });
@ -30,7 +29,7 @@ onBeforeRouteUpdate(async (to, from) => {
<template> <template>
<div id="main"> <div id="main">
<Header :id="id"></Header> <Header :room="room"></Header>
<div id="RoomViewBody"> <div id="RoomViewBody">
<div class="content"> <div class="content">
<Message v-for="(message, index) in store.getters.messages(id)" :key="index" :data="message" /> <Message v-for="(message, index) in store.getters.messages(id)" :key="index" :data="message" />
@ -65,7 +64,7 @@ onBeforeRouteUpdate(async (to, from) => {
.content { .content {
display: flex; display: flex;
flex-direction: column-reverse; flex-direction: column;
overflow: auto; overflow: auto;
margin-bottom: 100px; margin-bottom: 100px;
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<Accounts class="accounts" /> <Accounts />
<Rooms class="rooms" /> <Rooms id="rooms" />
</div> </div>
</template> </template>
@ -24,11 +24,9 @@ div {
height: 100%; height: 100%;
} }
.accounts { #rooms {
width: 82px; max-width: 300px;
} min-width: 250px;
.rooms {
width: 300px;
} }
/* todo setup max size */ /* todo setup max size */

View File

@ -5,6 +5,7 @@ import BaseAvatar from "../../avatars/BaseAvatar.vue";
import Badge from "../../../components/Badge.vue"; import Badge from "../../../components/Badge.vue";
import ThreadList from "./threads/ThreadList.vue"; import ThreadList from "./threads/ThreadList.vue";
import store from "@/store/store"; import store from "@/store/store";
import { decodeEmojis } from "@/utils/string";
const props = defineProps({ const props = defineProps({
data: { data: {
@ -31,7 +32,7 @@ const router = useRouter();
<BaseAvatar url="vue.png" /> <BaseAvatar url="vue.png" />
<div id="content"> <div id="content">
<div id="sender">{{ props.data.user }}</div> <div id="sender">{{ props.data.user }}</div>
<div id="object">{{ props.data.roomName }}</div> <div id="object">{{ decodeEmojis(props.data.roomName) }}</div>
</div> </div>
<Badge class="badge" v-if="props.data.unseen > 0" <Badge class="badge" v-if="props.data.unseen > 0"
><template v-slot:body>{{ props.data.unseen }}</template> ><template v-slot:body>{{ props.data.unseen }}</template>

View File

@ -5,7 +5,6 @@
"strict": true, "strict": true,
"jsx": "preserve", "jsx": "preserve",
"importHelpers": true, "importHelpers": true,
"allowJs": true,
"moduleResolution": "node", "moduleResolution": "node",
"skipLibCheck": true, "skipLibCheck": true,
"esModuleInterop": true, "esModuleInterop": true,
@ -20,7 +19,7 @@
], ],
"paths": { "paths": {
"@/*": [ "@/*": [
"src/*", "src/*"
] ]
}, },
"lib": [ "lib": [