File

src/lib/core/contact.ts

Index

Properties
Methods
Accessors

Constructor

constructor(jidPlain: string, name: string, logService?: LogService, avatar?: string)

Do not call directly, use ContactFactoryService instead.

Parameters :
Name Type Optional
jidPlain string No
name string No
logService LogService Yes
avatar string Yes

Properties

avatar
Default value : dummyAvatarContact
Readonly jidBare
Type : JID
Readonly jidFull
Type : JID

use jidBare, jid resource is only set for chat room contacts

Private Readonly messageStore
Type : MessageStore<Message>
metadata
Type : ContactMetadata
Default value : {}
Public name
Type : string
Readonly pendingIn$
Default value : new BehaviorSubject(false)
Readonly pendingOut$
Default value : new BehaviorSubject(false)
Readonly pendingRoomInvite$
Default value : new BehaviorSubject<null | Invitation>(null)
Readonly presence$
Default value : new BehaviorSubject<Presence>(Presence.unavailable)
Readonly recipientType
Type : string
Default value : 'contact'
Readonly resources$
Default value : new BehaviorSubject<JidToPresence>(new Map())
Readonly subscription$
Default value : new BehaviorSubject<ContactSubscription>(ContactSubscription.none)

Methods

addMessage
addMessage(message: Message)
Parameters :
Name Type Optional
message Message No
Returns : void
Private determineOverallPresence
determineOverallPresence(jidToPresence: JidToPresence)
Parameters :
Name Type Optional
jidToPresence JidToPresence No
Returns : Presence
equalsBareJid
equalsBareJid(other: Recipient | JID)
Parameters :
Name Type Optional
other Recipient | JID No
Returns : boolean
getMessageById
getMessageById(id: string)
Parameters :
Name Type Optional
id string No
Returns : Message | null
isSubscribed
isSubscribed()
Returns : boolean
isUnaffiliated
isUnaffiliated()
Returns : boolean
updateResourcePresence
updateResourcePresence(jid: string, presence: Presence)
Parameters :
Name Type Optional
jid string No
presence Presence No
Returns : void

Accessors

messages$
getmessages$()
messages
getmessages()
dateMessagesGroups
getdateMessagesGroups()
oldestMessage
getoldestMessage()
mostRecentMessage
getmostRecentMessage()
mostRecentMessageReceived
getmostRecentMessageReceived()
mostRecentMessageSent
getmostRecentMessageSent()
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;
    }

}

results matching ""

    No results matching ""