import * as React from 'react'; import { useCallback, useMemo } from 'react'; import PluginService, { defaultPluginSetting, Plugins, PluginSetting, PluginSettings } from '@joplin/lib/services/plugins/PluginService'; import { _ } from '@joplin/lib/locale'; import styled from 'styled-components'; import ToggleButton from '../../lib/ToggleButton/ToggleButton'; import Button, { ButtonLevel } from '../../Button/Button'; import bridge from '../../../services/bridge'; import produce from 'immer'; const Root = styled.div` display: flex; flex-direction: column; `; const TableRoot = styled.div` display: flex; flex-wrap: wrap; `; const InstallButton = styled(Button)` margin-bottom: 10px; `; const CellRoot = styled.div` display: flex; background-color: ${props => props.theme.backgroundColor}; flex-direction: column; align-items: flex-start; padding: 15px; border: 1px solid ${props => props.theme.dividerColor}; border-radius: 6px; width: 250px; margin-right: 20px; margin-bottom: 20px; box-shadow: 1px 1px 3px rgba(0,0,0,0.2); `; const CellTop = styled.div` display: flex; flex-direction: row; width: 100%; margin-bottom: 10px; `; const CellContent = styled.div` display: flex; margin-bottom: 10px; flex: 1; `; const CellFooter = styled.div` display: flex; flex-direction: row; `; const DevModeLabel = styled.div` border: 1px solid ${props => props.theme.color}; border-radius: 4px; padding: 4px 6px; font-size: ${props => props.theme.fontSize * 0.75}px; color: ${props => props.theme.color}; `; const StyledName = styled.div` font-family: ${props => props.theme.fontFamily}; color: ${props => props.theme.color}; font-size: ${props => props.theme.fontSize}px; font-weight: bold; flex: 1; `; const StyledDescription = styled.div` font-family: ${props => props.theme.fontFamily}; color: ${props => props.theme.colorFaded}; font-size: ${props => props.theme.fontSize}px; line-height: 1.6em; `; interface Props { value: any; themeId: number; onChange: Function; } interface CellProps { item: PluginItem; themeId: number; onToggle: Function; onDelete: Function; } interface PluginItem { id: string; name: string; description: string; enabled: boolean; deleted: boolean; devMode: boolean; } function Cell(props: CellProps) { const { item } = props; // For plugins in dev mode things like enabling/disabling or // uninstalling them doesn't make sense, as that should be done by // adding/removing them from wherever they were loaded from. function renderToggleButton() { if (item.devMode) { return DEV; } return props.onToggle({ item: props.item })} />; } function renderFooter() { if (item.devMode) return null; return (