Browse Source
Chat area is cleared when changing user
Chat area is cleared when changing user
Also frontend code has een refactored significantlymaster
Rohan Sircar
4 years ago
17 changed files with 304 additions and 312 deletions
-
1chatto/src/main/java/org/ros/chatto/config/DataSourceConfig.java
-
1chatto/src/main/java/org/ros/chatto/service/DBInitializerService.java
-
2chatto/src/main/javascript/package.json
-
134chatto/src/main/javascript/ts/src/main.ts
-
4chatto/src/main/javascript/ts/src/model/AbstractModel.ts
-
126chatto/src/main/javascript/ts/src/model/ChatModel.ts
-
54chatto/src/main/javascript/ts/src/model/ChatModelHelper.ts
-
8chatto/src/main/javascript/ts/src/model/FetchErrorHandler.ts
-
82chatto/src/main/javascript/ts/src/model/UserModel.ts
-
9chatto/src/main/javascript/ts/src/observe/Observable.ts
-
5chatto/src/main/javascript/ts/src/observe/Observer.ts
-
4chatto/src/main/javascript/ts/src/observe/ObserverData.ts
-
2chatto/src/main/javascript/ts/src/view/AbstractView.ts
-
135chatto/src/main/javascript/ts/src/view/ChatView.ts
-
3chatto/src/main/javascript/ts/src/view/ChatViewDeps.ts
-
4chatto/src/main/javascript/ts/src/view/FetchHandler.ts
-
42chatto/src/main/javascript/ts/src/view/UserView.ts
@ -1,7 +1,7 @@ |
|||
import { Subject } from "../observe/Observable"; |
|||
import { ActiveUserViewModel } from "../viewmodel/ActiveUserViewModel"; |
|||
|
|||
export interface Model extends Subject{ |
|||
export interface Model extends Subject<any> { |
|||
someBusinessMethod(data: Object): void; |
|||
|
|||
|
|||
} |
@ -1,114 +1,126 @@ |
|||
import { Subject } from "../observe/Observable"; |
|||
import { Model } from "./AbstractModel"; |
|||
import { Observer } from "../observe/Observer"; |
|||
import { fetchErrorHandler } from "./FetchErrorHandler"; |
|||
import { ActiveUserViewModel } from "../viewmodel/ActiveUserViewModel"; |
|||
import { ChatMessageViewModel } from "../viewmodel/ChatMessageViewModel"; |
|||
import { JsonAPI } from "../singleton/JsonAPI"; |
|||
import log = require('loglevel'); |
|||
import { EncryptionService } from "../service/EncryptionService"; |
|||
import { SJCLEncryptionService } from "../service/SJCLEncryptionService"; |
|||
import { ChatMessageDTO } from "../dto/ChatMessageDTO"; |
|||
import { ChatMessageViewModel } from "../viewmodel/ChatMessageViewModel"; |
|||
import { ChatModelHelper } from "./ChatModelHelper"; |
|||
import log = require('loglevel'); |
|||
import { ObserverData } from "../observe/ObserverData"; |
|||
|
|||
export class ChatModel implements Subject { |
|||
interface Params { |
|||
userName: string, |
|||
data: ChatMessageViewModel[], |
|||
op: string |
|||
} |
|||
|
|||
export class ChatModel implements Subject<ChatMessageViewModel> { |
|||
/** |
|||
* @type {Observer[]} List of subscribers. In real life, the list of |
|||
* subscribers can be stored more comprehensively (categorized by event |
|||
* type, etc.). |
|||
*/ |
|||
private readonly _observers: Observer[] = []; |
|||
private state: ChatMessageViewModel[] | null; |
|||
private readonly _observers: Observer<ChatMessageViewModel>[] = []; |
|||
private readonly _messagePageMap: Map<string, number>; |
|||
private readonly _messagesMap: Map<string, ChatMessageViewModel[]>; |
|||
private readonly _chatModelHelper: ChatModelHelper; |
|||
|
|||
constructor() { |
|||
this.state = null; |
|||
constructor(chatModelHelper: ChatModelHelper) { |
|||
this._messagePageMap = new Map(); |
|||
this._messagesMap = new Map(); |
|||
this._chatModelHelper = chatModelHelper; |
|||
} |
|||
/** |
|||
* The subscription management methods. |
|||
*/ |
|||
public attach(observer: Observer): void { |
|||
console.log('Subject: Attached an observer.'); |
|||
public attach(observer: Observer<ChatMessageViewModel>): void { |
|||
log.info('Subject: Attached an observer.'); |
|||
this._observers.push(observer); |
|||
} |
|||
|
|||
public detach(observer: Observer): void { |
|||
public detach(observer: Observer<ChatMessageViewModel>): void { |
|||
const observerIndex = this._observers.indexOf(observer); |
|||
this._observers.splice(observerIndex, 1); |
|||
console.log('Subject: Detached an observer.'); |
|||
log.info('Subject: Detached an observer.'); |
|||
} |
|||
|
|||
private storeUserMessages(username: string, messages: ChatMessageViewModel[]) { |
|||
this._messagesMap.set(username, messages); |
|||
private storeUserMessages(username: string, messages: ChatMessageViewModel[], op: string) { |
|||
switch (op) { |
|||
case "clear": this._messagesMap.set(username, []); |
|||
case "page": this._messagesMap.set(username, messages.concat(this.getStoredUserMessages(username))); break; |
|||
// case "page": this._messagesMap.set(username, messages);
|
|||
case "new": this._messagesMap.set(username, this.getStoredUserMessages(username).concat(messages)); break; |
|||
default: new Error("Invalid option"); |
|||
} |
|||
|
|||
} |
|||
|
|||
private getStoredUserMessages(username: string): ChatMessageViewModel[] { |
|||
return this._messagesMap.get(username)!; |
|||
let temp = this._messagesMap.get(username); |
|||
if (temp == null) |
|||
return []; |
|||
else { |
|||
return temp; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Trigger an update in each subscriber. |
|||
*/ |
|||
public notify(userName: string): void { |
|||
console.log('Subject: Notifying observers...'); |
|||
for (const observer of this._observers) { |
|||
observer.update(this._messagesMap.get(userName)); |
|||
public notify(p: Params): void { |
|||
log.info('Subject: Notifying observers...'); |
|||
switch (p.op) { |
|||
case "clear": { |
|||
const od: ObserverData<ChatMessageViewModel> = { data: [], op: "clear" } |
|||
for (const observer of this._observers) { |
|||
observer.update(od); |
|||
} |
|||
} break; |
|||
case "new": { |
|||
const od: ObserverData<ChatMessageViewModel> = { data: p.data, op: p.op } |
|||
for (const observer of this._observers) { |
|||
observer.update(od); |
|||
} |
|||
} break; |
|||
case "page": { |
|||
const od: ObserverData<ChatMessageViewModel> = { data: p.data, op: p.op } |
|||
for (const observer of this._observers) { |
|||
observer.update(od); |
|||
} |
|||
} break; |
|||
default: { log.error("error") } |
|||
} |
|||
} |
|||
|
|||
public someBusinessMethod(chatMessageList: ChatMessageViewModel[]): void { |
|||
this.state = chatMessageList; |
|||
console.log(`Subject: My state has just changed`); |
|||
console.log(chatMessageList); |
|||
this.notify("some user"); |
|||
} |
|||
|
|||
public async getMessages(contactName: string, passphrase: string, lastMessageTime: string | null): Promise<ChatMessageViewModel[]> { |
|||
public clear(): void { |
|||
this._messagePageMap.set(JsonAPI.contactName!, 0); |
|||
this.storeUserMessages(JsonAPI.contactName!, [], "clear"); |
|||
this.notify({ userName: "", data: [], op: "clear" }) |
|||
} |
|||
|
|||
public async getMessages(contactName: string, passphrase: string, lastMessageTime: string | null, op: string): Promise<ChatMessageViewModel[]> { |
|||
if (this._messagePageMap.get(contactName) == null) |
|||
this._messagePageMap.set(contactName, 0); |
|||
// else {
|
|||
// log.debug('page number before = ' + this._messagePageMap.get(contactName)!)
|
|||
// this._messagePageMap.set(contactName, this._messagePageMap.get(contactName)! + 1);
|
|||
// log.debug('page number after = ' + this._messagePageMap.get(contactName)!)
|
|||
// }
|
|||
|
|||
const pageNumber = this._messagePageMap.get(contactName) |
|||
const cVMs = await ChatModelHelper.getMessages(contactName, passphrase, pageNumber!, lastMessageTime); |
|||
const cVMs = await this._chatModelHelper.getMessages(contactName, passphrase, pageNumber!, lastMessageTime, op); |
|||
if (cVMs != null) { |
|||
log.info('Subject: My state has just changed') |
|||
|
|||
// this._messagesMap.set(userName, cVMs);
|
|||
const existingMessages = this.getStoredUserMessages(contactName); |
|||
log.debug('existing message:') |
|||
log.debug(existingMessages); |
|||
log.debug('new messages:') |
|||
log.debug(cVMs); |
|||
if (existingMessages != null) { |
|||
// existingMessages.forEach(function (elem) {
|
|||
// cVMs.push(elem);
|
|||
// })
|
|||
const newArr = cVMs.concat(existingMessages) |
|||
// log.debug(newArr);
|
|||
this.storeUserMessages(contactName, cVMs); |
|||
// this.storeUserMessages(contactName, cVMs);
|
|||
} |
|||
else { |
|||
this.storeUserMessages(contactName, cVMs); |
|||
} |
|||
JsonAPI.contactName = contactName; |
|||
this.notify(contactName); |
|||
this.storeUserMessages(contactName, cVMs, op); |
|||
this.notify({ userName: contactName, data: cVMs, op: op }); |
|||
} |
|||
else { |
|||
log.error('Messages were null'); |
|||
} |
|||
if(this._messagePageMap.get(contactName) == 0) |
|||
{ |
|||
log.info(cVMs[cVMs.length - 1].messageTime) |
|||
} |
|||
|
|||
if (cVMs.length != 0) { |
|||
// log.debug('page number before = ' + this._messagePageMap.get(contactName)!)
|
|||
this._messagePageMap.set(contactName, this._messagePageMap.get(contactName)! + 1); |
|||
// log.debug('page number after = ' + this._messagePageMap.get(contactName)!)
|
|||
} |
|||
|
|||
return cVMs; |
|||
|
@ -0,0 +1,4 @@ |
|||
export interface ObserverData<T> { |
|||
data: Array<T> |
|||
op: string |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue