< Summary

Class:DCL.EmotesWheel.EmotesWheelController
Assembly:EmotesWheelHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/EmotesWheelHUD/EmotesWheelController.cs
Covered lines:129
Uncovered lines:105
Coverable lines:234
Total lines:418
Line coverage:55.1% (129 of 234)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EmotesWheelController(...)0%110100%
SetVisibility(...)0%2100%
OnEmoteVisibleChanged(...)0%110100%
IsStartMenuOpenChanged(...)0%6200%
OnEquippedEmotesSet(...)0%110100%
UpdateEmoteSlots()0%18.2210056.52%
OnAnimationAdded(...)0%2100%
RefreshSlotLoadingState(...)0%12300%
SetVisibility_Internal(...)0%8.817066.67%
Dispose()0%220100%
OnEmoteClicked(...)0%2100%
PlayEmote(...)0%2.062075%
ConfigureShortcuts()0%110100%
OnNumericShortcutInputActionTriggered(...)0%52567200%
OnViewClosed()0%2100%
OnAvatarEmoteSet(...)0%110100%
OnCloseWindowPressed(...)0%110100%
OnOpenEmotesCustomizationInputActionTriggered(...)0%6200%
OpenEmotesCustomizationSection()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/EmotesWheelHUD/EmotesWheelController.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using UnityEngine;
 4
 5namespace DCL.EmotesWheel
 6{
 7    public class EmotesWheelController : IHUD
 8    {
 9        internal EmotesWheelView view;
 1310        private BaseVariable<bool> emotesVisible => DataStore.i.HUDs.emotesVisible;
 511        private BaseVariable<bool> emoteJustTriggeredFromShortcut => DataStore.i.HUDs.emoteJustTriggeredFromShortcut;
 012        private BaseVariable<bool> isAvatarEditorVisible => DataStore.i.HUDs.avatarEditorVisible;
 813        private BaseVariable<bool> isStartMenuOpen => DataStore.i.exploreV2.isOpen;
 514        private BaseVariable<bool> canStartMenuBeOpened => DataStore.i.exploreV2.isSomeModalOpen;
 015        private bool shortcutsCanBeUsed => !isStartMenuOpen.Get();
 1516        private DataStore_EmotesCustomization emotesCustomizationDataStore => DataStore.i.emotesCustomization;
 617        private BaseDictionary<(string bodyshapeId, string emoteId), AnimationClip> emoteAnimations => DataStore.i.emote
 18
 619        private UserProfile ownUserProfile => UserProfile.GetOwnUserProfile();
 20        private InputAction_Trigger closeWindow;
 21        private InputAction_Hold openEmotesCustomizationInputAction;
 22        private InputAction_Trigger shortcut0InputAction;
 23        private InputAction_Trigger shortcut1InputAction;
 24        private InputAction_Trigger shortcut2InputAction;
 25        private InputAction_Trigger shortcut3InputAction;
 26        private InputAction_Trigger shortcut4InputAction;
 27        private InputAction_Trigger shortcut5InputAction;
 28        private InputAction_Trigger shortcut6InputAction;
 29        private InputAction_Trigger shortcut7InputAction;
 30        private InputAction_Trigger shortcut8InputAction;
 31        private InputAction_Trigger shortcut9InputAction;
 32        private InputAction_Trigger auxShortcut0InputAction;
 33        private InputAction_Trigger auxShortcut1InputAction;
 34        private InputAction_Trigger auxShortcut2InputAction;
 35        private InputAction_Trigger auxShortcut3InputAction;
 36        private InputAction_Trigger auxShortcut4InputAction;
 37        private InputAction_Trigger auxShortcut5InputAction;
 38        private InputAction_Trigger auxShortcut6InputAction;
 39        private InputAction_Trigger auxShortcut7InputAction;
 40        private InputAction_Trigger auxShortcut8InputAction;
 41        private InputAction_Trigger auxShortcut9InputAction;
 42        private UserProfile userProfile;
 43        private BaseDictionary<string, WearableItem> catalog;
 44        private readonly IEmotesCatalogService emoteCatalog;
 45        private bool ownedWearablesAlreadyRequested = false;
 346        private BaseDictionary<string, EmoteWheelSlot> slotsInLoadingState = new BaseDictionary<string, EmoteWheelSlot>(
 47
 348        public EmotesWheelController(UserProfile userProfile, BaseDictionary<string, WearableItem> catalog, IEmotesCatal
 49        {
 350            closeWindow = Resources.Load<InputAction_Trigger>("CloseWindow");
 351            closeWindow.OnTriggered += OnCloseWindowPressed;
 52
 353            view = EmotesWheelView.Create();
 354            view.OnClose += OnViewClosed;
 355            view.onEmoteClicked += OnEmoteClicked;
 356            view.OnCustomizeClicked += OpenEmotesCustomizationSection;
 57
 358            ownUserProfile.OnAvatarEmoteSet += OnAvatarEmoteSet;
 359            emotesVisible.OnChange += OnEmoteVisibleChanged;
 360            OnEmoteVisibleChanged(emotesVisible.Get(), false);
 61
 362            isStartMenuOpen.OnChange += IsStartMenuOpenChanged;
 63
 364            this.userProfile = userProfile;
 365            this.catalog = catalog;
 366            this.emoteCatalog = emoteCatalog;
 367            emotesCustomizationDataStore.equippedEmotes.OnSet += OnEquippedEmotesSet;
 368            OnEquippedEmotesSet(emotesCustomizationDataStore.equippedEmotes.Get());
 369            emoteAnimations.OnAdded += OnAnimationAdded;
 70
 371            ConfigureShortcuts();
 72
 373            emotesCustomizationDataStore.isWheelInitialized.Set(true);
 374        }
 75
 76        public void SetVisibility(bool visible)
 77        {
 78            //TODO once kernel sends visible properly
 79            //expressionsVisible.Set(visible);
 080        }
 81
 1082        private void OnEmoteVisibleChanged(bool current, bool previous) { SetVisibility_Internal(current); }
 83
 84        private void IsStartMenuOpenChanged(bool current, bool previous)
 85        {
 086            if (!current)
 087                return;
 88
 089            emotesVisible.Set(false);
 090        }
 91
 692        private void OnEquippedEmotesSet(IEnumerable<EquippedEmoteData> equippedEmotes) { UpdateEmoteSlots(); }
 93
 94        private void UpdateEmoteSlots()
 95        {
 396            List<EmotesWheelView.EmoteSlotData> emotesToSet = new List<EmotesWheelView.EmoteSlotData>();
 6697            foreach (EquippedEmoteData equippedEmoteData in emotesCustomizationDataStore.equippedEmotes.Get())
 98            {
 3099                if (equippedEmoteData != null)
 100                {
 101                    WearableItem emoteItem;
 0102                    if (DataStore.i.emotes.newFlowEnabled.Get())
 0103                        emoteCatalog.TryGetLoadedEmote(equippedEmoteData.id, out emoteItem);
 104                    else
 0105                        catalog.TryGetValue(equippedEmoteData.id, out emoteItem);
 106
 0107                    if (emoteItem != null)
 108                    {
 0109                        emotesToSet.Add(new EmotesWheelView.EmoteSlotData
 110                        {
 111                            emoteItem = emoteItem,
 112                            thumbnailSprite = emoteItem.thumbnailSprite != null ? emoteItem.thumbnailSprite : equippedEm
 113                        });
 114                    }
 115                    else
 116                    {
 0117                        emotesToSet.Add(null);
 118                    }
 119                }
 120                else
 121                {
 30122                    emotesToSet.Add(null);
 123                }
 124            }
 125
 3126            List<EmoteWheelSlot> updatedWheelSlots = view.SetEmotes(emotesToSet);
 66127            foreach (EmoteWheelSlot slot in updatedWheelSlots)
 128            {
 30129                slot.SetAsLoading(false);
 30130                if (string.IsNullOrEmpty(slot.emoteId))
 131                    continue;
 132
 0133                slotsInLoadingState.Remove(slot.emoteId);
 134
 135
 0136                slot.SetAsLoading(true);
 0137                slotsInLoadingState.Add(slot.emoteId, slot);
 138
 0139                RefreshSlotLoadingState(slot.emoteId);
 140            }
 3141        }
 142
 0143        private void OnAnimationAdded((string bodyshapeId, string emoteId) values, AnimationClip animationClip) { Refres
 144
 145        private void RefreshSlotLoadingState(string emoteId)
 146        {
 0147            if (emoteAnimations.ContainsKey((userProfile.avatar.bodyShape, emoteId)))
 148            {
 0149                slotsInLoadingState.TryGetValue(emoteId, out EmoteWheelSlot slot);
 0150                if (slot != null)
 151                {
 0152                    slot.SetAsLoading(false);
 0153                    slotsInLoadingState.Remove(emoteId);
 154                }
 155            }
 0156        }
 157
 158        public void SetVisibility_Internal(bool visible)
 159        {
 5160            if (isStartMenuOpen.Get())
 0161                return;
 162
 5163            if (emoteJustTriggeredFromShortcut.Get())
 164            {
 0165                emotesVisible.Set(false);
 0166                return;
 167            }
 168
 5169            view.SetVisiblity(visible);
 170
 5171            if (visible)
 172            {
 1173                DCL.Helpers.Utils.UnlockCursor();
 174
 1175                if (userProfile != null &&
 176                    !string.IsNullOrEmpty(userProfile.userId) &&
 177                    !ownedWearablesAlreadyRequested)
 178                {
 0179                    CatalogController.RequestOwnedWearables(userProfile.userId)
 180                        .Then((ownedWearables) =>
 181                        {
 0182                            ownedWearablesAlreadyRequested = true;
 0183                            userProfile.SetInventory(ownedWearables.Select(x => x.id).ToArray());
 0184                            UpdateEmoteSlots();
 0185                        });
 186                }
 187            }
 188
 5189            canStartMenuBeOpened.Set(visible);
 5190        }
 191
 192        public void Dispose()
 193        {
 3194            view.OnClose -= OnViewClosed;
 3195            view.onEmoteClicked -= OnEmoteClicked;
 3196            view.OnCustomizeClicked -= OpenEmotesCustomizationSection;
 3197            closeWindow.OnTriggered -= OnCloseWindowPressed;
 3198            ownUserProfile.OnAvatarEmoteSet -= OnAvatarEmoteSet;
 3199            emotesVisible.OnChange -= OnEmoteVisibleChanged;
 3200            emotesCustomizationDataStore.equippedEmotes.OnSet -= OnEquippedEmotesSet;
 3201            emoteAnimations.OnAdded -= OnAnimationAdded;
 3202            shortcut0InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3203            shortcut1InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3204            shortcut2InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3205            shortcut3InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3206            shortcut4InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3207            shortcut5InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3208            shortcut6InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3209            shortcut7InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3210            shortcut8InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3211            shortcut9InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3212            auxShortcut0InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3213            auxShortcut1InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3214            auxShortcut2InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3215            auxShortcut3InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3216            auxShortcut4InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3217            auxShortcut5InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3218            auxShortcut6InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3219            auxShortcut7InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3220            auxShortcut8InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 3221            auxShortcut9InputAction.OnTriggered -= OnNumericShortcutInputActionTriggered;
 222
 3223            if (view != null)
 224            {
 3225                view.CleanUp();
 3226                UnityEngine.Object.Destroy(view.gameObject);
 227            }
 3228        }
 229
 0230        public void OnEmoteClicked(string id) { PlayEmote(id, UserProfile.EmoteSource.EmotesWheel); }
 231
 232        public void PlayEmote(string id, UserProfile.EmoteSource source)
 233        {
 1234            if (string.IsNullOrEmpty(id))
 0235                return;
 236
 1237            UserProfile.GetOwnUserProfile().SetAvatarExpression(id, source);
 1238        }
 239
 240        private void ConfigureShortcuts()
 241        {
 3242            closeWindow = Resources.Load<InputAction_Trigger>("CloseWindow");
 3243            closeWindow.OnTriggered += OnCloseWindowPressed;
 244
 3245            openEmotesCustomizationInputAction = Resources.Load<InputAction_Hold>("DefaultConfirmAction");
 3246            openEmotesCustomizationInputAction.OnFinished += OnOpenEmotesCustomizationInputActionTriggered;
 247
 3248            shortcut0InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut0");
 3249            shortcut0InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 250
 3251            shortcut1InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut1");
 3252            shortcut1InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 253
 3254            shortcut2InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut2");
 3255            shortcut2InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 256
 3257            shortcut3InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut3");
 3258            shortcut3InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 259
 3260            shortcut4InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut4");
 3261            shortcut4InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 262
 3263            shortcut5InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut5");
 3264            shortcut5InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 265
 3266            shortcut6InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut6");
 3267            shortcut6InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 268
 3269            shortcut7InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut7");
 3270            shortcut7InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 271
 3272            shortcut8InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut8");
 3273            shortcut8InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 274
 3275            shortcut9InputAction = Resources.Load<InputAction_Trigger>("ToggleEmoteShortcut9");
 3276            shortcut9InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 277
 3278            auxShortcut0InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut0");
 3279            auxShortcut0InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 280
 3281            auxShortcut1InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut1");
 3282            auxShortcut1InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 283
 3284            auxShortcut2InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut2");
 3285            auxShortcut2InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 286
 3287            auxShortcut3InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut3");
 3288            auxShortcut3InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 289
 3290            auxShortcut4InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut4");
 3291            auxShortcut4InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 292
 3293            auxShortcut5InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut5");
 3294            auxShortcut5InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 295
 3296            auxShortcut6InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut6");
 3297            auxShortcut6InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 298
 3299            auxShortcut7InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut7");
 3300            auxShortcut7InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 301
 3302            auxShortcut8InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut8");
 3303            auxShortcut8InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 304
 3305            auxShortcut9InputAction = Resources.Load<InputAction_Trigger>("ToggleShortcut9");
 3306            auxShortcut9InputAction.OnTriggered += OnNumericShortcutInputActionTriggered;
 3307        }
 308
 309        private void OnNumericShortcutInputActionTriggered(DCLAction_Trigger action)
 310        {
 0311            if (!shortcutsCanBeUsed)
 0312                return;
 313
 314            switch (action)
 315            {
 316                case DCLAction_Trigger.ToggleEmoteShortcut0:
 0317                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[0]?.id, UserProfile.EmoteSource.Shortcut);
 0318                    emoteJustTriggeredFromShortcut.Set(true);
 0319                    break;
 320                case DCLAction_Trigger.ToggleEmoteShortcut1:
 0321                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[1]?.id, UserProfile.EmoteSource.Shortcut);
 0322                    emoteJustTriggeredFromShortcut.Set(true);
 0323                    break;
 324                case DCLAction_Trigger.ToggleEmoteShortcut2:
 0325                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[2]?.id, UserProfile.EmoteSource.Shortcut);
 0326                    emoteJustTriggeredFromShortcut.Set(true);
 0327                    break;
 328                case DCLAction_Trigger.ToggleEmoteShortcut3:
 0329                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[3]?.id, UserProfile.EmoteSource.Shortcut);
 0330                    emoteJustTriggeredFromShortcut.Set(true);
 0331                    break;
 332                case DCLAction_Trigger.ToggleEmoteShortcut4:
 0333                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[4]?.id, UserProfile.EmoteSource.Shortcut);
 0334                    emoteJustTriggeredFromShortcut.Set(true);
 0335                    break;
 336                case DCLAction_Trigger.ToggleEmoteShortcut5:
 0337                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[5]?.id, UserProfile.EmoteSource.Shortcut);
 0338                    emoteJustTriggeredFromShortcut.Set(true);
 0339                    break;
 340                case DCLAction_Trigger.ToggleEmoteShortcut6:
 0341                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[6]?.id, UserProfile.EmoteSource.Shortcut);
 0342                    emoteJustTriggeredFromShortcut.Set(true);
 0343                    break;
 344                case DCLAction_Trigger.ToggleEmoteShortcut7:
 0345                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[7]?.id, UserProfile.EmoteSource.Shortcut);
 0346                    emoteJustTriggeredFromShortcut.Set(true);
 0347                    break;
 348                case DCLAction_Trigger.ToggleEmoteShortcut8:
 0349                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[8]?.id, UserProfile.EmoteSource.Shortcut);
 0350                    emoteJustTriggeredFromShortcut.Set(true);
 0351                    break;
 352                case DCLAction_Trigger.ToggleEmoteShortcut9:
 0353                    PlayEmote(emotesCustomizationDataStore.equippedEmotes[9]?.id, UserProfile.EmoteSource.Shortcut);
 0354                    emoteJustTriggeredFromShortcut.Set(true);
 0355                    break;
 356                case DCLAction_Trigger.ToggleShortcut0:
 0357                    if (emotesVisible.Get())
 0358                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[0]?.id, UserProfile.EmoteSource.Shortcut);
 0359                    break;
 360                case DCLAction_Trigger.ToggleShortcut1:
 0361                    if (emotesVisible.Get())
 0362                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[1]?.id, UserProfile.EmoteSource.Shortcut);
 0363                    break;
 364                case DCLAction_Trigger.ToggleShortcut2:
 0365                    if (emotesVisible.Get())
 0366                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[2]?.id, UserProfile.EmoteSource.Shortcut);
 0367                    break;
 368                case DCLAction_Trigger.ToggleShortcut3:
 0369                    if (emotesVisible.Get())
 0370                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[3]?.id, UserProfile.EmoteSource.Shortcut);
 0371                    break;
 372                case DCLAction_Trigger.ToggleShortcut4:
 0373                    if (emotesVisible.Get())
 0374                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[4]?.id, UserProfile.EmoteSource.Shortcut);
 0375                    break;
 376                case DCLAction_Trigger.ToggleShortcut5:
 0377                    if (emotesVisible.Get())
 0378                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[5]?.id, UserProfile.EmoteSource.Shortcut);
 0379                    break;
 380                case DCLAction_Trigger.ToggleShortcut6:
 0381                    if (emotesVisible.Get())
 0382                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[6]?.id, UserProfile.EmoteSource.Shortcut);
 0383                    break;
 384                case DCLAction_Trigger.ToggleShortcut7:
 0385                    if (emotesVisible.Get())
 0386                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[7]?.id, UserProfile.EmoteSource.Shortcut);
 0387                    break;
 388                case DCLAction_Trigger.ToggleShortcut8:
 0389                    if (emotesVisible.Get())
 0390                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[8]?.id, UserProfile.EmoteSource.Shortcut);
 0391                    break;
 392                case DCLAction_Trigger.ToggleShortcut9:
 0393                    if (emotesVisible.Get())
 0394                        PlayEmote(emotesCustomizationDataStore.equippedEmotes[9]?.id, UserProfile.EmoteSource.Shortcut);
 395                    break;
 396            }
 0397        }
 398
 0399        private void OnViewClosed() { emotesVisible.Set(false); }
 2400        private void OnAvatarEmoteSet(string id, long timestamp, UserProfile.EmoteSource source) { emotesVisible.Set(fal
 6401        private void OnCloseWindowPressed(DCLAction_Trigger action) { emotesVisible.Set(false); }
 402
 403        private void OnOpenEmotesCustomizationInputActionTriggered(DCLAction_Hold action)
 404        {
 0405            if (!emotesVisible.Get())
 0406                return;
 407
 0408            OpenEmotesCustomizationSection();
 0409        }
 410
 411        private void OpenEmotesCustomizationSection()
 412        {
 0413            emotesVisible.Set(false);
 0414            isAvatarEditorVisible.Set(true);
 0415            emotesCustomizationDataStore.isEmotesCustomizationSelected.Set(true);
 0416        }
 417    }
 418}