2021-09-09 05:20:35 -05:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
import { useMountedState } from 'react-use';
|
|
|
|
import { AppEvents, PluginType } from '@grafana/data';
|
2021-08-26 10:15:43 -05:00
|
|
|
import { Button, HorizontalGroup, useStyles2 } from '@grafana/ui';
|
|
|
|
import appEvents from 'app/core/app_events';
|
2021-09-09 05:20:35 -05:00
|
|
|
|
|
|
|
import { CatalogPlugin, PluginStatus } from '../../types';
|
2021-08-26 10:15:43 -05:00
|
|
|
import { getStyles } from './index';
|
2021-09-09 05:20:35 -05:00
|
|
|
import { useInstallStatus, useUninstallStatus, useInstall, useUninstall } from '../../state/hooks';
|
2021-08-26 10:15:43 -05:00
|
|
|
|
|
|
|
type InstallControlsButtonProps = {
|
|
|
|
plugin: CatalogPlugin;
|
|
|
|
pluginStatus: PluginStatus;
|
|
|
|
};
|
|
|
|
|
2021-09-09 05:20:35 -05:00
|
|
|
export function InstallControlsButton({ plugin, pluginStatus }: InstallControlsButtonProps) {
|
|
|
|
const { isInstalling, error: errorInstalling } = useInstallStatus();
|
|
|
|
const { isUninstalling, error: errorUninstalling } = useUninstallStatus();
|
|
|
|
const install = useInstall();
|
|
|
|
const uninstall = useUninstall();
|
|
|
|
const [hasInstalledPanel, setHasInstalledPanel] = useState(false);
|
2021-08-26 10:15:43 -05:00
|
|
|
const styles = useStyles2(getStyles);
|
2021-09-09 05:20:35 -05:00
|
|
|
const uninstallBtnText = isUninstalling ? 'Uninstalling' : 'Uninstall';
|
|
|
|
const isMounted = useMountedState();
|
2021-08-26 10:15:43 -05:00
|
|
|
|
|
|
|
const onInstall = async () => {
|
2021-09-09 05:20:35 -05:00
|
|
|
await install(plugin.id, plugin.version);
|
|
|
|
if (!errorInstalling) {
|
|
|
|
if (isMounted() && plugin.type === PluginType.panel) {
|
|
|
|
setHasInstalledPanel(true);
|
|
|
|
}
|
2021-08-26 10:15:43 -05:00
|
|
|
appEvents.emit(AppEvents.alertSuccess, [`Installed ${plugin.name}`]);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const onUninstall = async () => {
|
2021-09-09 05:20:35 -05:00
|
|
|
await uninstall(plugin.id);
|
|
|
|
if (!errorUninstalling) {
|
2021-08-26 10:15:43 -05:00
|
|
|
appEvents.emit(AppEvents.alertSuccess, [`Uninstalled ${plugin.name}`]);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const onUpdate = async () => {
|
2021-09-09 05:20:35 -05:00
|
|
|
await install(plugin.id, plugin.version, true);
|
|
|
|
if (!errorInstalling) {
|
2021-08-26 10:15:43 -05:00
|
|
|
appEvents.emit(AppEvents.alertSuccess, [`Updated ${plugin.name}`]);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
if (pluginStatus === PluginStatus.UNINSTALL) {
|
|
|
|
return (
|
|
|
|
<HorizontalGroup height="auto">
|
2021-09-09 05:20:35 -05:00
|
|
|
<Button variant="destructive" disabled={isUninstalling} onClick={onUninstall}>
|
2021-08-26 10:15:43 -05:00
|
|
|
{uninstallBtnText}
|
|
|
|
</Button>
|
|
|
|
{hasInstalledPanel && (
|
|
|
|
<div className={styles.message}>Please refresh your browser window before using this plugin.</div>
|
|
|
|
)}
|
|
|
|
</HorizontalGroup>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pluginStatus === PluginStatus.UPDATE) {
|
|
|
|
return (
|
|
|
|
<HorizontalGroup height="auto">
|
2021-09-09 05:20:35 -05:00
|
|
|
<Button disabled={isInstalling} onClick={onUpdate}>
|
|
|
|
{isInstalling ? 'Updating' : 'Update'}
|
2021-08-26 10:15:43 -05:00
|
|
|
</Button>
|
2021-09-09 05:20:35 -05:00
|
|
|
<Button variant="destructive" disabled={isUninstalling} onClick={onUninstall}>
|
2021-08-26 10:15:43 -05:00
|
|
|
{uninstallBtnText}
|
|
|
|
</Button>
|
|
|
|
</HorizontalGroup>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
2021-09-09 05:20:35 -05:00
|
|
|
<Button disabled={isInstalling} onClick={onInstall}>
|
|
|
|
{isInstalling ? 'Installing' : 'Install'}
|
2021-08-26 10:15:43 -05:00
|
|
|
</Button>
|
|
|
|
);
|
|
|
|
}
|