From 7eb2f7429732fd38c6265bc4b840195eee650615 Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Thu, 8 Aug 2024 22:05:36 +0200 Subject: [PATCH] fix: Always return a default user (if there are any added) --- apps/desktop/src/api/commands/users.rs | 10 ++++- apps/frontend/src/ui/components/Navbar.tsx | 2 +- .../src/ui/components/game/PlayerHead.tsx | 41 +++++++++++-------- .../overlay/account/AccountsPopup.tsx | 38 +++++++++++++---- .../overlay/account/AddAccountModal.tsx | 8 ++-- packages/core/src/api/minecraft.rs | 14 +++++-- 6 files changed, 76 insertions(+), 37 deletions(-) diff --git a/apps/desktop/src/api/commands/users.rs b/apps/desktop/src/api/commands/users.rs index eb0cdd05..adf17999 100644 --- a/apps/desktop/src/api/commands/users.rs +++ b/apps/desktop/src/api/commands/users.rs @@ -23,9 +23,15 @@ pub async fn remove_user(uuid: Uuid) -> Result<(), String> { #[specta::specta] #[tauri::command] -pub async fn get_default_user() -> Result, String> { +pub async fn get_default_user(fallback: Option) -> Result, String> { let uuid = minecraft::get_default_user().await?; + if let Some(fallback) = fallback { + if fallback && uuid.is_none() { + return Ok(minecraft::users().await?.first().cloned()); + } + } + match uuid { Some(uuid) => Ok(Some(minecraft::get_user(uuid).await?)), None => Ok(None), @@ -34,7 +40,7 @@ pub async fn get_default_user() -> Result, String> #[specta::specta] #[tauri::command] -pub async fn set_default_user(uuid: Uuid) -> Result<(), String> { +pub async fn set_default_user(uuid: Option) -> Result<(), String> { minecraft::set_default_user(uuid).await?; Ok(()) } diff --git a/apps/frontend/src/ui/components/Navbar.tsx b/apps/frontend/src/ui/components/Navbar.tsx index 883a59c0..f529bc29 100644 --- a/apps/frontend/src/ui/components/Navbar.tsx +++ b/apps/frontend/src/ui/components/Navbar.tsx @@ -82,7 +82,7 @@ function Navbar() { onClick={() => setProfileMenuOpen(!profileMenuOpen())} class="hover:opacity-70" > - + diff --git a/apps/frontend/src/ui/components/game/PlayerHead.tsx b/apps/frontend/src/ui/components/game/PlayerHead.tsx index 0f5d0285..c30896a8 100644 --- a/apps/frontend/src/ui/components/game/PlayerHead.tsx +++ b/apps/frontend/src/ui/components/game/PlayerHead.tsx @@ -1,4 +1,4 @@ -import { Show, createSignal, splitProps } from 'solid-js'; +import { Show, createEffect, createSignal, on, splitProps } from 'solid-js'; import type { JSX } from 'solid-js'; import steveSrc from '../../../assets/images/steve.png'; @@ -13,26 +13,31 @@ function headSrc(uuid: string) { function PlayerHead(props: PlayerHeadProps) { const [split, rest] = splitProps(props, ['uuid', 'class']); - const [isLoading, setLoading] = createSignal(true); + const [isLoaded, setLoaded] = createSignal(false); + + createEffect(on(() => props.uuid, () => setLoaded(false))); return ( <> - - - - - setLoading(false)} - onError={() => props.onError && props.onError()} - class={`image-render-pixel ${isLoading() ? 'hidden' : ''} ${split.class}`} - {...rest} - /> - + + )} + children={( + setLoaded(true)} + onError={() => props.onError && props.onError()} + class={`image-render-pixel ${isLoaded() ? '' : 'hidden'} ${split.class}`} + {...rest} + /> + )} + /> ); } diff --git a/apps/frontend/src/ui/components/overlay/account/AccountsPopup.tsx b/apps/frontend/src/ui/components/overlay/account/AccountsPopup.tsx index fa368f84..a295c245 100644 --- a/apps/frontend/src/ui/components/overlay/account/AccountsPopup.tsx +++ b/apps/frontend/src/ui/components/overlay/account/AccountsPopup.tsx @@ -1,5 +1,5 @@ import { For, Show } from 'solid-js'; -import { LogOut01Icon, PlusIcon, Settings01Icon } from '@untitled-theme/icons-solid'; +import { PlusIcon, Settings01Icon } from '@untitled-theme/icons-solid'; import { useNavigate } from '@solidjs/router'; import Button from '../../base/Button'; import PlayerHead from '../../game/PlayerHead'; @@ -13,9 +13,22 @@ interface AccountComponentProps { } function AccountComponent(props: AccountComponentProps) { + const controller = useAccountController(); + + function login() { + if (props.loggedIn === true) + return; + + if (props.account) + controller.setDefaultAccount(props.account.id); + } + return ( -
+
@@ -25,11 +38,14 @@ function AccountComponent(props: AccountComponentProps) {
- {props.loggedIn && ( - - )} + + {/* +
); @@ -46,10 +62,14 @@ function AccountPopup(props: Popup.PopupProps) {
- + + + -
{account => ( diff --git a/apps/frontend/src/ui/components/overlay/account/AddAccountModal.tsx b/apps/frontend/src/ui/components/overlay/account/AddAccountModal.tsx index cbd34517..e83cafb2 100644 --- a/apps/frontend/src/ui/components/overlay/account/AddAccountModal.tsx +++ b/apps/frontend/src/ui/components/overlay/account/AddAccountModal.tsx @@ -11,7 +11,7 @@ interface AccountControllerContextFunc { refetch: () => void; accounts: Resource; defaultAccount: Resource; - setDefaultAccount: (uuid: string) => Promise; + setDefaultAccount: (uuid: string | null) => Promise; removeAccount: (uuid: string, force?: boolean) => Promise; } @@ -19,7 +19,7 @@ const AccountControllerContext = createContext() a export function AccountControllerProvider(props: ParentProps) { const [accounts, { refetch: refetchAccounts }] = useCommand(bridge.commands.getUsers); - const [defaultAccount, { refetch: refetchDefaultAccount }] = useCommand(bridge.commands.getDefaultUser); + const [defaultAccount, { refetch: refetchDefaultAccount }] = useCommand(bridge.commands.getDefaultUser, true); const [deleteModalUuid, setDeleteModalUuid] = createSignal(); @@ -36,8 +36,8 @@ export function AccountControllerProvider(props: ParentProps) { refetchDefaultAccount(); } - async function setDefaultAccount(uuid: string) { - await tryResult(bridge.commands.setDefaultUser, uuid); + async function setDefaultAccount(uuid: string | null) { + await tryResult(bridge.commands.setDefaultUser, uuid).then(refetch); } async function removeAccount(uuid: string, force?: boolean) { diff --git a/packages/core/src/api/minecraft.rs b/packages/core/src/api/minecraft.rs index 1e68542d..45112781 100644 --- a/packages/core/src/api/minecraft.rs +++ b/packages/core/src/api/minecraft.rs @@ -31,12 +31,16 @@ pub async fn get_default_user() -> crate::Result> { /// Set the current default user by [`uuid::Uuid`]. #[tracing::instrument] -pub async fn set_default_user(user: uuid::Uuid) -> crate::Result<()> { - let user = get_user(user).await?; +pub async fn set_default_user(user: Option) -> crate::Result<()> { + let user = match user { + Some(user) => Some(get_user(user).await?.id), + None => None, + }; + let state = State::get().await?; let mut users = state.users.write().await; - users.default_user = Some(user.id); + users.default_user = user; users.save().await?; Ok(()) @@ -50,6 +54,10 @@ pub async fn remove_user(user: uuid::Uuid) -> crate::Result<()> { users.remove(user).await?; + if users.default_user == Some(user) { + set_default_user(Some(user)).await?; + } + Ok(()) }