You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.2 KiB
C#
140 lines
4.2 KiB
C#
1 month ago
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
using WalletConnectUnity.Core.Networking;
|
||
|
using WalletConnectUnity.Core.Utils;
|
||
|
using WalletConnectUnity.UI;
|
||
|
|
||
|
namespace WalletConnectUnity.Modal.Views
|
||
|
{
|
||
|
public class ApprovalViewTabsController : MonoBehaviour, ITabsController
|
||
|
{
|
||
|
[SerializeField] private WCModal _modal;
|
||
|
[SerializeField] private WCTabsBar _tabsBar;
|
||
|
[SerializeField] private RectTransform _rectTransform;
|
||
|
|
||
|
[SerializeField] private ConnectionTypeToTabPageDictionary _connectionTypeToPageDictionary = new();
|
||
|
|
||
|
private readonly List<WCTabPage> _pagesBuffer = new();
|
||
|
private bool _isPageTransitionInProgress;
|
||
|
private WCTabPage _currentPage;
|
||
|
|
||
|
public event EventHandler<WCTabPage> PageSelected;
|
||
|
|
||
|
public void Initialize()
|
||
|
{
|
||
|
_tabsBar.Initialize(this);
|
||
|
}
|
||
|
|
||
|
public void Enable(Wallet wallet)
|
||
|
{
|
||
|
_pagesBuffer.Clear();
|
||
|
|
||
|
if (wallet == null)
|
||
|
{
|
||
|
if (_connectionTypeToPageDictionary.TryGetValue(ConnectionType.QRCode, out var qrCodePage))
|
||
|
_pagesBuffer.Add(qrCodePage);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
#if UNITY_IOS || UNITY_ANDROID
|
||
|
if (wallet is { MobileLink: not null })
|
||
|
{
|
||
|
if (_connectionTypeToPageDictionary.TryGetValue(ConnectionType.DeepLink, out var deepLinkPage))
|
||
|
_pagesBuffer.Add(deepLinkPage);
|
||
|
}
|
||
|
#else
|
||
|
if (_connectionTypeToPageDictionary.TryGetValue(ConnectionType.QRCode, out var qrCodePage))
|
||
|
_pagesBuffer.Add(qrCodePage);
|
||
|
|
||
|
if (wallet.DesktopLink != null)
|
||
|
if (_connectionTypeToPageDictionary.TryGetValue(ConnectionType.DeepLink, out var deepLinkPage))
|
||
|
_pagesBuffer.Add(deepLinkPage);
|
||
|
#endif
|
||
|
if (wallet is { WebappLink: not null })
|
||
|
if (_connectionTypeToPageDictionary.TryGetValue(ConnectionType.Webapp, out var webappPage))
|
||
|
_pagesBuffer.Add(webappPage);
|
||
|
}
|
||
|
|
||
|
if (_pagesBuffer.Count == 0)
|
||
|
{
|
||
|
throw new Exception($"Wallet {wallet?.Name ?? string.Empty} has no available connection types.");
|
||
|
}
|
||
|
|
||
|
if (_pagesBuffer.Count > 1)
|
||
|
{
|
||
|
_tabsBar.Enable(_pagesBuffer);
|
||
|
}
|
||
|
|
||
|
SelectPage(_pagesBuffer.First());
|
||
|
}
|
||
|
|
||
|
public void Disable()
|
||
|
{
|
||
|
_tabsBar.Disable();
|
||
|
}
|
||
|
|
||
|
public void SelectPage(WCTabPage page)
|
||
|
{
|
||
|
if (_isPageTransitionInProgress) return;
|
||
|
|
||
|
_isPageTransitionInProgress = true;
|
||
|
|
||
|
var pages = _connectionTypeToPageDictionary.Values;
|
||
|
|
||
|
// Disable all pages
|
||
|
foreach (var p in pages)
|
||
|
p.PageTransform.gameObject.SetActive(false);
|
||
|
|
||
|
_currentPage = page;
|
||
|
|
||
|
// Update tabs bar
|
||
|
PageSelected?.Invoke(this, page);
|
||
|
|
||
|
// Resize modal and enable page
|
||
|
ResizeModalToFitPage(page);
|
||
|
}
|
||
|
|
||
|
public void ResizeModalToFitPage()
|
||
|
{
|
||
|
if (_currentPage == null) return;
|
||
|
ResizeModalToFitPage(_currentPage);
|
||
|
}
|
||
|
|
||
|
public void ResizeModalToFitPage(WCTabPage page)
|
||
|
{
|
||
|
StartCoroutine(ResizeModalAndEnablePageRoutine(page));
|
||
|
}
|
||
|
|
||
|
private IEnumerator ResizeModalAndEnablePageRoutine(WCTabPage page)
|
||
|
{
|
||
|
var newHeight = page.GetPageHeight();
|
||
|
|
||
|
if (_tabsBar.RootTransform.gameObject.activeSelf)
|
||
|
newHeight += _tabsBar.RootTransform.sizeDelta.y;
|
||
|
|
||
|
LayoutRebuilder.ForceRebuildLayoutImmediate(_rectTransform);
|
||
|
|
||
|
yield return _modal.ResizeModalRoutine(newHeight);
|
||
|
|
||
|
page.PageTransform.gameObject.SetActive(true);
|
||
|
|
||
|
_isPageTransitionInProgress = false;
|
||
|
}
|
||
|
|
||
|
private enum ConnectionType
|
||
|
{
|
||
|
QRCode = 1,
|
||
|
DeepLink,
|
||
|
Webapp
|
||
|
}
|
||
|
|
||
|
[Serializable]
|
||
|
private class ConnectionTypeToTabPageDictionary : SerializableDictionary<ConnectionType, WCTabPage>
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
}
|