import * as React from 'react'; import { Icon, Card, Chip } from 'react-native-paper'; import { _ } from '@joplin/lib/locale'; import { View } from 'react-native'; import { PluginItem } from '@joplin/lib/components/shared/config/plugins/types'; import shim from '@joplin/lib/shim'; import PluginService from '@joplin/lib/services/plugins/PluginService'; import ActionButton, { PluginCallback } from './ActionButton'; export enum InstallState { NotInstalled, Installing, Installed, } export enum UpdateState { Idle = 1, CanUpdate = 2, Updating = 3, HasBeenUpdated = 4, } interface Props { item: PluginItem; isCompatible: boolean; hasErrors?: boolean; installState?: InstallState; updateState?: UpdateState; onInstall?: PluginCallback; onUpdate?: PluginCallback; onDelete?: PluginCallback; onToggle?: PluginCallback; onAboutPress?: PluginCallback; onShowPluginLog?: PluginCallback; } // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied const PluginIcon = (props: any) => ; const PluginBox: React.FC = props => { const manifest = props.item.manifest; const item = props.item; const installButtonTitle = () => { if (props.installState === InstallState.Installing) return _('Installing...'); if (props.installState === InstallState.NotInstalled) return _('Install'); if (props.installState === InstallState.Installed) return _('Installed'); return `Invalid install state: ${props.installState}`; }; const installButton = ( ); const getUpdateButtonTitle = () => { if (props.updateState === UpdateState.Updating) return _('Updating...'); if (props.updateState === UpdateState.HasBeenUpdated) return _('Updated'); return _('Update'); }; const updateButton = ( ); const deleteButton = ( ); const disableButton = ; const enableButton = ; const aboutButton = ; const renderErrorsChip = () => { if (!props.hasErrors) return null; return ( props.onShowPluginLog({ item })} > {_('Error')} ); }; const renderRecommendedChip = () => { if (!props.item.manifest._recommended || !props.isCompatible) { return null; } return {_('Recommended')}; }; const renderBuiltInChip = () => { if (!props.item.builtIn) { return null; } return {_('Built-in')}; }; const renderIncompatibleChip = () => { if (props.isCompatible) return null; return ( { void shim.showMessageBox( PluginService.instance().describeIncompatibility(props.item.manifest), { buttons: [_('OK')] }, ); }} >{_('Incompatible')} ); }; const updateStateIsIdle = props.updateState !== UpdateState.Idle; return ( {renderIncompatibleChip()} {renderErrorsChip()} {renderRecommendedChip()} {renderBuiltInChip()} {props.onAboutPress ? aboutButton : null} {props.onInstall ? installButton : null} {props.onDelete && !props.item.builtIn ? deleteButton : null} {props.onUpdate && updateStateIsIdle ? updateButton : null} {props.onToggle && props.item.enabled ? disableButton : null} {props.onToggle && !props.item.enabled ? enableButton : null} ); }; export default PluginBox;