| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | // @flow
import { Dropbox } from 'dropbox';
import {
    getJitsiMeetGlobalNS,
    getLocationContextRoot,
    parseStandardURIString
} from '../base/util';
import { parseURLParams } from '../base/config';
import { UPDATE_DROPBOX_TOKEN } from './actionTypes';
/**
 * Executes the oauth flow.
 *
 * @param {string} authUrl - The URL to oauth service.
 * @returns {Promise<string>} - The URL with the authorization details.
 */
function authorize(authUrl: string): Promise<string> {
    const windowName = `oauth${Date.now()}`;
    const gloabalNS = getJitsiMeetGlobalNS();
    gloabalNS.oauthCallbacks = gloabalNS.oauthCallbacks || {};
    return new Promise(resolve => {
        const popup = window.open(authUrl, windowName);
        gloabalNS.oauthCallbacks[windowName] = () => {
            const returnURL = popup.location.href;
            popup.close();
            delete gloabalNS.oauthCallbacks.windowName;
            resolve(returnURL);
        };
    });
}
/**
 * Action to authorize the Jitsi Recording app in dropbox.
 *
 * @returns {Function}
 */
export function authorizeDropbox() {
    return (dispatch: Function, getState: Function) => {
        const state = getState();
        const { locationURL } = state['features/base/connection'];
        const { dropbox } = state['features/base/config'];
        const redirectURI = `${locationURL.origin
            + getLocationContextRoot(locationURL)}static/oauth.html`;
        const dropboxAPI = new Dropbox({ clientId: dropbox.clientId });
        const url = dropboxAPI.getAuthenticationUrl(redirectURI);
        authorize(url).then(returnUrl => {
            const params
                = parseURLParams(parseStandardURIString(returnUrl), true) || {};
            dispatch(updateDropboxToken(params.access_token));
        });
    };
}
/**
 * Action to update the dropbox access token.
 *
 * @param {string} token - The new token.
 * @returns {{
 *     type: UPDATE_DROPBOX_TOKEN,
 *     token: string
 * }}
 */
export function updateDropboxToken(token: string) {
    return {
        type: UPDATE_DROPBOX_TOKEN,
        token
    };
}
 |