Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions apps/oneclient/frontend/src/bindings.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,22 @@ export type VersionType =
*/
"old_beta"

const ARGS_MAP = { 'core':'{"updateClusterProfile":["name","profile"],"getRunningProcesses":[],"getLinkedPackages":["cluster_id"],"createCluster":["options"],"launchCluster":["id","uuid","search_for_java"],"getWorlds":["id"],"getUsers":[],"getClusters":[],"getPackage":["provider","slug"],"getMultiplePackages":["provider","slugs"],"installModpack":["modpack","cluster_id"],"removeCape":["access_token"],"setDiscordRPCMessage":["message"],"isClusterRunning":["cluster_id"],"writeSettings":["setting"],"getLogs":["id"],"getPackageBody":["provider","body"],"changeSkin":["access_token","skin_url","skin_variant"],"searchPackages":["provider","query"],"open":["input"],"openMsaLogin":[],"fetchLoggedInProfile":["access_token"],"readSettings":[],"removeCluster":["id"],"getClusterById":["id"],"createSettingsProfile":["name"],"updateClusterById":["id","request"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"killProcess":["pid"],"getLoadersForVersion":["mc_version"],"getProfileOrDefault":["name"],"setClusterStage":["id","stage"],"fetchMinecraftProfile":["uuid"],"getUsersFromAuthor":["provider","author"],"getLogByName":["id","name"],"getDefaultUser":["fallback"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getUser":["uuid"],"removeUser":["uuid"],"changeCape":["access_token","cape_uuid"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"convertUsernameUUID":["username_uuid"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"removePackage":["cluster_id","package_hash"],"getGameVersions":[],"getGlobalProfile":[],"setDefaultUser":["uuid"],"getScreenshots":["id"],"getRunningProcessesByClusterId":["cluster_id"]}', 'oneclient':'{"getClustersGroupedByMajor":[],"installUpdate":[],"checkForUpdate":[],"getBundlesFor":["cluster_id"],"getVersions":[]}', 'debug':'{"getLocale":[],"getArch":[],"getType":[],"getGitCommitHash":[],"openDevTools":[],"isInDev":[],"getFamily":[],"getPackageVersion":[],"getBuildTimestamp":[],"getPlatform":[],"getOsVersion":[]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}' }
export type Router = { 'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
const ARGS_MAP = { 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'core':'{"getLogByName":["id","name"],"getClusterById":["id"],"getLogs":["id"],"setDiscordRPCMessage":["message"],"getClusters":[],"getWorlds":["id"],"createSettingsProfile":["name"],"getUsers":[],"isClusterRunning":["cluster_id"],"fetchMinecraftProfile":["uuid"],"getPackage":["provider","slug"],"getScreenshots":["id"],"getRunningProcessesByClusterId":["cluster_id"],"getUsersFromAuthor":["provider","author"],"getLinkedPackages":["cluster_id"],"openMsaLogin":[],"getDefaultUser":["fallback"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"writeSettings":["setting"],"getUser":["uuid"],"readSettings":[],"fetchLoggedInProfile":["access_token"],"getLoadersForVersion":["mc_version"],"open":["input"],"killProcess":["pid"],"installModpack":["modpack","cluster_id"],"setClusterStage":["id","stage"],"getRunningProcesses":[],"getProfileOrDefault":["name"],"updateClusterProfile":["name","profile"],"removeCluster":["id"],"getGameVersions":[],"getPackageBody":["provider","body"],"getMultiplePackages":["provider","slugs"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"changeSkin":["access_token","skin_url","skin_variant"],"changeCape":["access_token","cape_uuid"],"removeUser":["uuid"],"setDefaultUser":["uuid"],"launchCluster":["id","uuid","search_for_java"],"updateClusterById":["id","request"],"createCluster":["options"],"getGlobalProfile":[],"searchPackages":["provider","query"],"removePackage":["cluster_id","package_hash"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"removeCape":["access_token"],"convertUsernameUUID":["username_uuid"]}', 'debug':'{"getArch":[],"getBuildTimestamp":[],"getPlatform":[],"getType":[],"getLocale":[],"getOsVersion":[],"openDevTools":[],"getGitCommitHash":[],"isInDev":[],"getPackageVersion":[],"getFamily":[]}', 'oneclient':'{"installUpdate":[],"getClustersGroupedByMajor":[],"checkForUpdate":[],"getBundlesFor":["cluster_id"],"getVersions":[]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}' }
export type Router = { 'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> },
'debug': { openDevTools: () => Promise<void>,
isInDev: () => Promise<boolean>,
getArch: () => Promise<string>,
getFamily: () => Promise<string>,
getLocale: () => Promise<string | null>,
getType: () => Promise<string>,
getPlatform: () => Promise<string>,
getOsVersion: () => Promise<string>,
getGitCommitHash: () => Promise<string>,
getBuildTimestamp: () => Promise<string>,
getPackageVersion: () => Promise<string> },
'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]>,
getVersions: () => Promise<OnlineClusterManifest>,
checkForUpdate: () => Promise<Update | null>,
Expand Down Expand Up @@ -358,22 +372,8 @@ removeCape: (accessToken: string) => Promise<MojangFullPlayerProfile>,
convertUsernameUUID: (usernameUuid: string) => Promise<MowojangProfile>,
setDiscordRPCMessage: (message: string) => Promise<null>,
open: (input: string) => Promise<null> },
'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> },
'folders': { fromCluster: (folderName: string) => Promise<string>,
openCluster: (folderName: string) => Promise<null> },
'debug': { openDevTools: () => Promise<void>,
isInDev: () => Promise<boolean>,
getArch: () => Promise<string>,
getFamily: () => Promise<string>,
getLocale: () => Promise<string | null>,
getType: () => Promise<string>,
getPlatform: () => Promise<string>,
getOsVersion: () => Promise<string>,
getGitCommitHash: () => Promise<string>,
getBuildTimestamp: () => Promise<string>,
getPackageVersion: () => Promise<string> } };
openCluster: (folderName: string) => Promise<null> } };


