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.
133 lines
4.2 KiB
C#
133 lines
4.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using UnityEngine.Assertions;
|
|
using UnityEngine.UI;
|
|
using WalletConnectUnity.Core.Networking;
|
|
using WalletConnectUnity.Core.Utils;
|
|
using WalletConnectUnity.UI;
|
|
|
|
namespace WalletConnectUnity.Modal.Views
|
|
{
|
|
public class ApprovalView : WCModalView
|
|
{
|
|
[Space, SerializeField]
|
|
private ApprovalViewTabsController _tabsController;
|
|
|
|
[SerializeField]
|
|
private ScrollRect _scrollRect;
|
|
|
|
[Space, SerializeField]
|
|
private ApprovalViewPageBase _qrCodePage;
|
|
|
|
[SerializeField]
|
|
private ApprovalViewPageBase _deepLinkPage;
|
|
|
|
[SerializeField]
|
|
private ApprovalViewPageBase _webAppPage;
|
|
|
|
private CancellationTokenSource _viewCts;
|
|
private Wallet _walletData;
|
|
|
|
protected override void Awake()
|
|
{
|
|
_tabsController.Initialize();
|
|
|
|
#pragma warning disable 618
|
|
WalletConnectModal.Connected += OnConnected;
|
|
#pragma warning restore 618
|
|
|
|
base.Awake();
|
|
}
|
|
|
|
public override async void Show(WCModal modal, IEnumerator effectCoroutine, object options = null)
|
|
{
|
|
var parameters = (Params)options;
|
|
|
|
Assert.IsNotNull(parameters, "QRCodeView options is not Params type or null.");
|
|
|
|
_walletData = parameters.walletData;
|
|
_viewCts = new CancellationTokenSource();
|
|
|
|
if (parameters.walletData == null)
|
|
{
|
|
await _qrCodePage.InitializeAsync(parameters.walletData, modal, parameters.walletIconRemoteSprite, _viewCts.Token);
|
|
}
|
|
else
|
|
{
|
|
await Task.WhenAll(
|
|
_qrCodePage.InitializeAsync(parameters.walletData, modal, parameters.walletIconRemoteSprite, _viewCts.Token),
|
|
_deepLinkPage.InitializeAsync(parameters.walletData, modal, parameters.walletIconRemoteSprite, _viewCts.Token),
|
|
_webAppPage.InitializeAsync(parameters.walletData, modal, parameters.walletIconRemoteSprite, _viewCts.Token)
|
|
);
|
|
}
|
|
|
|
_tabsController.Enable(parameters.walletData);
|
|
|
|
base.Show(modal, effectCoroutine, options);
|
|
|
|
await WaitForUserConnectionAsync(_viewCts.Token);
|
|
}
|
|
|
|
public override void Hide()
|
|
{
|
|
base.Hide();
|
|
|
|
_viewCts?.Cancel();
|
|
|
|
_qrCodePage.Disable();
|
|
_deepLinkPage.Disable();
|
|
_tabsController.Disable();
|
|
}
|
|
|
|
public override string GetTitle()
|
|
{
|
|
return _walletData == null ? base.GetTitle() : _walletData.Name;
|
|
}
|
|
|
|
protected override void ApplyScreenOrientation(ScreenOrientation orientation)
|
|
{
|
|
base.ApplyScreenOrientation(orientation);
|
|
|
|
// Because QR Code page can influence the modal height, we need to recalculate it after orientation change
|
|
_tabsController.ResizeModalToFitPage();
|
|
|
|
_scrollRect.content.anchoredPosition = Vector2.zero;
|
|
_scrollRect.enabled = orientation is ScreenOrientation.LandscapeLeft or ScreenOrientation.LandscapeRight;
|
|
}
|
|
|
|
private async Task WaitForUserConnectionAsync(CancellationToken cancellationToken)
|
|
{
|
|
var connectedData = await WalletConnectModal.ConnectionController.GetConnectionDataAsync(cancellationToken);
|
|
|
|
try
|
|
{
|
|
// Wait for the approval task or cancellation (if the QRCodeView is closed)
|
|
await Task.WhenAny(connectedData.Approval, Task.Delay(Timeout.Infinite, cancellationToken));
|
|
|
|
if (_viewCts.Token.IsCancellationRequested)
|
|
return;
|
|
|
|
if (connectedData.Approval.IsCompletedSuccessfully)
|
|
{
|
|
_ = await connectedData.Approval;
|
|
}
|
|
}
|
|
catch (OperationCanceledException) { }
|
|
}
|
|
|
|
private void OnConnected(object sender, EventArgs e)
|
|
{
|
|
WalletUtils.SetRecentWallet(_walletData);
|
|
}
|
|
|
|
public class Params
|
|
{
|
|
public RemoteSprite<Image> walletIconRemoteSprite;
|
|
public Wallet walletData;
|
|
}
|
|
}
|
|
}
|