Manos Chorianopoulos

add ContextualViewController

...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
14 1E108A9628A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1E108A9128A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf */; }; 14 1E108A9628A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1E108A9128A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf */; };
15 1E2966EA2837A21D00F83FAC /* RSBarcodes_Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 1E2966E92837A21D00F83FAC /* RSBarcodes_Swift */; }; 15 1E2966EA2837A21D00F83FAC /* RSBarcodes_Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 1E2966E92837A21D00F83FAC /* RSBarcodes_Swift */; };
16 1E74838D28378AF40042A589 /* CouponBarcodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */; }; 16 1E74838D28378AF40042A589 /* CouponBarcodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */; };
17 + 1E87A9EF28C2021200C79F90 /* ContextualViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E87A9EE28C2021200C79F90 /* ContextualViewController.swift */; };
17 1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */; }; 18 1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */; };
18 1EA2BB792865BFE8003F2AB0 /* InboxTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA2BB782865BFE8003F2AB0 /* InboxTableViewCell.swift */; }; 19 1EA2BB792865BFE8003F2AB0 /* InboxTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA2BB782865BFE8003F2AB0 /* InboxTableViewCell.swift */; };
19 1EB236AB28816B680063777A /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB236AA28816B680063777A /* ShareViewController.swift */; }; 20 1EB236AB28816B680063777A /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB236AA28816B680063777A /* ShareViewController.swift */; };
...@@ -169,6 +170,7 @@ ...@@ -169,6 +170,7 @@
169 1E108A9128A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = pf_square_sans_pro_bold.ttf; sourceTree = "<group>"; }; 170 1E108A9128A3F9280008B8E7 /* pf_square_sans_pro_bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = pf_square_sans_pro_bold.ttf; sourceTree = "<group>"; };
170 1E108A9728A3FA9B0008B8E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 171 1E108A9728A3FA9B0008B8E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
171 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponBarcodeViewController.swift; sourceTree = "<group>"; }; 172 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponBarcodeViewController.swift; sourceTree = "<group>"; };
173 + 1E87A9EE28C2021200C79F90 /* ContextualViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextualViewController.swift; sourceTree = "<group>"; };
172 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsTableViewCell.swift; sourceTree = "<group>"; }; 174 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsTableViewCell.swift; sourceTree = "<group>"; };
173 1EA2BB782865BFE8003F2AB0 /* InboxTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxTableViewCell.swift; sourceTree = "<group>"; }; 175 1EA2BB782865BFE8003F2AB0 /* InboxTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxTableViewCell.swift; sourceTree = "<group>"; };
174 1EB236AA28816B680063777A /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; }; 176 1EB236AA28816B680063777A /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; };
...@@ -449,6 +451,7 @@ ...@@ -449,6 +451,7 @@
449 E6A77A35282BB4CB0045BBA8 /* MakeItAPresentViewController.swift */, 451 E6A77A35282BB4CB0045BBA8 /* MakeItAPresentViewController.swift */,
450 E6A7785A282933E40045BBA8 /* Helpers */, 452 E6A7785A282933E40045BBA8 /* Helpers */,
451 E6A77861282933E50045BBA8 /* Main.storyboard */, 453 E6A77861282933E50045BBA8 /* Main.storyboard */,
454 + 1E87A9EE28C2021200C79F90 /* ContextualViewController.swift */,
452 1EB236AA28816B680063777A /* ShareViewController.swift */, 455 1EB236AA28816B680063777A /* ShareViewController.swift */,
453 1EB236AC28816C560063777A /* NumberPopupViewController.swift */, 456 1EB236AC28816C560063777A /* NumberPopupViewController.swift */,
454 1EB236AE28816CAB0063777A /* NumbersTableViewCell.swift */, 457 1EB236AE28816CAB0063777A /* NumbersTableViewCell.swift */,
...@@ -874,6 +877,7 @@ ...@@ -874,6 +877,7 @@
874 E6A778E2282933E60045BBA8 /* CouponsViewController.swift in Sources */, 877 E6A778E2282933E60045BBA8 /* CouponsViewController.swift in Sources */,
875 E6A77930282933E70045BBA8 /* UIImageView+AFNetworking.m in Sources */, 878 E6A77930282933E70045BBA8 /* UIImageView+AFNetworking.m in Sources */,
876 E6A77900282933E60045BBA8 /* WLInboxItemViewController.m in Sources */, 879 E6A77900282933E60045BBA8 /* WLInboxItemViewController.m in Sources */,
880 + 1E87A9EF28C2021200C79F90 /* ContextualViewController.swift in Sources */,
877 E6A7793E282933E70045BBA8 /* AFHTTPSessionManager.m in Sources */, 881 E6A7793E282933E70045BBA8 /* AFHTTPSessionManager.m in Sources */,
878 E6A77933282933E70045BBA8 /* UIButton+AFNetworking.m in Sources */, 882 E6A77933282933E70045BBA8 /* UIButton+AFNetworking.m in Sources */,
879 E6A77919282933E60045BBA8 /* Warply.m in Sources */, 883 E6A77919282933E60045BBA8 /* Warply.m in Sources */,
......
1 +//
2 +// ContextualViewController.swift
3 +// SwiftWarplyFramework
4 +//
5 +// Created by Manos Chorianopoulos on 2/9/22.
6 +//
7 +
8 +import UIKit
9 +
10 +@objc public class ContextualViewController: UIViewController, UIPopoverControllerDelegate {
11 + @IBOutlet weak var mainView: UIView!
12 + @IBOutlet weak var backgroundImage: UIImageView!
13 + @IBOutlet weak var scrollView: UIScrollView!
14 + @IBOutlet weak var scrollContentView: UIView!
15 + @IBOutlet weak var couponImage: UIImageView!
16 + @IBOutlet weak var couponImageHeight: NSLayoutConstraint!
17 + @IBOutlet weak var nameLabel: UILabel!
18 + @IBOutlet weak var descriptionLabel: UILabel!
19 + @IBOutlet weak var redeemButton: UIButton!
20 +
21 + public var ccms: swiftApi.LoyaltyContextualOfferModel?
22 +
23 + var selectedNumber: String = ""
24 + public var numbersList: Array<String> = []
25 +
26 + let uiscreen: CGRect = UIScreen.main.bounds
27 +
28 +
29 + public override func viewDidLoad() {
30 + super.viewDidLoad()
31 +
32 + self.hidesBottomBarWhenPushed = true
33 +
34 + // Do any additional setup after loading the view.
35 + getProfileRequest()
36 +
37 + setBackButton()
38 +// setNavigationTitle("")
39 +
40 + backgroundImage.image = UIImage(named: "coupons_scrollview_white", in: Bundle(for: MyEmptyClass.self), compatibleWith: nil)
41 +
42 + scrollView.clipsToBounds = true
43 + scrollView.layer.cornerRadius = 30
44 + scrollView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius
45 +
46 + couponImage.load(link: ccms?._imageUrl ?? "", placeholder: UIImage(), cache: URLCache())
47 + couponImage.contentMode = .scaleAspectFill
48 + couponImageHeight.constant = self.uiscreen.height * 0.25
49 +
50 + nameLabel.text = ccms?._title ?? ""
51 + descriptionLabel.text = ccms?._subtitle ?? ""
52 +
53 + redeemButton.titleLabel?.font = UIFont(name: "PFSquareSansPro-Medium", size: 16)
54 + redeemButton.setTitle("Ενεργοποίηση", for: .normal)
55 + redeemButton.setTitleColor(.white, for: .normal)
56 + redeemButton.backgroundColor = UIColor(red: 0.47, green: 0.75, blue: 0.08, alpha: 1.00)
57 + redeemButton.layer.cornerRadius = 12.0
58 +
59 + }
60 +
61 + // MARK: - Functions
62 + func showConfirmDialog() -> Void {
63 +
64 + let alert = UIAlertController(title: "Ενεργοποίηση υπηρεσίας", message: "Θέλετε να γίνει ενεργοποίηση στο Κινητό μου;", preferredStyle: .alert)
65 + alert.addAction(UIAlertAction(title: "Ενεργοποίηση", style: .default, handler: { action in
66 + switch action.style{
67 + case .default:
68 + self.submitOrderRequest()
69 +
70 + case .cancel:
71 + print("cancel")
72 +
73 + case .destructive:
74 + print("destructive")
75 +
76 + }
77 + }))
78 + alert.addAction(UIAlertAction(title: "Άκυρο", style: .default, handler: { action in
79 + switch action.style{
80 + case .default:
81 + print("default")
82 +
83 + case .cancel:
84 + print("cancel")
85 +
86 + case .destructive:
87 + print("destructive")
88 +
89 + }
90 + }))
91 + self.present(alert, animated: true, completion: nil)
92 + }
93 +
94 + func showDialog(_ alertTitle: String, _ alertSubTitle: String) -> Void {
95 +
96 + let alert = UIAlertController(title: alertTitle, message: alertSubTitle, preferredStyle: .alert)
97 + alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
98 + switch action.style{
99 + case .default:
100 + print("default")
101 +
102 + case .cancel:
103 + print("cancel")
104 +
105 + case .destructive:
106 + print("destructive")
107 +
108 + }
109 + }))
110 + self.present(alert, animated: true, completion: nil)
111 + }
112 +
113 +
114 + // MARK: - API CALLS
115 + func getProfileRequest() {
116 + swiftApi().getProfileAsync(getProfileCallback)
117 + }
118 +
119 + func getProfileCallback (_ profileData: swiftApi.ProfileModel?) -> Void {
120 + if (profileData != nil) {
121 + DispatchQueue.main.async {
122 + self.numbersList = profileData?._msisdnList ?? []
123 + }
124 + } else {
125 + }
126 + }
127 +
128 + func submitOrderRequest() {
129 + swiftApi().submitOrderAsync(campaign_session_uuid: "", user_msisdn: self.selectedNumber, businessService: (ccms?._businessService ?? ""), offerName: (ccms?._offerName ?? ""), productType: (ccms?._productType ?? ""), provDuration: (ccms?._provDuration ?? ""), noOfRecurrance: (ccms?._noOfRecurrance ?? ""), price: (ccms?._price ?? ""), discount: (ccms?._discount ?? ""), voiceCategory: (ccms?._voiceCategory ?? ""), dataCategory: (ccms?._dataCategory ?? ""), minsValue: (ccms?._minsValue ?? ""), dataValue: (ccms?._dataValue ?? ""), provStepValueMins: (ccms?._provStepValueMins ?? ""),
130 + OfferAudienceLevel: (ccms?._offerAudienceLevel ?? ""), UACIOfferTrackingCode: (ccms?._uaciOfferTrackingCode ?? ""), OFFERCODE1: (ccms?._offerCode1 ?? ""), SCORE: (ccms?._score ?? ""), ZONE: (ccms?._zone ?? ""), WAVE: (ccms?._wave ?? ""), VALIDITY: (ccms?._validity ?? ""), TREATMENT_CODE: (ccms?._treatmentCode ?? ""),
131 + submitOrderCallback)
132 + }
133 +
134 + func submitOrderCallback (_ response: swiftApi.GenericResponseModel?) -> Void {
135 + if (response != nil) {
136 + DispatchQueue.main.async {
137 + if (response?.getStatus == 1) {
138 + self.showDialog("Το αίτημά σου ολοκληρώθηκε επιτυχώς!","Θα ενημερωθείς άμεσα για την ενεργοποίηση του πακέτου σου.")
139 + // self.postEventRequest()
140 +
141 + } else {
142 + self.showDialog("Αποτυχία","Κάτι πήγε στραβά")
143 + }
144 + }
145 + } else {
146 + self.showDialog("Αποτυχία","Κάτι πήγε στραβά")
147 + }
148 + }
149 +
150 + // MARK: - Actions
151 +
152 + @IBAction func redeemButtomAction(_ sender: Any) {
153 + self.numbersPopupTapped(sender)
154 + }
155 +
156 +}
157 +
158 +// MARK: NumbersPopup
159 +extension ContextualViewController: NumbersPopupDelegate {
160 + @objc func numbersPopupTapped(_ sender: Any) {
161 + let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
162 + let pp = storyboard.instantiateViewController(withIdentifier: "NumberPopupViewController") as! SwiftWarplyFramework.NumberPopupViewController
163 + pp.InitWithController(controller: self,
164 + numbersList: self.numbersList,
165 + sender: sender,
166 + delegate: self)
167 + }
168 +
169 + func presentedPopup() {
170 +// Code for when popup is presented
171 + }
172 +
173 + func dismissedPopup() {
174 +// Code for when popup is dismissed
175 + }
176 +
177 + func optionSelected(_ option: String) {
178 +// Code for when option is selected
179 + self.selectedNumber = option
180 + DispatchQueue.main.async {
181 + self.showConfirmDialog()
182 + }
183 + }
184 +}
...@@ -160,7 +160,10 @@ extension GiftsViewController: UITableViewDelegate, UITableViewDataSource{ ...@@ -160,7 +160,10 @@ extension GiftsViewController: UITableViewDelegate, UITableViewDataSource{
160 160
161 public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 161 public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
162 if (campaigns[indexPath.row]._ccms != nil) { 162 if (campaigns[indexPath.row]._ccms != nil) {
163 - // TODO: open new screen with param campaigns[indexPath.row]._ccms 163 + let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
164 + let vc = storyboard.instantiateViewController(withIdentifier: "ContextualViewController") as! SwiftWarplyFramework.ContextualViewController
165 + vc.ccms = campaigns[indexPath.row]._ccms
166 + self.navigationController?.pushViewController(vc, animated: true)
164 167
165 } else if (campaigns[indexPath.row]._type != nil && campaigns[indexPath.row]._type == "telco") { 168 } else if (campaigns[indexPath.row]._type != nil && campaigns[indexPath.row]._type == "telco") {
166 let ccmsCampaigns = swiftApi().getCCMSLoyaltyCampaigns() 169 let ccmsCampaigns = swiftApi().getCCMSLoyaltyCampaigns()
......
...@@ -110,7 +110,10 @@ extension MFYViewController: UITableViewDelegate, UITableViewDataSource{ ...@@ -110,7 +110,10 @@ extension MFYViewController: UITableViewDelegate, UITableViewDataSource{
110 110
111 public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 111 public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
112 if (campaigns[indexPath.row]._ccms != nil) { 112 if (campaigns[indexPath.row]._ccms != nil) {
113 - // TODO: open new screen with param campaigns[indexPath.row]._ccms 113 + let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
114 + let vc = storyboard.instantiateViewController(withIdentifier: "ContextualViewController") as! SwiftWarplyFramework.ContextualViewController
115 + vc.ccms = campaigns[indexPath.row]._ccms
116 + self.navigationController?.pushViewController(vc, animated: true)
114 117
115 } else if (campaigns[indexPath.row]._type != nil && campaigns[indexPath.row]._type == "telco") { 118 } else if (campaigns[indexPath.row]._type != nil && campaigns[indexPath.row]._type == "telco") {
116 let ccmsCampaigns = swiftApi().getCCMSLoyaltyCampaigns() 119 let ccmsCampaigns = swiftApi().getCCMSLoyaltyCampaigns()
......
...@@ -2515,6 +2515,127 @@ ...@@ -2515,6 +2515,127 @@
2515 </objects> 2515 </objects>
2516 <point key="canvasLocation" x="4654" y="129"/> 2516 <point key="canvasLocation" x="4654" y="129"/>
2517 </scene> 2517 </scene>
2518 + <!--Contextual View Controller-->
2519 + <scene sceneID="PWP-CL-8VJ">
2520 + <objects>
2521 + <viewController storyboardIdentifier="ContextualViewController" id="KhM-xm-T4L" customClass="ContextualViewController" customModule="SwiftWarplyFramework" customModuleProvider="target" sceneMemberID="viewController">
2522 + <view key="view" contentMode="scaleToFill" id="oKn-aG-Yzh">
2523 + <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
2524 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
2525 + <subviews>
2526 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gV8-Ze-9jD">
2527 + <rect key="frame" x="0.0" y="44" width="414" height="852"/>
2528 + <subviews>
2529 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="coupons_scrollview_white" translatesAutoresizingMaskIntoConstraints="NO" id="7rs-yJ-Kvn">
2530 + <rect key="frame" x="0.0" y="0.0" width="414" height="852"/>
2531 + </imageView>
2532 + <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" ambiguous="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fVG-0L-fYi">
2533 + <rect key="frame" x="0.0" y="2" width="414" height="850"/>
2534 + <subviews>
2535 + <view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NHe-cF-AMf">
2536 + <rect key="frame" x="0.0" y="0.0" width="414" height="852"/>
2537 + <subviews>
2538 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="I4T-wN-u9w">
2539 + <rect key="frame" x="0.0" y="0.0" width="414" height="200"/>
2540 + <constraints>
2541 + <constraint firstAttribute="height" constant="200" id="jg1-IY-gKs"/>
2542 + </constraints>
2543 + </imageView>
2544 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Πάρε δωρεάν μηνιαία πακέτα με πάνες στα supermarket Σκλαβενίτης!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8BE-qj-xn5">
2545 + <rect key="frame" x="20" y="230" width="374" height="34"/>
2546 + <fontDescription key="fontDescription" name="PFSquareSansPro-Medium" family="PF Square Sans Pro" pointSize="17"/>
2547 + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
2548 + <nil key="highlightedColor"/>
2549 + </label>
2550 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Χρησιμοποίησε τον παρακάτω κωδικό και πάρε δωρεάν πακέτο πάνες Pampers αποκλειστικά στα Supermarket Σκλαβενίτης" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mbx-MR-VPL">
2551 + <rect key="frame" x="20" y="289" width="374" height="51"/>
2552 + <fontDescription key="fontDescription" name="PFSquareSansPro-Regular" family="PF Square Sans Pro" pointSize="17"/>
2553 + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
2554 + <nil key="highlightedColor"/>
2555 + </label>
2556 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qnn-bi-fLK">
2557 + <rect key="frame" x="83" y="440" width="248" height="50"/>
2558 + <constraints>
2559 + <constraint firstAttribute="height" constant="50" id="aPk-mJ-VfN"/>
2560 + </constraints>
2561 + <fontDescription key="fontDescription" name="PFSquareSansPro-Medium" family="PF Square Sans Pro" pointSize="16"/>
2562 + <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
2563 + <state key="normal" title="Απόκτησέ το">
2564 + <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
2565 + </state>
2566 + <connections>
2567 + <action selector="redeemButtomAction:" destination="KhM-xm-T4L" eventType="touchUpInside" id="EqO-ze-Bau"/>
2568 + </connections>
2569 + </button>
2570 + </subviews>
2571 + <color key="backgroundColor" systemColor="systemBackgroundColor"/>
2572 + <constraints>
2573 + <constraint firstItem="8BE-qj-xn5" firstAttribute="leading" secondItem="NHe-cF-AMf" secondAttribute="leading" constant="20" id="0Go-Zc-Qdz"/>
2574 + <constraint firstAttribute="trailing" secondItem="I4T-wN-u9w" secondAttribute="trailing" id="38i-gl-gom"/>
2575 + <constraint firstItem="I4T-wN-u9w" firstAttribute="leading" secondItem="NHe-cF-AMf" secondAttribute="leading" id="Kwd-Io-bdQ"/>
2576 + <constraint firstItem="mbx-MR-VPL" firstAttribute="top" secondItem="8BE-qj-xn5" secondAttribute="bottom" constant="25" id="MoO-Rt-CES"/>
2577 + <constraint firstItem="qnn-bi-fLK" firstAttribute="top" secondItem="mbx-MR-VPL" secondAttribute="bottom" constant="100" id="T9O-Lp-JKw"/>
2578 + <constraint firstAttribute="trailing" secondItem="mbx-MR-VPL" secondAttribute="trailing" constant="20" id="Tx9-8c-EZY"/>
2579 + <constraint firstItem="mbx-MR-VPL" firstAttribute="leading" secondItem="NHe-cF-AMf" secondAttribute="leading" constant="20" id="aL7-MN-hd4"/>
2580 + <constraint firstItem="qnn-bi-fLK" firstAttribute="centerX" secondItem="NHe-cF-AMf" secondAttribute="centerX" id="hKA-X6-Nnh"/>
2581 + <constraint firstItem="qnn-bi-fLK" firstAttribute="width" secondItem="NHe-cF-AMf" secondAttribute="width" multiplier="0.6" id="lN0-41-F3G"/>
2582 + <constraint firstAttribute="trailing" secondItem="8BE-qj-xn5" secondAttribute="trailing" constant="20" id="n53-MH-KG1"/>
2583 + <constraint firstItem="I4T-wN-u9w" firstAttribute="top" secondItem="NHe-cF-AMf" secondAttribute="top" id="osK-5K-XQJ"/>
2584 + <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="qnn-bi-fLK" secondAttribute="bottom" constant="30" id="uLb-eO-qwF"/>
2585 + <constraint firstItem="8BE-qj-xn5" firstAttribute="top" secondItem="I4T-wN-u9w" secondAttribute="bottom" constant="30" id="wFo-Wh-noH"/>
2586 + </constraints>
2587 + </view>
2588 + </subviews>
2589 + <constraints>
2590 + <constraint firstItem="NHe-cF-AMf" firstAttribute="top" secondItem="SCq-zB-WYb" secondAttribute="top" id="9bq-gO-haD"/>
2591 + <constraint firstItem="NHe-cF-AMf" firstAttribute="width" secondItem="Ian-NJ-q5c" secondAttribute="width" id="AEN-vd-IM6"/>
2592 + <constraint firstItem="NHe-cF-AMf" firstAttribute="leading" secondItem="SCq-zB-WYb" secondAttribute="leading" id="Dx1-nO-YiW"/>
2593 + <constraint firstItem="NHe-cF-AMf" firstAttribute="trailing" secondItem="SCq-zB-WYb" secondAttribute="trailing" id="Rcp-KC-FVf"/>
2594 + <constraint firstItem="NHe-cF-AMf" firstAttribute="bottom" secondItem="SCq-zB-WYb" secondAttribute="bottom" id="l90-nv-T7G"/>
2595 + </constraints>
2596 + <viewLayoutGuide key="contentLayoutGuide" id="SCq-zB-WYb"/>
2597 + <viewLayoutGuide key="frameLayoutGuide" id="Ian-NJ-q5c"/>
2598 + </scrollView>
2599 + </subviews>
2600 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
2601 + <constraints>
2602 + <constraint firstItem="7rs-yJ-Kvn" firstAttribute="leading" secondItem="gV8-Ze-9jD" secondAttribute="leading" id="2f9-NI-DVc"/>
2603 + <constraint firstItem="fVG-0L-fYi" firstAttribute="leading" secondItem="gV8-Ze-9jD" secondAttribute="leading" id="8Wo-dr-SYr"/>
2604 + <constraint firstAttribute="bottom" secondItem="fVG-0L-fYi" secondAttribute="bottom" id="F1h-dY-Qy9"/>
2605 + <constraint firstItem="7rs-yJ-Kvn" firstAttribute="top" secondItem="gV8-Ze-9jD" secondAttribute="top" id="Qqw-BH-PAa"/>
2606 + <constraint firstAttribute="bottom" secondItem="7rs-yJ-Kvn" secondAttribute="bottom" id="Syn-fK-lXo"/>
2607 + <constraint firstAttribute="trailing" secondItem="fVG-0L-fYi" secondAttribute="trailing" id="chL-lE-bqc"/>
2608 + <constraint firstItem="NHe-cF-AMf" firstAttribute="height" relation="greaterThanOrEqual" secondItem="gV8-Ze-9jD" secondAttribute="height" id="l9o-Lk-50b"/>
2609 + <constraint firstItem="fVG-0L-fYi" firstAttribute="top" secondItem="gV8-Ze-9jD" secondAttribute="top" constant="2" id="qnB-Bi-4Qj"/>
2610 + <constraint firstAttribute="trailing" secondItem="7rs-yJ-Kvn" secondAttribute="trailing" id="tpM-bQ-uV4"/>
2611 + </constraints>
2612 + </view>
2613 + </subviews>
2614 + <viewLayoutGuide key="safeArea" id="meX-xg-hMW"/>
2615 + <color key="backgroundColor" systemColor="systemBackgroundColor"/>
2616 + <constraints>
2617 + <constraint firstItem="gV8-Ze-9jD" firstAttribute="leading" secondItem="oKn-aG-Yzh" secondAttribute="leading" id="KUg-ao-Irx"/>
2618 + <constraint firstAttribute="bottom" secondItem="gV8-Ze-9jD" secondAttribute="bottom" id="M8J-yM-s5M"/>
2619 + <constraint firstItem="gV8-Ze-9jD" firstAttribute="top" secondItem="meX-xg-hMW" secondAttribute="top" id="OLd-wY-Edr"/>
2620 + <constraint firstAttribute="trailing" secondItem="gV8-Ze-9jD" secondAttribute="trailing" id="xnp-Tu-oyE"/>
2621 + </constraints>
2622 + </view>
2623 + <connections>
2624 + <outlet property="backgroundImage" destination="7rs-yJ-Kvn" id="UAm-Qy-V21"/>
2625 + <outlet property="couponImage" destination="I4T-wN-u9w" id="ONJ-uz-Emz"/>
2626 + <outlet property="couponImageHeight" destination="jg1-IY-gKs" id="yR6-wT-6A3"/>
2627 + <outlet property="descriptionLabel" destination="mbx-MR-VPL" id="LTL-7G-TUu"/>
2628 + <outlet property="mainView" destination="gV8-Ze-9jD" id="1YA-yr-IUE"/>
2629 + <outlet property="nameLabel" destination="8BE-qj-xn5" id="ysf-YK-z6C"/>
2630 + <outlet property="redeemButton" destination="qnn-bi-fLK" id="GzF-I5-zC3"/>
2631 + <outlet property="scrollContentView" destination="NHe-cF-AMf" id="Jgu-0v-nhF"/>
2632 + <outlet property="scrollView" destination="fVG-0L-fYi" id="Ia7-im-DSP"/>
2633 + </connections>
2634 + </viewController>
2635 + <placeholder placeholderIdentifier="IBFirstResponder" id="LXH-Az-i1V" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
2636 + </objects>
2637 + <point key="canvasLocation" x="5412" y="129"/>
2638 + </scene>
2518 </scenes> 2639 </scenes>
2519 <resources> 2640 <resources>
2520 <image name="active_code_logo" width="69.5" height="69"/> 2641 <image name="active_code_logo" width="69.5" height="69"/>
......