feat: oneclient remove account (#369)
This commit is contained in:
parent
4cb6abddd3
commit
549bb8e8a3
4 changed files with 97 additions and 20 deletions
|
|
@ -181,7 +181,7 @@ export type SettingProfileModel = { name: string; java_id: number | null; res: R
|
|||
|
||||
export type Settings = { global_game_settings: SettingProfileModel; allow_parallel_running_clusters: boolean; enable_gamemode: boolean; discord_enabled: boolean; max_concurrent_requests: number; settings_version: number; native_window_frame: boolean }
|
||||
|
||||
export type SettingsOsExtra = { enable_gamemode: boolean | null }
|
||||
export type SettingsOsExtra = Record<string, never>
|
||||
|
||||
export type Sort = "Relevance" | "Downloads" | "Newest" | "Updated"
|
||||
|
||||
|
|
@ -244,8 +244,11 @@ export type VersionType =
|
|||
*/
|
||||
"old_beta"
|
||||
|
||||
const ARGS_MAP = { 'core':'{"open":["input"],"setDefaultUser":["uuid"],"getScreenshots":["id"],"getClusters":[],"getClusterById":["id"],"getDefaultUser":["fallback"],"removeCluster":["id"],"getProfileOrDefault":["name"],"getRunningProcessesByClusterId":["cluster_id"],"getWorlds":["id"],"fetchMinecraftProfile":["uuid"],"getUser":["uuid"],"getLogByName":["id","name"],"writeSettings":["setting"],"installModpack":["modpack","cluster_id"],"killProcess":["pid"],"updateClusterProfile":["name","profile"],"getUsersFromAuthor":["provider","author"],"getUsers":[],"readSettings":[],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getPackage":["provider","slug"],"updateClusterById":["id","request"],"getLogs":["id"],"getGameVersions":[],"getGlobalProfile":[],"searchPackages":["provider","query"],"getRunningProcesses":[],"isClusterRunning":["cluster_id"],"getMultiplePackages":["provider","slugs"],"getLoadersForVersion":["mc_version"],"openMsaLogin":[],"removeUser":["uuid"],"createCluster":["options"],"getPackageBody":["provider","body"],"launchCluster":["id","uuid"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"]}', 'oneclient':'{"openDevTools":[],"getClustersGroupedByMajor":[],"getBundlesFor":["cluster_id"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'events':'{"ingress":["event"],"process":["event"],"message":["event"]}' }
|
||||
export type Router = { 'core': { getClusters: () => Promise<ClusterModel[]>,
|
||||
const ARGS_MAP = { 'core':'{"getLogs":["id"],"getMultiplePackages":["provider","slugs"],"installModpack":["modpack","cluster_id"],"removeUser":["uuid"],"createCluster":["options"],"getGlobalProfile":[],"getRunningProcesses":[],"getDefaultUser":["fallback"],"updateClusterProfile":["name","profile"],"setDefaultUser":["uuid"],"getPackage":["provider","slug"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"removeCluster":["id"],"getLogByName":["id","name"],"getProfileOrDefault":["name"],"getWorlds":["id"],"open":["input"],"getLoadersForVersion":["mc_version"],"readSettings":[],"writeSettings":["setting"],"fetchMinecraftProfile":["uuid"],"getGameVersions":[],"updateClusterById":["id","request"],"openMsaLogin":[],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getUser":["uuid"],"getScreenshots":["id"],"getClusters":[],"killProcess":["pid"],"getPackageBody":["provider","body"],"getRunningProcessesByClusterId":["cluster_id"],"isClusterRunning":["cluster_id"],"launchCluster":["id","uuid"],"searchPackages":["provider","query"],"getUsers":[],"getUsersFromAuthor":["provider","author"],"getClusterById":["id"]}', 'oneclient':'{"getClustersGroupedByMajor":[],"getBundlesFor":["cluster_id"],"openDevTools":[]}', 'events':'{"message":["event"],"ingress":["event"],"process":["event"]}', 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}' }
|
||||
export type Router = { 'oneclient': { openDevTools: () => Promise<void>,
|
||||
getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
|
||||
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]> },
|
||||
'core': { getClusters: () => Promise<ClusterModel[]>,
|
||||
getClusterById: (id: number) => Promise<ClusterModel | null>,
|
||||
removeCluster: (id: number) => Promise<null>,
|
||||
createCluster: (options: CreateCluster) => Promise<ClusterModel>,
|
||||
|
|
@ -282,14 +285,11 @@ getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise<Manag
|
|||
installModpack: (modpack: ModpackArchive, clusterId: number) => Promise<null>,
|
||||
fetchMinecraftProfile: (uuid: string) => Promise<MojangPlayerProfile>,
|
||||
open: (input: string) => Promise<null> },
|
||||
'oneclient': { openDevTools: () => Promise<void>,
|
||||
getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
|
||||
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]> },
|
||||
'folders': { fromCluster: (folderName: string) => Promise<string>,
|
||||
openCluster: (folderName: string) => Promise<null> },
|
||||
'events': { ingress: (event: IngressPayload) => Promise<void>,
|
||||
message: (event: MessagePayload) => Promise<void>,
|
||||
process: (event: ProcessPayload) => Promise<void> } };
|
||||
process: (event: ProcessPayload) => Promise<void> },
|
||||
'folders': { fromCluster: (folderName: string) => Promise<string>,
|
||||
openCluster: (folderName: string) => Promise<null> } };
|
||||
|
||||
|
||||
export type { InferCommandOutput }
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
import type { MinecraftCredentials } from '@/bindings.gen';
|
||||
import { AccountAvatar } from '@/components/AccountAvatar';
|
||||
import { Button } from '@onelauncher/common/components';
|
||||
import { Overlay } from './Overlay';
|
||||
|
||||
export function RemoveAccountModal({
|
||||
profile,
|
||||
onPress,
|
||||
}: {
|
||||
profile: MinecraftCredentials;
|
||||
onPress: () => void;
|
||||
}) {
|
||||
return (
|
||||
<Overlay.Dialog>
|
||||
<Overlay.Title>Are you sure?</Overlay.Title>
|
||||
|
||||
<p>Do you want to remove <span className='font-bold' color='primary'>{profile.username}</span> from you're accounts?</p>
|
||||
<p>This cannot be undone</p>
|
||||
|
||||
<AccountRow profile={profile} />
|
||||
<Button
|
||||
className="w-full"
|
||||
color="danger"
|
||||
onPress={onPress}
|
||||
size="large"
|
||||
slot="close"
|
||||
>
|
||||
Remove
|
||||
</Button>
|
||||
</Overlay.Dialog>
|
||||
);
|
||||
}
|
||||
|
||||
function AccountRow({
|
||||
profile,
|
||||
}: {
|
||||
profile: MinecraftCredentials;
|
||||
}) {
|
||||
return (
|
||||
<div className="flex flex-row items-center justify-start gap-2">
|
||||
<AccountAvatar className="aspect-square h-12 rounded-sm " uuid={profile.id} />
|
||||
|
||||
<div className="text-left flex flex-col">
|
||||
<p className="flex items-center gap-1 text-fg-primary font-semibold">{profile.username}</p>
|
||||
<p className="text-fg-secondary text-sm">{profile.id}</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -2,4 +2,5 @@ export * from './AccountPopup';
|
|||
export * from './AddAccountModal';
|
||||
export * from './Overlay';
|
||||
export * from './Popup';
|
||||
export * from './RemoveAccountModal';
|
||||
export * from './Toasts';
|
||||
|
|
|
|||
|
|
@ -3,12 +3,14 @@ import type { ButtonProps } from '@onelauncher/common/components';
|
|||
import { AccountAvatar, SheetPage, SkinViewer } from '@/components';
|
||||
import { AddAccountModal } from '@/components/overlay';
|
||||
import { Overlay } from '@/components/overlay/Overlay';
|
||||
import { RemoveAccountModal } from '@/components/overlay/RemoveAccountModal';
|
||||
import { usePlayerProfile } from '@/hooks/usePlayerProfile';
|
||||
import { bindings } from '@/main';
|
||||
import { useCommandMut, useCommandSuspense } from '@onelauncher/common';
|
||||
import { Button } from '@onelauncher/common/components';
|
||||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import { createFileRoute } from '@tanstack/react-router';
|
||||
import { Trash01Icon } from '@untitled-theme/icons-react';
|
||||
import { Button as AriaButton, DialogTrigger } from 'react-aria-components';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
|
|
@ -85,12 +87,23 @@ function AccountList() {
|
|||
});
|
||||
},
|
||||
});
|
||||
const { mutate: removeUser } = useCommandMut(bindings.core.removeUser, {
|
||||
onSuccess() {
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ['getDefaultUser'],
|
||||
});
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: ['getUsers'],
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="flex-1 flex flex-col gap-2">
|
||||
{accounts.map(account => (
|
||||
<AccountRow
|
||||
key={account.id}
|
||||
onDelete={() => removeUser(account.id)}
|
||||
onPress={() => setDefaultUser(account.id)}
|
||||
profile={account}
|
||||
selected={currentAccount?.id === account.id}
|
||||
|
|
@ -108,10 +121,12 @@ function AccountRow({
|
|||
selected = false,
|
||||
profile,
|
||||
onPress,
|
||||
onDelete,
|
||||
}: {
|
||||
selected?: boolean;
|
||||
profile: MinecraftCredentials;
|
||||
onPress: () => void;
|
||||
onDelete: () => void;
|
||||
}) {
|
||||
const { isError } = usePlayerProfile(profile.id);
|
||||
|
||||
|
|
@ -125,19 +140,31 @@ function AccountRow({
|
|||
)}
|
||||
onPress={onPress}
|
||||
>
|
||||
<AccountAvatar className="aspect-square h-12 rounded-sm " uuid={profile.id} />
|
||||
<div className="flex flex-row justify-between w-full">
|
||||
<div className="flex flex-row gap-2">
|
||||
<AccountAvatar className="aspect-square h-12 rounded-sm " uuid={profile.id} />
|
||||
|
||||
<div className="text-left flex flex-col">
|
||||
<p className="flex items-center gap-1 text-fg-primary font-semibold">
|
||||
{profile.username}
|
||||
{isError && <span className="text-danger text-xs font-medium"> (Error fetching online profile)</span>}
|
||||
</p>
|
||||
<p className="text-fg-secondary text-sm">{profile.id}</p>
|
||||
<div className="text-left flex flex-col">
|
||||
<p className="flex items-center gap-1 text-fg-primary font-semibold">
|
||||
{profile.username}
|
||||
{isError && <span className="text-danger text-xs font-medium"> (Error fetching online profile)</span>}
|
||||
</p>
|
||||
<p className="text-fg-secondary text-sm">{profile.id}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-row items-center gap-2">
|
||||
<DialogTrigger>
|
||||
<Button className="group w-8 h-8" color="ghost" size="icon">
|
||||
<Trash01Icon className="group-hover:stroke-danger" />
|
||||
</Button>
|
||||
|
||||
<Overlay>
|
||||
<RemoveAccountModal onPress={onDelete} profile={profile} />
|
||||
</Overlay>
|
||||
</DialogTrigger>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* <Button className="w-8 h-8" color="ghost" size="icon">
|
||||
<Trash01Icon />
|
||||
</Button> */}
|
||||
</AriaButton>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue