fix: loading plugin detail view by url
This commit is contained in:
parent
13d59eb04d
commit
ad6fc49515
|
|
@ -30,6 +30,13 @@ export abstract class BaseStore<T extends HasID> implements IClearable {
|
||||||
this.items = await this.requestItems().then((items) => items || []);
|
this.items = await this.requestItems().then((items) => items || []);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@action
|
||||||
|
public refreshIfMissing = async (id: number): Promise<void> => {
|
||||||
|
if (this.getByIDOrUndefined(id) === undefined) {
|
||||||
|
await this.refresh();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public getByID = (id: number): T => {
|
public getByID = (id: number): T => {
|
||||||
const item = this.getByIDOrUndefined(id);
|
const item = this.getByIDOrUndefined(id);
|
||||||
if (item === undefined) {
|
if (item === undefined) {
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ import * as config from '../config';
|
||||||
import Container from '../common/Container';
|
import Container from '../common/Container';
|
||||||
import {inject, Stores} from '../inject';
|
import {inject, Stores} from '../inject';
|
||||||
import {IPlugin} from '../types';
|
import {IPlugin} from '../types';
|
||||||
|
import LoadingSpinner from '../common/LoadingSpinner';
|
||||||
|
|
||||||
type IProps = RouteComponentProps<{id: string}>;
|
type IProps = RouteComponentProps<{id: string}>;
|
||||||
|
|
||||||
|
|
@ -42,8 +43,9 @@ class PluginDetailView extends Component<IProps & Stores<'pluginStore'>, IState>
|
||||||
this.refreshFeatures();
|
this.refreshFeatures();
|
||||||
}
|
}
|
||||||
|
|
||||||
private refreshFeatures() {
|
private async refreshFeatures() {
|
||||||
return Promise.all([this.refreshConfigurer(), this.refreshDisplayer()]);
|
await this.props.pluginStore.refreshIfMissing(this.pluginID);
|
||||||
|
return await Promise.all([this.refreshConfigurer(), this.refreshDisplayer()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async refreshConfigurer() {
|
private async refreshConfigurer() {
|
||||||
|
|
@ -67,14 +69,16 @@ class PluginDetailView extends Component<IProps & Stores<'pluginStore'>, IState>
|
||||||
}
|
}
|
||||||
|
|
||||||
public render() {
|
public render() {
|
||||||
const pluginInfo = this.pluginInfo();
|
const pluginInfo = this.props.pluginStore.getByIDOrUndefined(this.pluginID);
|
||||||
const {name, capabilities} = pluginInfo;
|
if (pluginInfo === undefined) {
|
||||||
|
return <LoadingSpinner />;
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<DefaultPage title={name} maxWidth={1000}>
|
<DefaultPage title={pluginInfo.name} maxWidth={1000}>
|
||||||
<PanelWrapper name={'Plugin Info'} icon={Info}>
|
<PanelWrapper name={'Plugin Info'} icon={Info}>
|
||||||
<PluginInfo pluginInfo={pluginInfo} />
|
<PluginInfo pluginInfo={pluginInfo} />
|
||||||
</PanelWrapper>
|
</PanelWrapper>
|
||||||
{capabilities.indexOf('configurer') !== -1 ? (
|
{pluginInfo.capabilities.indexOf('configurer') !== -1 ? (
|
||||||
<PanelWrapper
|
<PanelWrapper
|
||||||
name={'Configurer'}
|
name={'Configurer'}
|
||||||
description={'This is the configuration panel for this plugin.'}
|
description={'This is the configuration panel for this plugin.'}
|
||||||
|
|
@ -94,7 +98,7 @@ class PluginDetailView extends Component<IProps & Stores<'pluginStore'>, IState>
|
||||||
/>
|
/>
|
||||||
</PanelWrapper>
|
</PanelWrapper>
|
||||||
) : null}{' '}
|
) : null}{' '}
|
||||||
{capabilities.indexOf('displayer') !== -1 ? (
|
{pluginInfo.capabilities.indexOf('displayer') !== -1 ? (
|
||||||
<PanelWrapper
|
<PanelWrapper
|
||||||
name={'Displayer'}
|
name={'Displayer'}
|
||||||
description={'This is the information generated by the plugin.'}
|
description={'This is the information generated by the plugin.'}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue