123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import type {RouteComponentProps} from 'react-router';
- import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
- import ApiForm from 'sentry/components/forms/apiForm';
- import MultipleCheckbox from 'sentry/components/forms/controls/multipleCheckbox';
- import TextareaField from 'sentry/components/forms/fields/textareaField';
- import TextField from 'sentry/components/forms/fields/textField';
- import FormField from 'sentry/components/forms/formField';
- import Panel from 'sentry/components/panels/panel';
- import PanelBody from 'sentry/components/panels/panelBody';
- import PanelHeader from 'sentry/components/panels/panelHeader';
- import {API_ACCESS_SCOPES} from 'sentry/constants';
- import {t} from 'sentry/locale';
- import type {Organization} from 'sentry/types/organization';
- import {browserHistory} from 'sentry/utils/browserHistory';
- import recreateRoute from 'sentry/utils/recreateRoute';
- import routeTitleGen from 'sentry/utils/routeTitle';
- import withOrganization from 'sentry/utils/withOrganization';
- import DeprecatedAsyncView from 'sentry/views/deprecatedAsyncView';
- import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader';
- import type {DeprecatedApiKey} from './types';
- type RouteParams = {
- apiKey: string;
- };
- type Props = RouteComponentProps<RouteParams, {}> & {
- organization: Organization;
- };
- type State = DeprecatedAsyncView['state'] & {
- apiKey: DeprecatedApiKey;
- };
- class OrganizationApiKeyDetails extends DeprecatedAsyncView<Props, State> {
- getEndpoints(): ReturnType<DeprecatedAsyncView['getEndpoints']> {
- const {organization} = this.props;
- return [
- [
- 'apiKey',
- `/organizations/${organization.slug}/api-keys/${this.props.params.apiKey}/`,
- ],
- ];
- }
- getTitle() {
- return routeTitleGen(t('Edit API Key'), this.props.organization.slug, false);
- }
- handleSubmitSuccess = () => {
- addSuccessMessage('Saved changes');
- // Go back to API list
- browserHistory.push(
- recreateRoute('', {
- stepBack: -1,
- routes: this.props.routes,
- params: this.props.params,
- })
- );
- };
- handleSubmitError = () => {
- addErrorMessage('Unable to save changes. Please try again.');
- };
- renderBody() {
- const {organization} = this.props;
- return (
- <div>
- <SettingsPageHeader title={t('Edit API Key')} />
- <Panel>
- <PanelHeader>{t('API Key')}</PanelHeader>
- <ApiForm
- apiMethod="PUT"
- apiEndpoint={`/organizations/${organization.slug}/api-keys/${this.props.params.apiKey}/`}
- initialData={this.state.apiKey}
- onSubmitSuccess={this.handleSubmitSuccess}
- onSubmitError={this.handleSubmitError}
- onCancel={() =>
- browserHistory.push(
- recreateRoute('', {
- stepBack: -1,
- routes: this.props.routes,
- params: this.props.params,
- })
- )
- }
- >
- <PanelBody>
- <TextField label={t('Label')} name="label" />
- <TextField label={t('API Key')} name="key" disabled />
- <FormField name="scope_list" label={t('Scopes')} inline={false} required>
- {({name, value, onChange}) => (
- <MultipleCheckbox value={value} onChange={onChange} name={name}>
- {API_ACCESS_SCOPES.map(scope => (
- <MultipleCheckbox.Item value={scope} key={scope}>
- {scope}
- </MultipleCheckbox.Item>
- ))}
- </MultipleCheckbox>
- )}
- </FormField>
- <TextareaField
- label={t('Allowed Domains')}
- name="allowed_origins"
- placeholder="e.g. example.com or https://example.com"
- help="Separate multiple entries with a newline"
- />
- </PanelBody>
- </ApiForm>
- </Panel>
- </div>
- );
- }
- }
- export default withOrganization(OrganizationApiKeyDetails);
|