Skip to content

Commit 978732a

Browse files
authored
feat: toasts customizability (#497)
* fix: Toasts always using the info icon * feat: Toast Position Customizability * feat: Toast duration customizability * fix: send toast button wide lol * feat: toast auto close customizability * fix: SettingNumber being bad
1 parent 73a55ee commit 978732a

24 files changed

Lines changed: 280 additions & 279 deletions

apps/oneclient/frontend/src/bindings.gen.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,14 +248,16 @@ gallery: string[] }
248248

249249
export type SettingProfileModel = { name: string; java_id: number | null; res: Resolution | null; force_fullscreen: boolean | null; mem_max: number | null; launch_args: string | null; launch_env: string | null; hook_pre: string | null; hook_wrapper: string | null; hook_post: string | null; os_extra: SettingsOsExtra | null }
250250

251-
export type Settings = { global_game_settings: SettingProfileModel; allow_parallel_running_clusters: boolean; enable_gamemode: boolean; discord_enabled: boolean; seen_onboarding: boolean; mod_list_use_grid: boolean; max_concurrent_requests: number; settings_version: number; native_window_frame: boolean; log_debug_info: boolean; show_tanstack_dev_tools: boolean }
251+
export type Settings = { global_game_settings: SettingProfileModel; allow_parallel_running_clusters: boolean; enable_gamemode: boolean; discord_enabled: boolean; seen_onboarding: boolean; mod_list_use_grid: boolean; max_concurrent_requests: number; settings_version: number; native_window_frame: boolean; log_debug_info: boolean; show_tanstack_dev_tools: boolean; toast_position: ToastPosition; toast_duration: number; toast_auto_close: boolean }
252252

253253
export type SettingsOsExtra = { enable_gamemode: boolean | null }
254254

255255
export type SkinVariant = "classic" | "slim"
256256

257257
export type Sort = "Relevance" | "Downloads" | "Newest" | "Updated"
258258

259+
export type ToastPosition = "top-right" | "top-left" | "bottom-right" | "bottom-left"
260+
259261
export type Update = { version: string }
260262

261263
/**
@@ -317,7 +319,7 @@ export type VersionType =
317319
*/
318320
"old_beta"
319321

