accounts-frontend/packages/app/pages/dev/UpdateApplicationPage.tsx

110 lines
2.8 KiB
TypeScript
Raw Normal View History

2019-12-07 16:58:52 +05:30
import React from 'react';
2018-05-05 14:31:25 +05:30
import { connect } from 'react-redux';
import logger from 'app/services/logger';
2019-12-07 16:58:52 +05:30
import { RouteComponentProps } from 'react-router';
import { FormModel } from 'app/components/ui/form';
import { browserHistory } from 'app/services/history';
import oauth from 'app/services/api/oauth';
import * as loader from 'app/services/loader';
import PageNotFound from 'app/pages/404/PageNotFound';
2020-05-24 04:38:24 +05:30
import { getApp, fetchApp as fetchAppAction } from 'app/components/dev/apps/actions';
import ApplicationForm from 'app/components/dev/apps/applicationForm/ApplicationForm';
import { OauthAppResponse } from 'app/services/api/oauth';
import { RootState } from 'app/reducers';
2019-12-07 16:58:52 +05:30
type OwnProps = RouteComponentProps<{
2020-05-24 04:38:24 +05:30
clientId: string;
2019-12-07 16:58:52 +05:30
}>;
2019-12-07 16:58:52 +05:30
interface Props extends OwnProps {
2020-05-24 04:38:24 +05:30
app: OauthAppResponse | null;
fetchApp: (app: string) => Promise<void>;
2019-12-07 16:58:52 +05:30
}
2019-12-07 16:58:52 +05:30
class UpdateApplicationPage extends React.Component<
2020-05-24 04:38:24 +05:30
Props,
{
isNotFound: boolean;
}
> {
2020-05-24 04:38:24 +05:30
form: FormModel = new FormModel();
2020-05-24 04:38:24 +05:30
state = {
isNotFound: false,
};
2020-05-24 04:38:24 +05:30
componentDidMount() {
this.props.app === null && this.fetchApp();
}
2020-05-24 04:38:24 +05:30
render() {
const { app } = this.props;
2020-05-24 04:38:24 +05:30
if (this.state.isNotFound) {
return <PageNotFound />;
}
2020-05-24 04:38:24 +05:30
if (!app) {
// we are loading
return null;
}
2020-05-24 04:38:24 +05:30
return <ApplicationForm form={this.form} onSubmit={this.onSubmit} app={app} type={app.type} />;
}
2020-05-24 04:38:24 +05:30
async fetchApp() {
const { fetchApp, match } = this.props;
try {
loader.show();
await fetchApp(match.params.clientId);
} catch (resp) {
const { status } = resp.originalResponse;
if (status === 403) {
this.goToMainPage();
2018-05-05 14:31:25 +05:30
2020-05-24 04:38:24 +05:30
return;
}
if (status === 404) {
this.setState({
isNotFound: true,
});
return;
}
logger.unexpected('Error fetching app', resp);
} finally {
loader.hide();
}
}
2020-05-24 04:38:24 +05:30
onSubmit = async () => {
const { form } = this;
const { app } = this.props;
if (!app || !app.clientId) {
throw new Error('Form has an invalid state');
}
form.beginLoading();
const result = await oauth.update(app.clientId, form.serialize());
form.endLoading();
2020-05-24 04:38:24 +05:30
this.goToMainPage(result.data.clientId);
};
2020-05-24 04:38:24 +05:30
goToMainPage = (hash?: string) => browserHistory.push(`/dev/applications${hash ? `#${hash}` : ''}`);
}
2019-12-07 16:58:52 +05:30
export default connect(
2020-05-24 04:38:24 +05:30
(state: RootState, props: OwnProps) => ({
app: getApp(state, props.match.params.clientId),
}),
{
fetchApp: fetchAppAction,
},
)(UpdateApplicationPage);