summaryrefslogtreecommitdiff
path: root/frontend/src
diff options
context:
space:
mode:
authorParty Wumpus <48649272+PartyWumpus@users.noreply.github.com>2024-02-15 02:32:58 +0000
committerParty Wumpus <48649272+PartyWumpus@users.noreply.github.com>2024-02-20 21:33:41 +0000
commit35f6f041c1e800a8df9c222a17c00663ad3c9090 (patch)
treea53d23151458a140f9eb76f728eb5c5c552370fe /frontend/src
parent7e3f9edacf6a96e821a7e1850b598b6e303fae1c (diff)
downloaddecky-loader-35f6f041c1e800a8df9c222a17c00663ad3c9090.tar.gz
decky-loader-35f6f041c1e800a8df9c222a17c00663ad3c9090.zip
Testing PRs from within decky (#496)
* git no work so manually uploading files :( * argh i wish git was working * ok next time i'll make git work * Update updater.py * git please work next time this took ages without you * fix me locales * Update updater.py * Update en-US.json * Update updater.py * Update updater.py * i wish my python LSP stuff was working * fix it * Update updater.py * Update updater.py * Only show testing branch as an option if it is already selected * Initial implementation for fetching the open PRs. Still need testing and a token to complete this. * Wrong filter capitalization * Fix a couple of typos in the python backend updater. * Fix typos pt 3 * This should be the last one * Prepend the PR version number with PR- to make it clearer that's the PR number. * Update prettier to the latest version otherwise it will never be happy with the formatting. * fix merge mistake * fix pyright errors & type hint most new code * fix strict pyright errors... * not sure why my local linter didn't catch this * Reimplement the logic between PR and artifact build to limit API calls * Fix pyright errors * use nightly.link for downloads * remove accidental dollar sign * fix various logical errors. the code actually works now. * set branch to testing when user downloads a testing version --------- Co-authored-by: Marco Rodolfi <marco.rodolfi@tuta.io>
Diffstat (limited to 'frontend/src')
-rw-r--r--frontend/src/components/DeckyToaster.tsx13
-rw-r--r--frontend/src/components/settings/index.tsx14
-rw-r--r--frontend/src/components/settings/pages/general/BranchSelect.tsx15
-rw-r--r--frontend/src/components/settings/pages/general/Updater.tsx4
-rw-r--r--frontend/src/components/settings/pages/testing/index.tsx89
5 files changed, 122 insertions, 13 deletions
diff --git a/frontend/src/components/DeckyToaster.tsx b/frontend/src/components/DeckyToaster.tsx
index eaee75eb..6faece09 100644
--- a/frontend/src/components/DeckyToaster.tsx
+++ b/frontend/src/components/DeckyToaster.tsx
@@ -30,11 +30,14 @@ const DeckyToaster: FC<DeckyToasterProps> = () => {
// not actually node but TS is shit
let interval: NodeJS.Timer | null;
if (renderedToast) {
- interval = setTimeout(() => {
- interval = null;
- console.log('clear toast', renderedToast.data);
- removeToast(renderedToast.data);
- }, (renderedToast.data.duration || 5e3) + 1000);
+ interval = setTimeout(
+ () => {
+ interval = null;
+ console.log('clear toast', renderedToast.data);
+ removeToast(renderedToast.data);
+ },
+ (renderedToast.data.duration || 5e3) + 1000,
+ );
console.log('set int', interval);
}
return () => {
diff --git a/frontend/src/components/settings/index.tsx b/frontend/src/components/settings/index.tsx
index f3a76407..568a0a49 100644
--- a/frontend/src/components/settings/index.tsx
+++ b/frontend/src/components/settings/index.tsx
@@ -1,7 +1,7 @@
import { SidebarNavigation } from 'decky-frontend-lib';
import { lazy } from 'react';
import { useTranslation } from 'react-i18next';
-import { FaCode, FaPlug } from 'react-icons/fa';
+import { FaCode, FaFlask, FaPlug } from 'react-icons/fa';
import { useSetting } from '../../utils/hooks/useSetting';
import DeckyIcon from '../DeckyIcon';
@@ -10,6 +10,7 @@ import GeneralSettings from './pages/general';
import PluginList from './pages/plugin_list';
const DeveloperSettings = lazy(() => import('./pages/developer'));
+const TestingMenu = lazy(() => import('./pages/testing'));
export default function SettingsPage() {
const [isDeveloper, setIsDeveloper] = useSetting<boolean>('developer.enabled', false);
@@ -39,6 +40,17 @@ export default function SettingsPage() {
icon: <FaCode />,
visible: isDeveloper,
},
+ {
+ title: t('SettingsIndex.testing_title'),
+ content: (
+ <WithSuspense>
+ <TestingMenu />
+ </WithSuspense>
+ ),
+ route: '/decky/settings/testing',
+ icon: <FaFlask />,
+ visible: isDeveloper,
+ },
];
return <SidebarNavigation pages={pages} />;
diff --git a/frontend/src/components/settings/pages/general/BranchSelect.tsx b/frontend/src/components/settings/pages/general/BranchSelect.tsx
index 6e69208a..d51f1db8 100644
--- a/frontend/src/components/settings/pages/general/BranchSelect.tsx
+++ b/frontend/src/components/settings/pages/general/BranchSelect.tsx
@@ -8,10 +8,15 @@ import { useSetting } from '../../../../utils/hooks/useSetting';
const logger = new Logger('BranchSelect');
-enum UpdateBranch {
+export enum UpdateBranch {
+ Stable,
+ Prerelease,
+ Testing,
+}
+
+enum LessUpdateBranch {
Stable,
Prerelease,
- // Testing,
}
const BranchSelect: FunctionComponent<{}> = () => {
@@ -24,11 +29,11 @@ const BranchSelect: FunctionComponent<{}> = () => {
const [selectedBranch, setSelectedBranch] = useSetting<UpdateBranch>('branch', UpdateBranch.Stable);
return (
- // Returns numerical values from 0 to 2 (with current branch setup as of 8/28/22)
- // 0 being stable, 1 being pre-release and 2 being nightly
+ // Returns numerical values from 0 to 2 (with current branch setup as of 6/16/23)
+ // 0 being stable, 1 being pre-release and 2 being testing (not a branch!)
<Field label={t('BranchSelect.update_channel.label')} childrenContainerWidth={'fixed'}>
<Dropdown
- rgOptions={Object.values(UpdateBranch)
+ rgOptions={Object.values(selectedBranch == UpdateBranch.Testing ? UpdateBranch : LessUpdateBranch)
.filter((branch) => typeof branch == 'number')
.map((branch) => ({
label: tBranches[branch as number],
diff --git a/frontend/src/components/settings/pages/general/Updater.tsx b/frontend/src/components/settings/pages/general/Updater.tsx
index 01aeb4c3..45b026ca 100644
--- a/frontend/src/components/settings/pages/general/Updater.tsx
+++ b/frontend/src/components/settings/pages/general/Updater.tsx
@@ -136,8 +136,8 @@ export default function UpdaterSettings() {
{checkingForUpdates
? t('Updater.updates.checking')
: !versionInfo?.remote || versionInfo?.remote?.tag_name == versionInfo?.current
- ? t('Updater.updates.check_button')
- : t('Updater.updates.install_button')}
+ ? t('Updater.updates.check_button')
+ : t('Updater.updates.install_button')}
</DialogButton>
) : (
<ProgressBarWithInfo
diff --git a/frontend/src/components/settings/pages/testing/index.tsx b/frontend/src/components/settings/pages/testing/index.tsx
new file mode 100644
index 00000000..72267295
--- /dev/null
+++ b/frontend/src/components/settings/pages/testing/index.tsx
@@ -0,0 +1,89 @@
+import { DialogBody, DialogButton, DialogControlsSection, Focusable, Navigation } from 'decky-frontend-lib';
+import { useEffect, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { FaDownload, FaInfo } from 'react-icons/fa';
+
+import { setSetting } from '../../../../utils/settings';
+import { UpdateBranch } from '../general/BranchSelect';
+
+interface TestingVersion {
+ id: number;
+ name: string;
+ link: string;
+ head_sha: string;
+}
+
+const getTestingVersions = DeckyBackend.callable<[], TestingVersion[]>('updater/get_testing_versions');
+const downloadTestingVersion = DeckyBackend.callable<[pr_id: number, sha: string]>('updater/download_testing_version');
+
+export default function TestingVersionList() {
+ const { t } = useTranslation();
+ const [testingVersions, setTestingVersions] = useState<TestingVersion[]>([]);
+
+ useEffect(() => {
+ (async () => {
+ setTestingVersions(await getTestingVersions());
+ })();
+ }, []);
+
+ if (testingVersions.length === 0) {
+ return (
+ <div>
+ <p>No open PRs found</p>
+ </div>
+ );
+ }
+
+ return (
+ <DialogBody>
+ <DialogControlsSection>
+ <ul style={{ listStyleType: 'none', padding: '0' }}>
+ {testingVersions.map((version) => {
+ return (
+ <li style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', paddingBottom: '10px' }}>
+ <span>
+ {version.name} <span style={{ opacity: '50%' }}>{'#' + version.id}</span>
+ </span>
+ <Focusable style={{ height: '40px', marginLeft: 'auto', display: 'flex' }}>
+ <DialogButton
+ style={{ height: '40px', minWidth: '60px', marginRight: '10px' }}
+ onClick={() => {
+ downloadTestingVersion(version.id, version.head_sha);
+ setSetting('branch', UpdateBranch.Testing);
+ }}
+ >
+ <div
+ style={{
+ display: 'flex',
+ minWidth: '150px',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ }}
+ >
+ {t('Testing.download')}
+ <FaDownload style={{ paddingLeft: '1rem' }} />
+ </div>
+ </DialogButton>
+ <DialogButton
+ style={{
+ height: '40px',
+ width: '40px',
+ padding: '10px 12px',
+ minWidth: '40px',
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ }}
+ onClick={() => Navigation.NavigateToExternalWeb(version.link)}
+ >
+ <FaInfo />
+ </DialogButton>
+ </Focusable>
+ </li>
+ );
+ })}
+ </ul>
+ </DialogControlsSection>
+ </DialogBody>
+ );
+}