Untitled
unknown
csharp
a year ago
7.8 kB
19
Indexable
using System;
using System.Threading;
using Common.Controllers.Extensions;
using Features.InApps.Public.Data.Triggers;
using Features.InApps.Public.Services;
using Common.Loader.Controllers;
using Common.Loader.Payloads;
using Common.LocalizationConstants;
using Common.Payments.Controllers;
using Common.Payments.Data;
using Common.Payments.Data.Purchase;
using Common.Payments.Facades;
using Common.Repository.Infrastructure;
using Common.SaveNotifier.Infrastructure;
using Common.StateMachine.State;
using Common.UI;
using Cysharp.Threading.Tasks;
using Features.InApps.Public.Providers;
using Features.Piggy.Internal.Data.PiggyPopup;
using Features.Piggy.Public.Data;
using Features.WinStreak.Public.Notifiers;
using Playtika.Unity.ControllerTree;
using Playtika.Unity.ControllerTree.StateMachine;
using SGH.Controllers.ViewHolder.Infrastructure;
using Tools.LocalizationTools;
using UnityEngine;
using Zenject;
using ZLogger;
namespace Features.Piggy.Internal.States.PiggyPopup.InternalStates
{
internal class PiggyPopupPurchaseState : State
{
private const float DebugDelayInEditor = 1.5f;
private readonly IRepository<PiggyProgressData> _piggyProgressRepository;
private readonly IFactory<PiggyPopupRewardState> _piggyPopupRewardStateFactory;
private readonly IFactory<ElasticLoaderController> _loaderControllerFactory;
private readonly IFactory<PaymentsResultPopupsController> _paymentResultPopupControllerFactory;
private readonly IPaymentsFacade _paymentsFacade;
private readonly IRequestSaveNotifier _requestSaveNotifier;
private readonly PiggyPopupStateData _piggyPopupStateData;
private readonly OverlayCanvas _overlayCanvas;
private readonly IInAppsRefreshService _inAppsRefreshService;
private readonly IInAppsService _inAppsService;
private readonly IInAppsConditionalTriggerProvider _conditionalTriggerProvider;
private readonly IActiveInAppsService _activeInAppsService;
private readonly IWinStreakRewardNotifier _winStreakRewardNotifier;
private ElasticLoaderController _loaderController;
private CancellationTokenSource _inAppsCancellationTokenSource;
public PiggyPopupPurchaseState(
IRepository<PiggyProgressData> piggyProgressRepository,
IFactory<PiggyPopupRewardState> piggyPopupRewardStateFactory,
IFactory<ElasticLoaderController> loaderControllerFactory,
IFactory<PaymentsResultPopupsController> paymentResultPopupControllerFactory,
IPaymentsFacade paymentFacade,
IRequestSaveNotifier requestSaveNotifier,
IObjectHolderAcrossControllersChildren<PiggyPopupStateData> piggyPopupStateDataHolder,
OverlayCanvas overlayCanvas,
IInAppsRefreshService inAppsRefreshService,
IInAppsService inAppsService,
IInAppsConditionalTriggerProvider conditionalTriggerProvider,
IActiveInAppsService activeInAppsService,
IWinStreakRewardNotifier winStreakRewardNotifier
)
{
_piggyProgressRepository = piggyProgressRepository;
_piggyPopupRewardStateFactory = piggyPopupRewardStateFactory;
_loaderControllerFactory = loaderControllerFactory;
_paymentResultPopupControllerFactory = paymentResultPopupControllerFactory;
_paymentsFacade = paymentFacade;
_requestSaveNotifier = requestSaveNotifier;
_piggyPopupStateData = piggyPopupStateDataHolder.CurrentValue;
_overlayCanvas = overlayCanvas;
_inAppsRefreshService = inAppsRefreshService;
_inAppsService = inAppsService;
_conditionalTriggerProvider = conditionalTriggerProvider;
_activeInAppsService = activeInAppsService;
_winStreakRewardNotifier = winStreakRewardNotifier;
}
protected override UniTask OnInitialize(CancellationToken token)
{
_inAppsCancellationTokenSource = new CancellationTokenSource();
Resources.Attach(_inAppsCancellationTokenSource);
return UniTask.CompletedTask;
}
protected override async UniTask<IStackedControllerInfo> RunningForResult(CancellationToken token)
{
RemoveFinishedInApps();
RequestAvailableInApps();
await PurchasePiggy(token);
return await base.RunningForResult(token);
}
private async UniTask PurchasePiggy(CancellationToken token)
{
await ShowLoader(token);
var purchaseSourceData = GetPurchaseSourceData();
var result = await _paymentsFacade.PurchaseShopProduct(_piggyPopupStateData.ProductData.Product, purchaseSourceData, token);
if (Application.isEditor)
{
await UniTask.Delay(TimeSpan.FromSeconds(DebugDelayInEditor), cancellationToken: token);
}
HideLoader();
await ProcessPurchasingResult(result, token);
}
private async UniTask ShowLoader(CancellationToken token)
{
var parent = _overlayCanvas.transform;
var text = await Localization.CommonTerms.Loader_Purchasing.GetTranslation(token);
var loaderPayload = ElasticLoaderPayload.Loading(parent, text);
_loaderController = await Children.Run(_loaderControllerFactory, loaderPayload, token: token);
}
private void HideLoader()
{
_loaderController.TryStop().Forget();
}
private PurchaseSourceData GetPurchaseSourceData()
{
var appearanceId = _piggyProgressRepository.Get().AppearanceId;
return new PurchaseSourceData(PurchaseSourceType.PIGGY_POPUP, appearanceId);
}
private async UniTask ProcessPurchasingResult(PurchasingResultDescription resultDescription, CancellationToken token)
{
if (resultDescription.Result == PurchasingResult.Rewarded)
{
RemovePeggyExitInApps();
await ConsumeShopProduct(resultDescription, token);
ProcessWinStreakRewards();
_requestSaveNotifier.RequestSaveAndPushSyncService();
GoToPiggyEmptyingState();
}
else
{
RemoveAfterPurchaseInApps();
await Children.RunToDispose(
_paymentResultPopupControllerFactory,
new PaymentsResultPopupsData(_overlayCanvas.transform, resultDescription),
cancellationToken: token);
GoToPreviousState();
}
Logger.ZLogInformation("Piggy: Purchasing product: {0}. Purchase result: {1}", _piggyPopupStateData.ProductData.Product.PaymentPageOptionId, resultDescription.Result);
}
private void RemoveAfterPurchaseInApps()
{
_inAppsCancellationTokenSource.Cancel();
var conditionalTrigger = _conditionalTriggerProvider.GetConditionalTrigger(InAppsTriggerData.AfterPurchaseTrigger);
_inAppsService.RemoveInApps(conditionalTrigger);
}
private void RemovePeggyExitInApps()
{
var conditionalTrigger = _conditionalTriggerProvider.GetConditionalTrigger(InAppsTriggerData.ExitPeggyAreaTrigger);
_inAppsService.RemoveInApps(conditionalTrigger);
}
private void GoToPiggyEmptyingState()
{
CompletionSource.TrySetResult(GoTo(_piggyPopupRewardStateFactory.FromExtenject()).WithoutPayload());
}
private void RequestAvailableInApps()
{
_inAppsRefreshService.RefreshInApps(InAppsTriggerData.AfterPurchaseTrigger, _inAppsCancellationTokenSource.Token);
}
private void RemoveFinishedInApps()
{
RemovePiggyConditionalInApp(InAppsConditionalTriggerData.ConditionalPiggyIsFullLoginTrigger);
RemovePiggyConditionalInApp(InAppsConditionalTriggerData.ConditionalPiggyIsFullBackToMapTrigger);
void RemovePiggyConditionalInApp(InAppsConditionalTriggerData inAppTriggerData)
{
var inAppTrigger = _conditionalTriggerProvider.GetConditionalTrigger(inAppTriggerData);
_activeInAppsService.RemoveInApps(inAppTrigger);
}
}
private UniTask ConsumeShopProduct(PurchasingResultDescription resultDescription, CancellationToken token)
{
return _paymentsFacade.ConsumeShopProduct(resultDescription.ShopProduct, false, false, token);
}
private void ProcessWinStreakRewards()
{
var winStreakDuration = _piggyPopupStateData?.ProductData?.Product?.WinStreak ?? 0;
if (winStreakDuration > 0)
{
_winStreakRewardNotifier.NotifyWinStreakReceived();
}
}
}
}Editor is loading...
Leave a Comment