);
    }
    /**
     * Helper for determining how many of each type of user is being invited.
     * Used for logging and sending analytics related to invites.
     *
     * @param {Array} inviteItems - An array with the invite items, as created
     * in {@link _parseQueryResults}.
     * @private
     * @returns {Object} An object with keys as user types and values as the
     * number of invites for that type.
     */
    _getInviteTypeCounts(inviteItems = []) {
        const inviteTypeCounts = {};
        inviteItems.forEach(i => {
            const type = i.item.type;
            if (!inviteTypeCounts[type]) {
                inviteTypeCounts[type] = 0;
            }
            inviteTypeCounts[type]++;
        });
        return inviteTypeCounts;
    }
    _isAddDisabled: () => boolean;
    /**
     * Indicates if the Add button should be disabled.
     *
     * @private
     * @returns {boolean} - True to indicate that the Add button should
     * be disabled, false otherwise.
     */
    _isAddDisabled() {
        return !this.state.inviteItems.length
            || this.state.addToCallInProgress;
    }
    _onItemSelected: (Object) => Object;
    /**
     * Callback invoked when a selection has been made but before it has been
     * set as selected.
     *
     * @param {Object} item - The item that has just been selected.
     * @private
     * @returns {Object} The item to display as selected in the input.
     */
    _onItemSelected(item) {
        if (item.item.type === 'phone') {
            item.content = item.item.number;
        }
        return item;
    }
    _onSelectionChange: (Map<*, *>) => void;
    /**
     * Handles a selection change.
     *
     * @param {Map} selectedItems - The list of selected items.
     * @private
     * @returns {void}
     */
    _onSelectionChange(selectedItems) {
        this.setState({
            inviteItems: selectedItems
        });
    }
    _onSubmit: () => void;
    /**
     * Invite people and numbers to the conference. The logic works by inviting
     * numbers, people/rooms, and videosipgw in parallel. All invitees are
     * stored in an array. As each invite succeeds, the invitee is removed
     * from the array. After all invites finish, close the modal if there are
     * no invites left to send. If any are left, that means an invite failed
     * and an error state should display.
     *
     * @private
     * @returns {void}
     */
    _onSubmit() {
        const inviteTypeCounts
            = this._getInviteTypeCounts(this.state.inviteItems);
        sendAnalytics(createInviteDialogEvent(
            'clicked', 'inviteButton', {
                ...inviteTypeCounts,
                inviteAllowed: this._isAddDisabled()
            }));
        if (this._isAddDisabled()) {
            return;
        }
        this.setState({
            addToCallInProgress: true
        });
        const {
            _conference,
            _inviteServiceUrl,
            _inviteUrl,
            _jwt
        } = this.props;
        const inviteItems = this.state.inviteItems;
        const items = inviteItems.map(item => item.item);
        const options = {
            conference: _conference,
            inviteServiceUrl: _inviteServiceUrl,
            inviteUrl: _inviteUrl,
            inviteVideoRooms: this.props.inviteVideoRooms,
            jwt: _jwt
        };
        sendInvitesForItems(items, options)
            .then(invitesLeftToSend => {
                // If any invites are left that means something failed to send
                // so treat it as an error.
                if (invitesLeftToSend.length) {
                    const erroredInviteTypeCounts
                        = this._getInviteTypeCounts(invitesLeftToSend);
                    logger.error(`${invitesLeftToSend.length} invites failed`,
                        erroredInviteTypeCounts);
                    sendAnalytics(createInviteDialogEvent(
                        'error', 'invite', {
                            ...erroredInviteTypeCounts
                        }));
                    this.setState({
                        addToCallInProgress: false,
                        addToCallError: true
                    });
                    const unsentInviteIDs = invitesLeftToSend.map(invite =>
                        invite.id || invite.number
                    );
                    const itemsToSelect = inviteItems.filter(invite =>
                        unsentInviteIDs.includes(
                            invite.item.id || invite.item.number
                        )
                    );
                    if (this._multiselect) {
                        this._multiselect.setSelectedItems(itemsToSelect);
                    }
                    return;
                }
                this.setState({
                    addToCallInProgress: false
                });
                this.props.hideDialog();
            });
    }
    _parseQueryResults: (Array