mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 04:22:01 +00:00
9f586a1b97
* implement base frontend changes necessary for plugin disabling * implement frontend diisable functions/ modal * plugin disable boilerplate / untested * Feat disable plugins (#810) * implement base frontend changes necessary for plugin disabling * implement frontend diisable functions/ modal --------- Co-authored-by: Jesse Bofill <jesse_bofill@yahoo.com> * fix mistakes * add frontend * working plugin disable, not tested extensively * fix uninstalled hidden plugins remaining in list * hide plugin irrelevant plugin setting menu option when disabled * fix hidden plugin issues * reset disabled plugin on uninstall * fix plugin load on reenable * move disable settings uninstall cleanup * add engilsh tranlsations for enable/ disable elements * fix bug where wrong loadType can get passed to importPlugin * show correct number of hidden plugins if plugin is both hidden and disabled * fix: get fresh list of plugin updates when changed in settings plugin list * fix: fix invalid semver plugin version from preventing latest updates * retain x position when changing focus in list items that have multiple horizontal focusables * correction to pluging version checking validation * make sure disabled plugins get checked for updates * show number of disabled plugins at bottom of plugin view * add notice to update modals that disabled plugins will be enabled upon installation * run formatter * Update backend/decky_loader/locales/en-US.json Co-authored-by: EMERALD <hudson.samuels@gmail.com> * chore: correct filename typo * chore: change disabled icon * chore: revert accidental defsettings changes * format * add timeout to frontend importPlugin if a request hangs this prevent it from blocking other plugin loads. backend diaptch_plugin which calls this for individual plugin load (as opposed to batch) is set to 15s. other callers of importPlugin are not using timeout, same as before. * fix plugin update checking loop --------- Co-authored-by: marios <marios8543@gmail.com> Co-authored-by: EMERALD <hudson.samuels@gmail.com>
95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
import { ButtonItem, ErrorBoundary, Focusable, PanelSection, PanelSectionRow } from '@decky/ui';
|
|
import { FC, useMemo } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { FaBan, FaEyeSlash } from 'react-icons/fa';
|
|
|
|
import { useDeckyState } from './DeckyState';
|
|
import NotificationBadge from './NotificationBadge';
|
|
import { useQuickAccessVisible } from './QuickAccessVisibleState';
|
|
import TitleView from './TitleView';
|
|
|
|
const PluginView: FC = () => {
|
|
const {
|
|
plugins,
|
|
disabledPlugins,
|
|
hiddenPlugins,
|
|
updates,
|
|
activePlugin,
|
|
pluginOrder,
|
|
setActivePlugin,
|
|
closeActivePlugin,
|
|
} = useDeckyState();
|
|
const visible = useQuickAccessVisible();
|
|
const { t } = useTranslation();
|
|
|
|
const pluginList = useMemo(() => {
|
|
console.log('updating PluginView after changes');
|
|
|
|
return [...plugins]
|
|
.sort((a, b) => pluginOrder.indexOf(a.name) - pluginOrder.indexOf(b.name))
|
|
.filter((p) => p.content)
|
|
.filter(({ name }) => !hiddenPlugins.includes(name));
|
|
}, [plugins, pluginOrder, hiddenPlugins]);
|
|
|
|
const numberOfHidden = hiddenPlugins.filter((name) => !!plugins.find((p) => p.name === name)).length;
|
|
|
|
if (activePlugin) {
|
|
return (
|
|
<Focusable onCancelButton={closeActivePlugin}>
|
|
<TitleView />
|
|
<div style={{ height: '100%', paddingTop: '16px' }}>
|
|
<ErrorBoundary>{(visible || activePlugin.alwaysRender) && activePlugin.content}</ErrorBoundary>
|
|
</div>
|
|
</Focusable>
|
|
);
|
|
}
|
|
return (
|
|
<>
|
|
<TitleView />
|
|
<div
|
|
style={{
|
|
paddingTop: '16px',
|
|
}}
|
|
>
|
|
<PanelSection>
|
|
{pluginList.map(({ name, icon }) => (
|
|
<PanelSectionRow key={name}>
|
|
<ButtonItem layout="below" onClick={() => setActivePlugin(name)}>
|
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
|
{icon}
|
|
<div>{name}</div>
|
|
<NotificationBadge show={updates?.has(name)} style={{ top: '-5px', right: '-5px' }} />
|
|
</div>
|
|
</ButtonItem>
|
|
</PanelSectionRow>
|
|
))}
|
|
<div
|
|
style={{
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
position: 'absolute',
|
|
justifyContent: 'center',
|
|
padding: '5px 0px',
|
|
}}
|
|
>
|
|
{numberOfHidden > 0 && (
|
|
<div style={{ display: 'flex', alignItems: 'center', gap: '10px', fontSize: '0.8rem' }}>
|
|
<FaEyeSlash />
|
|
<div>{t('PluginView.hidden', { count: numberOfHidden })}</div>
|
|
</div>
|
|
)}
|
|
{disabledPlugins.length > 0 && (
|
|
<div style={{ display: 'flex', alignItems: 'center', gap: '10px', fontSize: '0.8rem' }}>
|
|
<FaBan />
|
|
<div>{t('PluginView.disabled', { count: disabledPlugins.length })}</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</PanelSection>
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default PluginView;
|