summaryrefslogtreecommitdiff
path: root/frontend/src
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src')
-rw-r--r--frontend/src/components/modals/PluginInstallModal.tsx8
-rw-r--r--frontend/src/components/modals/filepicker/index.tsx10
-rw-r--r--frontend/src/components/settings/pages/developer/index.tsx137
-rw-r--r--frontend/src/components/settings/pages/general/index.tsx21
4 files changed, 105 insertions, 71 deletions
diff --git a/frontend/src/components/modals/PluginInstallModal.tsx b/frontend/src/components/modals/PluginInstallModal.tsx
index f2f13bbf..7f0683ee 100644
--- a/frontend/src/components/modals/PluginInstallModal.tsx
+++ b/frontend/src/components/modals/PluginInstallModal.tsx
@@ -29,10 +29,10 @@ const PluginInstallModal: FC<PluginInstallModalProps> = ({ artifact, version, ha
strTitle={`Install ${artifact}`}
strOKButtonText={loading ? 'Installing' : 'Install'}
>
- {hash == 'False' ? (
- <h3 style={{ color: 'red' }}>!!!!NO HASH PROVIDED!!!!</h3>
- ) : (
- `Are you sure you want to install ${artifact} ${version}?`
+ Are you sure you want to install {artifact}
+ {version ? ` ${version}` : ''}?
+ {hash == 'False' && (
+ <span style={{ color: 'red' }}> This plugin does not have a hash, you are installing it at your own risk.</span>
)}
</ConfirmModal>
);
diff --git a/frontend/src/components/modals/filepicker/index.tsx b/frontend/src/components/modals/filepicker/index.tsx
index dcf179a3..ec3fc260 100644
--- a/frontend/src/components/modals/filepicker/index.tsx
+++ b/frontend/src/components/modals/filepicker/index.tsx
@@ -134,7 +134,15 @@ const FilePicker: FunctionComponent<FilePickerProps> = ({
)}
</div>
)}
- {file.name}
+ <span
+ style={{
+ textOverflow: 'ellipsis',
+ overflow: 'hidden',
+ textAlign: 'left',
+ }}
+ >
+ {file.name}
+ </span>
</div>
</DialogButton>
);
diff --git a/frontend/src/components/settings/pages/developer/index.tsx b/frontend/src/components/settings/pages/developer/index.tsx
index bd80cb77..e6e37813 100644
--- a/frontend/src/components/settings/pages/developer/index.tsx
+++ b/frontend/src/components/settings/pages/developer/index.tsx
@@ -1,64 +1,109 @@
-import { DialogBody, Field, TextField, Toggle } from 'decky-frontend-lib';
-import { useRef } from 'react';
-import { FaReact, FaSteamSymbol } from 'react-icons/fa';
+import {
+ DialogBody,
+ DialogButton,
+ DialogControlsSection,
+ DialogControlsSectionHeader,
+ Field,
+ TextField,
+ Toggle,
+} from 'decky-frontend-lib';
+import { useRef, useState } from 'react';
+import { FaFileArchive, FaLink, FaReact, FaSteamSymbol } from 'react-icons/fa';
import { setShouldConnectToReactDevTools, setShowValveInternal } from '../../../../developer';
+import { installFromURL } from '../../../../store';
import { useSetting } from '../../../../utils/hooks/useSetting';
import RemoteDebuggingSettings from '../general/RemoteDebugging';
+const installFromZip = () => {
+ window.DeckyPluginLoader.openFilePicker('/home/deck', true).then((val) => {
+ const url = `file://${val.path}`;
+ console.log(`Installing plugin locally from ${url}`);
+
+ if (url.endsWith('.zip')) {
+ installFromURL(url);
+ } else {
+ window.DeckyPluginLoader.toaster.toast({
+ title: 'Decky',
+ body: `Installation failed! Only ZIP files are supported.`,
+ onClick: installFromZip,
+ });
+ }
+ });
+};
+
export default function DeveloperSettings() {
const [enableValveInternal, setEnableValveInternal] = useSetting<boolean>('developer.valve_internal', false);
const [reactDevtoolsEnabled, setReactDevtoolsEnabled] = useSetting<boolean>('developer.rdt.enabled', false);
const [reactDevtoolsIP, setReactDevtoolsIP] = useSetting<string>('developer.rdt.ip', '');
+ const [pluginURL, setPluginURL] = useState('');
const textRef = useRef<HTMLDivElement>(null);
return (
<DialogBody>
- <RemoteDebuggingSettings />
- <Field
- label="Enable Valve Internal"
- description={
- <span style={{ whiteSpace: 'pre-line' }}>
- Enables the Valve internal developer menu.{' '}
- <span style={{ color: 'red' }}>Do not touch anything in this menu unless you know what it does.</span>
- </span>
- }
- icon={<FaSteamSymbol style={{ display: 'block' }} />}
- >
- <Toggle
- value={enableValveInternal}
- onChange={(toggleValue) => {
- setEnableValveInternal(toggleValue);
- setShowValveInternal(toggleValue);
- }}
- />
- </Field>
- <Field
- label="Enable React DevTools"
- description={
- <>
+ <DialogControlsSection>
+ <DialogControlsSectionHeader>Third-Party Plugins</DialogControlsSectionHeader>
+ <Field label="Install Plugin from ZIP File" icon={<FaFileArchive style={{ display: 'block' }} />}>
+ <DialogButton onClick={installFromZip}>Browse</DialogButton>
+ </Field>
+ <Field
+ label="Install Plugin from URL"
+ description={<TextField label={'URL'} value={pluginURL} onChange={(e) => setPluginURL(e?.target.value)} />}
+ icon={<FaLink style={{ display: 'block' }} />}
+ >
+ <DialogButton disabled={pluginURL.length == 0} onClick={() => installFromURL(pluginURL)}>
+ Install
+ </DialogButton>
+ </Field>
+ </DialogControlsSection>
+ <DialogControlsSection>
+ <DialogControlsSectionHeader>Other</DialogControlsSectionHeader>
+ <RemoteDebuggingSettings />
+ <Field
+ label="Enable Valve Internal"
+ description={
<span style={{ whiteSpace: 'pre-line' }}>
- Enables connection to a computer running React DevTools. Changing this setting will reload Steam. Set the
- IP address before enabling.
+ Enables the Valve internal developer menu.{' '}
+ <span style={{ color: 'red' }}>Do not touch anything in this menu unless you know what it does.</span>
</span>
- <br />
- <br />
- <div ref={textRef}>
- <TextField label={'IP'} value={reactDevtoolsIP} onChange={(e) => setReactDevtoolsIP(e?.target.value)} />
- </div>
- </>
- }
- icon={<FaReact style={{ display: 'block' }} />}
- >
- <Toggle
- value={reactDevtoolsEnabled}
- // disabled={reactDevtoolsIP == ''}
- onChange={(toggleValue) => {
- setReactDevtoolsEnabled(toggleValue);
- setShouldConnectToReactDevTools(toggleValue);
- }}
- />
- </Field>
+ }
+ icon={<FaSteamSymbol style={{ display: 'block' }} />}
+ >
+ <Toggle
+ value={enableValveInternal}
+ onChange={(toggleValue) => {
+ setEnableValveInternal(toggleValue);
+ setShowValveInternal(toggleValue);
+ }}
+ />
+ </Field>
+ <Field
+ label="Enable React DevTools"
+ description={
+ <>
+ <span style={{ whiteSpace: 'pre-line' }}>
+ Enables connection to a computer running React DevTools. Changing this setting will reload Steam. Set
+ the IP address before enabling.
+ </span>
+ <br />
+ <br />
+ <div ref={textRef}>
+ <TextField label={'IP'} value={reactDevtoolsIP} onChange={(e) => setReactDevtoolsIP(e?.target.value)} />
+ </div>
+ </>
+ }
+ icon={<FaReact style={{ display: 'block' }} />}
+ >
+ <Toggle
+ value={reactDevtoolsEnabled}
+ // disabled={reactDevtoolsIP == ''}
+ onChange={(toggleValue) => {
+ setReactDevtoolsEnabled(toggleValue);
+ setShouldConnectToReactDevTools(toggleValue);
+ }}
+ />
+ </Field>
+ </DialogControlsSection>
</DialogBody>
);
}
diff --git a/frontend/src/components/settings/pages/general/index.tsx b/frontend/src/components/settings/pages/general/index.tsx
index e0bd9691..97fd3e42 100644
--- a/frontend/src/components/settings/pages/general/index.tsx
+++ b/frontend/src/components/settings/pages/general/index.tsx
@@ -1,15 +1,5 @@
-import {
- DialogBody,
- DialogButton,
- DialogControlsSection,
- DialogControlsSectionHeader,
- Field,
- TextField,
- Toggle,
-} from 'decky-frontend-lib';
-import { useState } from 'react';
+import { DialogBody, DialogControlsSection, DialogControlsSectionHeader, Field, Toggle } from 'decky-frontend-lib';
-import { installFromURL } from '../../../../store';
import { useDeckyState } from '../../../DeckyState';
import BranchSelect from './BranchSelect';
import StoreSelect from './StoreSelect';
@@ -22,7 +12,6 @@ export default function GeneralSettings({
isDeveloper: boolean;
setIsDeveloper: (val: boolean) => void;
}) {
- const [pluginURL, setPluginURL] = useState('');
const { versionInfo } = useDeckyState();
return (
@@ -46,14 +35,6 @@ export default function GeneralSettings({
}}
/>
</Field>
- <Field
- label="Install plugin from URL"
- description={<TextField label={'URL'} value={pluginURL} onChange={(e) => setPluginURL(e?.target.value)} />}
- >
- <DialogButton disabled={pluginURL.length == 0} onClick={() => installFromURL(pluginURL)}>
- Install
- </DialogButton>
- </Field>
</DialogControlsSection>
<DialogControlsSection>
<DialogControlsSectionHeader>About</DialogControlsSectionHeader>