export type { InferCommandOutput }
Expand Down
6 changes: 3 additions & 3 deletions apps/oneclient/frontend/src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ function ReplaceVariables(template: string, variables: Record<string, any>) {
function useDiscordRPC() {
const location = useLocation();
const clusterId = location.search.clusterId ?? 0;
const provider = location.search.provider ?? 'Modrinth';
const packageId = location.search.packageId ?? '8pJYUDNi';
const provider = location.search.provider ?? null;
const packageId = location.search.packageId ?? null;
const { data: cluster } = useCommand(['getClusterById', clusterId], () => bindings.core.getClusterById(clusterId));
const { data: managedPackage } = useCommand(['getPackage', provider, packageId], () => bindings.core.getPackage(provider, packageId));
const { data: managedPackage } = useCommand(['getPackage', provider, packageId], () => bindings.core.getPackage(provider!, packageId!), { enabled: provider != null && packageId != null });
useEffect(() => {
bindings.core.setDiscordRPCMessage(ReplaceVariables(ResolvedPathNames[location.pathname as URLPath], { clusterName: cluster?.name ?? 'UNKNOWN', packageName: managedPackage?.name ?? 'UNKNOWN' }));
}, [location.pathname, location.search.clusterId, cluster?.name, managedPackage?.name]);
Expand Down
12 changes: 11 additions & 1 deletion apps/oneclient/frontend/src/routes/app/account/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,28 @@ export const Route = createFileRoute('/app/account')({
// TODO instead replace this with a refresh access_token function. Waiting on binding from @LynithDev
const { profile, search: validSearch } = search;
if (!profile)
return { profileData: null, profile: null, validSearch };
return { profileData: null, profile: null, validSearch, playerData: null };

const query = context.queryClient.ensureQueryData({
queryKey: ['fetchLoggedInProfile', profile.access_token],
queryFn: () => bindings.core.fetchLoggedInProfile(profile.access_token),
});


const profileData = await query;

const playerDataQuery = context.queryClient.ensureQueryData({
queryKey: ['fetchMinecraftProfile', profileData.id],
queryFn: () => bindings.core.fetchMinecraftProfile(profileData.id),
});

const playerData = await playerDataQuery

return {
profileData,
profile,
validSearch,
playerData
};
},
});
Expand Down
115 changes: 62 additions & 53 deletions apps/oneclient/frontend/src/routes/app/account/skins.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@
import { save } from '@tauri-apps/plugin-dialog';
import { exists, mkdir, readTextFile, writeFile, writeTextFile } from '@tauri-apps/plugin-fs';
import { Download01Icon, PlusIcon, Trash01Icon } from '@untitled-theme/icons-react';
import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
import { useEffect, useState } from 'react';
import { CrouchAnimation, FlyingAnimation, HitAnimation, IdleAnimation, WalkingAnimation } from 'skinview3d';

interface Skin {
is_slim: boolean;
skin_url: string;
cape_url?: string;
}

interface Cape {
Expand Down Expand Up @@ -108,7 +110,7 @@
}

function RouteComponent() {
const { profileData, profile, queryClient, validSearch } = Route.useRouteContext();
const { profileData, profile, queryClient, validSearch, playerData } = Route.useRouteContext();

const [capes, setCapes] = useState<Array<Cape>>([]);
const [selectedCape, setSelectedCape] = useState<string>('');
Expand All @@ -118,19 +120,20 @@
if (!profileData)
return;
setCapes([{ url: '', id: '' }, ...profileData.capes.map(cape => ({ url: cape.url, id: cape.id }))]);
}, []);

