src/lib/core/contact.ts
Properties |
|
Methods |
Accessors |
constructor(jidPlain: string, name: string, logService?: LogService, avatar?: string)
|
|||||||||||||||
Defined in src/lib/core/contact.ts:69
|
|||||||||||||||
Do not call directly, use ContactFactoryService instead.
Parameters :
|
avatar |
Default value : dummyAvatarContact
|
Defined in src/lib/core/contact.ts:28
|
Readonly jidBare |
Type : JID
|
Defined in src/lib/core/contact.ts:33
|
Readonly jidFull |
Type : JID
|
Defined in src/lib/core/contact.ts:32
|
use jidBare, jid resource is only set for chat room contacts |
Private Readonly messageStore |
Type : MessageStore<Message>
|
Defined in src/lib/core/contact.ts:41
|
metadata |
Type : ContactMetadata
|
Default value : {}
|
Defined in src/lib/core/contact.ts:29
|
Public name |
Type : string
|
Defined in src/lib/core/contact.ts:75
|
Readonly pendingIn$ |
Default value : new BehaviorSubject(false)
|
Defined in src/lib/core/contact.ts:37
|
Readonly pendingOut$ |
Default value : new BehaviorSubject(false)
|
Defined in src/lib/core/contact.ts:36
|
Readonly pendingRoomInvite$ |
Default value : new BehaviorSubject<null | Invitation>(null)
|
Defined in src/lib/core/contact.ts:39
|
Readonly presence$ |
Default value : new BehaviorSubject<Presence>(Presence.unavailable)
|
Defined in src/lib/core/contact.ts:34
|
Readonly recipientType |
Type : string
|
Default value : 'contact'
|
Defined in src/lib/core/contact.ts:27
|
Readonly resources$ |
Default value : new BehaviorSubject<JidToPresence>(new Map())
|
Defined in src/lib/core/contact.ts:38
|
Readonly subscription$ |
Default value : new BehaviorSubject<ContactSubscription>(ContactSubscription.none)
|
Defined in src/lib/core/contact.ts:35
|
addMessage | ||||||
addMessage(message: Message)
|
||||||
Defined in src/lib/core/contact.ts:87
|
||||||
Parameters :
Returns :
void
|
Private determineOverallPresence | ||||||
determineOverallPresence(jidToPresence: JidToPresence)
|
||||||
Defined in src/lib/core/contact.ts:119
|
||||||
Parameters :
Returns :
Presence
|
equalsBareJid | ||||||
equalsBareJid(other: Recipient | JID)
|
||||||
Defined in src/lib/core/contact.ts:91
|
||||||
Parameters :
Returns :
boolean
|
getMessageById | ||||||
getMessageById(id: string)
|
||||||
Defined in src/lib/core/contact.ts:115
|
||||||
Parameters :
Returns :
Message | null
|
isSubscribed |
isSubscribed()
|
Defined in src/lib/core/contact.ts:99
|
Returns :
boolean
|
isUnaffiliated |
isUnaffiliated()
|
Defined in src/lib/core/contact.ts:104
|
Returns :
boolean
|
updateResourcePresence |
updateResourcePresence(jid: string, presence: Presence)
|
Defined in src/lib/core/contact.ts:108
|
Returns :
void
|
messages$ |
getmessages$()
|
Defined in src/lib/core/contact.ts:43
|
messages |
getmessages()
|
Defined in src/lib/core/contact.ts:47
|
dateMessagesGroups |
getdateMessagesGroups()
|
Defined in src/lib/core/contact.ts:51
|
oldestMessage |
getoldestMessage()
|
Defined in src/lib/core/contact.ts:55
|
mostRecentMessage |
getmostRecentMessage()
|
Defined in src/lib/core/contact.ts:59
|
mostRecentMessageReceived |
getmostRecentMessageReceived()
|
Defined in src/lib/core/contact.ts:63
|
mostRecentMessageSent |
getmostRecentMessageSent()
|
Defined in src/lib/core/contact.ts:67
|
import { jid as parseJid } from '@xmpp/client';
import { JID } from '@xmpp/jid';
import { BehaviorSubject, Subject } from 'rxjs';
import { LogService } from '../services/log.service';
import { dummyAvatarContact } from './contact-avatar';
import { Message } from './message';
import { DateMessagesGroup, MessageStore } from './message-store';
import { Presence } from './presence';
import { isJid, Recipient } from './recipient';
import { ContactSubscription } from './subscription';
export interface Invitation {
from: JID;
roomJid: JID;
reason?: string;
password?: string;
}
export interface ContactMetadata {
[key: string]: any;
}
export type JidToPresence = Map<string, Presence>;
export class Contact {
readonly recipientType = 'contact';
avatar = dummyAvatarContact;
metadata: ContactMetadata = {};
/** use {@link jidBare}, jid resource is only set for chat room contacts */
readonly jidFull: JID;
readonly jidBare: JID;
readonly presence$ = new BehaviorSubject<Presence>(Presence.unavailable);
readonly subscription$ = new BehaviorSubject<ContactSubscription>(ContactSubscription.none);
readonly pendingOut$ = new BehaviorSubject(false);
readonly pendingIn$ = new BehaviorSubject(false);
readonly resources$ = new BehaviorSubject<JidToPresence>(new Map());
readonly pendingRoomInvite$ = new BehaviorSubject<null | Invitation>(null);
private readonly messageStore: MessageStore<Message>;
get messages$(): Subject<Message> {
return this.messageStore.messages$;
}
get messages(): Message[] {
return this.messageStore.messages;
}
get dateMessagesGroups(): DateMessagesGroup<Message>[] {
return this.messageStore.dateMessageGroups;
}
get oldestMessage(): Message | undefined {
return this.messageStore.oldestMessage;
}
get mostRecentMessage(): Message | undefined {
return this.messageStore.mostRecentMessage;
}
get mostRecentMessageReceived(): Message | undefined {
return this.messageStore.mostRecentMessageReceived;
}
get mostRecentMessageSent(): Message | undefined {
return this.messageStore.mostRecentMessageSent;
}
/**
* Do not call directly, use {@link ContactFactoryService#createContact} instead.
*/
constructor(jidPlain: string,
public name: string,
logService?: LogService,
avatar?: string) {
if (avatar) {
this.avatar = avatar;
}
const jid = parseJid(jidPlain);
this.jidFull = jid;
this.jidBare = jid.bare();
this.messageStore = new MessageStore(logService);
}
addMessage(message: Message): void {
this.messageStore.addMessage(message);
}
equalsBareJid(other: Recipient | JID): boolean {
if (other instanceof Contact || isJid(other)) {
const otherJid = other instanceof Contact ? other.jidBare : other.bare();
return this.jidBare.equals(otherJid);
}
return false;
}
isSubscribed(): boolean {
const subscription = this.subscription$.getValue();
return subscription === ContactSubscription.both || subscription === ContactSubscription.to;
}
isUnaffiliated(): boolean {
return !this.isSubscribed() && !this.pendingIn$.getValue() && !this.pendingOut$.getValue();
}
updateResourcePresence(jid: string, presence: Presence): void {
const resources = this.resources$.getValue();
resources.set(jid, presence);
this.presence$.next(this.determineOverallPresence(resources));
this.resources$.next(resources);
}
getMessageById(id: string): Message | null {
return this.messageStore.messageIdToMessage.get(id);
}
private determineOverallPresence(jidToPresence: JidToPresence): Presence {
let result = Presence.unavailable;
[...jidToPresence.values()].some((presence) => {
if (presence === Presence.present) {
result = presence;
return true;
} else if (presence === Presence.away) {
result = Presence.away;
}
return false;
});
return result;
}
}