2023-02-26 10:39:57 +01:00
|
|
|
import _converse from '@converse/headless/shared/_converse.js';
|
|
|
|
import { getOpenPromise } from '@converse/openpromise';
|
2023-02-26 10:46:45 +01:00
|
|
|
import { waitUntil, isFunction } from '../../utils/core.js';
|
2023-02-26 10:39:57 +01:00
|
|
|
|
|
|
|
export default {
|
|
|
|
/**
|
|
|
|
* Converse and its plugins trigger various events which you can listen to via the
|
|
|
|
* {@link _converse.api.listen} namespace.
|
|
|
|
*
|
|
|
|
* Some of these events are also available as [ES2015 Promises](http://es6-features.org/#PromiseUsage)
|
|
|
|
* although not all of them could logically act as promises, since some events
|
|
|
|
* might be fired multpile times whereas promises are to be resolved (or
|
|
|
|
* rejected) only once.
|
|
|
|
*
|
|
|
|
* Events which are also promises include:
|
|
|
|
*
|
|
|
|
* * [cachedRoster](/docs/html/events.html#cachedroster)
|
|
|
|
* * [chatBoxesFetched](/docs/html/events.html#chatBoxesFetched)
|
|
|
|
* * [pluginsInitialized](/docs/html/events.html#pluginsInitialized)
|
|
|
|
* * [roster](/docs/html/events.html#roster)
|
|
|
|
* * [rosterContactsFetched](/docs/html/events.html#rosterContactsFetched)
|
|
|
|
* * [rosterGroupsFetched](/docs/html/events.html#rosterGroupsFetched)
|
|
|
|
* * [rosterInitialized](/docs/html/events.html#rosterInitialized)
|
|
|
|
*
|
|
|
|
* The various plugins might also provide promises, and they do this by using the
|
|
|
|
* `promises.add` api method.
|
|
|
|
*
|
|
|
|
* @namespace _converse.api.promises
|
|
|
|
* @memberOf _converse.api
|
|
|
|
*/
|
|
|
|
promises: {
|
|
|
|
/**
|
|
|
|
* By calling `promises.add`, a new [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
|
|
|
|
* is made available for other code or plugins to depend on via the
|
|
|
|
* {@link _converse.api.waitUntil} method.
|
|
|
|
*
|
|
|
|
* Generally, it's the responsibility of the plugin which adds the promise to
|
|
|
|
* also resolve it.
|
|
|
|
*
|
|
|
|
* This is done by calling {@link _converse.api.trigger}, which not only resolves the
|
|
|
|
* promise, but also emits an event with the same name (which can be listened to
|
|
|
|
* via {@link _converse.api.listen}).
|
|
|
|
*
|
|
|
|
* @method _converse.api.promises.add
|
|
|
|
* @param {string|array} [name|names] The name or an array of names for the promise(s) to be added
|
|
|
|
* @param { boolean } [replace=true] Whether this promise should be replaced with a new one when the user logs out.
|
|
|
|
* @example _converse.api.promises.add('foo-completed');
|
|
|
|
*/
|
|
|
|
add (promises, replace=true) {
|
|
|
|
promises = Array.isArray(promises) ? promises : [promises];
|
|
|
|
promises.forEach(name => {
|
|
|
|
const promise = getOpenPromise();
|
|
|
|
promise.replace = replace;
|
|
|
|
_converse.promises[name] = promise;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Wait until a promise is resolved or until the passed in function returns
|
|
|
|
* a truthy value.
|
|
|
|
* @method _converse.api.waitUntil
|
|
|
|
* @param {string|function} condition - The name of the promise to wait for,
|
|
|
|
* or a function which should eventually return a truthy value.
|
|
|
|
* @returns {Promise}
|
|
|
|
*/
|
|
|
|
waitUntil (condition) {
|
|
|
|
if (isFunction(condition)) {
|
|
|
|
return waitUntil(condition);
|
|
|
|
} else {
|
|
|
|
const promise = _converse.promises[condition];
|
|
|
|
if (promise === undefined) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return promise;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|