soapbox/app/soapbox/actions/consumer-auth.ts

54 wiersze
1.5 KiB
TypeScript

import axios from 'axios';
import * as BuildConfig from 'soapbox/build-config';
import { isURL } from 'soapbox/utils/auth';
import sourceCode from 'soapbox/utils/code';
import { getScopes } from 'soapbox/utils/scopes';
import { createApp } from './apps';
import type { AppDispatch, RootState } from 'soapbox/store';
const createProviderApp = () => {
return async(dispatch: AppDispatch, getState: () => RootState) => {
const scopes = getScopes(getState());
const params = {
client_name: sourceCode.displayName,
redirect_uris: `${window.location.origin}/login/external`,
website: sourceCode.homepage,
scopes,
};
return dispatch(createApp(params));
};
};
export const prepareRequest = (provider: string) => {
return async(dispatch: AppDispatch, getState: () => RootState) => {
const baseURL = isURL(BuildConfig.BACKEND_URL) ? BuildConfig.BACKEND_URL : '';
const scopes = getScopes(getState());
const app = await dispatch(createProviderApp());
const { client_id, redirect_uri } = app;
localStorage.setItem('soapbox:external:app', JSON.stringify(app));
localStorage.setItem('soapbox:external:baseurl', baseURL);
localStorage.setItem('soapbox:external:scopes', scopes);
const params = {
provider,
authorization: {
client_id,
redirect_uri,
scope: scopes,
},
};
const formdata = axios.toFormData(params);
const query = new URLSearchParams(formdata as any);
location.href = `${baseURL}/oauth/prepare_request?${query.toString()}`;
};
};