import { DialogButton, Dropdown, Focusable, Router, SingleDropdownOption, SuspensefulImage, staticClasses, } from 'decky-frontend-lib'; import { FC, useRef, useState } from 'react'; import { StorePlugin } from './Store'; interface PluginCardProps { plugin: StorePlugin; } const classNames = (...classes: string[]) => { return classes.join(' '); }; async function requestPluginInstall(plugin: StorePlugin, selectedVer: string) { const formData = new FormData(); formData.append('artifact', plugin.artifact); formData.append('version', selectedVer); formData.append('hash', plugin.versions[selectedVer]); await fetch('http://localhost:1337/browser/install_plugin', { method: 'POST', body: formData, }); } 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={(e: CustomEvent) => { containerRef.current!.querySelectorAll('* :focus').length === 0 ? Router.NavigateBackOrOpenMenu() : 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}

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

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