import * as React from 'react'; import { Card, Text } from 'react-native-paper'; import { _ } from '@joplin/lib/locale'; import { PluginItem } from '@joplin/lib/components/shared/config/plugins/types'; import ActionButton from '../buttons/ActionButton'; import { ButtonType } from '../../../../buttons/TextButton'; import PluginChips from './PluginChips'; import { UpdateState } from '../utils/useUpdateState'; import { PluginCallback } from '../utils/usePluginCallbacks'; import { useCallback } from 'react'; import { StyleSheet, View } from 'react-native'; import InstallButton from '../buttons/InstallButton'; import PluginTitle from './PluginTitle'; import RecommendedBadge from './RecommendedBadge'; import CardButton from '../../../../buttons/CardButton'; export enum InstallState { NotInstalled, Installing, Installed, } interface Props { themeId: number; item: PluginItem; isCompatible: boolean; // In some cases, showing an "installed" chip is redundant (e.g. in the "installed plugins" // tab). In other places (e.g. search), an "installed" chip is important. showInstalledChip: boolean; hasErrors?: boolean; installState?: InstallState; updateState?: UpdateState; onAboutPress?: PluginCallback; onInstall?: PluginCallback; onShowPluginLog?: PluginCallback; onShowPluginInfo?: PluginCallback; } const styles = StyleSheet.create({ content: { gap: 5, }, cardContainer: { marginTop: 8, }, }); const PluginBox: React.FC = props => { const manifest = props.item.manifest; const item = props.item; const installButton = ; const aboutButton = ; const onPress = useCallback(() => { props.onShowPluginInfo?.({ item: props.item }); }, [props.onShowPluginInfo, props.item]); return ( {manifest.description} {props.onAboutPress ? aboutButton : null} {props.onInstall ? installButton : null} ); }; export default PluginBox;