redoc/src/components/StoreProvider.ts

84 lines
1.8 KiB
TypeScript
Raw Normal View History

import memoize from 'memoize-one';
import { Component } from 'react';
import { AppStore } from '../services/';
2017-11-21 14:00:33 +03:00
import { RedocRawOptions } from '../services/RedocNormalizedOptions';
import { OpenAPISpec } from '../types';
2018-03-13 14:04:55 +03:00
import { loadAndBundleSpec } from '../utils';
2017-10-12 00:01:37 +03:00
2018-05-16 12:44:36 +03:00
export interface StoreProviderProps {
2017-10-12 00:01:37 +03:00
specUrl?: string;
spec?: object;
store?: AppStore;
2017-11-21 14:00:33 +03:00
options?: RedocRawOptions;
children: (props: { loading: boolean; store?: AppStore }) => any;
2017-10-12 00:01:37 +03:00
}
2018-05-16 12:44:36 +03:00
export interface StoreProviderState {
error?: Error;
loading: boolean;
spec?: any;
prevSpecUrl?: string;
}
2017-10-12 00:01:37 +03:00
export class StoreProvider extends Component<StoreProviderProps, StoreProviderState> {
static getDerivedStateFromProps(props, state: StoreProviderState) {
if (props.specUrl !== state.prevSpecUrl) {
return {
spec: null,
prevSpecUrl: props.specUrl,
};
}
2017-10-12 00:01:37 +03:00
return null;
}
state: StoreProviderState = {
loading: true,
spec: null,
};
@memoize
makeStore(spec, specUrl, options) {
if (!spec) {
return undefined;
}
return new AppStore(spec, specUrl, options);
2017-11-20 02:00:43 +03:00
}
2017-11-20 02:00:43 +03:00
componentDidMount() {
this.load();
}
componentDidUpdate() {
if (this.props.spec === null) {
this.load();
}
}
async load() {
const { specUrl, spec, options } = this.props;
try {
const resolvedSpec = await loadAndBundleSpec(spec || specUrl!);
this.setState({ spec: resolvedSpec, loading: false });
} catch (e) {
this.setState({ error: e });
}
}
2017-10-12 00:01:37 +03:00
render() {
2018-01-22 21:30:53 +03:00
if (this.state.error) {
throw this.state.error;
}
const { specUrl, options } = this.props;
const { loading, spec } = this.state;
return this.props.children({
loading,
store: this.makeStore(spec, specUrl, options),
});
2017-10-12 00:01:37 +03:00
}
}