commit
64db796830
4 changed files with 92 additions and 73 deletions
|
|
@ -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>,
|
||||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -9,12 +9,14 @@ import { dataDir, downloadDir, join } from '@tauri-apps/api/path';
|
|||
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 {
|
||||
|
|
@ -108,7 +110,7 @@ export function MissingAccountData({ validSearch }: { validSearch: boolean }) {
|
|||
}
|
||||
|
||||
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>('');
|
||||
|
|
@ -122,7 +124,7 @@ function RouteComponent() {
|
|||
|
||||
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)
|
||||
|
|
@ -130,6 +132,7 @@ function RouteComponent() {
|
|||
|
||||
setSkins(prev => [...prev, skinData]);
|
||||
setSelectedSkin(skinData);
|
||||
setSelectedCape(skinData.cape_url ?? '')
|
||||
}, [loaded]);
|
||||
|
||||
const importFromURL = (url: string) => {
|
||||
|
|
@ -189,6 +192,7 @@ function RouteComponent() {
|
|||
}
|
||||
};
|
||||
|
||||
animations[0].animation.speed = animations[0].speed;
|
||||
const [animation, setAnimation] = useState<PlayerAnimation>(animations[0].animation);
|
||||
const [animationName, setAnimationName] = useState<string>(animations[0].name);
|
||||
|
||||
|
|
@ -238,7 +242,7 @@ function RouteComponent() {
|
|||
|
||||
<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}
|
||||
|
|
@ -274,35 +278,38 @@ function RouteComponent() {
|
|||
|
||||
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>
|
||||
);
|
||||
}
|
||||
|
|
@ -355,16 +362,16 @@ function RenderSkin({ skin, selected, animation, setSelectedSkin, setSkins, cape
|
|||
{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.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>
|
||||
<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"
|
||||
|
|
@ -379,21 +386,23 @@ function RenderSkin({ skin, selected, animation, setSelectedSkin, setSkins, cape
|
|||
|
||||
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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue