import { DialogButton, Dropdown, Focusable, QuickAccessTab, Router, SingleDropdownOption, SuspensefulImage, joinClassNames, staticClasses, } from 'decky-frontend-lib'; import { FC, useRef, useState } from 'react'; import { LegacyStorePlugin, StorePlugin, StorePluginVersion, isLegacyPlugin, requestLegacyPluginInstall, requestPluginInstall, } from '../../store'; interface PluginCardProps { plugin: StorePlugin | LegacyStorePlugin; } const PluginCard: FC = ({ plugin }) => { const [selectedOption, setSelectedOption] = useState(0); const buttonRef = useRef(null); const containerRef = useRef(null); return (
{/* TODO: abstract this messy focus hackiness into a custom component in lib */} { buttonRef.current!.focus(); }} onCancel={(_: CustomEvent) => { if (containerRef.current!.querySelectorAll('* :focus').length === 0) { Router.NavigateBackOrOpenMenu(); setTimeout(() => Router.OpenQuickAccessMenu(QuickAccessTab.Decky), 1000); } else { containerRef.current!.focus(); } }} style={{ display: 'flex', flexDirection: 'column', background: '#ACB2C924', height: 'unset', marginBottom: 'unset', // boxShadow: var(--gpShadow-Medium); scrollSnapAlign: 'start', boxSizing: 'border-box', }} >

Author: {plugin.author}

{plugin.description}

Tags: {plugin.tags.map((tag: string) => ( {tag == 'root' ? 'Requires root' : tag} ))} {isLegacyPlugin(plugin) && ( legacy )}

isLegacyPlugin(plugin) ? requestLegacyPluginInstall(plugin, Object.keys(plugin.versions)[selectedOption]) : requestPluginInstall(plugin.name, plugin.versions[selectedOption]) } > Install
({ data: k, label: v, })) : plugin.versions.map((version: StorePluginVersion, index) => ({ data: index, label: version.name, }))) as SingleDropdownOption[] } strDefaultLabel={'Select a version'} selectedOption={selectedOption} onChange={({ data }) => setSelectedOption(data)} />
); }; export default PluginCard;