Skip to content
This repository was archived by the owner on Aug 21, 2024. It is now read-only.

Commit 565e041

Browse files
authored
close menu after confirming avatar (#9090)
* close menu after confirming avatar * improve: show loading using `userReady` * fix: useHookstate
1 parent b36fe17 commit 565e041

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

packages/client-core/src/user/components/UserMenu/menus/AvatarSelectMenu.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ All portions of the code written by the Ethereal Engine team are Copyright © 20
2323
Ethereal Engine. All Rights Reserved.
2424
*/
2525

26-
import React, { useRef } from 'react'
26+
import React, { useEffect, useRef } from 'react'
2727
import { useTranslation } from 'react-i18next'
2828

2929
import Avatar from '@etherealengine/client-core/src/common/components/Avatar'
@@ -44,8 +44,10 @@ import IconButton from '@etherealengine/ui/src/primitives/mui/IconButton'
4444
import { EntityUUID } from '@etherealengine/common/src/interfaces/EntityUUID'
4545
import { AvatarState } from '@etherealengine/engine/src/avatar/state/AvatarNetworkState'
4646
import { useFind } from '@etherealengine/engine/src/common/functions/FeathersHooks'
47+
import { EngineState } from '@etherealengine/engine/src/ecs/classes/EngineState'
4748
import { avatarPath } from '@etherealengine/engine/src/schemas/user/avatar.schema'
4849
import { debounce } from 'lodash'
50+
import { LoadingCircle } from '../../../../components/LoadingCircle'
4951
import { UserMenus } from '../../../UserUISystem'
5052
import { AuthState } from '../../../services/AuthService'
5153
import { PopupMenuServices } from '../PopupMenuService'
@@ -58,6 +60,8 @@ const AvatarMenu = () => {
5860
const authState = useHookstate(getMutableState(AuthState))
5961
const userId = authState.user?.id?.value
6062
const userAvatarId = useHookstate(getMutableState(AvatarState)[Engine.instance.userID].avatarID as EntityUUID)
63+
const avatarLoading = useHookstate(false)
64+
const isUserReady = useHookstate(getMutableState(EngineState).userReady)
6165

6266
const page = useHookstate(0)
6367
const selectedAvatarId = useHookstate('')
@@ -83,6 +87,7 @@ const AvatarMenu = () => {
8387
}
8488
}
8589
selectedAvatarId.set('')
90+
avatarLoading.set(true)
8691
}
8792

8893
const handleSearch = async (searchString: string) => {
@@ -94,22 +99,33 @@ const AvatarMenu = () => {
9499
searchTimeoutCancelRef.current = debounce(() => search.query.set(searchString), 1000).cancel
95100
}
96101

102+
useEffect(() => {
103+
if (avatarLoading.value && isUserReady.value) {
104+
avatarLoading.set(false)
105+
PopupMenuServices.showPopupMenu()
106+
}
107+
}, [isUserReady, avatarLoading])
108+
97109
return (
98110
<Menu
99111
open
100112
showBackButton
101113
actions={
102114
<Box display="flex" width="100%">
103-
<Button
104-
disabled={!currentAvatar || currentAvatar.id === userAvatarId.value}
105-
startIcon={<Icon type="Check" />}
106-
size="medium"
107-
type="gradientRounded"
108-
title={t('user:avatar.confirm')}
109-
onClick={handleConfirmAvatar}
110-
>
111-
{t('user:avatar.confirm')}
112-
</Button>
115+
{avatarLoading.value ? (
116+
<LoadingCircle />
117+
) : (
118+
<Button
119+
disabled={!currentAvatar || currentAvatar.id === userAvatarId.value}
120+
startIcon={<Icon type="Check" />}
121+
size="medium"
122+
type="gradientRounded"
123+
title={t('user:avatar.confirm')}
124+
onClick={handleConfirmAvatar}
125+
>
126+
{t('user:avatar.confirm')}
127+
</Button>
128+
)}
113129
</Box>
114130
}
115131
title={t('user:avatar.titleSelectAvatar')}

0 commit comments

Comments
 (0)