feat: oneclient mini accounts delete (#376)

This commit is contained in:
Jacob 2025-09-29 04:32:53 +00:00 • committed by GitHub
parent c90c41ce45
commit c2ad51017b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 43 additions and 16 deletions

View file

@ -252,8 +252,13 @@ export type VersionType =
*/
"old_beta"
const ARGS_MAP = { 'oneclient':'{"getClustersGroupedByMajor":[],"openDevTools":[],"getBundlesFor":["cluster_id"]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}', 'core':'{"getGameVersions":[],"getUsers":[],"getWorlds":["id"],"getGlobalProfile":[],"removeCluster":["id"],"updateClusterById":["id","request"],"getScreenshots":["id"],"getLoadersForVersion":["mc_version"],"getPackageBody":["provider","body"],"installModpack":["modpack","cluster_id"],"fetchMinecraftProfile":["uuid"],"getProfileOrDefault":["name"],"changeSkin":["access_token","skin_url","skin_variant"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getRunningProcessesByClusterId":["cluster_id"],"searchPackages":["provider","query"],"openMsaLogin":[],"updateClusterProfile":["name","profile"],"getClusterById":["id"],"createCluster":["options"],"removeUser":["uuid"],"getRunningProcesses":[],"getClusters":[],"getLogByName":["id","name"],"getUser":["uuid"],"writeSettings":["setting"],"fetchLoggedInProfile":["access_token"],"killProcess":["pid"],"getMultiplePackages":["provider","slugs"],"getLogs":["id"],"launchCluster":["id","uuid"],"getDefaultUser":["fallback"],"readSettings":[],"getPackage":["provider","slug"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getUsersFromAuthor":["provider","author"],"open":["input"],"setDefaultUser":["uuid"],"isClusterRunning":["cluster_id"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}' }
export type Router = { 'oneclient': { openDevTools: () => Promise<void>,
const ARGS_MAP = { 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'oneclient':'{"getClustersGroupedByMajor":[],"openDevTools":[],"getBundlesFor":["cluster_id"]}', 'core':'{"getGameVersions":[],"getUsers":[],"getWorlds":["id"],"getGlobalProfile":[],"removeCluster":["id"],"updateClusterById":["id","request"],"getScreenshots":["id"],"getLoadersForVersion":["mc_version"],"getPackageBody":["provider","body"],"installModpack":["modpack","cluster_id"],"fetchMinecraftProfile":["uuid"],"getProfileOrDefault":["name"],"changeSkin":["access_token","skin_url","skin_variant"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getRunningProcessesByClusterId":["cluster_id"],"searchPackages":["provider","query"],"openMsaLogin":[],"updateClusterProfile":["name","profile"],"getClusterById":["id"],"createCluster":["options"],"removeUser":["uuid"],"getRunningProcesses":[],"getClusters":[],"getLogByName":["id","name"],"getUser":["uuid"],"writeSettings":["setting"],"fetchLoggedInProfile":["access_token"],"killProcess":["pid"],"getMultiplePackages":["provider","slugs"],"getLogs":["id"],"launchCluster":["id","uuid"],"getDefaultUser":["fallback"],"readSettings":[],"getPackage":["provider","slug"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getUsersFromAuthor":["provider","author"],"open":["input"],"setDefaultUser":["uuid"],"isClusterRunning":["cluster_id"]}' }
export type Router = { '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> },
'oneclient': { openDevTools: () => Promise<void>,
getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]> },
'core': { getClusters: () => Promise<ClusterModel[]>,
@ -295,12 +300,7 @@ fetchMinecraftProfile: (uuid: string) => Promise<MojangPlayerProfile>,
fetchLoggedInProfile: (accessToken: string) => Promise<MojangFullPlayerProfile>,
uploadSkinBytes: (accessToken: string, skinData: number[], imageFormat: string, skinVariant: SkinVariant) => Promise<MojangSkin>,
changeSkin: (accessToken: string, skinUrl: string, skinVariant: SkinVariant) => Promise<MojangSkin>,
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> } };
open: (input: string) => Promise<null> } };
export type { InferCommandOutput }

