From c95cded52260291e322b4d04a4b523b9403e2e34 Mon Sep 17 00:00:00 2001 From: Paolo Arena Date: Sun, 27 Oct 2019 00:39:00 +0200 Subject: [PATCH] Step 2: Creating page Messages: userlist last messages + a page for all the messages received and sent. --- src/model/MessageStore.ts | 82 ++++++++++++++ src/store/Modules/MessageStore.ts | 173 ++++++++++++++++++++++++++++++ src/store/Modules/fieldsTable.ts | 156 +++++++++++++++++++++++++++ 3 files changed, 411 insertions(+) create mode 100644 src/model/MessageStore.ts create mode 100644 src/store/Modules/MessageStore.ts create mode 100644 src/store/Modules/fieldsTable.ts diff --git a/src/model/MessageStore.ts b/src/model/MessageStore.ts new file mode 100644 index 0000000..2a3e27c --- /dev/null +++ b/src/model/MessageStore.ts @@ -0,0 +1,82 @@ +import { EState } from './Calendar' + +import { shared_consts } from '@src/common/shared_vuejs' + +export interface IMessagePage { + show: boolean + msg: IMessage + state: EState +} + +export interface ISource { + page?: string + event_id?: string + infoevent?: string +} + +export interface IIdentity { + idapp?: string + username?: string +} + +export const enum StatusMessage { + None = 0, + WaitingToSend = 1, + Sending = 2, + Sent = 3, + Received = 4, + Readit = 5 +} + +export const MsgDefault: IMessage = { + _id: '', + idapp: '', + source: { + event_id: '', + infoevent: '', + page: '' + }, + origin: { + username: '', + idapp: '' + }, + dest: { + idapp: '', + username: '' + }, + message: '', + datemsg: new Date(), + read: false, + deleted: false, + status: StatusMessage.None +} + +export interface IMessage { + _id?: any + idapp?: string + source?: ISource + origin?: IIdentity + dest?: IIdentity + message: string + datemsg?: Date + read?: boolean + deleted?: boolean + status?: StatusMessage + options?: number +} + +export interface IChat { + username: string + lasttimeActive?: Date +} + +export interface IMsgUsers { + username: string + msgs: IMessage[] + lastdataread?: Date +} + +export interface IMessageState { + last_msgs: IMessage[] + users_msg: IMsgUsers[] +} diff --git a/src/store/Modules/MessageStore.ts b/src/store/Modules/MessageStore.ts new file mode 100644 index 0000000..66aec22 --- /dev/null +++ b/src/store/Modules/MessageStore.ts @@ -0,0 +1,173 @@ +import Api from '@api' +import { storeBuilder } from './Store/Store' + +import { serv_constants } from '../Modules/serv_constants' +import { toolsext } from '@src/store/Modules/toolsext' +import { GlobalStore, UserStore, Todos, Projects, CalendarStore } from '@store' + +import { IMessage, IMessageState, StatusMessage } from '../../model' +import { tools } from '@src/store/Modules/tools' +import { MsgDefault } from '@src/model' +import { shared_consts } from '@src/common/shared_vuejs' + +// State +const state: IMessageState = { + last_msgs: [], + users_msg: [] + // last_update: [] +} + +const b = storeBuilder.module('MessageModule', state) + +namespace Getters { + + const getlasts_messages = b.read((mystate: IMessageState) => (): IMessage[] => { + const ctrec = (mystate.last_msgs) ? mystate.last_msgs.slice(0, 5) : [] + // const ctrec = (mystate.msgs) ? mystate.msgs.slice().reverse().slice(0, 5) : [] + return (ctrec) + + }, 'getlasts_messages') + + const getnumMsgUnread = b.read((mystate: IMessageState) => () => { + return mystate.last_msgs.filter((msg) => !msg.read).length + }, 'getnumMsgUnread') + + export const getters = { + get getlasts_messages() { + return getlasts_messages() + }, + get getnumMsgUnread() { + return getnumMsgUnread() + } + } + +} + +namespace Mutations { + export const mutations = { + } +} + +function setMsg(arrmsg: IMessage[], username) { + // console.log('arrmsg', arrmsg) + if (arrmsg.length > 0) { + let users_msg = state.users_msg.find((rec) => rec.username === username) + if (!users_msg) { + state.users_msg.push({ username, msgs: [] }) + users_msg = state.users_msg.find((rec) => rec.username === username) + } + users_msg.msgs.push(...arrmsg) + // console.table(users_msg.msgs) + + // users_msg.msgs = tools.getUnique(users_msg.msgs, '_id') + // console.table(users_msg.msgs) + + if (users_msg.msgs) { + let userother = users_msg.msgs.slice(-1)[0].dest.username + if (userother === UserStore.state.my.username) + userother = users_msg.msgs.slice(-1)[0].origin.username + + let index = state.last_msgs.findIndex((rec) => (rec.dest.username === userother) || (rec.origin.username === userother)) + if (index >= 0) { + // Update last message + state.last_msgs[index] = users_msg.msgs.slice(-1)[0] + } else { + state.last_msgs.push(users_msg.msgs.slice(-1)[0]) + index = state.last_msgs.findIndex((rec) => (rec.dest.username === userother) || (rec.origin.username === userother)) + } + if (state.last_msgs[index]) + users_msg.lastdataread = state.last_msgs[index].datemsg + else + users_msg.lastdataread = tools.getLastDateReadReset() + + } else { + users_msg.lastdataread = tools.getLastDateReadReset() + } + + // console.log('RICeVUTO', arrmsg, 'lastdataread', users_msg.lastdataread) + // console.log('state.users_msg', users_msg) + } +} + +namespace Actions { + + async function updateMsgDataFromServer(context, { username, lastdataread } ) { + // console.log('updateMsgDataFromServer', username, lastdataread) + + return await Api.SendReq(`/sendmsg/${username}/${lastdataread}/${process.env.APP_ID}`, 'GET', null) + .then((res) => { + console.log('res', res) + if (res.status === 200) { + setMsg(res.data.arrmsg, username) + return true + } + return false + }) + .catch((error) => { + console.error(error) + return false + }) + + } + + async function SendMsgEvent(context, msg: IMessage) { + console.log('SendMsgEvent', msg) + + const data: IMessage = { ...MsgDefault, ...msg} + + data.source.page = '' + data.idapp = process.env.APP_ID + data.origin.idapp = process.env.APP_ID + data.origin.username = UserStore.state.my.username + data.datemsg = tools.getDateNow() + data.status = StatusMessage.WaitingToSend + // Options + // data.options = tools.SetBit(data.options, shared_consts.MessageOptions.Notify_ByEmail) + data.options = tools.SetBit(data.options, shared_consts.MessageOptions.Notify_ByPushNotification) + + console.log('DOPO:') + console.table(data) + + return await Api.SendReq('/sendmsg', 'POST', data) + .then((res) => { + console.log('res', res) + if (res.status === 200) { + if (res.data.code === serv_constants.RIS_CODE_OK) { + data._id = res.data.id + + const myarr = [] + myarr.push(data) + + setMsg(myarr, data.dest.username) + return true + } + } + return false + }) + .catch((error) => { + console.error(error) + return false + }) + + } + + export const actions = { + updateMsgDataFromServer: b.dispatch(updateMsgDataFromServer), + SendMsgEvent: b.dispatch(SendMsgEvent) + } + +} + +const stateGetter = b.state() + +// Module +const MessageModule = { + get state() { + return stateGetter() + }, + actions: Actions.actions, + getters: Getters.getters, + mutations: Mutations.mutations +} + +export default MessageModule diff --git a/src/store/Modules/fieldsTable.ts b/src/store/Modules/fieldsTable.ts new file mode 100644 index 0000000..cc8648d --- /dev/null +++ b/src/store/Modules/fieldsTable.ts @@ -0,0 +1,156 @@ +import { IColGridTable } from '../../model' +import { lists } from './lists' +import { tools } from '@src/store/Modules/tools' + +const DeleteRec = { + name: 'deleterec', + label_trans: 'newsletter.reset', + align: 'right', + field: tools.NOFIELD, + sortable: false, + icon: 'fas fa-trash-alt', + action: lists.MenuAction.DELETE_RECTABLE, + askaction: 'db.deletetherecord', + required: true, + visuonlyEditVal: true +} + +function AddCol(params: IColGridTable) { + return { + name: params.name, + required: (params.required === undefined) ? false : params.required, + label: (params.label === undefined) ? '' : params.label, + label_trans: (params.label_trans === undefined) ? '' : params.label_trans, + align: (params.align === undefined) ? 'left' : params.align, + field: (params.field === undefined) ? params.name : params.field, + sortable: (params.sortable === undefined) ? true : params.sortable, + disable: (params.disable === undefined) ? false : params.disable, + titlepopupedit: (params.titlepopupedit === undefined) ? '' : params.titlepopupedit, + visible: (params.visible === undefined) ? true : params.visible, + icon: (params.icon === undefined) ? '' : params.icon, + action: (params.action === undefined) ? '' : params.action, + foredit: (params.foredit === undefined) ? true : params.foredit, + fieldtype: (params.fieldtype === undefined) ? 'string' : params.fieldtype, + visuonlyEditVal: (params.visuonlyEditVal === undefined) ? false : params.visuonlyEditVal, + askaction: (params.askaction === undefined) ? '' : params.askaction + } +} + +const colTableWhere = [ + AddCol({ name: 'code', label_trans: 'where.code' }), + AddCol({ name: 'placename', label_trans: 'where.placename' }), + AddCol({ name: 'whereicon', label_trans: 'where.whereicon' }), + AddCol(DeleteRec) +] + +const colcontribtype = [ + AddCol({ name: 'label', label_trans: 'proj.longdescr' }), + AddCol({ name: 'showprice', label_trans: 'event.showprice', fieldtype: 'boolean' }), + AddCol(DeleteRec) +] + +const colTableOperator = [ + AddCol({ name: 'username', label_trans: 'reg.username' }), + // AddCol({ name: 'name', label_trans: 'reg.name' }), + // AddCol({ name: 'surname', label_trans: 'reg.surname' }), + // AddCol({ name: 'webpage', label_trans: 'reg.webpage' }), + // AddCol({ name: 'email', label_trans: 'reg.email' }), + // AddCol({ name: 'cell', label_trans: 'reg.cell' }), + // AddCol({ name: 'img', label_trans: 'reg.img' }), + AddCol(DeleteRec)] + +const colTableEvents = [ + AddCol({ name: '_id', label_trans: 'event._id' }), + AddCol({ name: 'typol', label_trans: 'event.typol' }), + AddCol({ name: 'short_tit', label_trans: 'event.short_tit' }), + AddCol({ name: 'title', label_trans: 'event.title' }), + AddCol({ name: 'details', label_trans: 'event.details' }), + AddCol({ name: 'dateTimeStart', label_trans: 'event.dateTimeStart', fieldtype: 'date' }), + AddCol({ name: 'dateTimeEnd', label_trans: 'event.dateTimeEnd' }), + AddCol({ name: 'bgcolor', label_trans: 'event.bgcolor' }), + AddCol({ name: 'icon', label_trans: 'event.icon' }), + AddCol({ name: 'img_small', label_trans: 'event.img_small' }), + AddCol({ name: 'img', label_trans: 'event.img' }), + AddCol({ name: 'wherecode', label_trans: 'event.where' }), + AddCol({ name: 'contribtype', label_trans: 'event.contribtype' }), + AddCol({ name: 'price', label_trans: 'event.price' }), + AddCol({ name: 'infoafterprice', label_trans: 'event.infoafterprice' }), + AddCol({ name: 'teacher', label_trans: 'event.teacher' }), + AddCol({ name: 'teacher2', label_trans: 'event.teacher2' }), + AddCol({ name: 'infoextra', label_trans: 'event.infoextra' }), + AddCol({ name: 'linkpage', label_trans: 'event.linkpage' }), + AddCol({ name: 'linkpdf', label_trans: 'event.linkpdf' }), + AddCol({ name: 'nobookable', label_trans: 'event.nobookable', fieldtype: 'boolean' }), + AddCol({ name: 'news', label_trans: 'event.news', fieldtype: 'boolean' }), + AddCol({ name: 'canceled', label_trans: 'event.canceled', fieldtype: 'boolean' }), + AddCol({ name: 'deleted', label_trans: 'event.deleted', fieldtype: 'boolean' }), + AddCol({ name: 'dupId', label_trans: 'event.dupId' }), + AddCol({ name: 'modified', label_trans: 'event.modified', fieldtype: 'boolean' }), + AddCol(DeleteRec), + AddCol({ + name: 'copyrec', + label_trans: 'event.duplicate', + align: 'right', + field: tools.NOFIELD, + sortable: false, + icon: 'fas fa-copy', + action: lists.MenuAction.DUPLICATE_RECTABLE, + askaction: 'db.duplicatedrecord', + visuonlyEditVal: true, + required: true, + visible: true + }) +] + +export const fieldsTable = { + tablesList: [ + { + value: 'operators', + label: 'Insegnanti', + columns: colTableOperator, + colkey: '_id' + }, + { + value: 'wheres', + label: 'Luoghi', + columns: colTableWhere, + colkey: '_id' + }, + { + value: tools.TABEVENTS, + label: 'Eventi', + columns: colTableEvents, + colkey: '_id' + }, + { + value: 'contribtype', + label: 'Tipi di Contributi', + columns: colcontribtype, + colkey: '_id' + } + ], + + // IColGridTable + colTableUsers: [ + AddCol({ name: 'username', label_trans: 'reg.username' }), + AddCol({ name: 'name', label_trans: 'reg.name' }), + AddCol({ name: 'surname', label_trans: 'reg.surname' }), + AddCol({ name: 'email', label_trans: 'reg.email' }), + AddCol({ name: 'date_reg', label_trans: 'reg.date_reg', fieldtype: 'date' }), + AddCol({ name: 'perm', label_trans: 'reg.perm' }), + AddCol({ name: 'img', label_trans: 'reg.img', sortable: false }), + AddCol(DeleteRec), + AddCol({ + name: 'copyrec', + label_trans: 'event.duplicate', + align: 'right', + field: tools.NOFIELD, + sortable: false, + icon: 'fas fa-copy', + action: lists.MenuAction.DUPLICATE_RECTABLE, + askaction: 'db.duplicatedrecord', + visuonlyEditVal: true, + visible: true + }) + ] +}