From c2ad51017be591eca0d3e63d222df0b5a6b7e0af Mon Sep 17 00:00:00 2001 From: Jacob <55346310+Kathund@users.noreply.github.com> Date: Mon, 29 Sep 2025 04:32:53 +0000 Subject: [PATCH] feat: oneclient mini accounts delete (#376) --- apps/oneclient/frontend/src/bindings.gen.ts | 16 ++++---- .../src/components/overlay/AccountPopup.tsx | 40 ++++++++++++++++--- .../frontend/src/routes/app/accounts.tsx | 3 +- 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/apps/oneclient/frontend/src/bindings.gen.ts b/apps/oneclient/frontend/src/bindings.gen.ts index 50739f78..539d115c 100644 --- a/apps/oneclient/frontend/src/bindings.gen.ts +++ b/apps/oneclient/frontend/src/bindings.gen.ts @@ -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, +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, +message: (event: MessagePayload) => Promise, +process: (event: ProcessPayload) => Promise }, +'folders': { fromCluster: (folderName: string) => Promise, +openCluster: (folderName: string) => Promise }, +'oneclient': { openDevTools: () => Promise, getClustersGroupedByMajor: () => Promise>, getBundlesFor: (clusterId: number) => Promise }, 'core': { getClusters: () => Promise, @@ -295,12 +300,7 @@ fetchMinecraftProfile: (uuid: string) => Promise, fetchLoggedInProfile: (accessToken: string) => Promise, uploadSkinBytes: (accessToken: string, skinData: number[], imageFormat: string, skinVariant: SkinVariant) => Promise, changeSkin: (accessToken: string, skinUrl: string, skinVariant: SkinVariant) => Promise, -open: (input: string) => Promise }, -'events': { ingress: (event: IngressPayload) => Promise, -message: (event: MessagePayload) => Promise, -process: (event: ProcessPayload) => Promise }, -'folders': { fromCluster: (folderName: string) => Promise, -openCluster: (folderName: string) => Promise } }; +open: (input: string) => Promise } }; export type { InferCommandOutput } diff --git a/apps/oneclient/frontend/src/components/overlay/AccountPopup.tsx b/apps/oneclient/frontend/src/components/overlay/AccountPopup.tsx index cc9dfe8b..c7a9cd9e 100644 --- a/apps/oneclient/frontend/src/components/overlay/AccountPopup.tsx +++ b/apps/oneclient/frontend/src/components/overlay/AccountPopup.tsx @@ -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 ( @@ -30,6 +42,7 @@ export function AccountPopup() { { }} + onDelete={() => deleteUser(defaultUser.data)} user={defaultUser.data} /> @@ -39,6 +52,7 @@ export function AccountPopup() {
setDefaultUser(user)} + onDelete={() => deleteUser(user)} user={user} />
@@ -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} >
- -
-
-

{user.username}

- {loggedIn &&

Logged in

} +
+ +
+
+

{user.username}

+ {loggedIn &&

Logged in

} +
+ + + + + + + +
); diff --git a/apps/oneclient/frontend/src/routes/app/accounts.tsx b/apps/oneclient/frontend/src/routes/app/accounts.tsx index 07e3114d..b61503ab 100644 --- a/apps/oneclient/frontend/src/routes/app/accounts.tsx +++ b/apps/oneclient/frontend/src/routes/app/accounts.tsx @@ -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';