Browse Source

Rename `XMPPStatus` to `Profile`

JC Brand 2 months ago
parent
commit
d9c8072d12
34 changed files with 136 additions and 112 deletions
  1. 1 1
      src/headless/index.js
  2. 7 4
      src/headless/plugins/caps/tests/caps.js
  3. 1 1
      src/headless/plugins/chat/model.js
  4. 4 4
      src/headless/plugins/muc/muc.js
  5. 1 1
      src/headless/plugins/muc/occupant.js
  6. 5 4
      src/headless/plugins/muc/tests/muc.js
  7. 3 3
      src/headless/plugins/muc/utils.js
  8. 3 3
      src/headless/plugins/roster/contacts.js
  9. 4 4
      src/headless/plugins/status/api.js
  10. 2 2
      src/headless/plugins/status/index.js
  11. 13 6
      src/headless/plugins/status/plugin.js
  12. 3 3
      src/headless/plugins/status/profile.js
  13. 1 1
      src/headless/plugins/status/tests/status.js
  14. 18 14
      src/headless/plugins/status/utils.js
  15. 5 5
      src/headless/plugins/vcard/utils.js
  16. 3 3
      src/headless/shared/_converse.js
  17. 2 2
      src/headless/shared/api/presence.js
  18. 3 3
      src/headless/shared/model-with-contact.js
  19. 18 12
      src/headless/tests/converse.js
  20. 1 1
      src/headless/types/index.d.ts
  21. 1 1
      src/headless/types/plugins/chat/model.d.ts
  22. 2 2
      src/headless/types/plugins/status/index.d.ts
  23. 3 3
      src/headless/types/plugins/status/profile.d.ts
  24. 4 1
      src/headless/types/plugins/status/utils.d.ts
  25. 1 1
      src/headless/types/plugins/vcard/utils.d.ts
  26. 4 4
      src/headless/types/shared/_converse.d.ts
  27. 1 1
      src/headless/types/shared/api/presence.d.ts
  28. 1 1
      src/headless/types/shared/message.d.ts
  29. 3 3
      src/headless/types/shared/model-with-contact.d.ts
  30. 2 2
      src/plugins/profile/modals/profile.js
  31. 2 2
      src/plugins/rosterview/types.ts
  32. 6 6
      src/plugins/rosterview/utils.js
  33. 2 2
      src/types/plugins/rosterview/types.d.ts
  34. 6 6
      src/types/plugins/rosterview/utils.d.ts

+ 1 - 1
src/headless/index.js

@@ -41,7 +41,7 @@ import './plugins/pubsub/index.js'; // XEP-0060 Pubsub
 export { RosterContact, RosterContacts, RosterFilter, Presence, Presences } from './plugins/roster/index.js';
 
 import './plugins/smacks/index.js'; // XEP-0198 Stream Management
-export { XMPPStatus } from './plugins/status/index.js';
+export { Profile } from './plugins/status/index.js';
 export { VCard, VCards } from './plugins/vcard/index.js'; // XEP-0054 VCard-temp
 // ---------------------------
 // END: Removable components

+ 7 - 4
src/headless/plugins/caps/tests/caps.js