Check warning on line 123 in apps/oneclient/frontend/src/routes/app/account/skins.tsx

View workflow job for this annotation

GitHub Actions / ES Checks

React Hook useEffect has a missing dependency: 'profileData'. Either include it or remove the dependency array

const [skins, setSkins, loaded] = useSkinHistory();
const [selectedSkin, setSelectedSkin] = useState<Skin>({ skin_url: getSkinUrl(null), is_slim: false });
const skinData: Skin = { is_slim: profileData?.skins[0].variant === 'slim', skin_url: getSkinUrl(profileData?.skins[0].url) };
const skinData: Skin = { is_slim: profileData?.skins[0].variant === 'slim', skin_url: getSkinUrl(profileData?.skins[0].url), cape_url: playerData?.cape_url ?? '' };

useEffect(() => {
if (!loaded)
return;

setSkins(prev => [...prev, skinData]);
setSelectedSkin(skinData);
setSelectedCape(skinData.cape_url ?? '')
}, [loaded]);

Check warning on line 136 in apps/oneclient/frontend/src/routes/app/account/skins.tsx

View workflow job for this annotation

GitHub Actions / ES Checks

React Hook useEffect has missing dependencies: 'setSkins' and 'skinData'. Either include them or remove the dependency array

const importFromURL = (url: string) => {
setSkins(prev => [...prev, { is_slim: false, skin_url: url }]);
Expand Down Expand Up @@ -189,6 +192,7 @@
}
};

animations[0].animation.speed = animations[0].speed;
const [animation, setAnimation] = useState<PlayerAnimation>(animations[0].animation);
const [animationName, setAnimationName] = useState<string>(animations[0].name);

Expand Down Expand Up @@ -238,7 +242,7 @@

<div className="min-h-full w-px bg-component-border"></div>

<div className="w-full flex flex-col min-h-full justify-between">
<div className="w-full flex flex-col min-h-full justify-between overflow-hidden">

<SkinHistoryRow
animation={animation}
Expand Down Expand Up @@ -274,35 +278,38 @@

