feat: oneclient no account popup (#381)

* feat: oneclient no account popup

Prompts the user for a login when they don't have an account added and
are trying to start the game

* fix: formatting

* fix: account popup text color
This commit is contained in:
Jacob 2025-10-04 04:44:17 +00:00 • committed by GitHub
parent 8a2939597b
commit 59e7cde8df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 64 additions and 20 deletions

View file

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

View file

@ -1,8 +1,13 @@
import type { ButtonProps } from '@onelauncher/common/components';
import { useIsRunning } from '@/hooks/useClusters';
import { useLaunchCluster } from '@/hooks/useLaunchCluster';
import { bindings } from '@/main';
import { useCommandSuspense } from '@onelauncher/common';
import { Button } from '@onelauncher/common/components';
import { useState } from 'react';
import { DialogTrigger } from 'react-aria-components';
import { tv } from 'tailwind-variants';
import { NoAccountPopup, Overlay } from './overlay';
export type LaunchButtonProps = Omit<ButtonProps, 'children' | 'onClick'> & {
clusterId: number | undefined | null;
@ -22,17 +27,32 @@ export function LaunchButton({
className,
...rest
}: LaunchButtonProps) {
const launch = useLaunchCluster(clusterId);
const { data: currentAccount } = useCommandSuspense(['getDefaultUser'], () => bindings.core.getDefaultUser(true));
const launchCluster = useLaunchCluster(clusterId);
const isRunning = useIsRunning(clusterId);
const [open, setOpen] = useState<boolean>(false);
const launch = () => {
if (currentAccount === null)
setOpen(true);
else
launchCluster();
};
return (
<Button
className={launchButtonVariants({ isRunning, className })}
isDisabled={isDisabled || isRunning}
onClick={launch}
{...rest}
>
{isRunning ? 'Running' : 'Launch'}
</Button>
<DialogTrigger isOpen={open} onOpenChange={setOpen}>
<Button
className={launchButtonVariants({ isRunning, className })}
isDisabled={isDisabled || isRunning}
onPress={launch}
{...rest}
>
{isRunning ? 'Running' : 'Launch'}
</Button>
<Overlay>
<NoAccountPopup />
</Overlay>
</DialogTrigger>
);
}

View file

@ -0,0 +1,23 @@
import { Button } from '@onelauncher/common/components';
import { DialogTrigger } from 'react-aria-components';
import { AddAccountModal } from './AddAccountModal';
import { Overlay } from './Overlay';
export function NoAccountPopup() {
return (
<Overlay.Dialog>
<Overlay.Title>No Account</Overlay.Title>
<p className="max-w-sm text-fg-secondary">Please add an account before you start minecraft</p>
<DialogTrigger>
<Button className="w-full" size="large">
Add Account
</Button>
<Overlay>
<AddAccountModal />
</Overlay>
</DialogTrigger>
</Overlay.Dialog>
);
}

View file

@ -1,6 +1,7 @@
export * from './AccountPopup';
export * from './AddAccountModal';
export * from './ImportSkinModal';
export * from './NoAccountPopup';
export * from './Overlay';
export * from './Popup';
export * from './RemoveAccountModal';