diff --git a/apps/oneclient/frontend/src/bindings.gen.ts b/apps/oneclient/frontend/src/bindings.gen.ts index 1b1858ea..4b01aefa 100644 --- a/apps/oneclient/frontend/src/bindings.gen.ts +++ b/apps/oneclient/frontend/src/bindings.gen.ts @@ -303,8 +303,26 @@ export type VersionType = */ "old_beta" -const ARGS_MAP = { 'debug':'{"openDevTools":[],"getArch":[],"getFamily":[],"getOsVersion":[],"getBuildTimestamp":[],"getPackageVersion":[],"isInDev":[],"getLocale":[],"getType":[],"getGitCommitHash":[],"getPlatform":[]}', 'core':'{"getLinkedPackages":["cluster_id"],"installModpack":["modpack","cluster_id"],"removeCape":["access_token"],"changeSkin":["access_token","skin_url","skin_variant"],"getDefaultUser":["fallback"],"getUser":["uuid"],"removeUser":["uuid"],"getLogByName":["id","name"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"getUsersFromAuthor":["provider","author"],"open":["input"],"fetchLoggedInProfile":["access_token"],"searchPackages":["provider","query"],"getClusters":[],"getProfileOrDefault":["name"],"setDefaultUser":["uuid"],"getRunningProcesses":[],"getUsers":[],"getLoadersForVersion":["mc_version"],"getScreenshots":["id"],"getWorlds":["id"],"killProcess":["pid"],"writeSettings":["setting"],"updateClusterProfile":["name","profile"],"convertUsernameUUID":["username_uuid"],"changeCape":["access_token","cape_uuid"],"setDiscordRPCMessage":["message"],"createSettingsProfile":["name"],"removePackage":["cluster_id","package_hash"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getRunningProcessesByClusterId":["cluster_id"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"updateClusterById":["id","request"],"fetchMinecraftProfile":["uuid"],"getClusterById":["id"],"createCluster":["options"],"getLogs":["id"],"isClusterRunning":["cluster_id"],"openMsaLogin":[],"getGameVersions":[],"refreshAccount":["uuid"],"refreshAccounts":[],"removeCluster":["id"],"launchCluster":["id","uuid","search_for_java"],"readSettings":[],"getPackage":["provider","slug"],"setClusterStage":["id","stage"],"getPackageBody":["provider","body"],"getGlobalProfile":[],"getMultiplePackages":["provider","slugs"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"]}', 'oneclient':'{"getVersions":[],"getClustersGroupedByMajor":[],"checkForUpdate":[],"getBundlesFor":["cluster_id"],"installUpdate":[]}', 'events':'{"message":["event"],"ingress":["event"],"process":["event"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}' } -export type Router = { 'core': { getClusters: () => Promise, +const ARGS_MAP = { 'oneclient':'{"installUpdate":[],"checkForUpdate":[],"getBundlesFor":["cluster_id"],"getVersions":[],"getClustersGroupedByMajor":[]}', 'events':'{"message":["event"],"process":["event"],"ingress":["event"]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'debug':'{"isInDev":[],"getPlatform":[],"getArch":[],"getFamily":[],"getLocale":[],"openDevTools":[],"getOsVersion":[],"getBuildTimestamp":[],"getGitCommitHash":[],"getPackageVersion":[],"getType":[]}', 'core':'{"getLinkedPackages":["cluster_id"],"setDefaultUser":["uuid"],"refreshAccounts":[],"getUsers":[],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"getRunningProcessesByClusterId":["cluster_id"],"getUser":["uuid"],"readSettings":[],"getClusters":[],"getLoadersForVersion":["mc_version"],"removePackage":["cluster_id","package_hash"],"fetchMinecraftProfile":["uuid"],"fetchLoggedInProfile":["access_token"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"changeSkin":["access_token","skin_url","skin_variant"],"removeCape":["access_token"],"getPackageBody":["provider","body"],"setDiscordRPCMessage":["message"],"setClusterStage":["id","stage"],"writeSettings":["setting"],"open":["input"],"getLogByName":["id","name"],"getRunningProcesses":[],"searchPackages":["provider","query"],"createSettingsProfile":["name"],"getLogs":["id"],"getProfileOrDefault":["name"],"openMsaLogin":[],"convertUsernameUUID":["username_uuid"],"getScreenshots":["id"],"createCluster":["options"],"removeCluster":["id"],"isClusterRunning":["cluster_id"],"getDefaultUser":["fallback"],"getPackage":["provider","slug"],"installModpack":["modpack","cluster_id"],"launchCluster":["id","uuid","search_for_java"],"getGlobalProfile":[],"refreshAccount":["uuid"],"changeCape":["access_token","cape_uuid"],"getUsersFromAuthor":["provider","author"],"killProcess":["pid"],"getClusterById":["id"],"getWorlds":["id"],"updateClusterProfile":["name","profile"],"getGameVersions":[],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"updateClusterById":["id","request"],"getMultiplePackages":["provider","slugs"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"removeUser":["uuid"]}' } +export type Router = { 'folders': { fromCluster: (folderName: string) => Promise, +openCluster: (folderName: string) => Promise }, +'debug': { openDevTools: () => Promise, +isInDev: () => Promise, +getArch: () => Promise, +getFamily: () => Promise, +getLocale: () => Promise, +getType: () => Promise, +getPlatform: () => Promise, +getOsVersion: () => Promise, +getGitCommitHash: () => Promise, +getBuildTimestamp: () => Promise, +getPackageVersion: () => Promise }, +'oneclient': { getClustersGroupedByMajor: () => Promise>, +getBundlesFor: (clusterId: number) => Promise, +getVersions: () => Promise, +checkForUpdate: () => Promise, +installUpdate: () => Promise }, +'core': { getClusters: () => Promise, getClusterById: (id: number) => Promise, removeCluster: (id: number) => Promise, createCluster: (options: CreateCluster) => Promise, @@ -355,27 +373,9 @@ removeCape: (accessToken: string) => Promise, convertUsernameUUID: (usernameUuid: string) => Promise, setDiscordRPCMessage: (message: string) => Promise, open: (input: string) => Promise }, -'oneclient': { getClustersGroupedByMajor: () => Promise>, -getBundlesFor: (clusterId: number) => Promise, -getVersions: () => Promise, -checkForUpdate: () => Promise, -installUpdate: () => Promise }, 'events': { ingress: (event: IngressPayload) => Promise, message: (event: MessagePayload) => Promise, -process: (event: ProcessPayload) => Promise }, -'folders': { fromCluster: (folderName: string) => Promise, -openCluster: (folderName: string) => Promise }, -'debug': { openDevTools: () => Promise, -isInDev: () => Promise, -getArch: () => Promise, -getFamily: () => Promise, -getLocale: () => Promise, -getType: () => Promise, -getPlatform: () => Promise, -getOsVersion: () => Promise, -getGitCommitHash: () => Promise, -getBuildTimestamp: () => Promise, -getPackageVersion: () => Promise } }; +process: (event: ProcessPayload) => Promise } }; export type { InferCommandOutput } diff --git a/apps/oneclient/frontend/src/routes/__root.tsx b/apps/oneclient/frontend/src/routes/__root.tsx index 4c6f0d67..e9cf6983 100644 --- a/apps/oneclient/frontend/src/routes/__root.tsx +++ b/apps/oneclient/frontend/src/routes/__root.tsx @@ -46,6 +46,7 @@ const ResolvedPathNames: Record = { '/app/settings/appearance': 'Viewing Settings', '/app/settings/developer': 'Viewing Settings', '/app/settings/minecraft': 'Viewing Settings', + '/app/settings/changelog': 'Viewing Settings', '/app/accounts': 'Viewing Accounts', '/app/clusters': 'Viewing Clusters', '/onboarding': 'Preparing OneClient', diff --git a/apps/oneclient/frontend/src/routes/app/settings/changelog.tsx b/apps/oneclient/frontend/src/routes/app/settings/changelog.tsx new file mode 100644 index 00000000..4213d3d1 --- /dev/null +++ b/apps/oneclient/frontend/src/routes/app/settings/changelog.tsx @@ -0,0 +1,128 @@ +import { bindings } from '@/main'; +import { Sidebar } from '@/routes/app/settings/route'; +import { useCommand } from '@onelauncher/common'; +import { createFileRoute } from '@tanstack/react-router'; +import { ChevronDownIcon } from '@untitled-theme/icons-react'; +import { useEffect, useState } from 'react'; +import { twMerge } from 'tailwind-merge'; + +export const Route = createFileRoute('/app/settings/changelog')({ + component: RouteComponent, +}); + +interface VersionDropdownProps { + version: string; + changes: Array; + active?: boolean; + current?: boolean; +} + +function VersionDropdown({ version, changes, active, current }: VersionDropdownProps) { + const [isOpen, setIsOpen] = useState(current ?? active ?? false); + + return ( +
+
setIsOpen(prev => !prev)}> +

{version}{current ? ' (Currently Installed)' : ''}

+ +
+ +
+ {isOpen && ( +
+ {changes.length > 0 + ? ( +
    + {changes.map((change, index) => ( +
  • + {change} +
  • + ))} +
+ ) + :

No changes recorded for this version.

} +
+ )} +
+
+ ); +}; + +interface ChangelogGroup { + version: string; + changes: Array; +} + +function RouteComponent() { + const [data, setData] = useState(''); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const { data: version } = useCommand(['getPackageVersion'], () => bindings.debug.getPackageVersion()); + + useEffect(() => { + const getData = async () => { + try { + const response = await fetch('https://raw.githubusercontent.com/Polyfrost/OneLauncher/refs/heads/oneclient/main/docs/OneClient/CHANGE_LOG.md'); + if (!response.ok) + throw new Error('Failed to fetch changelog'); + + const data = await response.text(); + setData(data); + } + catch (error: unknown) { + if (error instanceof Error) + setError(error.message); + else + setError('An unknown error occurred'); + } + finally { + setIsLoading(false); + } + }; + + getData(); + }, []); + + if (isLoading) + return
Loading...
; + + if (error) + return
Error: {error}
; + + const changelogGroups = data.split('\n').reduce>((acc, line) => { + if (line.startsWith('# ')) { + acc.push({ version: line.replaceAll('# ', '').trim(), changes: [] }); + } + else if (line.startsWith('- ')) { + if (acc.length > 0) + acc[acc.length - 1].changes.push(line.slice(2).trim()); + } + else if (line === '###') { + return acc; + } + return acc; + }, []); + + return ( + +
+ {changelogGroups.map((group, groupIndex) => ( + group.version + ? ( + + ) + : null + ))} +
+
+ ); +} diff --git a/apps/oneclient/frontend/src/routes/app/settings/route.tsx b/apps/oneclient/frontend/src/routes/app/settings/route.tsx index ca86056d..6c914558 100644 --- a/apps/oneclient/frontend/src/routes/app/settings/route.tsx +++ b/apps/oneclient/frontend/src/routes/app/settings/route.tsx @@ -1,7 +1,7 @@ import type { JSX } from 'react'; import { SheetPage } from '@/components'; import { createFileRoute, Outlet, useNavigate, useRouterState } from '@tanstack/react-router'; -import { CodeSnippet02Icon, Rocket02Icon, Sliders04Icon } from '@untitled-theme/icons-react'; +import { CodeSnippet02Icon, RefreshCcw02Icon, Rocket02Icon, Sliders04Icon } from '@untitled-theme/icons-react'; import { useEffect } from 'react'; export const Route = createFileRoute('/app/settings')({ @@ -43,7 +43,7 @@ function RouteComponent() { [, 'Minecraft settings', '/minecraft'], ], 'About': [ - // [, 'Changelog', '/'], + [, 'Changelog', '/changelog'], // [, 'Feedback', '/'], [, 'Developer Options', '/developer'], ], diff --git a/apps/oneclient/frontend/src/routes/onboarding/route.tsx b/apps/oneclient/frontend/src/routes/onboarding/route.tsx index fe0849aa..adb1772f 100644 --- a/apps/oneclient/frontend/src/routes/onboarding/route.tsx +++ b/apps/oneclient/frontend/src/routes/onboarding/route.tsx @@ -154,8 +154,8 @@ function AppShell({ children, }: PropsWithChildren) { const { isFirstStep, currentStepIndex } = Route.useLoaderData(); - const { data: version } = useCommand(["getPackageVersion"], () => bindings.debug.getPackageVersion()); - const { data: isInDev } = useCommand(["isInDev"], () => bindings.debug.isInDev()); + const { data: version } = useCommand(['getPackageVersion'], () => bindings.debug.getPackageVersion()); + const { data: isInDev } = useCommand(['isInDev'], () => bindings.debug.isInDev()); return (
@@ -184,7 +184,7 @@ function AppShell({

OneClient by Polyfrost

Version {version}

-

{isInDev ? "Development" : "Release"} Build

+

{isInDev ? 'Development' : 'Release'} Build

diff --git a/docs/OneClient/CHANGE_LOG.md b/docs/OneClient/CHANGE_LOG.md new file mode 100644 index 00000000..2d1de10f --- /dev/null +++ b/docs/OneClient/CHANGE_LOG.md @@ -0,0 +1,56 @@ +# 1.0.0-alpha.6 + +### +- Refresh accounts automatically + +# 1.0.0-alpha.5 + +### +- Actually fix decorations showing on Linux +- Fix JDK downloading error on Linux +- Fix RPC spamming Modrinth requests +- Add scroll bar on skins and capes +- Add a default animation speed to skin manager +- Select the player's selected cape by default +- Remove SkyClient provider option in mod browser +- Track external mods properly +- Fix not being able to be set memory to 0 +- Add units to memory input +- Fix resolution default in settings + +# 1.0.0-alpha.4 + +### +- Only turn on decorations on macOS +- Actually implement "enabled" for mods / categories +- Fix AppImage for Linux + +# 1.0.0-alpha.3 + +### +- Make back button always go to home page +- Make MS login window bigger +- Fix lack of window rounding on macOS +- Fix copyright info on macOS +- Fix cluster being stuck on downloading +- Fix MS Auth failing sometimes +- Fix copy/paste not working on macOS +- Kill cluster overview page + +# 1.0.0-alpha.2 + +### +- Fix reading Minecraft options.txt +- Don't search for external JDKs in OneClient (fixes 32-bit issue) +- Remove max concurrent request limit + - We're hoping this fixes issues with Microsoft logins +- Implement caching for modrinth projects/versions + - Downloads should be significantly faster +- Disable missing changelog/feedback page +- Implement app updates (Cluster/mod updates will come soon) + +# 1.0.0-alpha.1 + +### +- Initial Alpha Release +