import React, { useState } from 'react'; import { useIntl, FormattedMessage, defineMessages } from 'react-intl'; import { createApp } from 'soapbox/actions/apps'; import { obtainOAuthToken } from 'soapbox/actions/oauth'; import { Column, Button, Form, FormActions, FormGroup, Input, Stack, Text, Textarea } from 'soapbox/components/ui'; import { useAppDispatch, useOwnAccount } from 'soapbox/hooks'; import { getBaseURL } from 'soapbox/utils/accounts'; const messages = defineMessages({ heading: { id: 'column.app_create', defaultMessage: 'Create app' }, namePlaceholder: { id: 'app_create.name_placeholder', defaultMessage: 'e.g. \'Soapbox\'' }, scopesPlaceholder: { id: 'app_create.scopes_placeholder', defaultMessage: 'e.g. \'read write follow\'' }, }); const BLANK_PARAMS = { client_name: '', redirect_uris: 'urn:ietf:wg:oauth:2.0:oob', scopes: '', website: '', }; type Params = typeof BLANK_PARAMS; const CreateApp: React.FC = () => { const intl = useIntl(); const dispatch = useAppDispatch(); const account = useOwnAccount(); const [app, setApp] = useState | null>(null); const [token, setToken] = useState(null); const [isLoading, setLoading] = useState(false); const [params, setParams] = useState(BLANK_PARAMS); const handleCreateApp = () => { const baseURL = getBaseURL(account!); return dispatch(createApp(params, baseURL)) .then(app => { setApp(app); return app; }); }; const handleCreateToken = (app: Record) => { const baseURL = getBaseURL(account!); const tokenParams = { client_id: app!.client_id, client_secret: app!.client_secret, redirect_uri: params.redirect_uris, grant_type: 'client_credentials', scope: params.scopes, }; return dispatch(obtainOAuthToken(tokenParams, baseURL)) .then(setToken); }; const handleSubmit = () => { setLoading(true); handleCreateApp() .then(handleCreateToken) .then(() => { scrollToTop(); setLoading(false); }).catch(error => { console.error(error); setLoading(false); }); }; const setParam = (key: string, value: string) => { setParams({ ...params, [key]: value }); }; const handleParamChange = (key: string): React.ChangeEventHandler => { return e => { setParam(key, e.target.value); }; }; const resetState = () => { setApp(null); setToken(null); setLoading(false); setParams(BLANK_PARAMS); }; const handleReset = () => { resetState(); scrollToTop(); }; const scrollToTop = (): void => { window.scrollTo({ top: 0, behavior: 'smooth' }); }; const renderResults = () => { return (
}>