/
sberpay
/
AgeGate-iOS
Обзор
Документация
Войти
/
sberpay
/
AgeGate-iOS
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
develop
AgeGateExample/Presentation/CartVC/CartPresenter.swift
89 строк
3 KB
SergeyGladkiy
[0.2.0] БДСЧ сценарий
30 июл 2026, 21:57
30 июл 2026, 21:57
cbcdfcb
Код
Авторство
О чём код?
// // CartPresenter.swift // AgeGateExample // // Created by Гладкий Сергей Игоревич on 24.07.2026. // import UIKit import AgeGateSDKDEBUG protocol CartPresenterProtocol { func startAgeGate(from viewController: UIViewController) func changeCount(_ count: Int, at index: Int) func item(at index: Int) -> CartItem var itemsCount: Int { get } var total: Int { get } var hasRestrictedItems: Bool { get } } final class CartPresenter: CartPresenterProtocol { weak var view: CartVCProtocol? private let values: ConfigValues private var items: [CartItem] = [] init(values: ConfigValues) { self.values = values reloadItems() } var itemsCount: Int { items.count } var total: Int { items.reduce(0) { $0 + $1.price * $1.count } } var hasRestrictedItems: Bool { items.contains { $0.isRestricted && $0.count > 0 } } func item(at index: Int) -> CartItem { items[index] } func changeCount(_ count: Int, at index: Int) { items[index].count = count view?.updateTotal() } // MARK: - Запуск SDK func startAgeGate(from viewController: UIViewController) { let request = AGTRequest(scenario: .checkout, orderId: values.orderId, restrictedItemIds: restrictedIds, amountMinorUnits: total * 100) AgeGate.start(from: values.displayMode == .view ? viewController : nil, request: request) { [weak self] result in self?.handle(result) } } private var restrictedIds: [String] { items.filter { $0.isRestricted && $0.count > 0 }.map(\.id) } private func handle(_ result: AGTResult) { switch result { case .paid(let orderId): view?.showResult(title: "Оплачено", message: "Заказ \(orderId)") case .ageConfirmed(let orderId): view?.showResult(title: "Возраст подтверждён", message: "Заказ \(orderId)") case .continuedWithoutRestrictedItems(let removed): /// Убрать позиции из корзины — задача партнёра, SDK этого не делает. items.removeAll { removed.contains($0.id) } view?.reload() view?.showResult(title: "Продолжили без части товаров", message: "Убрано: \(removed.joined(separator: ", "))") case .cancelled: view?.showResult(title: "Отменено", message: nil) case .failed(let error): view?.showResult(title: "Ошибка", message: "\(error)") } } private func reloadItems() { items = CartItem.demo(restrictedCount: values.restrictedCount) } }