import AbstractModel from './abstractModel' import {parseDateOrNull} from '@/helpers/parseDateOrNull' import UserModel from '@/models/user' import TaskModel from '@/models/task' import TaskCommentModel from '@/models/taskComment' import ListModel from '@/models/list' import TeamModel from '@/models/team' import {NOTIFICATION_NAMES, type INotification} from '@/modelTypes/INotification' export default class NotificationModel extends AbstractModel implements INotification { id = 0 name = '' notification: INotification['notification'] = null read = false readAt: Date | null = null created: Date constructor(data: Partial) { super() this.assignData(data) switch (this.name) { case NOTIFICATION_NAMES.TASK_COMMENT: this.notification = { doer: new UserModel(this.notification.doer), task: new TaskModel(this.notification.task), comment: new TaskCommentModel(this.notification.comment), } break case NOTIFICATION_NAMES.TASK_ASSIGNED: this.notification = { doer: new UserModel(this.notification.doer), task: new TaskModel(this.notification.task), assignee: new UserModel(this.notification.assignee), } break case NOTIFICATION_NAMES.TASK_DELETED: this.notification = { doer: new UserModel(this.notification.doer), task: new TaskModel(this.notification.task), } break case NOTIFICATION_NAMES.LIST_CREATED: this.notification = { doer: new UserModel(this.notification.doer), list: new ListModel(this.notification.list), } break case NOTIFICATION_NAMES.TEAM_MEMBER_ADDED: this.notification = { doer: new UserModel(this.notification.doer), member: new UserModel(this.notification.member), team: new TeamModel(this.notification.team), } break } this.created = new Date(this.created) this.readAt = parseDateOrNull(this.readAt) } toText(user = null) { let who = '' switch (this.name) { case NOTIFICATION_NAMES.TASK_COMMENT: return `commented on ${this.notification.task.getTextIdentifier()}` case NOTIFICATION_NAMES.TASK_ASSIGNED: who = `${this.notification.assignee.getDisplayName()}` if (user !== null && user.id === this.notification.assignee.id) { who = 'you' } return `assigned ${who} to ${this.notification.task.getTextIdentifier()}` case NOTIFICATION_NAMES.TASK_DELETED: return `deleted ${this.notification.task.getTextIdentifier()}` case NOTIFICATION_NAMES.LIST_CREATED: return `created ${this.notification.list.title}` case NOTIFICATION_NAMES.TEAM_MEMBER_ADDED: who = `${this.notification.member.getDisplayName()}` if (user !== null && user.id === this.notification.member.id) { who = 'you' } return `added ${who} to the ${this.notification.team.name} team` } return '' } }