mirror of
https://github.com/RevenueCat/purchases-ios
synced 2026-11-11 22:55:55 +05:45
141 lines
5.5 KiB
Swift
141 lines
5.5 KiB
Swift
//
|
|
// Copyright RevenueCat Inc. All Rights Reserved.
|
|
//
|
|
// Licensed under the MIT License (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://opensource.org/licenses/MIT
|
|
//
|
|
// FeedbackSurveyViewModel.swift
|
|
//
|
|
//
|
|
// Created by Cesar de la Vega on 17/6/24.
|
|
//
|
|
|
|
import Foundation
|
|
import RevenueCat
|
|
|
|
#if os(iOS)
|
|
|
|
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
|
|
@available(macOS, unavailable)
|
|
@available(tvOS, unavailable)
|
|
@available(watchOS, unavailable)
|
|
@MainActor
|
|
class FeedbackSurveyViewModel: ObservableObject {
|
|
|
|
var feedbackSurveyData: FeedbackSurveyData
|
|
|
|
@Published
|
|
var loadingOption: String?
|
|
|
|
@Published
|
|
var promotionalOfferData: PromotionalOfferData?
|
|
|
|
private var purchasesProvider: CustomerCenterPurchasesType
|
|
private let loadPromotionalOfferUseCase: LoadPromotionalOfferUseCaseType
|
|
private let customerCenterActionHandler: CustomerCenterActionHandler?
|
|
|
|
convenience init(feedbackSurveyData: FeedbackSurveyData,
|
|
customerCenterActionHandler: CustomerCenterActionHandler?) {
|
|
self.init(feedbackSurveyData: feedbackSurveyData,
|
|
purchasesProvider: CustomerCenterPurchases(),
|
|
loadPromotionalOfferUseCase: LoadPromotionalOfferUseCase(),
|
|
customerCenterActionHandler: customerCenterActionHandler)
|
|
}
|
|
|
|
init(feedbackSurveyData: FeedbackSurveyData,
|
|
purchasesProvider: CustomerCenterPurchasesType,
|
|
loadPromotionalOfferUseCase: LoadPromotionalOfferUseCaseType,
|
|
customerCenterActionHandler: CustomerCenterActionHandler?) {
|
|
self.feedbackSurveyData = feedbackSurveyData
|
|
self.purchasesProvider = purchasesProvider
|
|
self.loadPromotionalOfferUseCase = loadPromotionalOfferUseCase
|
|
self.customerCenterActionHandler = customerCenterActionHandler
|
|
}
|
|
|
|
func handleAction(
|
|
for option: CustomerCenterConfigData.HelpPath.FeedbackSurvey.Option,
|
|
darkMode: Bool,
|
|
displayMode: CustomerCenterPresentationMode,
|
|
locale: Locale = .current,
|
|
dismissView: () -> Void
|
|
) async {
|
|
trackSurveyAnswerSubmitted(option: option, darkMode: darkMode, displayMode: displayMode, locale: locale)
|
|
|
|
self.customerCenterActionHandler?(.feedbackSurveyCompleted(option.id))
|
|
|
|
if let promotionalOffer = option.promotionalOffer,
|
|
promotionalOffer.eligible {
|
|
self.loadingOption = option.id
|
|
let result = await loadPromotionalOfferUseCase.execute(promoOfferDetails: promotionalOffer)
|
|
switch result {
|
|
case .success(let promotionalOfferData):
|
|
self.promotionalOfferData = promotionalOfferData
|
|
case .failure:
|
|
self.feedbackSurveyData.onOptionSelected()
|
|
self.loadingOption = nil
|
|
}
|
|
} else {
|
|
self.feedbackSurveyData.onOptionSelected()
|
|
dismissView()
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Promotional Offer Sheet Dismissal Handling
|
|
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
|
|
@available(macOS, unavailable)
|
|
@available(tvOS, unavailable)
|
|
@available(watchOS, unavailable)
|
|
extension FeedbackSurveyViewModel {
|
|
|
|
/// Function responsible for handling the user's action on the PromotionalOfferView
|
|
func handleDismissPromotionalOfferView(
|
|
_ userAction: PromotionalOfferViewAction,
|
|
dismissView: () -> Void
|
|
) async {
|
|
// Clear the promotional offer data to dismiss the sheet
|
|
self.promotionalOfferData = nil
|
|
self.loadingOption = nil
|
|
|
|
if !userAction.shouldTerminateCurrentPathFlow {
|
|
self.feedbackSurveyData.onOptionSelected()
|
|
}
|
|
|
|
dismissView()
|
|
}
|
|
}
|
|
|
|
// MARK: - Events
|
|
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
|
|
@available(macOS, unavailable)
|
|
@available(tvOS, unavailable)
|
|
@available(watchOS, unavailable)
|
|
private extension FeedbackSurveyViewModel {
|
|
|
|
func trackSurveyAnswerSubmitted(option: CustomerCenterConfigData.HelpPath.FeedbackSurvey.Option,
|
|
darkMode: Bool,
|
|
displayMode: CustomerCenterPresentationMode,
|
|
locale: Locale) {
|
|
let isSandbox = purchasesProvider.isSandbox
|
|
let surveyOptionData = CustomerCenterAnswerSubmittedEvent.Data(locale: locale,
|
|
darkMode: darkMode,
|
|
isSandbox: isSandbox,
|
|
displayMode: displayMode,
|
|
path: feedbackSurveyData.path.type,
|
|
url: feedbackSurveyData.path.url,
|
|
surveyOptionID: option.id,
|
|
surveyOptionTitleKey: option.title,
|
|
additionalContext: nil,
|
|
revisionID: 0)
|
|
let event = CustomerCenterAnswerSubmittedEvent.answerSubmitted(CustomerCenterEventCreationData(),
|
|
surveyOptionData)
|
|
purchasesProvider.track(customerCenterEvent: event)
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|