View file

@ -3,13 +3,14 @@ import { bindings } from '@/main';
import { useCommand, useCommandMut } from '@onelauncher/common';
import { Button } from '@onelauncher/common/components';
import { Link } from '@tanstack/react-router';
import { PlusIcon, Settings01Icon } from '@untitled-theme/icons-react';
import { PlusIcon, Settings01Icon, Trash01Icon } from '@untitled-theme/icons-react';
import { DialogTrigger } from 'react-aria-components';
import { twMerge } from 'tailwind-merge';
import { AccountAvatar } from '../AccountAvatar';
import { AddAccountModal } from './AddAccountModal';
import { Overlay } from './Overlay';
import { Popup } from './Popup';
import { RemoveAccountModal } from './RemoveAccountModal';
export function AccountPopup() {
const users = useCommand(['getUsers'], bindings.core.getUsers);
@ -21,6 +22,17 @@ export function AccountPopup() {
defaultUser.refetch();
};
const deleteUser = async (user: MinecraftCredentials) => {
await bindings.core.removeUser(user.id);
users.refetch();
defaultUser.refetch();
if (defaultUser.data && defaultUser.data.id === user.id && users.data && users.data.length > 1) {
const filtered = users.data.filter((userData) => userData.id !== user.id)
if (filtered.length > 0) setDefaultUser(filtered[0]);
}
};
return (
<Popup placement="top left">
@ -30,6 +42,7 @@ export function AccountPopup() {
<AccountEntry
loggedIn
onClick={() => { }}
onDelete={() => deleteUser(defaultUser.data)}
user={defaultUser.data}
/>
</div>
@ -39,6 +52,7 @@ export function AccountPopup() {
<div key={user.id}>
<AccountEntry
onClick={() => setDefaultUser(user)}
onDelete={() => deleteUser(user)}
user={user}
/>
</div>
@ -75,10 +89,12 @@ export default AccountPopup;
function AccountEntry({
onClick,
onDelete,
user,
loggedIn = false,
}: {
onClick: () => void;
onDelete: () => void;
user: MinecraftCredentials;
loggedIn?: boolean;
}) {
@ -88,13 +104,25 @@ function AccountEntry({
onClick={onClick}
>
<div className="flex flex-1 flex-row justify-start gap-x-3">
<AccountAvatar className="h-8 w-8 rounded-md" uuid={user.id} />
<div className="flex flex-col items-center justify-center">
<div className="flex flex-col items-start justify-between">
<p className="h-[18px] font-semibold">{user.username}</p>
{loggedIn && <p className="text-xs">Logged in</p>}
<div className="flex flex-1 flex-row justify-start gap-x-3">
<AccountAvatar className="h-8 w-8 rounded-md" uuid={user.id} />
<div className="flex flex-col items-center justify-center">
<div className="flex flex-col items-start justify-between">
<p className="h-[18px] font-semibold">{user.username}</p>
{loggedIn && <p className="text-xs">Logged in</p>}
</div>
</div>
</div>
<DialogTrigger>
<Button className="group w-8 h-8" color="ghost" size="icon">
<Trash01Icon className="group-hover:stroke-danger" />
</Button>
<Overlay>
<RemoveAccountModal onPress={onDelete} profile={user} />
</Overlay>
</DialogTrigger>
</div>
</div>
);

View file

@ -1,9 +1,8 @@
import type { MinecraftCredentials } from '@/bindings.gen';
import type { ButtonProps } from '@onelauncher/common/components';
import { AccountAvatar, SheetPage, SkinViewer } from '@/components';
import { AddAccountModal } from '@/components/overlay';
import { AddAccountModal, RemoveAccountModal } 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';