diff --git a/.vscode/settings.json b/.vscode/settings.json index a582b844..d1d29577 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -188,6 +188,7 @@ "*.vue": "$(capture).*.ts, $(capture).*.js, $(capture).story.vue", "*.w": "$(capture).*.w, I$(capture).w", "*.xaml": "$(capture).xaml.cs" - }, - "typescript.tsdk": "node_modules/typescript/lib" + }, + "typescript.tsdk": "node_modules/typescript/lib", + "svg.preview.background": "editor" } diff --git a/apps/desktop/src/api/commands/mod.rs b/apps/desktop/src/api/commands/mod.rs index a3655106..e569501a 100644 --- a/apps/desktop/src/api/commands/mod.rs +++ b/apps/desktop/src/api/commands/mod.rs @@ -58,7 +58,8 @@ macro_rules! collect_commands { // Metadata get_minecraft_versions, // Launcher Packages (Instances) - import_launcher_instances, + get_launcher_instances, + import_instances, // Provider Packages get_provider_package, get_provider_packages, diff --git a/apps/desktop/src/api/commands/package.rs b/apps/desktop/src/api/commands/package.rs index 0ea3cc58..f59967ac 100644 --- a/apps/desktop/src/api/commands/package.rs +++ b/apps/desktop/src/api/commands/package.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use onelauncher::cluster::content::package; use onelauncher::data::{Loader, ManagedPackage, ManagedUser, ManagedVersion, PackageType}; use onelauncher::package::content::Providers; -use onelauncher::package::import::{default_launcher_path, ImportType}; +use onelauncher::package::import::ImportType; use onelauncher::store::{ Author, ClusterPath, Package, PackageBody, PackagePath, ProviderSearchResults, }; @@ -12,18 +12,25 @@ use uuid::Uuid; #[specta::specta] #[tauri::command] -pub async fn import_launcher_instances( +pub async fn get_launcher_instances( launcher: ImportType, path: Option, +) -> Result<(String, Vec), String> { + let (dir, instances) = onelauncher::api::package::import::get_launcher_instances(launcher, path).await?; + Ok(( + dir.to_str().ok_or("could not convert pathbuf to string")?.to_string(), + instances + )) +} + +#[specta::specta] +#[tauri::command] +pub async fn import_instances( + launcher: ImportType, + base_path: PathBuf, + instances: Vec, ) -> Result<(), String> { - onelauncher::api::package::import::import_instances( - launcher, - path.unwrap_or( - default_launcher_path(launcher) - .ok_or("couldn't get a default path for this launcher")?, - ), - ) - .await?; + onelauncher::api::package::import::import_instances(launcher, base_path, instances).await?; Ok(()) } diff --git a/apps/frontend/src/assets/logos/curseforge.svg b/apps/frontend/src/assets/logos/curseforge.svg index c00fb357..5664d7d6 100644 --- a/apps/frontend/src/assets/logos/curseforge.svg +++ b/apps/frontend/src/assets/logos/curseforge.svg @@ -1,4 +1,4 @@ - - \ No newline at end of file + diff --git a/apps/frontend/src/assets/logos/launchers/atlauncher.svg b/apps/frontend/src/assets/logos/launchers/atlauncher.svg new file mode 100644 index 00000000..fa2799c8 --- /dev/null +++ b/apps/frontend/src/assets/logos/launchers/atlauncher.svg @@ -0,0 +1 @@ + diff --git a/apps/frontend/src/assets/logos/launchers/ftb.svg b/apps/frontend/src/assets/logos/launchers/ftb.svg new file mode 100644 index 00000000..2d3fee4b --- /dev/null +++ b/apps/frontend/src/assets/logos/launchers/ftb.svg @@ -0,0 +1 @@ + diff --git a/apps/frontend/src/assets/logos/launchers/gdlauncher.png b/apps/frontend/src/assets/logos/launchers/gdlauncher.png new file mode 100644 index 00000000..091e698c Binary files /dev/null and b/apps/frontend/src/assets/logos/launchers/gdlauncher.png differ diff --git a/apps/frontend/src/assets/logos/launchers/multimc.png b/apps/frontend/src/assets/logos/launchers/multimc.png new file mode 100644 index 00000000..891852eb Binary files /dev/null and b/apps/frontend/src/assets/logos/launchers/multimc.png differ diff --git a/apps/frontend/src/assets/logos/launchers/prismlauncher.svg b/apps/frontend/src/assets/logos/launchers/prismlauncher.svg new file mode 100644 index 00000000..1249b4f5 --- /dev/null +++ b/apps/frontend/src/assets/logos/launchers/prismlauncher.svg @@ -0,0 +1,52 @@ + + Prism Launcher Logo + + + + Prism Launcher Logo + 19/10/2022 + + + Prism Launcher + + + + + AutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zeke + + + https://github.com/PrismLauncher/PrismLauncher + + + Prism Launcher + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/frontend/src/assets/logos/launchers/technic.png b/apps/frontend/src/assets/logos/launchers/technic.png new file mode 100644 index 00000000..a8cb9e49 Binary files /dev/null and b/apps/frontend/src/assets/logos/launchers/technic.png differ diff --git a/apps/frontend/src/assets/logos/launchers/tlauncher.png b/apps/frontend/src/assets/logos/launchers/tlauncher.png new file mode 100644 index 00000000..c515d2f5 Binary files /dev/null and b/apps/frontend/src/assets/logos/launchers/tlauncher.png differ diff --git a/apps/frontend/src/assets/logos/modrinth.svg b/apps/frontend/src/assets/logos/modrinth.svg index e84db411..e076a359 100644 --- a/apps/frontend/src/assets/logos/modrinth.svg +++ b/apps/frontend/src/assets/logos/modrinth.svg @@ -1,8 +1,4 @@ - - - - \ No newline at end of file + + + + diff --git a/apps/frontend/src/ui/components/content/LauncherIcon.tsx b/apps/frontend/src/ui/components/content/LauncherIcon.tsx new file mode 100644 index 00000000..e5a2241b --- /dev/null +++ b/apps/frontend/src/ui/components/content/LauncherIcon.tsx @@ -0,0 +1,60 @@ +import type { ImportType } from '@onelauncher/client/bindings'; +import CurseforgeIcon from '~assets/logos/curseforge.svg?component-solid'; +import AtLauncherIcon from '~assets/logos/launchers/atlauncher.svg?component-solid'; +import FTBIcon from '~assets/logos/launchers/ftb.svg?component-solid'; +import GDLauncherImage from '~assets/logos/launchers/gdlauncher.png'; +import MultiMCImage from '~assets/logos/launchers/multimc.png'; +import PrismIcon from '~assets/logos/launchers/prismlauncher.svg?component-solid'; +import TechnicImage from '~assets/logos/launchers/technic.png'; +import TLauncherImage from '~assets/logos/launchers/tlauncher.png'; +import ModrinthIcon from '~assets/logos/modrinth.svg?component-solid'; +import UnknownImage from '~assets/logos/vanilla.png'; +import { type JSX, type JSXElement, Show, splitProps } from 'solid-js'; + +type ElementType = (props: any) => JSXElement; + +export function getLauncherLogoElement(launcher: ImportType): ElementType { + const providerName = launcher.toLowerCase() as Lowercase; + + const image = (src: string, props: any) => {providerName}; + + // [provider logo, is svg] + const mapping: Record, ElementType | string> = { + modrinth: ModrinthIcon, + curseforge: CurseforgeIcon, + prismlauncher: PrismIcon, + atlauncher: AtLauncherIcon, + gdlauncher: GDLauncherImage, + ftblauncher: FTBIcon, + multimc: MultiMCImage, + tlauncher: TLauncherImage, + technic: TechnicImage, + unknown: UnknownImage, + }; + + const logo = mapping[providerName] || UnknownImage; + if (typeof logo === 'function') + return logo; + + return props => image(logo, props); +} + +type LauncherIconProps = JSX.HTMLAttributes & { + launcher: ImportType | undefined; +}; + +function LauncherIcon(props: LauncherIconProps) { + const [split, rest] = splitProps(props, ['launcher', 'class']); + + return ( + } /> + )} + when={split.launcher !== undefined} + /> + ); +} + +export default LauncherIcon; diff --git a/apps/frontend/src/ui/components/content/ProviderIcon.tsx b/apps/frontend/src/ui/components/content/ProviderIcon.tsx index b112319a..0975f92c 100644 --- a/apps/frontend/src/ui/components/content/ProviderIcon.tsx +++ b/apps/frontend/src/ui/components/content/ProviderIcon.tsx @@ -1,4 +1,5 @@ import type { ManagedPackage, Providers } from '@onelauncher/client/bindings'; +import CurseforgeIcon from '~assets/logos/curseforge.svg?component-solid'; import ModrinthImage from '~assets/logos/modrinth.svg?component-solid'; import { type Component, type JSX, Match, Show, splitProps, Switch } from 'solid-js'; @@ -8,6 +9,7 @@ export function getProviderLogoElement(provider: ManagedPackage | Providers): st // [provider logo, is svg] const mapping: Record, string | Component> = { modrinth: ModrinthImage, + curseforge: CurseforgeIcon, }; return mapping[providerName]; diff --git a/apps/frontend/src/ui/pages/onboarding/Onboarding.tsx b/apps/frontend/src/ui/pages/onboarding/Onboarding.tsx index 8e6f4215..01bd0191 100644 --- a/apps/frontend/src/ui/pages/onboarding/Onboarding.tsx +++ b/apps/frontend/src/ui/pages/onboarding/Onboarding.tsx @@ -32,7 +32,7 @@ export const enum OnboardingTaskStage { interface OnboardingContextType { setLanguage: (language: Language) => void; - setImportTypes: (types: ImportType[]) => void; + setImportTypeInstances: (type: ImportType, instances: string[]) => void; getTasks: () => string[]; @@ -51,7 +51,7 @@ function Onboarding(props: ParentProps) { const [forwardButtonEnabled, setForwardButtonEnabled] = createSignal(true); const [language, setLanguage] = createSignal('en'); - const [importTypes, setImportTypes] = createSignal([]); + const [importTypes, setImportTypes] = createSignal>(new Map()); const [tasksStage, setTasksStage] = createSignal(OnboardingTaskStage.NotStarted); const [tasksMessage, setTasksMessage] = createSignal(''); @@ -140,7 +140,13 @@ function Onboarding(props: ParentProps) { const ctx: OnboardingContextType = { setLanguage, - setImportTypes, + setImportTypeInstances(type, instances) { + setImportTypes((importTypes) => { + const newMap = new Map(importTypes); + newMap.set(type, instances); + return newMap; + }); + }, getTasks, diff --git a/apps/frontend/src/ui/pages/onboarding/OnboardingImport.tsx b/apps/frontend/src/ui/pages/onboarding/OnboardingImport.tsx index 0583c1ab..e55bb6e2 100644 --- a/apps/frontend/src/ui/pages/onboarding/OnboardingImport.tsx +++ b/apps/frontend/src/ui/pages/onboarding/OnboardingImport.tsx @@ -1,18 +1,24 @@ -import { useBeforeLeave } from '@solidjs/router'; +import type { ImportType } from '@onelauncher/client/bindings'; import Illustration from '~assets/illustrations/onboarding/import_from_others.svg?component-solid'; -import Image from '~assets/logos/vanilla.png'; +import LauncherIcon from '~ui/components/content/LauncherIcon'; import { LAUNCHER_IMPORT_TYPES } from '~utils'; import { OverlayScrollbarsComponent } from 'overlayscrollbars-solid'; import { For } from 'solid-js'; import Onboarding, { OnboardingStep } from './Onboarding'; +import { createModal } from '~ui/components/overlay/Modal'; function OnboardingImport() { const ctx = Onboarding.useContext(); - useBeforeLeave(() => { - ctx.setImportTypes([]); + const modal = createModal((props) => { + }); + function displayImport(type: ImportType) { + + } + + return ( } @@ -24,10 +30,10 @@ function OnboardingImport() {
{type => ( -
- {type} +
+ )}
@@ -38,3 +44,7 @@ function OnboardingImport() { } export default OnboardingImport; + +function InstancesPickerModal() { + +} diff --git a/apps/frontend/src/ui/pages/onboarding/OnboardingSummary.tsx b/apps/frontend/src/ui/pages/onboarding/OnboardingSummary.tsx index f234f001..1ee78490 100644 --- a/apps/frontend/src/ui/pages/onboarding/OnboardingSummary.tsx +++ b/apps/frontend/src/ui/pages/onboarding/OnboardingSummary.tsx @@ -16,7 +16,7 @@ function OnboardingSummary() { -
+
{task => ( diff --git a/apps/frontend/src/ui/pages/settings/about/SettingsDeveloper.tsx b/apps/frontend/src/ui/pages/settings/about/SettingsDeveloper.tsx index 82ac0dd9..041dbc22 100644 --- a/apps/frontend/src/ui/pages/settings/about/SettingsDeveloper.tsx +++ b/apps/frontend/src/ui/pages/settings/about/SettingsDeveloper.tsx @@ -1,4 +1,5 @@ -import { CodeBrowserIcon, GitMergeIcon, LinkExternal01Icon, RefreshCcw05Icon } from '@untitled-theme/icons-solid'; +import { useNavigate } from '@solidjs/router'; +import { CodeBrowserIcon, EyeIcon, GitMergeIcon, LinkExternal01Icon, RefreshCcw05Icon } from '@untitled-theme/icons-solid'; import Button from '~ui/components/base/Button'; import Toggle from '~ui/components/base/Toggle'; import ScrollableContainer from '~ui/components/ScrollableContainer'; @@ -7,7 +8,13 @@ import Sidebar from '~ui/components/Sidebar'; import useSettings from '~ui/hooks/useSettings'; function SettingsDeveloper() { - const { settings } = useSettings(); + const { settings, saveOnLeave } = useSettings(); + const navigate = useNavigate(); + + saveOnLeave(() => ({ + debug_mode: settings().debug_mode!, + onboarding_completed: settings().onboarding_completed!, + })); return ( @@ -44,7 +51,22 @@ function SettingsDeveloper() {