320-
const ARGS_MAP = { 'debug':'{"getFullDebugInfoParsed":[],"getLocale":[],"getType":[],"hasDevSettings":[],"isInDev":[],"getFamily":[],"getPackageVersion":[],"getOsVersion":[],"getGitCommitHash":[],"getPlatform":[],"getBuildTimestamp":[],"getOsDistro":[],"getArch":[],"getFullDebugInfo":[],"getFullDebugInfoParsedString":[],"openDevTools":[]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'events':'{"process":["event"],"message":["event"],"ingress":["event"]}', 'core':'{"searchPackages":["provider","query"],"getLinkedPackages":["cluster_id"],"getProcessLogTail":["id","max_lines"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"updateClusterById":["id","request"],"getLogs":["id"],"getGameVersions":[],"refreshAccounts":[],"syncCluster":["cluster_id"],"removeCape":["access_token"],"getClusterById":["id"],"openMsaLogin":[],"refreshAccount":["uuid"],"convertUsernameUUID":["username_uuid"],"getRunningProcessesByClusterId":["cluster_id"],"setDiscordRPCMessage":["message"],"open":["input"],"getClusters":[],"getProfileOrDefault":["name"],"getLogByName":["id","name"],"getPackage":["provider","slug"],"getUsers":[],"createSettingsProfile":["name"],"removeCluster":["id"],"getPackageBody":["provider","body"],"killProcess":["pid"],"changeSkin":["access_token","skin_url","skin_variant"],"getGlobalProfile":[],"getUser":["uuid"],"removeUser":["uuid"],"getDefaultUser":["fallback"],"getMultiplePackages":["provider","slugs"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"changeCape":["access_token","cape_uuid"],"launchCluster":["id","uuid","search_for_java"],"createCluster":["options"],"updateClusterProfile":["name","profile"],"getWorlds":["id"],"getScreenshots":["id"],"getLoadersForVersion":["mc_version"],"getUsersFromAuthor":["provider","author"],"isClusterRunning":["cluster_id"],"setClusterStage":["id","stage"],"setDefaultUser":["uuid"],"getRunningProcesses":[],"writeSettings":["setting"],"readSettings":[],"removePackage":["cluster_id","package_hash"],"fetchMinecraftProfile":["uuid"],"fetchLoggedInProfile":["access_token"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"togglePackage":["cluster_id","package_hash"],"installModpack":["modpack","cluster_id"]}', 'oneclient':'{"getVersions":[],"extractBundleOverrides":["bundle_path","cluster_id"],"downloadPackageFromBundle":["package","cluster_id","bundle_name","skip_compatibility"],"getBundlesFor":["cluster_id"],"isBundleSyncing":[],"installUpdate":[],"cacheArt":["path"],"refreshArt":["path"],"checkForUpdate":[],"getClustersGroupedByMajor":[],"updateBundlePackages":["cluster_id"]}' }
322+
const ARGS_MAP = { 'events':'{"ingress":["event"],"process":["event"],"message":["event"]}', 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}', 'debug':'{"getLocale":[],"getPlatform":[],"getOsVersion":[],"getOsDistro":[],"isInDev":[],"getArch":[],"getFullDebugInfo":[],"getFullDebugInfoParsedString":[],"getPackageVersion":[],"getBuildTimestamp":[],"getType":[],"getGitCommitHash":[],"openDevTools":[],"getFamily":[],"getFullDebugInfoParsed":[],"hasDevSettings":[]}', 'oneclient':'{"getBundlesFor":["cluster_id"],"isBundleSyncing":[],"extractBundleOverrides":["bundle_path","cluster_id"],"installUpdate":[],"getClustersGroupedByMajor":[],"updateBundlePackages":["cluster_id"],"cacheArt":["path"],"checkForUpdate":[],"downloadPackageFromBundle":["package","cluster_id","bundle_name","skip_compatibility"],"refreshArt":["path"],"getVersions":[]}', 'core':'{"removePackage":["cluster_id","package_hash"],"getLinkedPackages":["cluster_id"],"refreshAccount":["uuid"],"createSettingsProfile":["name"],"changeCape":["access_token","cape_uuid"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"isClusterRunning":["cluster_id"],"convertUsernameUUID":["username_uuid"],"setDiscordRPCMessage":["message"],"removeUser":["uuid"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"syncCluster":["cluster_id"],"getRunningProcessesByClusterId":["cluster_id"],"removeCluster":["id"],"open":["input"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"getWorlds":["id"],"getScreenshots":["id"],"killProcess":["pid"],"getUsers":[],"removeCape":["access_token"],"getClusters":[],"getUsersFromAuthor":["provider","author"],"installModpack":["modpack","cluster_id"],"fetchMinecraftProfile":["uuid"],"getUser":["uuid"],"getPackageBody":["provider","body"],"getLoadersForVersion":["mc_version"],"fetchLoggedInProfile":["access_token"],"getLogByName":["id","name"],"changeSkin":["access_token","skin_url","skin_variant"],"writeSettings":["setting"],"getDefaultUser":["fallback"],"setDefaultUser":["uuid"],"getLogs":["id"],"updateClusterProfile":["name","profile"],"getClusterById":["id"],"launchCluster":["id","uuid","search_for_java"],"refreshAccounts":[],"getProcessLogTail":["id","max_lines"],"getGlobalProfile":[],"getRunningProcesses":[],"openMsaLogin":[],"createCluster":["options"],"getProfileOrDefault":["name"],"getGameVersions":[],"searchPackages":["provider","query"],"updateClusterById":["id","request"],"getPackage":["provider","slug"],"togglePackage":["cluster_id","package_hash"],"getMultiplePackages":["provider","slugs"],"setClusterStage":["id","stage"],"readSettings":[],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"]}' }
321323
export type Router = { 'folders': { fromCluster: (folderName: string) => Promise<string>,
322324
openCluster: (folderName: string) => Promise<null> },
323325
'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
@@ -347,9 +349,6 @@ getFullDebugInfo: () => Promise<DebugInfoData>,
347349
getFullDebugInfoParsed: () => Promise<DebugInfoParsedLine[]>,
348350
getFullDebugInfoParsedString: () => Promise<string>,
349351
hasDevSettings: () => Promise<boolean> },
350-
'events': { ingress: (event: IngressPayload) => Promise<void>,
351-
message: (event: MessagePayload) => Promise<void>,
352-
process: (event: ProcessPayload) => Promise<void> },
353352
'core': { getClusters: () => Promise<ClusterModel[]>,
354353
getClusterById: (id: number) => Promise<ClusterModel | null>,
355354
removeCluster: (id: number) => Promise<null>,
@@ -403,7 +402,10 @@ changeCape: (accessToken: string, capeUuid: string) => Promise<MojangFullPlayerP
403402
removeCape: (accessToken: string) => Promise<MojangFullPlayerProfile>,
404403
convertUsernameUUID: (usernameUuid: string) => Promise<MowojangProfile>,
405404
setDiscordRPCMessage: (message: string) => Promise<null>,
406-
open: (input: string) => Promise<null> } };
405+
open: (input: string) => Promise<null> },
406+
'events': { ingress: (event: IngressPayload) => Promise<void>,
407+
message: (event: MessagePayload) => Promise<void>,
408+
process: (event: ProcessPayload) => Promise<void> } };
407409

408410

409411
export type { InferCommandOutput }

apps/oneclient/frontend/src/components/MadeBy.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { copyDebugInfo } from '@/hooks/useDebugInfo';
1+
import { useCopyDebugInfo } from '@/hooks/useDebugInfo';
22
import { bindings } from '@/main';
33
import { useCommand } from '@onelauncher/common';
44
import { Button } from '@onelauncher/common/components';
55

66
export function MadeBy() {
77
const { data: version } = useCommand(['getPackageVersion'], () => bindings.debug.getPackageVersion());
88
const { data: isInDev } = useCommand(['isInDev'], () => bindings.debug.isInDev());
9+
const copyDebugInfo = useCopyDebugInfo();
910

1011
return (
1112
<Button
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { TitleCase } from '@/utils/string';
2+
import { Dropdown } from '@onelauncher/common/components';
3+
4+
export function SettingDropdown<T extends string>({ setting, options }: { setting: [T, (value: T) => void]; options: Array<T> }) {
5+
return (
6+
<Dropdown onSelectionChange={key => setting[1](key as T)} selectedKey={setting[0]}>
7+
{options.map(option => <Dropdown.Item id={option} key={option}>{TitleCase(option)}</Dropdown.Item>)}
8+
</Dropdown>
9+
);
10+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { TextField } from '@onelauncher/common/components';
2+
import { useState } from 'react';
3+
4+
type NumberSetting = [
5+
number,
6+
(value: number) => void,
7+
];
8+
9+
export function SettingNumber({ setting, placeholder, min, max }: { setting: NumberSetting; placeholder?: string; min?: number; max?: number }) {
10+
const [inputValue, setInputValue] = useState(String(setting[0]));
11+
12+
function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
13+
const value = event.currentTarget.value;
14+
setInputValue(value);
15+
const num = Number(value);
16+
if (!Number.isNaN(num))
17+
setting[1](num);
18+
}
19+
20+
function handleBlur() {
21+
let num = Number(inputValue);
22+
23+
if (Number.isNaN(num)) {
24+
setInputValue(String(setting[0]));
25+
return;
26+
}
27+
28+
if (min !== undefined)
29+
num = Math.max(min, num);
30+
if (max !== undefined)
31+
num = Math.min(max, num);
32+
33+
setInputValue(String(num));
34+
setting[1](num);
35+
}
36+
37+
return (
38+
<TextField
39+
max={max}
40+
min={min}
41+
onBlur={handleBlur}
42+
onChange={handleChange}
43+
placeholder={placeholder}
44+
type="number"
45+
value={inputValue}
46+
/>
47+
);
48+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TextField } from '@onelauncher/common/components';
2+
3+
type StringSetting = [
4+
string,
5+
(value: string) => void,
6+
];
7+
8+
export function SettingString({ setting, placeholder }: { setting: StringSetting; placeholder?: string }) {
9+
return (
10+
<TextField
11+
onChange={event => setting[1](event.currentTarget.value)}
12+
placeholder={placeholder}
13+
value={setting[0]}
14+
/>
15+
);
16+
}

apps/oneclient/frontend/src/components/SettingSwitch.tsx renamed to apps/oneclient/frontend/src/components/Settings/SettingSwitch.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ type BooleanSetting = [
55
(value: boolean) => void,
66
];
77

8-
export function SettingsSwitch({ setting }: { setting: BooleanSetting }) {
8+
export function SettingSwitch({ setting }: { setting: BooleanSetting }) {
99
return (
1010
<Switch
1111
isSelected={setting[0]}

apps/oneclient/frontend/src/components/SettingsRow.tsx renamed to apps/oneclient/frontend/src/components/Settings/SettingsRow.tsx

File renamed without changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export * from './SettingDropdown';
2+
export * from './SettingNumber';
3+
export * from './SettingsRow';
4+
export * from './SettingString';
5+
export * from './SettingSwitch';

apps/oneclient/frontend/src/components/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ export * from './ManageSkinButton';
1313
export * from './Markdown';
1414
export * from './Navbar';
1515
export * from './overlay';
16-
export * from './SettingsRow';
17-
export * from './SettingSwitch';
16+
export * from './Settings';
1817
export * from './SheetPage';
1918
export * from './SkinViewer';
2019
export * from './Spinner';

apps/oneclient/frontend/src/components/overlay/DebugInfo.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { DebugInfoArray } from '@/hooks/useDebugInfo';
22
import { Overlay } from '@/components';
3-
import { copyDebugInfo, useDebugInfo } from '@/hooks/useDebugInfo';
3+
import { useCopyDebugInfo, useDebugInfo } from '@/hooks/useDebugInfo';
44
import { Button } from '@onelauncher/common/components';
55

66
export function DebugInfo() {
@@ -14,6 +14,7 @@ export function DebugInfo() {
1414
}
1515

1616
export function RawDebugInfo({ debugInfo }: { debugInfo: DebugInfoArray }) {
17+
const copyDebugInfo = useCopyDebugInfo();
1718
return (
1819
<>
1920
<div>

0 commit comments

Comments
 (0)