mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 13:52:02 +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>
186 lines
5.1 KiB
TypeScript
186 lines
5.1 KiB
TypeScript
import {
|
|
ButtonItem,
|
|
Dropdown,
|
|
Focusable,
|
|
PanelSectionRow,
|
|
SingleDropdownOption,
|
|
SuspensefulImage,
|
|
} from 'decky-frontend-lib';
|
|
import { FC, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import { InstallType } from '../../plugin';
|
|
import { StorePlugin, StorePluginVersion, requestPluginInstall } from '../../store';
|
|
|
|
interface PluginCardProps {
|
|
plugin: StorePlugin;
|
|
}
|
|
|
|
const PluginCard: FC<PluginCardProps> = ({ plugin }) => {
|
|
const [selectedOption, setSelectedOption] = useState<number>(0);
|
|
const root: boolean = plugin.tags.some((tag) => tag === 'root');
|
|
|
|
const { t } = useTranslation();
|
|
|
|
return (
|
|
<div
|
|
className="deckyStoreCard"
|
|
style={{
|
|
marginLeft: '20px',
|
|
marginRight: '20px',
|
|
marginBottom: '20px',
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
}}
|
|
>
|
|
<div
|
|
className="deckyStoreCardImageContainer"
|
|
style={{
|
|
width: '320px',
|
|
height: '200px',
|
|
position: 'relative',
|
|
}}
|
|
>
|
|
<SuspensefulImage
|
|
className="deckyStoreCardImage"
|
|
suspenseHeight="200px"
|
|
suspenseWidth="320px"
|
|
style={{
|
|
width: '320px',
|
|
height: '200px',
|
|
objectFit: 'cover',
|
|
}}
|
|
src={plugin.image_url}
|
|
/>
|
|
</div>
|
|
<div
|
|
className="deckyStoreCardInfo"
|
|
style={{
|
|
width: 'calc(100% - 320px)', // The calc is here so that the info section doesn't expand into the image
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
height: '100%',
|
|
marginLeft: '1em',
|
|
justifyContent: 'center',
|
|
}}
|
|
>
|
|
<span
|
|
className="deckyStoreCardTitle"
|
|
style={{
|
|
fontSize: '1.25em',
|
|
fontWeight: 'bold',
|
|
whiteSpace: 'nowrap',
|
|
overflow: 'hidden',
|
|
textOverflow: 'ellipsis',
|
|
width: '90%',
|
|
}}
|
|
>
|
|
{plugin.name}
|
|
</span>
|
|
<span
|
|
className="deckyStoreCardAuthor"
|
|
style={{
|
|
marginRight: 'auto',
|
|
fontSize: '1em',
|
|
}}
|
|
>
|
|
{plugin.author}
|
|
</span>
|
|
<span
|
|
className="deckyStoreCardDescription"
|
|
style={{
|
|
fontSize: '13px',
|
|
color: '#969696',
|
|
WebkitLineClamp: root ? '2' : '3',
|
|
WebkitBoxOrient: 'vertical',
|
|
overflow: 'hidden',
|
|
display: '-webkit-box',
|
|
}}
|
|
>
|
|
{plugin.description ? (
|
|
plugin.description
|
|
) : (
|
|
<span>
|
|
<i style={{ color: '#666' }}>{t('PluginCard.plugin_no_desc')}</i>
|
|
</span>
|
|
)}
|
|
</span>
|
|
{root && (
|
|
<span
|
|
className="deckyStoreCardDescription deckyStoreCardDescriptionRoot"
|
|
style={{
|
|
fontSize: '13px',
|
|
color: '#fee75c',
|
|
}}
|
|
>
|
|
<i>{t('PluginCard.plugin_full_access')}</i>{' '}
|
|
<a
|
|
className="deckyStoreCardDescriptionRootLink"
|
|
href="https://deckbrew.xyz/root"
|
|
target="_blank"
|
|
style={{
|
|
color: '#fee75c',
|
|
textDecoration: 'none',
|
|
}}
|
|
>
|
|
deckbrew.xyz/root
|
|
</a>
|
|
</span>
|
|
)}
|
|
<div
|
|
className="deckyStoreCardButtonRow"
|
|
style={{
|
|
marginTop: '1em',
|
|
width: '100%',
|
|
overflow: 'hidden',
|
|
}}
|
|
>
|
|
<PanelSectionRow>
|
|
<Focusable style={{ display: 'flex', maxWidth: '100%' }}>
|
|
<div
|
|
className="deckyStoreCardInstallContainer"
|
|
style={{
|
|
paddingTop: '0px',
|
|
paddingBottom: '0px',
|
|
width: '40%',
|
|
}}
|
|
>
|
|
<ButtonItem
|
|
bottomSeparator="none"
|
|
layout="below"
|
|
onClick={() =>
|
|
requestPluginInstall(plugin.name, plugin.versions[selectedOption], InstallType.INSTALL)
|
|
}
|
|
>
|
|
<span className="deckyStoreCardInstallText">{t('PluginCard.plugin_install')}</span>
|
|
</ButtonItem>
|
|
</div>
|
|
<div
|
|
className="deckyStoreCardVersionContainer"
|
|
style={{
|
|
marginLeft: '5%',
|
|
width: '30%',
|
|
}}
|
|
>
|
|
<Dropdown
|
|
rgOptions={
|
|
plugin.versions.map((version: StorePluginVersion, index) => ({
|
|
data: index,
|
|
label: version.name,
|
|
})) as SingleDropdownOption[]
|
|
}
|
|
menuLabel={t('PluginCard.plugin_version_label') as string}
|
|
selectedOption={selectedOption}
|
|
onChange={({ data }) => setSelectedOption(data)}
|
|
/>
|
|
</div>
|
|
</Focusable>
|
|
</PanelSectionRow>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default PluginCard;
|