-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStorePageViewController.swift
More file actions
109 lines (89 loc) · 4.15 KB
/
StorePageViewController.swift
File metadata and controls
109 lines (89 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//
// StorePageViewController.swift
// Funbox
//
// Created by Антон Кочетков on 25.11.2021.
//
import UIKit
class StorePageViewController: UIPageViewController {
private var deviceProvider: StoreFrontProviderProtocol
init(provider: StoreFrontProviderProtocol) {
deviceProvider = provider
super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
dataSource = self
delegate = self
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
if let contentVC = showViewController(at: 0) {
setViewControllers([contentVC], direction: .forward, animated: true, completion: nil)
}
}
func updateContent() {
guard let currectVC = viewControllers?.first as? StoreFrontContentViewController else { return }
guard let device = deviceProvider.view(with: currectVC.pageNumber) else { return }
if device != currectVC.device {
currectVC.device = device
}
}
private func showViewController(at index: Int) -> StoreFrontContentViewController? {
guard index >= 0 && index <= deviceProvider.count else { return nil }
guard let device = deviceProvider.view(with: index) else { return nil }
guard device.count > 0 else { return nil }
let storeFrontVC = StoreFrontContentViewController()
storeFrontVC.device = device
storeFrontVC.pageNumber = index
storeFrontVC.buy = { [weak self] localDevice in
storeFrontVC.activity?.startAnimating()
storeFrontVC.activity?.isHidden = false
self?.deviceProvider.buy(localDevice) { device in
guard device != nil else { return }
DispatchQueue.main.async {
storeFrontVC.activity?.stopAnimating()
storeFrontVC.activity?.isHidden = true
storeFrontVC.device = device
}
}
self?.buyLastDevice(localDevice, currectVC: storeFrontVC)
}
return storeFrontVC
}
private func buyLastDevice(_ device: Device, currectVC: StoreFrontContentViewController) {
guard device.count <= 1 else { return }
let index = currectVC.pageNumber
let nextPageDevice = index == deviceProvider.count - 1 ? index - 1 : index + 1
if let nextVC = showViewController(at: nextPageDevice) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
if let firstVC = self.viewControllers?.first,
firstVC == currectVC {
print("currectVC:", currectVC, "firstVC:", firstVC)
self.setViewControllers([nextVC], direction: .forward, animated: true, completion: nil)
}
}
}
}
}
extension StorePageViewController: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
var pageNumber = (viewController as! StoreFrontContentViewController).pageNumber
pageNumber -= 1
return showViewController(at: pageNumber)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
var pageNumber = (viewController as! StoreFrontContentViewController).pageNumber
pageNumber += 1
return showViewController(at: pageNumber)
}
}
extension StorePageViewController: UIPageViewControllerDelegate {
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
guard let storeFront = pendingViewControllers.first as? StoreFrontContentViewController else { return }
guard let device = deviceProvider.view(with: storeFront.pageNumber) else { return }
if device != storeFront.device {
storeFront.device = device
}
}
}