function SkinHistoryRow({ selected, animation, setSelectedSkin, skins, setSkins, importFromURL, importFromUsername, capeURL, shouldShowElytra }: { selected: Skin; animation: PlayerAnimation; setSelectedSkin: (skin: Skin) => void; skins: Array<Skin>; setSkins: (updater: (prev: Array<Skin>) => Array<Skin>) => void; importFromURL: (url: string) => void; importFromUsername: (username: string) => void; capeURL: string; shouldShowElytra: boolean }) {
return (
<div className="flex flex-col h-full justify-around">
<div className="flex flex-col h-full justify-around w-10/12">
<div className="flex flex-col justify-center items-center">
<p>Skin History</p>
</div>

<div className="flex flex-row h-fit gap-2">
<Overlay.Trigger>
<Button className="border border-component-border rounded-xl bg-component-border w-[75px] h-[120px]" color="ghost">
<div className="flex flex-col justify-center items-center content-center h-full">
<PlusIcon className="scale-200" />
</div>
</Button>
<Overlay>
<ImportSkinModal importFromURL={importFromURL} importFromUsername={importFromUsername} />
</Overlay>
</Overlay.Trigger>
{skins.map(skinData => (
<RenderSkin
animation={animation}
capeURL={capeURL}
key={skinData.skin_url}
selected={selected}
setSelectedSkin={setSelectedSkin}
setSkins={setSkins}
shouldShowElytra={shouldShowElytra}
skin={skinData}
/>
))}
</div>
<OverlayScrollbarsComponent>
<div className="flex flex-row h-fit gap-2">
<Overlay.Trigger>
<Button className="border border-component-border rounded-xl bg-component-border w-[75px] h-[120px]" color="ghost">
<div className="flex flex-col justify-center items-center content-center h-full">
<PlusIcon className="scale-200" />
</div>
</Button>
<Overlay>
<ImportSkinModal importFromURL={importFromURL} importFromUsername={importFromUsername} />
</Overlay>
</Overlay.Trigger>
{skins.map(skinData => (
<RenderSkin
animation={animation}
capeURL={capeURL}
key={skinData.skin_url}
selected={selected}
setSelectedSkin={setSelectedSkin}
setSkins={setSkins}
shouldShowElytra={shouldShowElytra}
skin={skinData}
/>
))}
<div className="w-4 shrink-0" />
</div>
</OverlayScrollbarsComponent>
</div>
);
}
Expand Down Expand Up @@ -355,16 +362,16 @@
{selected.skin_url === skin.skin_url
? <></>
: (
<Overlay.Trigger>
<Button className="group w-8 h-8 absolute top-0 right-0" color="ghost" size="icon">
<Trash01Icon className="group-hover:stroke-danger" />
</Button>

<Overlay>
<RemoveSkinCapeModal onPress={() => setSkins(prev => prev.filter(skinData => skinData.skin_url !== skin.skin_url))} />
</Overlay>
</Overlay.Trigger>
)}
<Overlay.Trigger>
<Button className="group w-8 h-8 absolute top-0 right-0" color="ghost" size="icon">
<Trash01Icon className="group-hover:stroke-danger" />
</Button>

<Overlay>
<RemoveSkinCapeModal onPress={() => setSkins(prev => prev.filter(skinData => skinData.skin_url !== skin.skin_url))} />
</Overlay>
</Overlay.Trigger>
)}
<Button
className="group w-8 h-8 absolute bottom-0 right-0"
color="ghost"
Expand All @@ -379,21 +386,23 @@

function CapeRow({ selected, animation, setSelectedCape, capes, shouldShowElytra, setShouldShowElytra, skinURL }: { selected: string | null; animation: PlayerAnimation; setSelectedCape: (cape: string) => void; capes: Array<Cape>; shouldShowElytra: boolean; setShouldShowElytra: () => void; skinURL: string }) {
return (
<div className="flex flex-col h-full justify-around">
<div className="flex flex-row h-fit gap-2">
{capes.map(cape => (
<RenderCape
animation={animation}
cape={cape.url}
key={cape.id}
selected={selected}
setSelectedCape={setSelectedCape}
shouldShowElytra={shouldShowElytra}
skinURL={skinURL}
/>
))}

</div>
<div className="flex flex-col h-full justify-around w-10/12">
<OverlayScrollbarsComponent className="pr-4">
<div className="flex flex-row h-fit gap-2 mr-4 pr-4">
{capes.map(cape => (
<RenderCape
animation={animation}
cape={cape.url}
key={cape.id}
selected={selected}
setSelectedCape={setSelectedCape}
shouldShowElytra={shouldShowElytra}
skinURL={skinURL}
/>
))}
<div className="w-4 shrink-0" />
</div>
</OverlayScrollbarsComponent>

<div className="flex flex-col justify-center items-center">
<p>Cape History</p>
Expand Down
Loading