From ad45798ea247de31d59c960fe0fa3c1797cfefa0 Mon Sep 17 00:00:00 2001 From: emirsassan Date: Fri, 11 Jul 2025 15:43:56 +0300 Subject: [PATCH] feat: match notification style and re-enable notifications --- .../frontend/src/components/Navbar.tsx | 4 +- .../launcher/cluster/ClusterCreation.tsx | 54 ++++++++++++------- .../components/overlay/NotificationToasts.tsx | 41 +++++++------- .../overlay/popups/NotificationPopup.tsx | 7 ++- .../frontend/src/hooks/useNotification.tsx | 40 +++++++++----- .../frontend/src/routes/app/cluster/index.tsx | 2 +- .../frontend/src/routes/app/index.tsx | 1 - 7 files changed, 86 insertions(+), 63 deletions(-) diff --git a/apps/onelauncher/frontend/src/components/Navbar.tsx b/apps/onelauncher/frontend/src/components/Navbar.tsx index c4ddb25e..601d6e96 100644 --- a/apps/onelauncher/frontend/src/components/Navbar.tsx +++ b/apps/onelauncher/frontend/src/components/Navbar.tsx @@ -2,10 +2,9 @@ import type { ToOptions } from '@tanstack/react-router'; import useNotifications from '@/hooks/useNotification'; import { bindings } from '@/main'; import { useCommand } from '@onelauncher/common'; -import { Button, Menu, Popup } from '@onelauncher/common/components'; +import { Button, Popup } from '@onelauncher/common/components'; import { Link } from '@tanstack/react-router'; import { Bell01Icon, Cloud01Icon, TerminalBrowserIcon } from '@untitled-theme/icons-react'; -import { MenuTrigger } from 'react-aria-components'; import OneLauncherText from '../assets/logos/onelauncher_text.svg'; import PlayerHead from './content/PlayerHead'; import AccountPopup from './overlay/popups/AccountPopup'; @@ -49,6 +48,7 @@ function Navbar() { )} + diff --git a/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx b/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx index 0e15f054..8d0a8e8e 100644 --- a/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx +++ b/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx @@ -1,7 +1,6 @@ import type { GameLoader, Version, VersionType } from '@/bindings.gen'; import type { JSX, RefAttributes } from 'react'; import DefaultBanner from '@/assets/images/default_banner.png'; -import DefaultClusterBanner from '@/assets/images/default_instance_cover.jpg'; import LauncherIcon from '@/components/content/LauncherIcon'; import Modal from '@/components/overlay/Modal'; import ScrollableContainer from '@/components/ScrollableContainer'; @@ -9,6 +8,7 @@ import { bindings } from '@/main'; import { LAUNCHER_IMPORT_TYPES, LOADERS, upperFirst } from '@/utils'; import { useCommand, useCommandMut } from '@onelauncher/common'; import { Button, Dropdown, SelectList, TextField } from '@onelauncher/common/components'; +import { useQueryClient } from '@tanstack/react-query'; import { ArrowRightIcon, PlusIcon, SearchMdIcon, Server01Icon, TextInputIcon, User03Icon } from '@untitled-theme/icons-react'; import { useCallback, useEffect, useState } from 'react'; import { Checkbox } from 'react-aria-components'; @@ -25,24 +25,37 @@ const STEPS = [ }, ] as const; +interface ClusterFormData { + loader: GameLoader; + clusterName: string; + clusterVersion: string; + clusterProvider: string; +} + export function NewClusterCreate() { + const queryClient = useQueryClient(); const [currentStepIndex, setCurrentStepIndex] = useState(0); - const [formData, setFormData] = useState({ - loader: '', + const [formData, setFormData] = useState({ + loader: 'vanilla', clusterName: '', clusterVersion: '', + clusterProvider: '', }); const create = useCommandMut(() => bindings.core.createCluster({ - icon: DefaultClusterBanner, - mc_loader: formData.loader as GameLoader, + icon: null, + mc_loader: formData.loader, mc_loader_version: null, mc_version: formData.clusterVersion, name: formData.clusterName, - })); + }), { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['getClusters'] }); + }, + }); function handleCreate() { - if (!isLastInputStep) + if (!isLastInputStep && !formData.clusterName) return; create.mutate(); @@ -70,10 +83,7 @@ export function NewClusterCreate() { switch (currentStepConfig.id) { case 'loader': { stepContent = ( - setFormData(prev => ({ ...prev, loader }))} - selectedLoader={formData.loader} - /> + setFormData(prev => ({ ...prev, clusterProvider: provider }))} selectedProvider={formData.clusterProvider} /> ); break; } @@ -81,6 +91,7 @@ export function NewClusterCreate() { case 'info': { stepContent = ( setFormData(prev => ({ ...prev, loader }))} @@ -98,7 +109,7 @@ export function NewClusterCreate() { const nextButtonText = isLastInputStep ? 'Create' : 'Next'; let isNextDisabled = false; - if (currentStepConfig.id === 'loader' && !formData.loader) + if (currentStepConfig.id === 'loader' && !formData.clusterProvider) isNextDisabled = true; else if ( currentStepConfig.id === 'info' @@ -167,19 +178,19 @@ export function NewClusterCreate() { } interface ClusterLoaderProps { - selectedLoader: string; - onSelectLoader: (loader: string) => void; + selectedProvider: string; + onSelectProvider: (provider: string) => void; } -function ClusterLoader({ selectedLoader, onSelectLoader }: ClusterLoaderProps) { +function ClusterLoader({ selectedProvider, onSelectProvider }: ClusterLoaderProps) { return ( <>
} name="New" - selected={selectedLoader === 'new'} - setSelected={() => onSelectLoader('new')} + selected={selectedProvider === 'new'} + setSelected={() => onSelectProvider('new')} /> {LAUNCHER_IMPORT_TYPES.map((data, i) => ( @@ -187,8 +198,8 @@ function ClusterLoader({ selectedLoader, onSelectLoader }: ClusterLoaderProps) { icon={} key={i} name={data} - selected={selectedLoader === data} - setSelected={() => onSelectLoader(data)} + selected={selectedProvider === data} + setSelected={() => onSelectProvider(data)} /> ))}
@@ -224,6 +235,7 @@ interface ClusterInformationProps { onClusterNameChange: (name: string) => void; clusterVersion: string; onClusterVersionChange: (version: string) => void; + clusterLoader: GameLoader; onClusterLoaderChange: (loader: GameLoader) => void; } @@ -232,6 +244,7 @@ function ClusterInformation({ onClusterNameChange, clusterVersion, onClusterVersionChange, + clusterLoader, onClusterLoaderChange, }: ClusterInformationProps) { const versions = useCommand('getGameVersions', bindings.core.getGameVersions); @@ -244,6 +257,7 @@ function ClusterInformation({ iconLeft={} onChange={e => onClusterNameChange(e.target.value)} placeholder="Name" + required value={clusterName} /> @@ -254,7 +268,7 @@ function ClusterInformation({