Untitled
unknown
csharp
8 months ago
1.8 kB
4
Indexable
Never
using System; using System.Collections.Concurrent; using System.Threading; using CodeBase.UI.Popups.Base; using CodeBase.UI.Services.Infrastructure; using Cysharp.Threading.Tasks; using UnityEngine; namespace CodeBase.UI.Popups.Service { public sealed class PopupService : IPopupService, IDisposable { private readonly IFrameSupplierAsync<PopupName, UnityFrame> supplierAsync; private readonly ConcurrentDictionary<PopupName, UnityFrame> activePopups = new ConcurrentDictionary<PopupName, UnityFrame>(); private readonly CancellationTokenSource ctn = new CancellationTokenSource(); public PopupService(IFrameSupplierAsync<PopupName, UnityFrame> supplier) { supplierAsync = supplier; } public async UniTask ShowPopup<TInitializeData>(PopupName name, TInitializeData initializeData) { if(IsPopupActive(name)) return; UnityFrame frame = await supplierAsync.LoadFrame(name); activePopups.TryAdd(name, frame); if (frame is PopupBase<TInitializeData> popupView) { await popupView.Show(initializeData).AttachExternalCancellation(ctn.Token); popupView.Hide(); activePopups.TryRemove(name, out _); } else { throw new InvalidCastException("Received object is not a PopupBase instance"); } } public bool IsPopupActive(PopupName key) => activePopups.ContainsKey(key); public void Dispose() { ctn.Cancel(); Debug.Log("PopupService -> Dispose"); } } }
Leave a Comment