diff --git a/frontend/src/components/PluginView.tsx b/frontend/src/components/PluginView.tsx index 0d0a52cf..2ae0b555 100644 --- a/frontend/src/components/PluginView.tsx +++ b/frontend/src/components/PluginView.tsx @@ -1,5 +1,6 @@ import { ButtonItem, + Focusable, PanelSection, PanelSectionRow, joinClassNames, @@ -10,38 +11,47 @@ import { VFC } from 'react'; import { useDeckyState } from './DeckyState'; import NotificationBadge from './NotificationBadge'; +import { useQuickAccessVisible } from './QuickAccessVisibleState'; +import TitleView from './TitleView'; const PluginView: VFC = () => { - const { plugins, updates, activePlugin, setActivePlugin } = useDeckyState(); + const { plugins, updates, activePlugin, setActivePlugin, closeActivePlugin } = useDeckyState(); + const visible = useQuickAccessVisible(); if (activePlugin) { return ( -
- {activePlugin.content} -
+ + +
+ {visible && activePlugin.content} +
+
); } return ( -
- - {plugins - .filter((p) => p.content) - .map(({ name, icon }) => ( - - setActivePlugin(name)}> -
- {icon} -
{name}
- -
-
-
- ))} -
-
+ <> + +
+ + {plugins + .filter((p) => p.content) + .map(({ name, icon }) => ( + + setActivePlugin(name)}> +
+ {icon} +
{name}
+ +
+
+
+ ))} +
+
+ ); }; diff --git a/frontend/src/components/QuickAccessVisibleState.tsx b/frontend/src/components/QuickAccessVisibleState.tsx new file mode 100644 index 00000000..b5ee3b98 --- /dev/null +++ b/frontend/src/components/QuickAccessVisibleState.tsx @@ -0,0 +1,13 @@ +import { FC, createContext, useContext } from 'react'; + +const QuickAccessVisibleState = createContext(true); + +export const useQuickAccessVisible = () => useContext(QuickAccessVisibleState); + +interface Props { + visible: boolean; +} + +export const QuickAccessVisibleStateProvider: FC = ({ children, visible }) => { + return {children}; +}; diff --git a/frontend/src/plugin-loader.tsx b/frontend/src/plugin-loader.tsx index a1414b3a..6eee9bc0 100644 --- a/frontend/src/plugin-loader.tsx +++ b/frontend/src/plugin-loader.tsx @@ -17,7 +17,6 @@ import { deinitFilepickerPatches, initFilepickerPatches } from './components/mod import PluginInstallModal from './components/modals/PluginInstallModal'; import NotificationBadge from './components/NotificationBadge'; import PluginView from './components/PluginView'; -import TitleView from './components/TitleView'; import WithSuspense from './components/WithSuspense'; import Logger from './logger'; import { Plugin } from './plugin'; @@ -64,7 +63,6 @@ class PluginLoader extends Logger { title: null, content: ( - ), diff --git a/frontend/src/tabs-hook.ts b/frontend/src/tabs-hook.tsx similarity index 91% rename from frontend/src/tabs-hook.ts rename to frontend/src/tabs-hook.tsx index e75e043d..c5072e27 100644 --- a/frontend/src/tabs-hook.ts +++ b/frontend/src/tabs-hook.tsx @@ -1,6 +1,7 @@ import { Patch, QuickAccessTab, afterPatch, sleep } from 'decky-frontend-lib'; import { memo } from 'react'; +import { QuickAccessVisibleStateProvider } from './components/QuickAccessVisibleState'; import Logger from './logger'; declare global { @@ -83,17 +84,17 @@ class TabsHook extends Logger { if (ret) { if (!newQATabRenderer) { this.tabRenderer = ret.props.children[1].children.type; - newQATabRenderer = (...args: any) => { + newQATabRenderer = (...qamArgs: any[]) => { const oFilter = Array.prototype.filter; Array.prototype.filter = function (...args: any[]) { if (isTabsArray(this)) { - self.render(this); + self.render(this, qamArgs[0].visible); } // @ts-ignore return oFilter.call(this, ...args); }; // TODO remove array hack entirely and use this instead const tabs = ret.props.children.props.children[0].props.children[1].props.children[0].props.children[0].props.tabs - const ret = this.tabRenderer(...args); + const ret = this.tabRenderer(...qamArgs); Array.prototype.filter = oFilter; return ret; }; @@ -135,13 +136,13 @@ class TabsHook extends Logger { this.tabs = this.tabs.filter((tab) => tab.id !== id); } - render(existingTabs: any[]) { + render(existingTabs: any[], visible: boolean) { for (const { title, icon, content, id } of this.tabs) { existingTabs.push({ key: id, title, tab: icon, - panel: content, + panel: {content}, }); } }