| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | // @flow
/**
 * An registry that dispatches hardware back button events for subscribers with a custom logic.
 */
class BackButtonRegistry {
    _listeners: Array<Function>;
    /**
     * Instantiates a new instance of the registry.
     */
    constructor() {
        this._listeners = [];
    }
    /**
     * Adds a listener to the registry.
     *
     * NOTE: Due to the different order of component mounts, we allow a component to register
     * its listener to the top of the list, so then that will be invoked before other, 'non-top'
     * listeners. For example a 'non-top' listener can be the one that puts the app into PiP mode,
     * while a 'top' listener is the one that closes a modal in a conference.
     *
     * @param {Function} listener - The listener function.
     * @param {boolean?} top - If true, the listener will be put on the top (eg for modal-like components).
     * @returns {void}
     */
    addListener(listener: Function, top: boolean = false) {
        if (top) {
            this._listeners.splice(0, 0, listener);
        } else {
            this._listeners.push(listener);
        }
    }
    /**
     * Removes a listener from the registry.
     *
     * @param {Function} listener - The listener to remove.
     * @returns {void}
     */
    removeListener(listener: Function) {
        this._listeners = this._listeners.filter(f => f !== listener);
    }
    onHardwareBackPress: () => boolean
    /**
     * Callback for the back button press event.
     *
     * @returns {boolean}
     */
    onHardwareBackPress() {
        for (const listener of this._listeners) {
            const result = listener();
            if (result === true) {
                return true;
            }
        }
        return false;
    }
}
export default new BackButtonRegistry();
 |