mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 00:12:12 +00:00
35e7c80835
* First iteration for internationalization of the loader * First iteration for internationalization of the loader * Cleanup node mess * Cleanup node mess pt2 * Additional touches * Latest decky changed merged into i18n and updated translation. * Styling fixes * Initial backend hosting implementation * Added correct url path of the loopback server. * Added correct url path of the loopback server. * Some better namespaced text. * Added whitelist for locales path. * Refactor languages and fix hooks logic bugs. * Small typo in language translation structure. * Working backend, automatically swtich languages with steam and language fixes. * Fix to languages * Key fixes * Additional language fixes. * Additional json changes * Final text revision and added a vscode tasks to automatically extract text from code. * Typo in the middleware * Remove unused imports * Cleanup whitespaces. * Import changes * Revert "Import changes" This reverts commit8e8231950f. * Update index.d.ts * Clean up unused imports * Delete pnpm-lock.yaml * Update rollup.config.js * Update PluginInstallModal.tsx * Update index.tsx * Update plugin-loader.tsx * Update plugin-loader.tsx * Revert "Delete pnpm-lock.yaml" This reverts commit3a39f36f21. * Additional strings reworks. * Fixes for issues coming from github merge. * Fixes for master * Styling fixes * Styling pt2 * Missed a few strings in master, * Styling fixes * Additional master merge fixes. * Final cleanup and adaptation to master. * Final empty language cleanup and few string added * Small changes to italian translation * Disabled translation on a few components inside plugin-loader for missing react hooks. * Fixed passing tag to translation. * Disable debug output for reducing console spam. * Return correct content type * Small italian language change * Added support for country code * Fixed missing translation for uninstall popup. * Fix class name shenanigans for toast notification * Update dependencies * Fixed github workflow to include the new locales folder * Update dependencies to latest version (unless it's React) and fixed the new small errors that cropped up * Missed a file name change * Updated dev dependencies to latest version * Missed a few dev dependencies * Revert "Update dependencies to latest version (unless it's React) and fixed the new small errors that cropped up" Messed up merge with a different main branch * Messed up deletion of rollup config. * Fix broken pnpm lock file * Missed a localized string during the merge * Fixed a parameter mistake in the uninstall text parameter * Fix pnpm random issues * Small italian language tweaks * Fix wrong parameter passed to the uninstall function call * Another fix on a wrong function parameter * Additional translation text on the store and branch selection channels * Changed the default type passed to map to being able to index the two arrays. * Reverted and reworked the last changes * Distinguish events in UI for installing vs reinstalling plugins * Additional fixes for reinstall prompt * Revert the use of intevalPlural since the parser doesn't seem to support that. * Missed a routing path in the backend * Small bugfixes * Small fixes * Correctly adding the parameter to the request headers. * Refactoring of the UI popup modal * Fix pnpm shenanigans * Final fixes for the install UI localization * Clean up unnedeed backend code * Small rework on text selection. * Cleaned up parser configuration * Removed extracttext dependency to pnpmsetup * Merged translation and cleaned up parser * Fixed JSON structure after manual merge. * Added translation to the file picker * Revert changes to PluginInstallModal * Reworked the text modal for the final time * Missed the proper linted text * Missed the backend change * Final branch cleanup * Fixed small translation bleeding Caused from the manual merge of _old.json files. * fix extra space in browser.py * fix extra newline in plugin-loader.tsx * Cleanup i18next-parser.config.mjs * Update plugin-loader.tsx * Cleanup language files * Better labeling of text * Fixed language typos in BranchSelect * Fixed language typos in StoreSelect * Cleanup plugin-loader.tsx from unused imports * Removed the path bypass since I'm using authentication from the frontend. * Reimplemented this component as a functional component. * Updated dependencies and lockfile * Removed static route from main.py Already handled in loader.py * Small italian coherency fixes * Fix small typography fixes on plugin name uninstall * Fixed italian typo on removal popup * Reenabled manual escaping value in i18next * Set to fallback to the default language if the string in the JSON file is empty. * Fixed pnpm wankery * Added a missed italian text translation string --------- Co-authored-by: AAGaming <aa@mail.catvibers.me>
170 lines
5.7 KiB
TypeScript
170 lines
5.7 KiB
TypeScript
import {
|
|
Carousel,
|
|
DialogButton,
|
|
Field,
|
|
FocusRing,
|
|
Focusable,
|
|
ProgressBarWithInfo,
|
|
Spinner,
|
|
findSP,
|
|
showModal,
|
|
} from 'decky-frontend-lib';
|
|
import { useCallback } from 'react';
|
|
import { Suspense, lazy } from 'react';
|
|
import { useEffect, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { FaExclamation } from 'react-icons/fa';
|
|
|
|
import { VerInfo, callUpdaterMethod, finishUpdate } from '../../../../updater';
|
|
import { useDeckyState } from '../../../DeckyState';
|
|
import InlinePatchNotes from '../../../patchnotes/InlinePatchNotes';
|
|
import WithSuspense from '../../../WithSuspense';
|
|
|
|
const MarkdownRenderer = lazy(() => import('../../../Markdown'));
|
|
|
|
function PatchNotesModal({ versionInfo, closeModal }: { versionInfo: VerInfo | null; closeModal?: () => {} }) {
|
|
const SP = findSP();
|
|
const { t } = useTranslation();
|
|
return (
|
|
<Focusable onCancelButton={closeModal}>
|
|
<FocusRing>
|
|
<Carousel
|
|
fnItemRenderer={(id: number) => (
|
|
<Focusable
|
|
style={{
|
|
marginTop: '40px',
|
|
height: 'calc( 100% - 40px )',
|
|
overflowY: 'scroll',
|
|
display: 'flex',
|
|
justifyContent: 'center',
|
|
margin: '40px',
|
|
}}
|
|
>
|
|
<div>
|
|
<h1>{versionInfo?.all?.[id]?.name || 'Invalid Update Name'}</h1>
|
|
{versionInfo?.all?.[id]?.body ? (
|
|
<WithSuspense>
|
|
<MarkdownRenderer onDismiss={closeModal}>{versionInfo.all[id].body}</MarkdownRenderer>
|
|
</WithSuspense>
|
|
) : (
|
|
t('Updater.no_patch_notes_desc')
|
|
)}
|
|
</div>
|
|
</Focusable>
|
|
)}
|
|
fnGetId={(id) => id}
|
|
nNumItems={versionInfo?.all?.length}
|
|
nHeight={SP.innerHeight - 40}
|
|
nItemHeight={SP.innerHeight - 40}
|
|
nItemMarginX={0}
|
|
initialColumn={0}
|
|
autoFocus={true}
|
|
fnGetColumnWidth={() => SP.innerWidth}
|
|
name={t('Updater.decky_updates') as string}
|
|
/>
|
|
</FocusRing>
|
|
</Focusable>
|
|
);
|
|
}
|
|
|
|
export default function UpdaterSettings() {
|
|
const { isLoaderUpdating, setIsLoaderUpdating, versionInfo, setVersionInfo } = useDeckyState();
|
|
|
|
const [checkingForUpdates, setCheckingForUpdates] = useState<boolean>(false);
|
|
const [updateProgress, setUpdateProgress] = useState<number>(-1);
|
|
const [reloading, setReloading] = useState<boolean>(false);
|
|
|
|
const { t } = useTranslation();
|
|
|
|
useEffect(() => {
|
|
window.DeckyUpdater = {
|
|
updateProgress: (i) => {
|
|
setUpdateProgress(i);
|
|
setIsLoaderUpdating(true);
|
|
},
|
|
finish: async () => {
|
|
setUpdateProgress(0);
|
|
setReloading(true);
|
|
await finishUpdate();
|
|
},
|
|
};
|
|
}, []);
|
|
|
|
const showPatchNotes = useCallback(() => {
|
|
showModal(<PatchNotesModal versionInfo={versionInfo} />);
|
|
}, [versionInfo]);
|
|
|
|
return (
|
|
<>
|
|
<Field
|
|
onOptionsActionDescription={versionInfo?.all ? t('Updater.patch_notes_desc') : undefined}
|
|
onOptionsButton={versionInfo?.all ? showPatchNotes : undefined}
|
|
label={t('Updater.updates.label')}
|
|
description={
|
|
checkingForUpdates || versionInfo?.remote?.tag_name != versionInfo?.current || !versionInfo?.remote ? (
|
|
''
|
|
) : (
|
|
<span>{t('Updater.updates.lat_version', { ver: versionInfo?.current })} </span>
|
|
)
|
|
}
|
|
icon={
|
|
versionInfo?.remote &&
|
|
versionInfo?.remote?.tag_name != versionInfo?.current && (
|
|
<FaExclamation color="var(--gpColor-Yellow)" style={{ display: 'block' }} />
|
|
)
|
|
}
|
|
childrenContainerWidth={'fixed'}
|
|
>
|
|
{updateProgress == -1 && !isLoaderUpdating ? (
|
|
<DialogButton
|
|
disabled={!versionInfo?.updatable || checkingForUpdates}
|
|
onClick={
|
|
!versionInfo?.remote || versionInfo?.remote?.tag_name == versionInfo?.current
|
|
? async () => {
|
|
setCheckingForUpdates(true);
|
|
const res = (await callUpdaterMethod('check_for_updates')) as { result: VerInfo };
|
|
setVersionInfo(res.result);
|
|
setCheckingForUpdates(false);
|
|
}
|
|
: async () => {
|
|
setUpdateProgress(0);
|
|
callUpdaterMethod('do_update');
|
|
}
|
|
}
|
|
>
|
|
{checkingForUpdates
|
|
? t('Updater.updates.checking')
|
|
: !versionInfo?.remote || versionInfo?.remote?.tag_name == versionInfo?.current
|
|
? t('Updater.updates.check_button')
|
|
: t('Updater.updates.install_button')}
|
|
</DialogButton>
|
|
) : (
|
|
<ProgressBarWithInfo
|
|
layout="inline"
|
|
bottomSeparator="none"
|
|
nProgress={updateProgress}
|
|
indeterminate={reloading}
|
|
sOperationText={reloading ? t('Updater.updates.reloading') : t('Updater.updates.updating')}
|
|
/>
|
|
)}
|
|
</Field>
|
|
{versionInfo?.remote && versionInfo?.remote?.tag_name != versionInfo?.current && (
|
|
<InlinePatchNotes
|
|
title={versionInfo?.remote.name}
|
|
date={new Intl.RelativeTimeFormat('en-US', {
|
|
numeric: 'auto',
|
|
}).format(
|
|
Math.ceil((new Date(versionInfo.remote.published_at).getTime() - new Date().getTime()) / 86400000),
|
|
'day',
|
|
)}
|
|
onClick={showPatchNotes}
|
|
>
|
|
<Suspense fallback={<Spinner style={{ width: '24', height: '24' }} />}>
|
|
<MarkdownRenderer>{versionInfo?.remote.body}</MarkdownRenderer>
|
|
</Suspense>
|
|
</InlinePatchNotes>
|
|
)}
|
|
</>
|
|
);
|
|
}
|