@@ -21,7 +21,9 @@ describe("A sent presence stanza", function () {
         _converse.api.disco.own.features.add("http://jabber.org/protocol/disco#items");
         _converse.api.disco.own.features.add("http://jabber.org/protocol/muc");
 
-        const presence = await _converse.xmppstatus.constructPresence();
+        const { profile } = _converse.state;
+
+        const presence = await profile.constructPresence();
         expect(presence.toLocaleString()).toBe(
             `<presence xmlns="jabber:client">`+
                 `<priority>0</priority>`+
@@ -31,7 +33,8 @@ describe("A sent presence stanza", function () {
 
     it("has a given priority", mock.initConverse(['statusInitialized'], {}, async (_converse) => {
         const { api } = _converse;
-        let pres = await _converse.xmppstatus.constructPresence('online', null, 'Hello world');
+        const { profile } = _converse.state;
+        let pres = await profile.constructPresence('online', null, 'Hello world');
         expect(pres.toLocaleString()).toBe(
             `<presence xmlns="jabber:client">`+
                 `<status>Hello world</status>`+
@@ -41,7 +44,7 @@ describe("A sent presence stanza", function () {
         );
 
         api.settings.set('priority', 2);
-        pres = await _converse.xmppstatus.constructPresence('away', null, 'Going jogging');
+        pres = await profile.constructPresence('away', null, 'Going jogging');
         expect(pres.toLocaleString()).toBe(
             `<presence xmlns="jabber:client">`+
                 `<show>away</show>`+
@@ -52,7 +55,7 @@ describe("A sent presence stanza", function () {
         );
 
         api.settings.set('priority', undefined);
-        pres = await _converse.xmppstatus.constructPresence('dnd', null, 'Doing taxes');
+        pres = await profile.constructPresence('dnd', null, 'Doing taxes');
         expect(pres.toLocaleString()).toBe(
             `<presence xmlns="jabber:client">`+
                 `<show>dnd</show>`+

+ 1 - 1
src/headless/plugins/chat/model.js

@@ -196,7 +196,7 @@ class ChatBox extends ModelWithVCard(ModelWithMessages(ModelWithContact(ColorAwa
             {
                 body,
                 from: _converse.session.get('jid'),
-                fullname: _converse.state.xmppstatus.get('fullname'),
+                fullname: _converse.state.profile.get('fullname'),
                 id: origin_id,
                 is_spoiler,
                 jid: this.get('jid'),

+ 4 - 4
src/headless/plugins/muc/muc.js

@@ -215,9 +215,9 @@ class MUC extends ModelWithVCard(ModelWithMessages(ColorAwareModel(ChatBoxBase))
         const maxstanzas = is_new || this.features.get("mam_enabled") ? 0 : api.settings.get("muc_history_max_stanzas");
         password = password || this.get("password");
 
-        const { xmppstatus } = _converse.state;
-        const status = xmppstatus.get("status");
-        const status_message = xmppstatus.get("status_message");
+        const { profile } = _converse.state;
+        const status = profile.get("status");
+        const status_message = profile.get("status_message");
         const stanza = stx`
             <presence xmlns="jabber:client"
                       id="${getUniqueId()}"
@@ -2055,7 +2055,7 @@ class MUC extends ModelWithVCard(ModelWithMessages(ColorAwareModel(ChatBoxBase))
      */
     async sendStatusPresence(type, status, child_nodes) {
         if (this.session.get("connection_status") === ROOMSTATUS.ENTERED) {
-            const presence = await _converse.state.xmppstatus.constructPresence(type, this.getRoomJIDAndNick(), status);
+            const presence = await _converse.state.profile.constructPresence(type, this.getRoomJIDAndNick(), status);
             /** @type {Element[]|Builder[]} */ (child_nodes)
                 ?.map((c) => c?.tree() ?? c)
                 .forEach((c) => presence.cnode(c).up());

+ 1 - 1
src/headless/plugins/muc/occupant.js

@@ -173,7 +173,7 @@ class MUCOccupant extends ModelWithVCard(ModelWithMessages(ColorAwareModel(Model
             {
                 body,
                 from: own_occupant.get("from"),
-                fullname: _converse.state.xmppstatus.get("fullname"),
+                fullname: _converse.state.profile.get("fullname"),
                 id: origin_id,
                 jid: this.get("jid"),
                 message: body,

+ 5 - 4
src/headless/plugins/muc/tests/muc.js

@@ -44,8 +44,9 @@ describe("Groupchats", function () {
         it("sends the user status when joining and when it changes",
                 mock.initConverse(['statusInitialized'], {}, async function (_converse) {
 
+            const { profile } = _converse.state;
             const muc_jid = 'coven@chat.shakespeare.lit';
-            _converse.xmppstatus.set('status', 'away');
+            profile.set('status', 'away');
 
             const sent_stanzas = _converse.api.connection.get().sent_stanzas;
             while (sent_stanzas.length) sent_stanzas.pop();
@@ -64,7 +65,7 @@ describe("Groupchats", function () {
 
             while (sent_stanzas.length) sent_stanzas.pop();
 
-            _converse.xmppstatus.set('status', 'xa');
+            profile.set('status', 'xa');
             pres = await u.waitUntil(() => sent_stanzas.filter(s => s.nodeName === 'presence' && s.getAttribute('to') === `${muc_jid}/romeo`).pop());
 
             expect(Strophe.serialize(pres)).toBe(
@@ -74,8 +75,8 @@ describe("Groupchats", function () {
                     `<c hash="sha-1" node="https://conversejs.org" ver="TfHz9vOOfqIG0Z9lW5CuPaWGnrQ=" xmlns="http://jabber.org/protocol/caps"/>`+
                 `</presence>`)
 
-            _converse.xmppstatus.set('status', 'dnd');
-            _converse.xmppstatus.set('status_message', 'Do not disturb');
+            profile.set('status', 'dnd');
+            profile.set('status_message', 'Do not disturb');
             while (sent_stanzas.length) sent_stanzas.pop();
 
             const muc2_jid = 'cave@chat.shakespeare.lit';

+ 3 - 3
src/headless/plugins/muc/utils.js

@@ -161,13 +161,13 @@ export async function onDirectMUCInvitation (message) {
 export function getDefaultMUCNickname () {
     // XXX: if anything changes here, update the docs for the
     // locked_muc_nickname setting.
-    const { xmppstatus } = _converse.state;
-    if (!xmppstatus) {
+    const { profile } = _converse.state;
+    if (!profile) {
         log.error("Called getDefaultMUCNickname before statusInitialized has been fired.");
         return '';
 
     }
-    const nick = xmppstatus.getNickname();
+    const nick = profile.getNickname();
     if (nick) {
         return nick;
     } else if (api.settings.get('muc_nickname_from_jid')) {

+ 3 - 3
src/headless/plugins/roster/contacts.js

@@ -418,7 +418,7 @@ class RosterContacts extends Collection {
         const jid = presence.getAttribute('from');
         const resource = Strophe.getResourceFromJid(jid);
         const presence_type = presence.getAttribute('type');
-        const { xmppstatus } = _converse.state;
+        const { profile } = _converse.state;
 
         if ((api.connection.get().jid !== jid) &&
                 (presence_type !== 'unavailable') &&
@@ -428,10 +428,10 @@ class RosterContacts extends Collection {
             // synchronize_availability option set to update,
             // we'll update ours as well.
             const show = presence.querySelector('show')?.textContent || 'online';
-            xmppstatus.save({ 'status': show }, { 'silent': true });
+            profile.save({ 'status': show }, { silent: true });
 
             const status_message = presence.querySelector('status')?.textContent;
-            if (status_message) xmppstatus.save({ status_message });
+            if (status_message) profile.save({ status_message });
         }
         if (_converse.session.get('jid') === jid && presence_type === 'unavailable') {
             // XXX: We've received an "unavailable" presence from our

+ 4 - 4
src/headless/plugins/status/api.js

@@ -18,7 +18,7 @@ export default {
          */
         async get () {
             await api.waitUntil('statusInitialized');
-            return _converse.state.xmppstatus.get('status');
+            return _converse.state.profile.get('status');
         },
 
         /**
@@ -43,7 +43,7 @@ export default {
                 data.status_message = message;
             }
             await api.waitUntil('statusInitialized');
-            _converse.state.xmppstatus.save(data);
+            _converse.state.profile.save(data);
         },
 
         /**
@@ -61,7 +61,7 @@ export default {
              */
             async get () {
                 await api.waitUntil('statusInitialized');
-                return _converse.state.xmppstatus.get('status_message');
+                return _converse.state.profile.get('status_message');
             },
             /**
              * @async
@@ -71,7 +71,7 @@ export default {
              */
             async set (status) {
                 await api.waitUntil('statusInitialized');
-                _converse.state.xmppstatus.save({ status_message: status });
+                _converse.state.profile.save({ status_message: status });
             }
         }
     }

+ 2 - 2
src/headless/plugins/status/index.js

@@ -1,4 +1,4 @@
-import XMPPStatus from './status.js';
+import Profile from './profile.js';
 import './plugin.js';
 
-export { XMPPStatus };
+export { Profile };

+ 13 - 6
src/headless/plugins/status/plugin.js

@@ -1,4 +1,4 @@
-import XMPPStatus from './status.js';
+import Profile from './profile.js';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
@@ -32,7 +32,14 @@ converse.plugins.add('converse-status', {
         });
         api.promises.add(['statusInitialized']);
 
-        const exports = { XMPPStatus, onUserActivity, onEverySecond, sendCSI, registerIntervalHandler };
+        const exports = {
+            XMPPStatus: Profile, // Deprecated
+            Profile,
+            onUserActivity,
+            onEverySecond,
+            sendCSI,
+            registerIntervalHandler
+        };
         Object.assign(_converse, exports); // Deprecated
         Object.assign(_converse.exports, exports);
         Object.assign(_converse.api.user, status_api);
@@ -45,10 +52,10 @@ converse.plugins.add('converse-status', {
         api.listen.on('beforeTearDown', tearDown);
 
         api.listen.on('clearSession', () => {
-            if (shouldClearCache(_converse) && _converse.state.xmppstatus) {
-                _converse.state.xmppstatus.destroy();
-                delete _converse.state.xmppstatus;
-                Object.assign(_converse, { xmppstatus: undefined }); // XXX DEPRECATED
+            if (shouldClearCache(_converse) && _converse.state.profile) {
+                _converse.state.profile.destroy();
+                delete _converse.state.profile;
+                Object.assign(_converse, { profile: undefined }); // XXX DEPRECATED
                 api.promises.add(['statusInitialized']);
             }
         });

+ 3 - 3
src/headless/plugins/status/status.js → src/headless/plugins/status/profile.js

@@ -8,7 +8,7 @@ import { isIdle, getIdleSeconds } from './utils.js';
 
 const { Strophe, $pres } = converse.env;
 
-export default class XMPPStatus extends ModelWithVCard(ColorAwareModel(Model)) {
+export default class Profile extends ModelWithVCard(ColorAwareModel(Model)) {
     defaults() {
         return { status: api.settings.get('default_state') };
     }
@@ -79,8 +79,8 @@ export default class XMPPStatus extends ModelWithVCard(ColorAwareModel(Model)) {
 
         if (type === 'subscribe') {
             presence = $pres({ to, type });
-            const { xmppstatus } = _converse.state;
-            const nick = xmppstatus.getNickname();
+            const { profile } = _converse.state;
+            const nick = profile.getNickname();
             if (nick) presence.c('nick', { 'xmlns': Strophe.NS.NICK }).t(nick).up();
         } else if (
             type === 'unavailable' ||

+ 1 - 1
src/headless/plugins/status/tests/status.js

@@ -2,7 +2,7 @@
 
 const u = converse.env.utils;
 
-describe("The XMPPStatus model", function () {
+describe("The Profile model", function () {
 
     it("won't send <show>online</show> when setting a custom status message",
             mock.initConverse(async (_converse) => {

+ 18 - 14
src/headless/plugins/status/utils.js

@@ -17,21 +17,25 @@ function onStatusInitialized (reconnecting) {
     api.trigger('statusInitialized', reconnecting);
 }
 
+/**
+ * @param {boolean} reconnecting
+ */
 export function initStatus (reconnecting) {
-    // If there's no xmppstatus obj, then we were never connected to
+    // If there's no profile obj, then we were never connected to
     // begin with, so we set reconnecting to false.
-    reconnecting = _converse.state.xmppstatus === undefined ? false : reconnecting;
+    reconnecting = _converse.state.profile === undefined ? false : reconnecting;
     if (reconnecting) {
         onStatusInitialized(reconnecting);
     } else {
         const id = `converse.xmppstatus-${_converse.session.get('bare_jid')}`;
-        _converse.state.xmppstatus = new _converse.exports.XMPPStatus({ id });
-        Object.assign(_converse, { xmppstatus: _converse.state.xmppstatus });
-        initStorage(_converse.state.xmppstatus, id, 'session');
-        _converse.state.xmppstatus.fetch({
-            'success': () => onStatusInitialized(reconnecting),
-            'error': () => onStatusInitialized(reconnecting),
-            'silent': true
+        _converse.state.profile = new _converse.exports.Profile({ id });
+        _converse.state.xmppstatus = _converse.state.profile; // Deprecated
+        Object.assign(_converse, { xmppstatus: _converse.state.profile }); // Deprecated
+        initStorage(_converse.state.profile, id, 'session');
+        _converse.state.profile.fetch({
+            success: () => onStatusInitialized(reconnecting),
+            error: () => onStatusInitialized(reconnecting),
+            silent: true
         });
     }
 }
@@ -72,7 +76,7 @@ export function onUserActivity () {
         auto_changed_status = false;
         // XXX: we should really remember the original state here, and
         // then set it back to that...
-        _converse.state.xmppstatus.set('status', api.settings.get("default_state"));
+        _converse.state.profile.set('status', api.settings.get("default_state"));
     }
 }
 
@@ -85,8 +89,8 @@ export function onEverySecond () {
         // This can happen when the connection reconnects.
         return;
     }
-    const { xmppstatus } = _converse.state;
-    const stat = xmppstatus.get('status');
+    const { profile } = _converse.state;
+    const stat = profile.get('status');
     idle_seconds++;
     if (api.settings.get("csi_waiting_time") > 0 &&
             idle_seconds > api.settings.get("csi_waiting_time") &&
@@ -103,12 +107,12 @@ export function onEverySecond () {
             idle_seconds > api.settings.get("auto_away") &&
             stat !== 'away' && stat !== 'xa' && stat !== 'dnd') {
         auto_changed_status = true;
-        xmppstatus.set('status', 'away');
+        profile.set('status', 'away');
     } else if (api.settings.get("auto_xa") > 0 &&
             idle_seconds > api.settings.get("auto_xa") &&
             stat !== 'xa' && stat !== 'dnd') {
         auto_changed_status = true;
-        xmppstatus.set('status', 'xa');
+        profile.set('status', 'xa');
     }
 }
 

+ 5 - 5
src/headless/plugins/vcard/utils.js

@@ -1,6 +1,6 @@
 /**
  * @typedef {import('../../plugins/muc/message').default} MUCMessage
- * @typedef {import('../../plugins/status/status').default} XMPPStatus
+ * @typedef {import('../../plugins/status/profile').default} Profile
  * @typedef {import('../../plugins/vcard/vcards').default} VCards
  * @typedef {import('../../plugins/vcard/vcard').default} VCard
  * @typedef {import('../../shared/model-with-contact.js').default} ModelWithContact
@@ -117,12 +117,12 @@ export async function getVCardForModel(model, lazy_load = false) {
 export async function getVCardForOccupant(occupant, lazy_load = true) {
     await api.waitUntil("VCardsInitialized");
 
-    const { vcards, xmppstatus } = _converse.state;
+    const { vcards, profile } = _converse.state;
     const muc = occupant?.collection?.chatroom;
     const nick = occupant.get("nick");
 
     if (nick && muc?.get("nick") === nick) {
-        return xmppstatus.vcard;
+        return profile.vcard;
     } else {
         const jid = occupant.get("jid") || occupant.get("from");
         if (jid) {
@@ -143,12 +143,12 @@ async function getVCardForMUCMessage(message, lazy_load = true) {
     if (["error", "info"].includes(message.get("type"))) return;
 
     await api.waitUntil("VCardsInitialized");
-    const { vcards, xmppstatus } = _converse.state;
+    const { vcards, profile } = _converse.state;
     const muc = message?.collection?.chatbox;
     const nick = Strophe.getResourceFromJid(message.get("from"));
 
     if (nick && muc?.get("nick") === nick) {
-        return xmppstatus.vcard;
+        return profile.vcard;
     } else {
         const jid = message.occupant?.get("jid") || message.get("from");
         if (jid) {

+ 3 - 3
src/headless/shared/_converse.js

@@ -3,7 +3,7 @@
  * @typedef {import('@converse/skeletor').Storage} Storage
  * @typedef {import('@converse/skeletor').Collection} Collection
  * @typedef {import('../plugins/disco/index').DiscoState} DiscoState
- * @typedef {import('../plugins/status/status').default} XMPPStatus
+ * @typedef {import('../plugins/status/profile').default} Profile
  * @typedef {import('../plugins/vcard/vcard').default} VCards
  */
 import log from "@converse/log";
@@ -136,9 +136,9 @@ class ConversePrivateGlobal extends EventEmitter(Object) {
          * Namespace for storing the state, as represented by instances of
          * Models and Collections.
          *
-         * @typedef {Object & Record<string, Collection|Model|VCards|XMPPStatus|DiscoState>} ConverseState
+         * @typedef {Object & Record<string, Collection|Model|VCards|Profile|DiscoState>} ConverseState
          * @property {VCards} [vcards]
-         * @property {XMPPStatus} xmppstatus
+         * @property {Profile} profile
          * @property {DiscoState} disco
          */
         this.state = /** @type {ConverseState} */({});

+ 2 - 2
src/headless/shared/api/presence.js

@@ -1,6 +1,6 @@
 /**
  * @typedef {import('strophe.js').Builder} Builder
- * @typedef {import('../../plugins/status/status').default} XMPPStatus
+ * @typedef {import('../../plugins/status/profile').default} Profile
  * @typedef {import('../../plugins/muc/muc.js').default} MUC
  */
 import _converse from '../_converse.js';
@@ -35,7 +35,7 @@ export default {
                 children = Array.isArray(nodes) ? nodes : [nodes];
             }
 
-            const model = /** @type {XMPPStatus} */(_converse.state.xmppstatus);
+            const model = /** @type {Profile} */(_converse.state.profile);
             const presence = await model.constructPresence(type, to, status);
             children.map(c => c?.tree() ?? c).forEach(c => presence.cnode(c).up());
             send(presence);

+ 3 - 3
src/headless/shared/model-with-contact.js

@@ -11,7 +11,7 @@ export default function ModelWithContact(BaseModel) {
     return class ModelWithContact extends BaseModel {
         /**
          * @typedef {import('../plugins/roster/contact').default} RosterContact
-         * @typedef {import('./_converse.js').XMPPStatus} XMPPStatus
+         * @typedef {import('./_converse.js').Profile} Profile
          */
 
         initialize() {
@@ -19,7 +19,7 @@ export default function ModelWithContact(BaseModel) {
             this.rosterContactAdded = getOpenPromise();
             /**
              * @public
-             * @type {RosterContact|XMPPStatus}
+             * @type {RosterContact|Profile}
              */
             this.contact = null;
         }
@@ -34,7 +34,7 @@ export default function ModelWithContact(BaseModel) {
 
             let contact;
             if (Strophe.getBareJidFromJid(jid) === session.get('bare_jid')) {
-                contact = state.xmppstatus;
+                contact = state.profile;
             } else {
                 contact = await api.contacts.get(jid);
                 if (!contact && !(await api.blocklist.get()).get(jid)) {

+ 18 - 12
src/headless/tests/converse.js

@@ -99,21 +99,24 @@ describe("Converse", function() {
 
             it("has a method for getting the user's availability",
                     mock.initConverse(['statusInitialized'], {}, async(_converse) => {
-                _converse.xmppstatus.set('status', 'online');
+
+                const { profile } = _converse.state;
+                profile.set('status', 'online');
                 expect(await _converse.api.user.status.get()).toBe('online');
-                _converse.xmppstatus.set('status', 'dnd');
+                profile.set('status', 'dnd');
                 expect(await _converse.api.user.status.get()).toBe('dnd');
             }));
 
             it("has a method for setting the user's availability", mock.initConverse(async (_converse) => {
                 await _converse.api.user.status.set('away');
-                expect(await _converse.xmppstatus.get('status')).toBe('away');
+                const { profile } = _converse.state;
+                expect(await profile.get('status')).toBe('away');
                 await _converse.api.user.status.set('dnd');
-                expect(await _converse.xmppstatus.get('status')).toBe('dnd');
+                expect(await profile.get('status')).toBe('dnd');
                 await _converse.api.user.status.set('xa');
-                expect(await _converse.xmppstatus.get('status')).toBe('xa');
+                expect(await profile.get('status')).toBe('xa');
                 await _converse.api.user.status.set('chat');
-                expect(await _converse.xmppstatus.get('status')).toBe('chat');
+                expect(await profile.get('status')).toBe('chat');
                 const promise = _converse.api.user.status.set('invalid')
                 promise.catch(e => {
                     expect(e.message).toBe('Invalid availability value. See https://xmpp.org/rfcs/rfc3921.html#rfc.section.2.2.2.1');
@@ -122,23 +125,26 @@ describe("Converse", function() {
 
             it("allows setting the status message as well", mock.initConverse(async (_converse) => {
                 await _converse.api.user.status.set('away', "I'm in a meeting");
-                expect(_converse.xmppstatus.get('status')).toBe('away');
-                expect(_converse.xmppstatus.get('status_message')).toBe("I'm in a meeting");
+                const { profile } = _converse.state;
+                expect(profile.get('status')).toBe('away');
+                expect(profile.get('status_message')).toBe("I'm in a meeting");
             }));
 
             it("has a method for getting the user's status message",
                     mock.initConverse(['statusInitialized'], {}, async (_converse) => {
-                await _converse.xmppstatus.set('status_message', undefined);
+                const { profile } = _converse.state;
+                await profile.set('status_message', undefined);
                 expect(await _converse.api.user.status.message.get()).toBe(undefined);
-                await _converse.xmppstatus.set('status_message', "I'm in a meeting");
+                await profile.set('status_message', "I'm in a meeting");
                 expect(await _converse.api.user.status.message.get()).toBe("I'm in a meeting");
             }));
 
             it("has a method for setting the user's status message",
                     mock.initConverse(['statusInitialized'], {}, async (_converse) => {
-                _converse.xmppstatus.set('status_message', undefined);
+                const { profile } = _converse.state;
+                profile.set('status_message', undefined);
                 await _converse.api.user.status.message.set("I'm in a meeting");
-                expect(_converse.xmppstatus.get('status_message')).toBe("I'm in a meeting");
+                expect(profile.get('status_message')).toBe("I'm in a meeting");
             }));
         });
     });

+ 1 - 1
src/headless/types/index.d.ts

@@ -1,6 +1,6 @@
 export { EmojiPicker } from "./plugins/emoji/index.js";
 export { MAMPlaceholderMessage } from "./plugins/mam/index.js";
-export { XMPPStatus } from "./plugins/status/index.js";
+export { Profile } from "./plugins/status/index.js";
 export default converse;
 import BaseMessage from './shared/message.js';
 import ModelWithMessages from './shared/model-with-messages.js';

+ 1 - 1
src/headless/types/plugins/chat/model.d.ts

@@ -207,7 +207,7 @@ declare const ChatBox_base: {
             resolve: (value: any) => void;
             reject: (reason?: any) => void;
         };
-        contact: import("../roster/contact.js").default | import("../status/status.js").default;
+        contact: import("../roster/contact.js").default | import("../status/profile.js").default;
         setModelContact(jid: string): Promise<void>;
         cid: any;
         attributes: {};

+ 2 - 2
src/headless/types/plugins/status/index.d.ts

@@ -1,3 +1,3 @@
-export { XMPPStatus };
-import XMPPStatus from './status.js';
+export { Profile };
+import Profile from './profile.js';
 //# sourceMappingURL=index.d.ts.map

+ 3 - 3
src/headless/types/plugins/status/status.d.ts → src/headless/types/plugins/status/profile.d.ts

@@ -1,4 +1,4 @@
-declare const XMPPStatus_base: {
+declare const Profile_base: {
     new (...args: any[]): {
         _vcard: import("../vcard/vcard.js").default;
         lazy_load_vcard: boolean;
@@ -137,7 +137,7 @@ declare const XMPPStatus_base: {
         propertyIsEnumerable(v: PropertyKey): boolean;
     };
 } & typeof Model;
-export default class XMPPStatus extends XMPPStatus_base {
+export default class Profile extends Profile_base {
     defaults(): {
         status: any;
     };
@@ -163,4 +163,4 @@ export default class XMPPStatus extends XMPPStatus_base {
 }
 import { Model } from '@converse/skeletor';
 export {};
-//# sourceMappingURL=status.d.ts.map
+//# sourceMappingURL=profile.d.ts.map

+ 4 - 1
src/headless/types/plugins/status/utils.d.ts

@@ -1,4 +1,7 @@
-export function initStatus(reconnecting: any): void;
+/**
+ * @param {boolean} reconnecting
+ */
+export function initStatus(reconnecting: boolean): void;
 export function isIdle(): boolean;
 export function getIdleSeconds(): number;
 /**

+ 1 - 1
src/headless/types/plugins/vcard/utils.d.ts

@@ -36,7 +36,7 @@ export function fetchVCard(jid: string): Promise<import("./types").VCardResult |
     vcard_error: string;
 }>;
 export type MUCMessage = import("../../plugins/muc/message").default;
-export type XMPPStatus = import("../../plugins/status/status").default;
+export type Profile = import("../../plugins/status/profile").default;
 export type VCards = import("../../plugins/vcard/vcards").default;
 export type VCard = import("../../plugins/vcard/vcard").default;
 export type ModelWithContact = typeof import("../../shared/model-with-contact.js").default;

+ 4 - 4
src/headless/types/shared/_converse.d.ts

@@ -2,7 +2,7 @@ export default _converse;
 export type Storage = import("@converse/skeletor").Storage;
 export type Collection = import("@converse/skeletor").Collection;
 export type DiscoState = import("../plugins/disco/index").DiscoState;
-export type XMPPStatus = import("../plugins/status/status").default;
+export type Profile = import("../plugins/status/profile").default;
 export type VCards = import("../plugins/vcard/vcard").default;
 declare const _converse: ConversePrivateGlobal;
 declare const ConversePrivateGlobal_base: (new (...args: any[]) => {
@@ -15,7 +15,7 @@ declare const ConversePrivateGlobal_base: (new (...args: any[]) => {
     off(name: string, callback: (event: any, model: import("@converse/skeletor/src/types/model.js").Model, collection: import("@converse/skeletor").Collection, options?: Record<string, any>) => any, context?: any): any;
     stopListening(obj?: any, name?: string, callback?: (event: any, model: import("@converse/skeletor/src/types/model.js").Model, collection: import("@converse/skeletor").Collection, options?: Record<string, any>) => any): any;
     once(name: string, callback: (event: any, model: import("@converse/skeletor/src/types/model.js").Model, collection: import("@converse/skeletor").Collection, options?: Record<string, any>) => any, context: any): any;
-    listenToOnce(obj: any, name: string, callback?: (event: any, model: import("@converse/skeletor/src/types/model.js").Model, collection: import("@converse/skeletor").Collection, options? /** @type {ConverseState} */: Record<string, any>) => any): any;
+    listenToOnce(obj: any, name: string, callback?: (event: any, model: import("@converse/skeletor/src/types/model.js").Model, collection: import("@converse/skeletor").Collection, options?: Record<string, any>) => any): any;
     trigger(name: string, ...args: any[]): any;
 }) & ObjectConstructor;
 /**
@@ -74,9 +74,9 @@ declare class ConversePrivateGlobal extends ConversePrivateGlobal_base {
      * Namespace for storing the state, as represented by instances of
      * Models and Collections.
      *
-     * @typedef {Object & Record<string, Collection|Model|VCards|XMPPStatus|DiscoState>} ConverseState
+     * @typedef {Object & Record<string, Collection|Model|VCards|Profile|DiscoState>} ConverseState
      * @property {VCards} [vcards]
-     * @property {XMPPStatus} xmppstatus
+     * @property {Profile} profile
      * @property {DiscoState} disco
      */
     state: any;

+ 1 - 1
src/headless/types/shared/api/presence.d.ts

@@ -14,6 +14,6 @@ declare namespace _default {
 }
 export default _default;
 export type Builder = import("strophe.js").Builder;
-export type XMPPStatus = import("../../plugins/status/status").default;
+export type Profile = import("../../plugins/status/profile").default;
 export type MUC = import("../../plugins/muc/muc.js").default;
 //# sourceMappingURL=presence.d.ts.map

+ 1 - 1
src/headless/types/shared/message.d.ts

@@ -78,7 +78,7 @@ declare const BaseMessage_base: {
             resolve: (value: any) => void;
             reject: (reason?: any) => void;
         };
-        contact: import("../index.js").RosterContact | import("../index.js").XMPPStatus;
+        contact: import("../index.js").RosterContact | import("../index.js").Profile;
         setModelContact(jid: string): Promise<void>;
         cid: any;
         attributes: {};

+ 3 - 3
src/headless/types/shared/model-with-contact.d.ts

@@ -6,7 +6,7 @@ export default function ModelWithContact<T extends import("./types").ModelExtend
     new (...args: any[]): {
         /**
          * @typedef {import('../plugins/roster/contact').default} RosterContact
-         * @typedef {import('./_converse.js').XMPPStatus} XMPPStatus
+         * @typedef {import('./_converse.js').Profile} Profile
          */
         initialize(): void;
         rosterContactAdded: Promise<any> & {
@@ -18,9 +18,9 @@ export default function ModelWithContact<T extends import("./types").ModelExtend
         };
         /**
          * @public
-         * @type {RosterContact|XMPPStatus}
+         * @type {RosterContact|Profile}
          */
-        contact: import("../plugins/roster/contact").default | import("../index.js").XMPPStatus;
+        contact: import("../plugins/roster/contact").default | import("../index.js").Profile;
         /**
          * @param {string} jid
          */

+ 2 - 2
src/plugins/profile/modals/profile.js

@@ -11,7 +11,7 @@ import './styles/profile.scss';
 export default class ProfileModal extends BaseModal {
     /**
      * @typedef {import('@converse/headless/types/plugins/vcard/api').VCardData} VCardData
-     * @typedef {import("@converse/headless").XMPPStatus} XMPPStatus
+     * @typedef {import("@converse/headless").Profile} Profile
      */
 
     /**
@@ -28,7 +28,7 @@ export default class ProfileModal extends BaseModal {
         /**
          * Triggered when the _converse.ProfileModal has been created and initialized.
          * @event _converse#profileModalInitialized
-         * @type {XMPPStatus}
+         * @type {Profile}
          * @example _converse.api.listen.on('profileModalInitialized', status => { ... });
          */
         api.trigger('profileModalInitialized', this.model);

+ 2 - 2
src/plugins/rosterview/types.ts

@@ -1,6 +1,6 @@
 import RosterContact from "@converse/headless/types/plugins/roster/contact"
-import XMPPStatus from "@converse/headless/types/plugins/status/status"
+import Profile from "@converse/headless/types/plugins/status/profile"
 
 export type ContactsMap = {
-    [Key: string]: (XMPPStatus|RosterContact)[]
+    [Key: string]: (Profile|RosterContact)[]
 }

+ 6 - 6
src/plugins/rosterview/utils.js

@@ -4,7 +4,7 @@
  * @typedef {import('@converse/headless').RosterContacts} RosterContacts
  */
 import { __ } from 'i18n';
-import { _converse, api, converse, log, constants, u, XMPPStatus } from '@converse/headless';
+import { _converse, api, converse, log, constants, u, Profile } from '@converse/headless';
 
 const { Strophe } = converse.env;
 const { STATUS_WEIGHTS } = constants;
@@ -111,11 +111,11 @@ export function toggleGroup(ev, name) {
  *
  * The goal is to be able to filter against the VCard fullname,
  * roster nickname and JID.
- * @param {RosterContact|XMPPStatus} contact
+ * @param {RosterContact|Profile} contact
  * @returns {string} Lower-cased, tab-separated values
  */
 function getFilterCriteria(contact) {
-    const nick = contact instanceof XMPPStatus ? contact.getNickname() : contact.get('nickname');
+    const nick = contact instanceof Profile ? contact.getNickname() : contact.get('nickname');
     const jid = contact.get('jid');
     let criteria = contact.getDisplayName({ context: 'roster' });
     criteria = !criteria.includes(jid) ? criteria.concat(`   ${jid}`) : criteria;
@@ -124,7 +124,7 @@ function getFilterCriteria(contact) {
 }
 
 /**
- * @param {RosterContact|XMPPStatus} contact
+ * @param {RosterContact|Profile} contact
  * @param {string} groupname
  * @returns {boolean}
  */
@@ -236,8 +236,8 @@ export function populateContactsMap(contacts_map, contact) {
 }
 
 /**
- * @param {RosterContact|XMPPStatus} contact1
- * @param {RosterContact|XMPPStatus} contact2
+ * @param {RosterContact|Profile} contact1
+ * @param {RosterContact|Profile} contact2
  * @returns {(-1|0|1)}
  */
 export function contactsComparator(contact1, contact2) {

+ 2 - 2
src/types/plugins/rosterview/types.d.ts

@@ -1,6 +1,6 @@
 import RosterContact from "@converse/headless/types/plugins/roster/contact";
-import XMPPStatus from "@converse/headless/types/plugins/status/status";
+import Profile from "@converse/headless/types/plugins/status/profile";
 export type ContactsMap = {
-    [Key: string]: (XMPPStatus | RosterContact)[];
+    [Key: string]: (Profile | RosterContact)[];
 };
 //# sourceMappingURL=types.d.ts.map

+ 6 - 6
src/types/plugins/rosterview/utils.d.ts

@@ -24,11 +24,11 @@ export function highlightRosterItem(jid: string): void;
  */
 export function toggleGroup(ev: Event, name: string): void;
 /**
- * @param {RosterContact|XMPPStatus} contact
+ * @param {RosterContact|Profile} contact
  * @param {string} groupname
  * @returns {boolean}
  */
-export function isContactFiltered(contact: RosterContact | XMPPStatus, groupname: string): boolean;
+export function isContactFiltered(contact: RosterContact | Profile, groupname: string): boolean;
 /**
  * @param {RosterContact} contact
  * @param {string} groupname
@@ -49,11 +49,11 @@ export function shouldShowGroup(group: string, model: Model): boolean;
  */
 export function populateContactsMap(contacts_map: import("./types").ContactsMap, contact: RosterContact): import("./types").ContactsMap;
 /**
- * @param {RosterContact|XMPPStatus} contact1
- * @param {RosterContact|XMPPStatus} contact2
+ * @param {RosterContact|Profile} contact1
+ * @param {RosterContact|Profile} contact2
  * @returns {(-1|0|1)}
  */
-export function contactsComparator(contact1: RosterContact | XMPPStatus, contact2: RosterContact | XMPPStatus): (-1 | 0 | 1);
+export function contactsComparator(contact1: RosterContact | Profile, contact2: RosterContact | Profile): (-1 | 0 | 1);
 /**
  * @param {string} a
  * @param {string} b
@@ -71,5 +71,5 @@ export function getNamesAutoCompleteList(query: string): Promise<{
 export type Model = import("@converse/skeletor").Model;
 export type RosterContact = import("@converse/headless").RosterContact;
 export type RosterContacts = import("@converse/headless").RosterContacts;
-import { XMPPStatus } from '@converse/headless';
+import { Profile } from '@converse/headless';
 //# sourceMappingURL=utils.d.ts.map