diff --git a/Cargo.lock b/Cargo.lock index 195ec597..b2ab04fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3400,6 +3400,7 @@ dependencies = [ "chrono", "interpulse", "onelauncher_core", + "reqwest", "serde", "serde_json", "specta", @@ -6060,9 +6061,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88371e340ad2f07409a3b68294abe73f20bc9c1bc1b631a31dc37a3d0161f682" +checksum = "33ead0daec5d305adcefe05af9d970fc437bcc7996052d564e7393eb291252da" dependencies = [ "anyhow", "dunce", @@ -6078,7 +6079,6 @@ dependencies = [ "thiserror 2.0.12", "toml", "url", - "uuid 1.16.0", ] [[package]] diff --git a/apps/oneclient/desktop/Cargo.toml b/apps/oneclient/desktop/Cargo.toml index 0f0e8f14..8e2ce0c1 100644 --- a/apps/oneclient/desktop/Cargo.toml +++ b/apps/oneclient/desktop/Cargo.toml @@ -60,6 +60,7 @@ tokio = { workspace = true } # utils thiserror = { workspace = true } anyhow = { workspace = true } +reqwest = { workspace = true } [dependencies.tauri] workspace = true diff --git a/apps/oneclient/frontend/package.json b/apps/oneclient/frontend/package.json index 3d5bfa9d..90354df2 100644 --- a/apps/oneclient/frontend/package.json +++ b/apps/oneclient/frontend/package.json @@ -35,6 +35,7 @@ "react-aria-components": "catalog:", "react-dom": "catalog:", "react-just-parallax": "catalog:", + "skinview3d": "catalog:", "tailwind-merge": "catalog:", "tailwind-variants": "catalog:", "tailwindcss": "catalog:", diff --git a/apps/oneclient/frontend/src/assets/backgrounds/MinecraftBuilding.png b/apps/oneclient/frontend/src/assets/backgrounds/MinecraftBuilding.png new file mode 100644 index 00000000..94208370 Binary files /dev/null and b/apps/oneclient/frontend/src/assets/backgrounds/MinecraftBuilding.png differ diff --git a/apps/oneclient/frontend/src/assets/logos/oneclient2.svg b/apps/oneclient/frontend/src/assets/logos/oneclient2.svg new file mode 100644 index 00000000..7330f6ce --- /dev/null +++ b/apps/oneclient/frontend/src/assets/logos/oneclient2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/oneclient/frontend/src/bindings.gen.ts b/apps/oneclient/frontend/src/bindings.gen.ts index a19f8789..3bda344c 100644 --- a/apps/oneclient/frontend/src/bindings.gen.ts +++ b/apps/oneclient/frontend/src/bindings.gen.ts @@ -94,6 +94,8 @@ refresh_token: string; */ expires: string } +export type MojangPlayerProfile = { uuid: string; username: string; is_slim: boolean; skin_url: string | null; cape_url: string | null } + export type PackageAuthor = { Team: { team_id: string; org_id: string | null } } | { Users: ManagedUser[] } export type PackageCategories = { Mod: PackageModCategory[] } | { ResourcePack: PackageResourcePackCategory[] } | { Shader: PackageShaderCategory[] } | { DataPack: PackageModCategory[] } | { ModPack: PackageModPackCategory[] } @@ -228,6 +230,7 @@ export type VersionType = */ "old_beta" +<<<<<<< HEAD const ARGS_MAP = { 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}', 'events':'{"ingress":["event"],"process":["event"],"message":["event"]}', 'oneclient':'{"getClustersGroupedByMajor":[],"openDevTools":[]}', 'core':'{"getWorlds":["id"],"launchCluster":["id","uuid"],"getDefaultUser":["fallback"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getClusterById":["id"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"getProfileOrDefault":["name"],"updateClusterProfile":["name","profile"],"writeSettings":["setting"],"updateClusterById":["id","request"],"getMultiplePackages":["provider","slugs"],"removeCluster":["id"],"getUser":["uuid"],"getGlobalProfile":[],"openMsaLogin":[],"getPackageBody":["provider","body"],"getLogByName":["id","name"],"getLoadersForVersion":["mc_version"],"searchPackages":["provider","query"],"readSettings":[],"removeUser":["uuid"],"getClusters":[],"getGameVersions":[],"getUsers":[],"getPackage":["provider","slug"],"getUsersFromAuthor":["provider","author"],"getScreenshots":["id"],"getLogs":["id"],"setDefaultUser":["uuid"],"createCluster":["options"]}' } export type Router = { 'events': { ingress: (event: IngressPayload) => Promise, message: (event: MessagePayload) => Promise, @@ -236,6 +239,16 @@ process: (event: ProcessPayload) => Promise }, openCluster: (folderName: string) => Promise }, 'oneclient': { openDevTools: () => Promise, getClustersGroupedByMajor: () => Promise> }, +======= +const ARGS_MAP = { 'oneclient':'{"openDevTools":[],"getClustersGroupedByMajor":[]}', 'events':'{"message":["event"],"process":["event"],"ingress":["event"]}', 'core':'{"getLoadersForVersion":["mc_version"],"writeSettings":["setting"],"getLogs":["id"],"getWorlds":["id"],"getClusterById":["id"],"launchCluster":["id","uuid"],"getPackage":["provider","slug"],"getGlobalProfile":[],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"readSettings":[],"updateClusterById":["id","request"],"getUser":["uuid"],"getPackageBody":["provider","body"],"fetchMinecraftProfile":["uuid"],"createCluster":["options"],"updateClusterProfile":["name","profile"],"getScreenshots":["id"],"removeUser":["uuid"],"getDefaultUser":["fallback"],"openMsaLogin":[],"getGameVersions":[],"setDefaultUser":["uuid"],"getUsersFromAuthor":["provider","author"],"removeCluster":["id"],"getLogByName":["id","name"],"getProfileOrDefault":["name"],"getClusters":[],"getMultiplePackages":["provider","slugs"],"getUsers":[],"searchPackages":["provider","query"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"]}', 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}' } +export type Router = { 'events': { ingress: (event: IngressPayload) => Promise, +message: (event: MessagePayload) => Promise, +process: (event: ProcessPayload) => Promise }, +'oneclient': { openDevTools: () => Promise, +getClustersGroupedByMajor: () => Promise> }, +'folders': { fromCluster: (folderName: string) => Promise, +openCluster: (folderName: string) => Promise }, +>>>>>>> 04cd2183d01fa465f38ac0b802c81eb344a7ecf9 'core': { getClusters: () => Promise, getClusterById: (id: number) => Promise, removeCluster: (id: number) => Promise, @@ -265,7 +278,12 @@ getPackageBody: (provider: Provider, body: ManagedPackageBody) => Promise Promise, getPackageVersions: (provider: Provider, slug: string, mcVersion: string | null, loader: GameLoader | null, offset: number, limit: number) => Promise>, downloadPackage: (provider: Provider, packageId: string, versionId: string, clusterId: number, skipCompatibility: boolean | null) => Promise, +<<<<<<< HEAD getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise } }; +======= +getUsersFromAuthor: (provider: Provider, author: PackageAuthor) => Promise, +fetchMinecraftProfile: (uuid: string) => Promise } }; +>>>>>>> 04cd2183d01fa465f38ac0b802c81eb344a7ecf9 export type { InferCommandOutput } diff --git a/apps/oneclient/frontend/src/components/AccountAvatar.tsx b/apps/oneclient/frontend/src/components/AccountAvatar.tsx new file mode 100644 index 00000000..aad665db --- /dev/null +++ b/apps/oneclient/frontend/src/components/AccountAvatar.tsx @@ -0,0 +1,35 @@ +import type { ImgHTMLAttributes } from 'react'; +import { usePlayerProfile } from '@/hooks/usePlayerProfile'; +import { getSkinUrl } from '@/utils/minecraft'; +import { renderHeadToDataUrl } from '@onelauncher/common'; +import { useEffect, useState } from 'react'; + +export interface AccountAvatarProps extends ImgHTMLAttributes { + uuid: string | undefined | null; +} + +export function AccountAvatar({ + uuid, + alt, + style, + ...rest +}: AccountAvatarProps) { + const { data: profile } = usePlayerProfile(uuid); + const [headUrl, setHeadUrl] = useState(null); + + useEffect(() => { + renderHeadToDataUrl(getSkinUrl(profile?.skin_url)).then(setHeadUrl); + }, [profile]); + + return ( + {alt + ); +} diff --git a/apps/oneclient/frontend/src/components/GameBackground.tsx b/apps/oneclient/frontend/src/components/GameBackground.tsx index 6dca5458..281d70fc 100644 --- a/apps/oneclient/frontend/src/components/GameBackground.tsx +++ b/apps/oneclient/frontend/src/components/GameBackground.tsx @@ -4,10 +4,12 @@ import { twMerge } from 'tailwind-merge'; import CavesAndCliffs from '@/assets/backgrounds/CavesAndCliffs.jpg'; import HypixelSkyblockHub from '@/assets/backgrounds/HypixelSkyblockHub.png'; +import MinecraftBuilding from '@/assets/backgrounds/MinecraftBuilding.png'; const GameBackgrounds = { HypixelSkyblockHub, CavesAndCliffs, + MinecraftBuilding, }; export type GameBackgroundName = keyof typeof GameBackgrounds; diff --git a/apps/oneclient/frontend/src/components/Navbar.tsx b/apps/oneclient/frontend/src/components/Navbar.tsx index bdb6e0a0..de0d3734 100644 --- a/apps/oneclient/frontend/src/components/Navbar.tsx +++ b/apps/oneclient/frontend/src/components/Navbar.tsx @@ -1,19 +1,25 @@ import type { ButtonProps } from '@onelauncher/common/components'; import type { LinkProps, RegisteredRouter } from '@tanstack/react-router'; import LauncherLogo from '@/assets/logos/oneclient.svg?react'; -import { Button } from '@onelauncher/common/components'; +import { bindings } from '@/main'; +import { useCommand } from '@onelauncher/common'; +import { Button, Popup } from '@onelauncher/common/components'; import { Link } from '@tanstack/react-router'; import { Window } from '@tauri-apps/api/window'; import { MinusIcon, SquareIcon, XCloseIcon } from '@untitled-theme/icons-react'; import { twMerge } from 'tailwind-merge'; +import { AccountAvatar } from './AccountAvatar'; +import { AccountPopup } from './overlay/AccountPopup'; export function Navbar() { + const { data: currentAccount } = useCommand(['getDefaultUser'], () => bindings.core.getDefaultUser(true)); + const onMinimize = () => Window.getCurrent().minimize(); const onMaximize = () => Window.getCurrent().toggleMaximize(); const onClose = () => Window.getCurrent().close(); return ( -