mirror of
https://github.com/LCE-Hub/LCE-Emerald-Launcher.git
synced 2026-09-24 17:11:00 +00:00
feat: extended description and required versions (#119)
This commit is contained in:
@@ -25,6 +25,7 @@ import {
|
|||||||
type CustomEdition,
|
type CustomEdition,
|
||||||
} from "../../services/TauriService";
|
} from "../../services/TauriService";
|
||||||
import { PluginManager } from "../../plugins/PluginManager";
|
import { PluginManager } from "../../plugins/PluginManager";
|
||||||
|
import { BASE_EDITIONS } from "../../hooks/useGameManager";
|
||||||
const REGISTRY_URL =
|
const REGISTRY_URL =
|
||||||
"https://raw.githubusercontent.com/LCE-Hub/LCE-Workshop/refs/heads/main/registry.json";
|
"https://raw.githubusercontent.com/LCE-Hub/LCE-Workshop/refs/heads/main/registry.json";
|
||||||
const VERSIONS_URL =
|
const VERSIONS_URL =
|
||||||
@@ -75,6 +76,7 @@ interface RegistryPackage {
|
|||||||
permissions?: string[];
|
permissions?: string[];
|
||||||
files?: string[];
|
files?: string[];
|
||||||
dependencies?: string[];
|
dependencies?: string[];
|
||||||
|
required_versions?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ServerListing {
|
interface ServerListing {
|
||||||
@@ -1095,6 +1097,8 @@ const WorkshopView = memo(function WorkshopView({
|
|||||||
<PackageModal
|
<PackageModal
|
||||||
pkg={selectedPkg}
|
pkg={selectedPkg}
|
||||||
allPackages={allPackages}
|
allPackages={allPackages}
|
||||||
|
versionPackages={versionPackages}
|
||||||
|
customEditions={config.customEditions || []}
|
||||||
installedPkgs={installedPkgs}
|
installedPkgs={installedPkgs}
|
||||||
onClose={closeModal}
|
onClose={closeModal}
|
||||||
playPressSound={playPressSound}
|
playPressSound={playPressSound}
|
||||||
@@ -1237,6 +1241,8 @@ function PackageCard({
|
|||||||
function PackageModal({
|
function PackageModal({
|
||||||
pkg,
|
pkg,
|
||||||
allPackages,
|
allPackages,
|
||||||
|
versionPackages,
|
||||||
|
customEditions,
|
||||||
installedPkgs,
|
installedPkgs,
|
||||||
onClose,
|
onClose,
|
||||||
playPressSound,
|
playPressSound,
|
||||||
@@ -1252,6 +1258,8 @@ function PackageModal({
|
|||||||
}: {
|
}: {
|
||||||
pkg: RegistryPackage;
|
pkg: RegistryPackage;
|
||||||
allPackages: RegistryPackage[];
|
allPackages: RegistryPackage[];
|
||||||
|
versionPackages: RegistryPackage[];
|
||||||
|
customEditions: CustomEdition[];
|
||||||
installedPkgs: InstalledWorkshopPackage[];
|
installedPkgs: InstalledWorkshopPackage[];
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
playPressSound: () => void;
|
playPressSound: () => void;
|
||||||
@@ -1668,33 +1676,57 @@ function PackageModal({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{pkg.dependencies && pkg.dependencies.length > 0 && (
|
|
||||||
<div className="flex flex-col gap-1.5 mt-4 pt-4 border-t border-[#333]">
|
|
||||||
<span className="text-[10px] text-[#FFAA33] mc-text-shadow uppercase tracking-[0.2em] font-bold">
|
|
||||||
Required Dependencies
|
|
||||||
</span>
|
|
||||||
<div className="flex flex-wrap gap-1.5">
|
|
||||||
{pkg.dependencies.map((depId) => {
|
|
||||||
const dep = allPackages.find((p) => p.id === depId);
|
|
||||||
const isDepInstalled = installedPkgs.some((p) => p.packageId === depId);
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
key={depId}
|
|
||||||
className={`text-[10px] border px-2 py-0.5 mc-text-shadow uppercase tracking-widest ${
|
|
||||||
isDepInstalled
|
|
||||||
? "bg-[#003300] border-[#55FF55]/60 text-[#55FF55]"
|
|
||||||
: "bg-black/60 border-[#FF8800]/40 text-[#FFAA33]"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{dep?.name || depId}
|
|
||||||
{isDepInstalled ? " (installed)" : ""}
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
{pkg.dependencies && pkg.dependencies.length > 0 && (
|
||||||
|
<div className="flex flex-col gap-1.5 pt-4 border-t border-[#333]">
|
||||||
|
<span className="text-[10px] text-[#FFAA33] mc-text-shadow uppercase tracking-[0.2em] font-bold">
|
||||||
|
Required Dependencies
|
||||||
|
</span>
|
||||||
|
<div className="flex flex-wrap gap-1.5 mt-1">
|
||||||
|
{pkg.dependencies.map((depId) => {
|
||||||
|
const dep = allPackages.find((p) => p.id === depId);
|
||||||
|
const isDepInstalled = installedPkgs.some((p) => p.packageId === depId);
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
key={depId}
|
||||||
|
className={`text-[10px] border px-2 py-0.5 mc-text-shadow uppercase tracking-widest ${
|
||||||
|
isDepInstalled
|
||||||
|
? "bg-[#003300] border-[#55FF55]/60 text-[#55FF55]"
|
||||||
|
: "bg-black/60 border-[#FF8800]/40 text-[#FFAA33]"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{dep?.name || depId}
|
||||||
|
{isDepInstalled ? " (installed)" : ""}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{pkg.required_versions && pkg.required_versions.length > 0 && (
|
||||||
|
<div className="flex flex-col gap-1.5 pt-4 border-t border-[#333]">
|
||||||
|
<span className="text-[10px] text-[#55AAFF] mc-text-shadow uppercase tracking-[0.2em] font-bold">
|
||||||
|
Required Editions
|
||||||
|
</span>
|
||||||
|
<div className="flex flex-wrap gap-1.5 mt-1">
|
||||||
|
{pkg.required_versions.map((verId) => {
|
||||||
|
const builtin = BASE_EDITIONS.find((e) => e.id === verId);
|
||||||
|
const versionPkg = versionPackages.find((v) => v.id === verId);
|
||||||
|
const customEd = customEditions.find((e) => e.id === verId);
|
||||||
|
const displayName = builtin?.name || customEd?.name || versionPkg?.name;
|
||||||
|
if (!displayName) return null;
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
key={verId}
|
||||||
|
className="text-[10px] bg-black/60 border border-[#55AAFF]/40 px-2 py-0.5 text-[#55AAFF] mc-text-shadow uppercase tracking-widest"
|
||||||
|
>
|
||||||
|
{displayName}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
{pkg.zips && Object.keys(pkg.zips).length > 0 && (
|
{pkg.zips && Object.keys(pkg.zips).length > 0 && (
|
||||||
<div className="flex flex-col gap-3 pt-4 border-t border-[#333]">
|
<div className="flex flex-col gap-3 pt-4 border-t border-[#333]">
|
||||||
<span className="text-[10px] text-[#666] mc-text-shadow uppercase tracking-[0.2em] font-bold">
|
<span className="text-[10px] text-[#666] mc-text-shadow uppercase tracking-[0.2em] font-bold">
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ async function imageUrlToBase64(url: string): Promise<string> {
|
|||||||
reader.readAsDataURL(blob);
|
reader.readAsDataURL(blob);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const BASE_EDITIONS = [
|
export const BASE_EDITIONS = [
|
||||||
{
|
{
|
||||||
id: "legacy_evolved",
|
id: "legacy_evolved",
|
||||||
name: "neoLegacy",
|
name: "neoLegacy",
|
||||||
|
|||||||
Reference in New Issue
Block a user