mirror of
https://github.com/Redocly/redoc.git
synced 2024-11-29 03:53:43 +03:00
61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import * as PropTypes from 'prop-types';
|
|
import * as React from 'react';
|
|
|
|
import { RedocNormalizedOptions, RedocRawOptions } from '../services/RedocNormalizedOptions';
|
|
import { ErrorBoundary } from './ErrorBoundary';
|
|
import { Loading } from './Loading/Loading';
|
|
import { Redoc } from './Redoc/Redoc';
|
|
import { StoreBuilder } from './StoreBuilder';
|
|
|
|
export interface RedocStandaloneProps {
|
|
spec?: object;
|
|
specUrl?: string;
|
|
options?: RedocRawOptions;
|
|
onLoaded?: (e?: Error) => any;
|
|
}
|
|
|
|
export class RedocStandalone extends React.PureComponent<RedocStandaloneProps> {
|
|
static propTypes = {
|
|
spec: (props, _, componentName) => {
|
|
if (!props.spec && !props.specUrl) {
|
|
return new Error(
|
|
`One of props 'spec' or 'specUrl' was not specified in '${componentName}'.`,
|
|
);
|
|
}
|
|
return null;
|
|
},
|
|
|
|
specUrl: (props, _, componentName) => {
|
|
if (!props.spec && !props.specUrl) {
|
|
return new Error(
|
|
`One of props 'spec' or 'specUrl' was not specified in '${componentName}'.`,
|
|
);
|
|
}
|
|
return null;
|
|
},
|
|
options: PropTypes.any,
|
|
onLoaded: PropTypes.any,
|
|
};
|
|
|
|
render() {
|
|
const { spec, specUrl, options = {}, onLoaded } = this.props;
|
|
const hideLoading = options.hideLoading !== undefined;
|
|
|
|
const normalizedOpts = new RedocNormalizedOptions(options);
|
|
|
|
return (
|
|
<ErrorBoundary>
|
|
<StoreBuilder spec={spec} specUrl={specUrl} options={options} onLoaded={onLoaded}>
|
|
{({ loading, store }) =>
|
|
!loading ? (
|
|
<Redoc store={store!} />
|
|
) : hideLoading ? null : (
|
|
<Loading color={normalizedOpts.theme.colors.primary.main} />
|
|
)
|
|
}
|
|
</StoreBuilder>
|
|
</ErrorBoundary>
|
|
);
|
|
}
|
|
}
|