Manos Chorianopoulos

add CouponsetViewController

...@@ -51,6 +51,7 @@ let package = Package( ...@@ -51,6 +51,7 @@ let package = Package(
51 .process("cells/ProfileCouponTableViewCell/ProfileCouponTableViewCell.xib"), 51 .process("cells/ProfileCouponTableViewCell/ProfileCouponTableViewCell.xib"),
52 .process("cells/ProfileFilterCollectionViewCell/ProfileFilterCollectionViewCell.xib"), 52 .process("cells/ProfileFilterCollectionViewCell/ProfileFilterCollectionViewCell.xib"),
53 .process("screens/CouponViewController/CouponViewController.xib"), 53 .process("screens/CouponViewController/CouponViewController.xib"),
54 + .process("screens/CouponsetViewController/CouponsetViewController.xib"),
54 .process("screens/ProfileViewController/ProfileViewController.xib"), 55 .process("screens/ProfileViewController/ProfileViewController.xib"),
55 .process("screens/CampaignViewController/CampaignViewController.xib"), 56 .process("screens/CampaignViewController/CampaignViewController.xib"),
56 .process("cells/MyRewardsOfferCollectionViewCell/MyRewardsOfferCollectionViewCell.xib"), 57 .process("cells/MyRewardsOfferCollectionViewCell/MyRewardsOfferCollectionViewCell.xib"),
......
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 +<plist version="1.0">
4 +<dict>
5 + <key>SchemeUserState</key>
6 + <dict>
7 + <key>Pods-SwiftWarplyFramework.xcscheme_^#shared#^_</key>
8 + <dict>
9 + <key>orderHint</key>
10 + <integer>1</integer>
11 + </dict>
12 + </dict>
13 +</dict>
14 +</plist>
...@@ -71,6 +71,8 @@ ...@@ -71,6 +71,8 @@
71 1EDBAF112DE8443B00911E79 /* ProfileHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDBAF0E2DE8443B00911E79 /* ProfileHeaderTableViewCell.swift */; }; 71 1EDBAF112DE8443B00911E79 /* ProfileHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDBAF0E2DE8443B00911E79 /* ProfileHeaderTableViewCell.swift */; };
72 1EDD0ABD2E0D308A005E162B /* XIBLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDD0ABC2E0D308A005E162B /* XIBLoader.swift */; }; 72 1EDD0ABD2E0D308A005E162B /* XIBLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDD0ABC2E0D308A005E162B /* XIBLoader.swift */; };
73 1EDD0AC62E0D68B6005E162B /* SQLite in Frameworks */ = {isa = PBXBuildFile; productRef = 1EDD0AC52E0D68B6005E162B /* SQLite */; }; 73 1EDD0AC62E0D68B6005E162B /* SQLite in Frameworks */ = {isa = PBXBuildFile; productRef = 1EDD0AC52E0D68B6005E162B /* SQLite */; };
74 + 622DA0AE2F51CAEE00308AB8 /* CouponsetViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 622DA0AD2F51CAEE00308AB8 /* CouponsetViewController.xib */; };
75 + 622DA0AF2F51CAEE00308AB8 /* CouponsetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 622DA0AC2F51CAEE00308AB8 /* CouponsetViewController.swift */; };
74 7630AD9A6242D60846D6750C /* Pods_SwiftWarplyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */; }; 76 7630AD9A6242D60846D6750C /* Pods_SwiftWarplyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */; };
75 A07936762885E9CC00064122 /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A07936752885E9CC00064122 /* UIColorExtensions.swift */; }; 77 A07936762885E9CC00064122 /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A07936752885E9CC00064122 /* UIColorExtensions.swift */; };
76 E6A77853282933340045BBA8 /* SwiftWarplyFramework.docc in Sources */ = {isa = PBXBuildFile; fileRef = E6A77852282933340045BBA8 /* SwiftWarplyFramework.docc */; }; 78 E6A77853282933340045BBA8 /* SwiftWarplyFramework.docc in Sources */ = {isa = PBXBuildFile; fileRef = E6A77852282933340045BBA8 /* SwiftWarplyFramework.docc */; };
...@@ -146,6 +148,8 @@ ...@@ -146,6 +148,8 @@
146 1EDBAF0E2DE8443B00911E79 /* ProfileHeaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileHeaderTableViewCell.swift; sourceTree = "<group>"; }; 148 1EDBAF0E2DE8443B00911E79 /* ProfileHeaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileHeaderTableViewCell.swift; sourceTree = "<group>"; };
147 1EDBAF0F2DE8443B00911E79 /* ProfileHeaderTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ProfileHeaderTableViewCell.xib; sourceTree = "<group>"; }; 149 1EDBAF0F2DE8443B00911E79 /* ProfileHeaderTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ProfileHeaderTableViewCell.xib; sourceTree = "<group>"; };
148 1EDD0ABC2E0D308A005E162B /* XIBLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XIBLoader.swift; sourceTree = "<group>"; }; 150 1EDD0ABC2E0D308A005E162B /* XIBLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XIBLoader.swift; sourceTree = "<group>"; };
151 + 622DA0AC2F51CAEE00308AB8 /* CouponsetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsetViewController.swift; sourceTree = "<group>"; };
152 + 622DA0AD2F51CAEE00308AB8 /* CouponsetViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CouponsetViewController.xib; sourceTree = "<group>"; };
149 A07936752885E9CC00064122 /* UIColorExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorExtensions.swift; sourceTree = "<group>"; }; 153 A07936752885E9CC00064122 /* UIColorExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorExtensions.swift; sourceTree = "<group>"; };
150 A9B7BE01A4E812DE49866EF8 /* Pods-SwiftWarplyFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.debug.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.debug.xcconfig"; sourceTree = "<group>"; }; 154 A9B7BE01A4E812DE49866EF8 /* Pods-SwiftWarplyFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.debug.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.debug.xcconfig"; sourceTree = "<group>"; };
151 B9EB8A451EF0C5AD75094EEE /* Pods-SwiftWarplyFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.release.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.release.xcconfig"; sourceTree = "<group>"; }; 155 B9EB8A451EF0C5AD75094EEE /* Pods-SwiftWarplyFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.release.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.release.xcconfig"; sourceTree = "<group>"; };
...@@ -319,6 +323,7 @@ ...@@ -319,6 +323,7 @@
319 1EA8E5B42DDF315600CD3418 /* screens */ = { 323 1EA8E5B42DDF315600CD3418 /* screens */ = {
320 isa = PBXGroup; 324 isa = PBXGroup;
321 children = ( 325 children = (
326 + 622DA0AB2F51CA9100308AB8 /* CouponsetViewController */,
322 1EBE45642E02DDF90055A0D4 /* CampaignViewController */, 327 1EBE45642E02DDF90055A0D4 /* CampaignViewController */,
323 1E917CD32DDF6472002221D8 /* MyRewardsViewController */, 328 1E917CD32DDF6472002221D8 /* MyRewardsViewController */,
324 1E917CD82DDF687E002221D8 /* CouponViewController */, 329 1E917CD82DDF687E002221D8 /* CouponViewController */,
...@@ -425,6 +430,15 @@ ...@@ -425,6 +430,15 @@
425 path = ProfileFilterCollectionViewCell; 430 path = ProfileFilterCollectionViewCell;
426 sourceTree = "<group>"; 431 sourceTree = "<group>";
427 }; 432 };
433 + 622DA0AB2F51CA9100308AB8 /* CouponsetViewController */ = {
434 + isa = PBXGroup;
435 + children = (
436 + 622DA0AC2F51CAEE00308AB8 /* CouponsetViewController.swift */,
437 + 622DA0AD2F51CAEE00308AB8 /* CouponsetViewController.xib */,
438 + );
439 + path = CouponsetViewController;
440 + sourceTree = "<group>";
441 + };
428 98AD36FA62350CEABCD961A7 /* Frameworks */ = { 442 98AD36FA62350CEABCD961A7 /* Frameworks */ = {
429 isa = PBXGroup; 443 isa = PBXGroup;
430 children = ( 444 children = (
...@@ -598,6 +612,7 @@ ...@@ -598,6 +612,7 @@
598 1E116F682DE845B1009AE791 /* ProfileFilterCollectionViewCell.xib in Resources */, 612 1E116F682DE845B1009AE791 /* ProfileFilterCollectionViewCell.xib in Resources */,
599 1EB4F4252DE09AAC00D934C0 /* MyRewardsBannerOffersScrollTableViewCell.xib in Resources */, 613 1EB4F4252DE09AAC00D934C0 /* MyRewardsBannerOffersScrollTableViewCell.xib in Resources */,
600 1EA8E5C02DDF427A00CD3418 /* PingLCG-Bold.otf in Resources */, 614 1EA8E5C02DDF427A00CD3418 /* PingLCG-Bold.otf in Resources */,
615 + 622DA0AE2F51CAEE00308AB8 /* CouponsetViewController.xib in Resources */,
601 1E64E1832DE48E0600543217 /* MyRewardsOfferCollectionViewCell.xib in Resources */, 616 1E64E1832DE48E0600543217 /* MyRewardsOfferCollectionViewCell.xib in Resources */,
602 1EA8E5C12DDF427A00CD3418 /* PingLCG-Light.otf in Resources */, 617 1EA8E5C12DDF427A00CD3418 /* PingLCG-Light.otf in Resources */,
603 1EA8E5C22DDF427A00CD3418 /* PingLCG-Regular.otf in Resources */, 618 1EA8E5C22DDF427A00CD3418 /* PingLCG-Regular.otf in Resources */,
...@@ -660,6 +675,7 @@ ...@@ -660,6 +675,7 @@
660 1E089E062DF87CED007459F1 /* Endpoints.swift in Sources */, 675 1E089E062DF87CED007459F1 /* Endpoints.swift in Sources */,
661 1E089E072DF87CED007459F1 /* NetworkService.swift in Sources */, 676 1E089E072DF87CED007459F1 /* NetworkService.swift in Sources */,
662 1EBE45672E02DE9A0055A0D4 /* CampaignViewController.swift in Sources */, 677 1EBE45672E02DE9A0055A0D4 /* CampaignViewController.swift in Sources */,
678 + 622DA0AF2F51CAEE00308AB8 /* CouponsetViewController.swift in Sources */,
663 1E089DFE2DF87C39007459F1 /* Coupon.swift in Sources */, 679 1E089DFE2DF87C39007459F1 /* Coupon.swift in Sources */,
664 1E089DFF2DF87C39007459F1 /* OfferModel.swift in Sources */, 680 1E089DFF2DF87C39007459F1 /* OfferModel.swift in Sources */,
665 1ED41E4C2DE0C24D00836ABA /* MyRewardsBannerOfferCollectionViewCell.swift in Sources */, 681 1ED41E4C2DE0C24D00836ABA /* MyRewardsBannerOfferCollectionViewCell.swift in Sources */,
......
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 +<plist version="1.0">
4 +<dict>
5 + <key>SchemeUserState</key>
6 + <dict>
7 + <key>SwiftWarplyFramework.xcscheme_^#shared#^_</key>
8 + <dict>
9 + <key>orderHint</key>
10 + <integer>0</integer>
11 + </dict>
12 + </dict>
13 +</dict>
14 +</plist>
1 +//
2 +// CouponsetViewController.swift
3 +// SwiftWarplyFramework
4 +//
5 +// Created by Manos Chorianopoulos on 27/2/26.
6 +//
7 +
8 +import UIKit
9 +
10 +@objc public class CouponsetViewController: UIViewController {
11 + @IBOutlet weak var couponImage: UIImageView!
12 +
13 + // MARK: - Initializers
14 + public convenience init() {
15 + self.init(nibName: "CouponsetViewController", bundle: Bundle.frameworkBundle)
16 + }
17 +
18 + public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
19 + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
20 + }
21 +
22 + required init?(coder: NSCoder) {
23 + super.init(coder: coder)
24 + }
25 +
26 + @IBOutlet weak var infoView: UIView!
27 + @IBOutlet weak var infoImage: UIImageView!
28 + @IBOutlet weak var infoLabel: UILabel!
29 +
30 + @IBOutlet weak var favoriteImage: UIImageView!
31 + @IBOutlet weak var shareImage: UIImageView!
32 +
33 + @IBOutlet weak var titleLabel: UILabel!
34 + @IBOutlet weak var subtitleLabel: UILabel!
35 + @IBOutlet weak var expirationLabel: UILabel!
36 + @IBOutlet weak var detailsLabel: UILabel!
37 +
38 + // MARK: - IBOutlets for Coupon Code Section
39 + @IBOutlet weak var couponCodeContainerView: UIView!
40 + @IBOutlet weak var couponCodeHeaderView: UIView!
41 + @IBOutlet weak var couponCodeContentView: UIView!
42 +
43 + // Header elements
44 + @IBOutlet weak var couponCodeTitleLabel: UILabel!
45 + @IBOutlet weak var couponCodeArrowImage: UIImageView!
46 + @IBOutlet weak var couponCodeButton: UIButton!
47 +
48 + // Content elements (initially hidden)
49 + @IBOutlet weak var couponCodeValueLabel: UILabel!
50 + @IBOutlet weak var copyButtonImage: UIImageView!
51 + @IBOutlet weak var copyButton: UIButton!
52 +
53 + // Constraints for animation
54 + @IBOutlet weak var couponCodeContentHeightConstraint: NSLayoutConstraint!
55 +
56 + // MARK: - IBOutlets for Coupon Code Section
57 + @IBOutlet weak var couponQRContainerView: UIView!
58 + @IBOutlet weak var couponQRHeaderView: UIView!
59 + @IBOutlet weak var couponQRContentView: UIView!
60 +
61 + // Header elements
62 + @IBOutlet weak var couponQRTitleLabel: UILabel!
63 + @IBOutlet weak var couponQRArrowImage: UIImageView!
64 + @IBOutlet weak var couponQRButton: UIButton!
65 +
66 + // Content elements (initially hidden)
67 + @IBOutlet weak var couponQRImage: UIImageView!
68 +
69 + // Constraints for animation
70 + @IBOutlet weak var couponQRContentHeightConstraint: NSLayoutConstraint!
71 +
72 + @IBOutlet weak var termsButtonView: UIView!
73 + @IBOutlet weak var termsButtonTitleLabel: UILabel!
74 + @IBOutlet weak var termsButtonArrowImage: UIImageView!
75 + @IBOutlet weak var termsButton: UIButton!
76 + @IBOutlet weak var termsLabel: UILabel!
77 + @IBOutlet weak var termsLabelHeight: NSLayoutConstraint!
78 +
79 + @IBOutlet weak var mapButton: UIButton!
80 +
81 + @IBOutlet weak var websiteButton: UIButton!
82 +
83 + var couponset: CouponSetItemModel?
84 + private var isDetailsExpanded = false
85 + private var isCouponCodeExpanded = false
86 + private var isCouponQRExpanded = false
87 + private var isTermsExpanded = false
88 +
89 + public override func viewDidLoad() {
90 + super.viewDidLoad()
91 +
92 + // Show navigation bar for this screen (with back button)
93 + self.navigationController?.setNavigationBarHidden(false, animated: false)
94 + setBackButton()
95 + setNavigationTitle("Προσφορά")
96 +
97 + infoView.backgroundColor = UIColor(rgb: 0xFFFFFF)
98 + infoView.layer.cornerRadius = 10.0
99 + infoView.layer.borderWidth = 1.0
100 + infoView.layer.borderColor = UIColor(red: 0.01, green: 0.05, blue: 0.11, alpha: 0.19).cgColor
101 +
102 + infoImage.image = UIImage(named: "info", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
103 + shareImage.image = UIImage(named: "share", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
104 + couponCodeArrowImage.image = UIImage(named: "arrow_down", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
105 + copyButtonImage.image = UIImage(named: "copy", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
106 + couponQRArrowImage.image = UIImage(named: "arrow_down", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
107 + couponQRImage.image = UIImage(named: "barcode", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
108 + termsButtonArrowImage.image = UIImage(named: "arrow_down", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
109 +
110 + infoLabel.font = UIFont(name: "PingLCG-Regular", size: 13)
111 + infoLabel.textColor = UIColor(rgb: 0x020E1C)
112 + infoLabel.text = "Περισσότερα"
113 +
114 + couponCodeContainerView.backgroundColor = UIColor(rgb: 0xFFFFFF)
115 + couponCodeContainerView.layer.cornerRadius = 8.0
116 + couponCodeContainerView.clipsToBounds = true
117 + couponCodeButton.addTarget(self, action: #selector(toggleCouponCode), for: .touchUpInside)
118 + couponCodeContentHeightConstraint.constant = 0
119 + couponCodeContentView.isHidden = true
120 +
121 + couponQRContainerView.backgroundColor = UIColor(rgb: 0xFFFFFF)
122 + couponQRContainerView.layer.cornerRadius = 8.0
123 + couponQRContainerView.clipsToBounds = true
124 + couponQRButton.addTarget(self, action: #selector(toggleCouponQR), for: .touchUpInside)
125 + couponQRContentHeightConstraint.constant = 0
126 + couponQRContentView.isHidden = true
127 +
128 + termsButtonTitleLabel.font = UIFont(name: "PingLCG-Bold", size: 16)
129 + termsButtonTitleLabel.textColor = UIColor(rgb: 0x020E1C)
130 + termsButtonTitleLabel.text = "Όροι Χρήσης"
131 + termsButton.addTarget(self, action: #selector(toggleTerms), for: .touchUpInside)
132 + termsLabelHeight.constant = 0
133 +
134 + mapButton.titleLabel?.font = UIFont(name: "PingLCG-Bold", size: 16)
135 + mapButton.setTitle("Καταστήματα κοντά μου", for: .normal)
136 + mapButton.setTitleColor(UIColor(rgb: 0xFFFFFF), for: .normal)
137 + mapButton.setTitleColor(UIColor(rgb: 0xFFFFFF), for: .highlighted)
138 + mapButton.layer.cornerRadius = 4.0
139 + mapButton.backgroundColor = UIColor(rgb: 0x000F1E)
140 +
141 + websiteButton.titleLabel?.font = UIFont(name: "PingLCG-Bold", size: 16)
142 + websiteButton.setTitle("Δες το website", for: .normal)
143 + websiteButton.setTitleColor(UIColor(rgb: 0x000F1E), for: .normal)
144 + websiteButton.setTitleColor(UIColor(rgb: 0x000F1E), for: .highlighted)
145 + websiteButton.backgroundColor = .clear
146 + websiteButton.layer.borderWidth = 1
147 + websiteButton.layer.borderColor = UIColor(rgb: 0x000F1E).cgColor
148 + websiteButton.layer.cornerRadius = 4.0
149 +
150 + // Configure the view with offer data
151 + if let offer = couponset {
152 + setupUI(with: offer)
153 + }
154 + }
155 +
156 + private func setupUI(with couponset: CouponSetItemModel) {
157 + couponImage.image = UIImage(named: couponset.bannerImage, in: Bundle.frameworkResourceBundle, compatibleWith: nil)
158 + favoriteImage.image = UIImage(named: couponset.isFavorite ? "favorite2_filled" : "favorite2_empty", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
159 +
160 + titleLabel.font = UIFont(name: "PingLCG-Bold", size: 24)
161 + titleLabel.textColor = UIColor(rgb: 0xF2709D)
162 + titleLabel.text = couponset.title
163 +
164 + subtitleLabel.font = UIFont(name: "PingLCG-Regular", size: 18)
165 + subtitleLabel.textColor = UIColor(rgb: 0x020E1C)
166 + subtitleLabel.text = couponset.description
167 +
168 + expirationLabel.font = UIFont(name: "PingLCG-Regular", size: 14)
169 + expirationLabel.textColor = UIColor(rgb: 0x020E1C)
170 +// expirationLabel.text = ("Η προσφορά ισχύει " + couponset.expirationDate)
171 + expirationLabel.text = "Η προσφορά ισχύει έως 30-09-2025"
172 +
173 + setupExpandableDetails()
174 +
175 + couponCodeTitleLabel.font = UIFont(name: "PingLCG-Regular", size: 16)
176 + couponCodeTitleLabel.textColor = UIColor(rgb: 0x000F1E)
177 + couponCodeTitleLabel.text = "Κωδικός Κουπονιού"
178 +
179 + couponCodeValueLabel.font = UIFont(name: "PingLCG-Bold", size: 24)
180 + couponCodeValueLabel.textColor = UIColor(rgb: 0x000F1E)
181 + couponCodeValueLabel.text = "coupons_ab"
182 + copyButton.addTarget(self, action: #selector(copyButtonTapped), for: .touchUpInside)
183 +
184 + couponQRTitleLabel.font = UIFont(name: "PingLCG-Regular", size: 16)
185 + couponQRTitleLabel.textColor = UIColor(rgb: 0x000F1E)
186 + couponQRTitleLabel.text = "QR Κουπονιού"
187 +
188 + termsLabel.font = UIFont(name: "PingLCG-Regular", size: 16)
189 + termsLabel.textColor = UIColor(rgb: 0x020E1C)
190 + termsLabel.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed ex euismod, feugiat justo eu, faucibus urna. Nulla sodales euismod arcu volutpat finibus. Etiam id urna at justo facilisis tempor. Morbi dignissim erat vitae magna sodales dignissim ac in mauris. Mauris tempor convallis tortor, interdum hendrerit turpis eleifend at. Praesent."
191 + }
192 +
193 + private var fullDetailsText = ""
194 + private var shouldTruncaitDetails = false
195 +
196 + private func setupExpandableDetails() {
197 + fullDetailsText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed ex euismod, feugiat justo eu, faucibus urna. Nulla sodales euismod arcu volutpat finibus. Etiam id urna at justo facilisis tempor. Morbi dignissim erat vitae magna sodales dignissim ac in mauris. Mauris tempor convallis tortor, interdum hendrerit turpis eleifend at. Praesent."
198 +
199 + detailsLabel.font = UIFont(name: "PingLCG-Regular", size: 18)
200 + detailsLabel.textColor = UIColor(rgb: 0x020E1C)
201 +
202 + updateDetailsText()
203 +
204 + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toggleDetails))
205 + detailsLabel.isUserInteractionEnabled = true
206 + detailsLabel.addGestureRecognizer(tapGesture)
207 + }
208 +
209 + private func updateDetailsText() {
210 + if isDetailsExpanded {
211 + // Show full text with "Λιγότερα"
212 + if (shouldTruncaitDetails) {
213 + let fullTextWithLess = fullDetailsText + " Λιγότερα"
214 + let attributedString = createAttributedString(text: fullTextWithLess, linkText: "Λιγότερα")
215 + detailsLabel.attributedText = attributedString
216 + } else {
217 + detailsLabel.text = fullDetailsText
218 + }
219 + detailsLabel.numberOfLines = 0
220 + } else {
221 + // Calculate approximate characters for 4 lines and truncate if needed
222 + let truncatedText = getTruncatedTextForFourLines()
223 + let attributedString = createAttributedString(text: truncatedText, linkText: "Περισσότερα")
224 + detailsLabel.attributedText = attributedString
225 + detailsLabel.numberOfLines = 4
226 + }
227 + }
228 +
229 + private func getTruncatedTextForFourLines() -> String {
230 + // Calculate approximate characters that fit in 4 lines
231 + let labelWidth = detailsLabel.frame.width
232 + let fontSize: CGFloat = 18
233 + let averageCharWidth: CGFloat = fontSize * 0.5 // Rough estimate for character width
234 + let charactersPerLine = Int(labelWidth / averageCharWidth)
235 + let maxCharactersFor4Lines = charactersPerLine * 4
236 +
237 + let moreText = " Περισσότερα"
238 + let ellipsis = "..."
239 + let reservedCharacters = ellipsis.count + moreText.count + 15
240 +
241 + // If text is short enough, don't truncate
242 + if fullDetailsText.count <= maxCharactersFor4Lines {
243 + shouldTruncaitDetails = false
244 + return fullDetailsText
245 + } else {
246 + shouldTruncaitDetails = true
247 + }
248 +
249 + // Calculate how many characters we can use from original text
250 + let availableCharacters = maxCharactersFor4Lines - reservedCharacters
251 +
252 + // Truncate text and add ellipsis + more
253 + let truncatedText = String(fullDetailsText.prefix(availableCharacters))
254 + return truncatedText + ellipsis + moreText
255 + }
256 +
257 + private func createAttributedString(text: String, linkText: String) -> NSAttributedString {
258 + let attributedString = NSMutableAttributedString(string: text)
259 +
260 + // Regular text attributes
261 + let regularAttributes: [NSAttributedString.Key: Any] = [
262 + .font: UIFont(name: "PingLCG-Regular", size: 18) ?? UIFont.systemFont(ofSize: 18),
263 + .foregroundColor: UIColor(rgb: 0x020E1C)
264 + ]
265 +
266 + // Link text attributes (blue color)
267 + let linkAttributes: [NSAttributedString.Key: Any] = [
268 + .font: UIFont(name: "PingLCG-Regular", size: 18) ?? UIFont.systemFont(ofSize: 18),
269 + .foregroundColor: UIColor(rgb: 0x00A8E8) // Blue color
270 + ]
271 +
272 + // Apply regular attributes to entire text
273 + attributedString.addAttributes(regularAttributes, range: NSRange(location: 0, length: text.count))
274 +
275 + // Find and style the link text
276 + if let range = text.range(of: linkText) {
277 + let nsRange = NSRange(range, in: text)
278 + attributedString.addAttributes(linkAttributes, range: nsRange)
279 + }
280 +
281 + return attributedString
282 + }
283 +
284 +
285 + @objc private func toggleDetails() {
286 + isDetailsExpanded.toggle()
287 +
288 + UIView.animate(withDuration: 0.3) {
289 + self.updateDetailsText()
290 + self.view.layoutIfNeeded()
291 + }
292 + }
293 +
294 + @objc private func toggleCouponCode() {
295 + isCouponCodeExpanded.toggle()
296 +
297 + // Calculate the target height before animation
298 + let targetHeight: CGFloat = isCouponCodeExpanded ? 80.67 : 0 // Set a fixed height instead of intrinsicContentSize
299 +
300 + // Show content immediately if expanding
301 + if isCouponCodeExpanded {
302 + couponCodeContentView.isHidden = false
303 + couponCodeContentView.alpha = 0
304 + }
305 +
306 + UIView.animate(withDuration: 0.3, animations: {
307 + // // Update arrow image
308 + // self.couponCodeArrowImage.image = UIImage(named: self.isCouponCodeExpanded ? "arrow_up" : "arrow_down", in: MyEmptyClass.resourceBundle(), compatibleWith: nil)
309 +
310 + // Update arrow with rotation
311 + let rotation = self.isCouponCodeExpanded ? CGAffineTransform(rotationAngle: .pi) : .identity
312 + self.couponCodeArrowImage.transform = rotation
313 +
314 + // Update height constraint
315 + self.couponCodeContentHeightConstraint.constant = targetHeight
316 +
317 + // Update alpha for smooth fade
318 + self.couponCodeContentView.alpha = self.isCouponCodeExpanded ? 1.0 : 0.0
319 +
320 + // Force layout update
321 + self.view.layoutIfNeeded()
322 +
323 + }) { _ in
324 + // Hide content after animation completes if collapsing
325 + if !self.isCouponCodeExpanded {
326 + self.couponCodeContentView.isHidden = true
327 + }
328 + }
329 + }
330 +
331 + @objc private func toggleCouponQR() {
332 + isCouponQRExpanded.toggle()
333 +
334 + // Calculate the target height before animation
335 + let targetHeight: CGFloat = isCouponQRExpanded ? 250 : 0 // Set a fixed height for QR code
336 +
337 + // Show content immediately if expanding
338 + if isCouponQRExpanded {
339 + couponQRContentView.isHidden = false
340 + couponQRContentView.alpha = 0
341 + }
342 +
343 + UIView.animate(withDuration: 0.3, animations: {
344 + // Update arrow image
345 + // self.couponQRArrowImage.image = UIImage(named: self.isCouponQRExpanded ? "arrow_up" : "arrow_down", in: MyEmptyClass.resourceBundle(), compatibleWith: nil)
346 +
347 + // Update arrow with rotation
348 + let rotation = self.isCouponQRExpanded ? CGAffineTransform(rotationAngle: .pi) : .identity
349 + self.couponQRArrowImage.transform = rotation
350 +
351 + // Update height constraint
352 + self.couponQRContentHeightConstraint.constant = targetHeight
353 +
354 + // Update alpha for smooth fade
355 + self.couponQRContentView.alpha = self.isCouponQRExpanded ? 1.0 : 0.0
356 +
357 + // Force layout update
358 + self.view.layoutIfNeeded()
359 +
360 + }) { _ in
361 + // Hide content after animation completes if collapsing
362 + if !self.isCouponQRExpanded {
363 + self.couponQRContentView.isHidden = true
364 + }
365 + }
366 + }
367 +
368 + @objc private func toggleTerms() {
369 + isTermsExpanded.toggle()
370 +
371 + UIView.animate(withDuration: 0.3) {
372 + // self.termsButtonArrowImage.image = UIImage(named: self.isTermsExpanded ? "arrow_up" : "arrow_down", in: MyEmptyClass.resourceBundle(), compatibleWith: nil)
373 +
374 + // Update arrow with rotation
375 + let rotation = self.isTermsExpanded ? CGAffineTransform(rotationAngle: .pi) : .identity
376 + self.termsButtonArrowImage.transform = rotation
377 +
378 + self.termsLabelHeight.constant = self.isTermsExpanded ? self.termsLabel.intrinsicContentSize.height : 0
379 + self.view.layoutIfNeeded()
380 + }
381 + }
382 +
383 + @objc private func copyButtonTapped() {
384 + // Get the coupon code text
385 + guard let couponCode = couponCodeValueLabel.text else { return }
386 +
387 + // Copy to clipboard
388 + UIPasteboard.general.string = couponCode
389 +
390 + // Show visual feedback
391 + showCopyFeedback()
392 +
393 + // Optional: Haptic feedback
394 + let impactFeedback = UIImpactFeedbackGenerator(style: .medium)
395 + impactFeedback.impactOccurred()
396 + }
397 +
398 + private func showCopyFeedback() {
399 + // Store original image
400 + // let originalImage = copyButtonImage.image
401 +
402 + // Change to checkmark temporarily
403 + // copyButtonImage.image = UIImage(systemName: "checkmark")
404 + // copyButtonImage.tintColor = UIColor(rgb: 0x09914E) // Green color
405 +
406 + // Show toast message
407 + showToast(message: "Κωδικός αντιγράφηκε!")
408 +
409 + // Reset after 1.5 seconds
410 + // DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
411 + // self.copyButtonImage.image = originalImage
412 + // self.copyButtonImage.tintColor = UIColor(rgb: 0xCBCED1) // Original color
413 + // }
414 + }
415 +
416 + private func showToast(message: String) {
417 + // Create toast label
418 + let toast = UILabel()
419 + toast.backgroundColor = UIColor.black.withAlphaComponent(0.8)
420 + toast.textColor = .white
421 + toast.textAlignment = .center
422 + toast.font = UIFont(name: "PingLCG-Regular", size: 14)
423 + toast.text = message
424 + toast.alpha = 0.0
425 + toast.layer.cornerRadius = 8
426 + toast.clipsToBounds = true
427 +
428 + // Add to view
429 + view.addSubview(toast)
430 + toast.translatesAutoresizingMaskIntoConstraints = false
431 + NSLayoutConstraint.activate([
432 + toast.centerXAnchor.constraint(equalTo: view.centerXAnchor),
433 + toast.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -100),
434 + toast.widthAnchor.constraint(equalToConstant: 200),
435 + toast.heightAnchor.constraint(equalToConstant: 40)
436 + ])
437 +
438 + // Animate in
439 + UIView.animate(withDuration: 0.3, animations: {
440 + toast.alpha = 1.0
441 + }) { _ in
442 + // Animate out after delay
443 + UIView.animate(withDuration: 0.3, delay: 1.5, animations: {
444 + toast.alpha = 0.0
445 + }) { _ in
446 + toast.removeFromSuperview()
447 + }
448 + }
449 + }
450 +
451 +}
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="24506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
3 + <device id="retina6_12" orientation="portrait" appearance="light"/>
4 + <dependencies>
5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24504"/>
6 + <capability name="Safe area layout guides" minToolsVersion="9.0"/>
7 + <capability name="System colors in document resources" minToolsVersion="11.0"/>
8 + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
9 + </dependencies>
10 + <objects>
11 + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CouponsetViewController" customModule="SwiftWarplyFramework" customModuleProvider="target">
12 + <connections>
13 + <outlet property="copyButton" destination="m3i-vZ-CnB" id="RvZ-a5-lOk"/>
14 + <outlet property="copyButtonImage" destination="gvk-s4-PBD" id="NB5-Cs-XIZ"/>
15 + <outlet property="couponCodeArrowImage" destination="cLt-W0-J7b" id="rhG-F2-CEF"/>
16 + <outlet property="couponCodeButton" destination="Or4-Qv-FhV" id="HNQ-W8-EJt"/>
17 + <outlet property="couponCodeContainerView" destination="29d-hw-9hc" id="bFc-aC-TB8"/>
18 + <outlet property="couponCodeContentHeightConstraint" destination="Pdw-1g-EBR" id="c8h-hL-86W"/>
19 + <outlet property="couponCodeContentView" destination="fPF-zq-mmh" id="TzU-Cp-YiP"/>
20 + <outlet property="couponCodeHeaderView" destination="aiu-GV-BNh" id="S0d-Rf-fJk"/>
21 + <outlet property="couponCodeTitleLabel" destination="QFx-zm-Qpn" id="hwX-hU-Odi"/>
22 + <outlet property="couponCodeValueLabel" destination="fLU-pC-Plj" id="aJj-My-W8v"/>
23 + <outlet property="couponImage" destination="50f-Uw-WmD" id="yxn-pQ-nCT"/>
24 + <outlet property="couponQRArrowImage" destination="41k-Lv-Ekd" id="t3K-U3-iKg"/>
25 + <outlet property="couponQRButton" destination="GHf-9X-rhc" id="KTg-qi-csy"/>
26 + <outlet property="couponQRContainerView" destination="YkU-9O-TIA" id="ZYg-PQ-pc5"/>
27 + <outlet property="couponQRContentHeightConstraint" destination="WnV-ph-lxQ" id="mFh-ob-BUc"/>
28 + <outlet property="couponQRContentView" destination="g3y-cV-fMg" id="kGI-iD-j8P"/>
29 + <outlet property="couponQRHeaderView" destination="eUm-Wc-G5O" id="byR-SI-PUH"/>
30 + <outlet property="couponQRImage" destination="Zkh-qS-gYz" id="5aD-AM-Qc7"/>
31 + <outlet property="couponQRTitleLabel" destination="yia-c1-g1x" id="Aft-FH-B0b"/>
32 + <outlet property="detailsLabel" destination="tOt-gP-Et5" id="H2V-Uq-Dsj"/>
33 + <outlet property="expirationLabel" destination="PZ8-Go-A85" id="hXE-lo-i0w"/>
34 + <outlet property="favoriteImage" destination="kQb-LM-Zaa" id="75J-Ez-RZx"/>
35 + <outlet property="infoImage" destination="RK8-R9-SZK" id="ZjM-PX-DgT"/>
36 + <outlet property="infoLabel" destination="oln-Zl-Mu1" id="OZb-dV-dlF"/>
37 + <outlet property="infoView" destination="raJ-sJ-NGX" id="fol-KV-D65"/>
38 + <outlet property="mapButton" destination="bTa-jT-Ufb" id="gH0-yo-in7"/>
39 + <outlet property="shareImage" destination="a1t-wH-dMg" id="Viw-KD-1JB"/>
40 + <outlet property="subtitleLabel" destination="iWC-mi-WKw" id="peM-oa-eSS"/>
41 + <outlet property="termsButton" destination="eGV-3B-aQo" id="Y0X-hP-SDU"/>
42 + <outlet property="termsButtonArrowImage" destination="TeG-69-TfN" id="FSe-bA-hAS"/>
43 + <outlet property="termsButtonTitleLabel" destination="uSf-AS-iFa" id="qJm-Be-jIb"/>
44 + <outlet property="termsButtonView" destination="12M-YC-Cox" id="YyK-Ox-225"/>
45 + <outlet property="termsLabel" destination="jug-xV-lmv" id="QLz-mM-7dR"/>
46 + <outlet property="termsLabelHeight" destination="9VB-9j-Q79" id="G0C-tp-L7M"/>
47 + <outlet property="titleLabel" destination="aSO-pm-a0W" id="uyw-AX-ElA"/>
48 + <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
49 + <outlet property="websiteButton" destination="lU8-hR-MF0" id="cj6-X8-D8Z"/>
50 + </connections>
51 + </placeholder>
52 + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
53 + <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
54 + <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
55 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
56 + <subviews>
57 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SHO-CC-9Fd" userLabel="Main View">
58 + <rect key="frame" x="0.0" y="118" width="393" height="734"/>
59 + <subviews>
60 + <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GDr-bX-h2w">
61 + <rect key="frame" x="0.0" y="0.0" width="393" height="734"/>
62 + <subviews>
63 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mci-HQ-9iu" userLabel="Scroll Content View">
64 + <rect key="frame" x="0.0" y="0.0" width="393" height="1177"/>
65 + <subviews>
66 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="50f-Uw-WmD" userLabel="Coupon Image View">
67 + <rect key="frame" x="0.0" y="0.0" width="393" height="211"/>
68 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
69 + <constraints>
70 + <constraint firstAttribute="height" constant="211" id="9fB-Rk-hOH"/>
71 + </constraints>
72 + </imageView>
73 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="raJ-sJ-NGX" userLabel="Info View">
74 + <rect key="frame" x="239" y="17" width="138" height="20.666666666666671"/>
75 + <subviews>
76 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="RK8-R9-SZK" userLabel="Info Image View">
77 + <rect key="frame" x="10" y="3.6666666666666581" width="13.666666666666664" height="13.333333333333336"/>
78 + <constraints>
79 + <constraint firstAttribute="width" constant="13.5" id="K5D-fX-XS0"/>
80 + <constraint firstAttribute="height" constant="13.5" id="vHI-H6-Ehp"/>
81 + </constraints>
82 + </imageView>
83 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Περισσότερα" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oln-Zl-Mu1" userLabel="Info Label">
84 + <rect key="frame" x="28" y="-0.33333333333334281" width="100" height="21"/>
85 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
86 + <nil key="textColor"/>
87 + <nil key="highlightedColor"/>
88 + </label>
89 + </subviews>
90 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
91 + <constraints>
92 + <constraint firstItem="RK8-R9-SZK" firstAttribute="top" secondItem="raJ-sJ-NGX" secondAttribute="top" constant="3.5" id="1MP-Cj-DCi"/>
93 + <constraint firstAttribute="trailing" secondItem="oln-Zl-Mu1" secondAttribute="trailing" constant="10" id="4SV-XE-IRS"/>
94 + <constraint firstItem="oln-Zl-Mu1" firstAttribute="centerY" secondItem="raJ-sJ-NGX" secondAttribute="centerY" id="e0C-hf-tpb"/>
95 + <constraint firstItem="RK8-R9-SZK" firstAttribute="leading" secondItem="raJ-sJ-NGX" secondAttribute="leading" constant="10" id="nim-JL-sOm"/>
96 + <constraint firstAttribute="bottom" secondItem="RK8-R9-SZK" secondAttribute="bottom" constant="3.5" id="t6e-f0-5Uf"/>
97 + <constraint firstItem="oln-Zl-Mu1" firstAttribute="leading" secondItem="RK8-R9-SZK" secondAttribute="trailing" constant="4.5" id="uSA-Gk-Fws"/>
98 + </constraints>
99 + </view>
100 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aSO-pm-a0W" userLabel="Title Label">
101 + <rect key="frame" x="24" y="234" width="249" height="20.333333333333343"/>
102 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
103 + <nil key="textColor"/>
104 + <nil key="highlightedColor"/>
105 + </label>
106 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="kQb-LM-Zaa" userLabel="Favorite Image View">
107 + <rect key="frame" x="284" y="228" width="40" height="40"/>
108 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
109 + <constraints>
110 + <constraint firstAttribute="width" constant="40" id="1I4-KR-lcE"/>
111 + <constraint firstAttribute="height" constant="40" id="uqG-Va-NOQ"/>
112 + </constraints>
113 + </imageView>
114 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="a1t-wH-dMg" userLabel="Share Image View">
115 + <rect key="frame" x="335" y="228" width="40" height="40"/>
116 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
117 + <constraints>
118 + <constraint firstAttribute="width" constant="40" id="WKb-kR-izm"/>
119 + <constraint firstAttribute="height" constant="40" id="Woz-Er-jU5"/>
120 + </constraints>
121 + </imageView>
122 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iWC-mi-WKw" userLabel="Subtitle Label">
123 + <rect key="frame" x="24" y="254.33333333333334" width="345" height="20.333333333333343"/>
124 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
125 + <nil key="textColor"/>
126 + <nil key="highlightedColor"/>
127 + </label>
128 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PZ8-Go-A85" userLabel="Expiration Label">
129 + <rect key="frame" x="24" y="288.66666666666669" width="345" height="20.333333333333314"/>
130 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
131 + <nil key="textColor"/>
132 + <nil key="highlightedColor"/>
133 + </label>
134 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tOt-gP-Et5" userLabel="Details Label">
135 + <rect key="frame" x="24" y="329" width="345" height="20.333333333333314"/>
136 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
137 + <nil key="textColor"/>
138 + <nil key="highlightedColor"/>
139 + </label>
140 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="29d-hw-9hc" userLabel="CouponCodeContainerView">
141 + <rect key="frame" x="24" y="383.33333333333331" width="345" height="134.33333333333331"/>
142 + <subviews>
143 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aiu-GV-BNh" userLabel="CouponCodeHeaderView">
144 + <rect key="frame" x="0.0" y="0.0" width="345" height="54.333333333333336"/>
145 + <subviews>
146 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QFx-zm-Qpn" userLabel="CouponCodeTitleLabel">
147 + <rect key="frame" x="17" y="17.000000000000057" width="277" height="20.333333333333329"/>
148 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
149 + <nil key="textColor"/>
150 + <nil key="highlightedColor"/>
151 + </label>
152 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="cLt-W0-J7b" userLabel="CouponCodeArrowImage">
153 + <rect key="frame" x="311" y="20.666666666666686" width="13" height="13"/>
154 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
155 + <constraints>
156 + <constraint firstAttribute="height" constant="13" id="5n5-5K-6Gl"/>
157 + <constraint firstAttribute="width" constant="13" id="HOb-s9-jHn"/>
158 + </constraints>
159 + </imageView>
160 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Or4-Qv-FhV" userLabel="CouponCodeButton">
161 + <rect key="frame" x="0.0" y="0.0" width="345" height="54.333333333333336"/>
162 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
163 + <state key="normal" title="Button"/>
164 + <buttonConfiguration key="configuration" style="plain" title="Button">
165 + <color key="baseForegroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
166 + </buttonConfiguration>
167 + </button>
168 + </subviews>
169 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
170 + <constraints>
171 + <constraint firstItem="Or4-Qv-FhV" firstAttribute="leading" secondItem="aiu-GV-BNh" secondAttribute="leading" id="3L1-2d-c9l"/>
172 + <constraint firstItem="cLt-W0-J7b" firstAttribute="leading" secondItem="QFx-zm-Qpn" secondAttribute="trailing" constant="17" id="BY0-sX-Ij6"/>
173 + <constraint firstItem="Or4-Qv-FhV" firstAttribute="top" secondItem="aiu-GV-BNh" secondAttribute="top" id="HbR-kc-b0S"/>
174 + <constraint firstAttribute="trailing" secondItem="Or4-Qv-FhV" secondAttribute="trailing" id="PAh-NE-K8G"/>
175 + <constraint firstAttribute="bottom" secondItem="Or4-Qv-FhV" secondAttribute="bottom" id="Xlv-SC-QlR"/>
176 + <constraint firstItem="QFx-zm-Qpn" firstAttribute="top" secondItem="aiu-GV-BNh" secondAttribute="top" constant="17" id="Yjr-Rs-j8t"/>
177 + <constraint firstAttribute="trailing" secondItem="cLt-W0-J7b" secondAttribute="trailing" constant="21" id="cf5-ur-kx8"/>
178 + <constraint firstItem="cLt-W0-J7b" firstAttribute="centerY" secondItem="aiu-GV-BNh" secondAttribute="centerY" id="oah-FX-t8K"/>
179 + <constraint firstAttribute="bottom" secondItem="QFx-zm-Qpn" secondAttribute="bottom" constant="17" id="pIk-PV-GY0"/>
180 + <constraint firstItem="QFx-zm-Qpn" firstAttribute="leading" secondItem="aiu-GV-BNh" secondAttribute="leading" constant="17" id="uMw-90-i4l"/>
181 + </constraints>
182 + </view>
183 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fPF-zq-mmh" userLabel="CouponCodeContentView">
184 + <rect key="frame" x="0.0" y="54.333333333333314" width="345" height="80"/>
185 + <subviews>
186 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fLU-pC-Plj" userLabel="CouponCodeValueLabel">
187 + <rect key="frame" x="16.999999999999996" y="26" width="56.666666666666657" height="28"/>
188 + <fontDescription key="fontDescription" type="system" pointSize="24"/>
189 + <nil key="textColor"/>
190 + <nil key="highlightedColor"/>
191 + </label>
192 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="gvk-s4-PBD" userLabel="CopyButtonImage">
193 + <rect key="frame" x="84.666666666666671" y="23.666666666666742" width="33" height="33"/>
194 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
195 + <constraints>
196 + <constraint firstAttribute="width" constant="33" id="ALY-g4-dih"/>
197 + <constraint firstAttribute="height" constant="33" id="PaJ-hI-z6k"/>
198 + </constraints>
199 + </imageView>
200 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="m3i-vZ-CnB" userLabel="CouponCopyButton">
201 + <rect key="frame" x="0.0" y="0.0" width="117.66666666666667" height="80"/>
202 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
203 + <state key="normal" title="Button"/>
204 + <buttonConfiguration key="configuration" style="plain" title="Button">
205 + <color key="baseForegroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
206 + </buttonConfiguration>
207 + </button>
208 + </subviews>
209 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
210 + <constraints>
211 + <constraint firstItem="gvk-s4-PBD" firstAttribute="trailing" secondItem="m3i-vZ-CnB" secondAttribute="trailing" id="1O8-g3-Mle"/>
212 + <constraint firstItem="fLU-pC-Plj" firstAttribute="top" secondItem="fPF-zq-mmh" secondAttribute="top" constant="26" id="CsE-B4-Fy6"/>
213 + <constraint firstItem="fLU-pC-Plj" firstAttribute="leading" secondItem="fPF-zq-mmh" secondAttribute="leading" constant="17" id="DcA-Yo-ZfZ"/>
214 + <constraint firstAttribute="bottom" secondItem="fLU-pC-Plj" secondAttribute="bottom" constant="26" id="J3W-Ep-wZk"/>
215 + <constraint firstAttribute="bottom" secondItem="m3i-vZ-CnB" secondAttribute="bottom" id="LUo-NY-g9R"/>
216 + <constraint firstItem="m3i-vZ-CnB" firstAttribute="leading" secondItem="fPF-zq-mmh" secondAttribute="leading" id="Lek-00-bZQ"/>
217 + <constraint firstAttribute="height" constant="80" id="Pdw-1g-EBR"/>
218 + <constraint firstItem="gvk-s4-PBD" firstAttribute="centerY" secondItem="fPF-zq-mmh" secondAttribute="centerY" id="dSc-Jp-D00"/>
219 + <constraint firstItem="m3i-vZ-CnB" firstAttribute="top" secondItem="fPF-zq-mmh" secondAttribute="top" id="grU-Ao-7aq"/>
220 + <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="gvk-s4-PBD" secondAttribute="trailing" constant="17" id="maW-DE-22h"/>
221 + <constraint firstItem="gvk-s4-PBD" firstAttribute="leading" secondItem="fLU-pC-Plj" secondAttribute="trailing" constant="11" id="viJ-A9-Vq4"/>
222 + </constraints>
223 + </view>
224 + </subviews>
225 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
226 + <constraints>
227 + <constraint firstItem="fPF-zq-mmh" firstAttribute="top" secondItem="aiu-GV-BNh" secondAttribute="bottom" id="4vc-xd-rhc"/>
228 + <constraint firstItem="aiu-GV-BNh" firstAttribute="leading" secondItem="29d-hw-9hc" secondAttribute="leading" id="78S-aR-g2z"/>
229 + <constraint firstAttribute="trailing" secondItem="aiu-GV-BNh" secondAttribute="trailing" id="TKA-7b-5s3"/>
230 + <constraint firstAttribute="trailing" secondItem="fPF-zq-mmh" secondAttribute="trailing" id="WvZ-7R-yvJ"/>
231 + <constraint firstItem="fPF-zq-mmh" firstAttribute="leading" secondItem="29d-hw-9hc" secondAttribute="leading" id="dUy-qI-4Gi"/>
232 + <constraint firstItem="aiu-GV-BNh" firstAttribute="top" secondItem="29d-hw-9hc" secondAttribute="top" id="sgM-Gh-9Zh"/>
233 + <constraint firstAttribute="bottom" secondItem="fPF-zq-mmh" secondAttribute="bottom" id="tKQ-k1-OV3"/>
234 + </constraints>
235 + </view>
236 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YkU-9O-TIA" userLabel="CouponQRContainerView">
237 + <rect key="frame" x="24" y="540.66666666666663" width="345" height="305"/>
238 + <subviews>
239 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eUm-Wc-G5O" userLabel="CouponQRHeaderView">
240 + <rect key="frame" x="0.0" y="0.0" width="345" height="55"/>
241 + <subviews>
242 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yia-c1-g1x" userLabel="CouponQRTitleLabel">
243 + <rect key="frame" x="17" y="17" width="277" height="21"/>
244 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
245 + <nil key="textColor"/>
246 + <nil key="highlightedColor"/>
247 + </label>
248 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="41k-Lv-Ekd" userLabel="CouponQRArrowImage">
249 + <rect key="frame" x="311" y="21" width="13" height="13"/>
250 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
251 + <constraints>
252 + <constraint firstAttribute="height" constant="13" id="6id-7o-w1B"/>
253 + <constraint firstAttribute="width" constant="13" id="GbL-3z-lLO"/>
254 + </constraints>
255 + </imageView>
256 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GHf-9X-rhc" userLabel="CouponQRButton">
257 + <rect key="frame" x="0.0" y="0.0" width="345" height="55"/>
258 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
259 + <state key="normal" title="Button"/>
260 + <buttonConfiguration key="configuration" style="plain" title="Button">
261 + <color key="baseForegroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
262 + </buttonConfiguration>
263 + </button>
264 + </subviews>
265 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
266 + <constraints>
267 + <constraint firstItem="yia-c1-g1x" firstAttribute="leading" secondItem="eUm-Wc-G5O" secondAttribute="leading" constant="17" id="0Hm-ir-dIJ"/>
268 + <constraint firstItem="GHf-9X-rhc" firstAttribute="leading" secondItem="eUm-Wc-G5O" secondAttribute="leading" id="43c-Zl-wzz"/>
269 + <constraint firstAttribute="bottom" secondItem="GHf-9X-rhc" secondAttribute="bottom" id="4Cs-jO-J62"/>
270 + <constraint firstItem="41k-Lv-Ekd" firstAttribute="centerY" secondItem="eUm-Wc-G5O" secondAttribute="centerY" id="9z5-4x-NhN"/>
271 + <constraint firstItem="yia-c1-g1x" firstAttribute="top" secondItem="eUm-Wc-G5O" secondAttribute="top" constant="17" id="Goi-Tx-bOj"/>
272 + <constraint firstAttribute="bottom" secondItem="yia-c1-g1x" secondAttribute="bottom" constant="17" id="OT0-Qv-M2p"/>
273 + <constraint firstItem="41k-Lv-Ekd" firstAttribute="leading" secondItem="yia-c1-g1x" secondAttribute="trailing" constant="17" id="cmx-fJ-sSY"/>
274 + <constraint firstItem="GHf-9X-rhc" firstAttribute="top" secondItem="eUm-Wc-G5O" secondAttribute="top" id="ixt-bM-i74"/>
275 + <constraint firstAttribute="trailing" secondItem="GHf-9X-rhc" secondAttribute="trailing" id="kIR-05-5gY"/>
276 + <constraint firstAttribute="trailing" secondItem="41k-Lv-Ekd" secondAttribute="trailing" constant="21" id="nXi-62-ZGj"/>
277 + </constraints>
278 + </view>
279 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="g3y-cV-fMg" userLabel="CouponQRContentView">
280 + <rect key="frame" x="0.0" y="55" width="345" height="250"/>
281 + <subviews>
282 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Zkh-qS-gYz" userLabel="CouponQRImage">
283 + <rect key="frame" x="72.666666666666686" y="20" width="200" height="200"/>
284 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
285 + <constraints>
286 + <constraint firstAttribute="height" constant="200" id="HhN-a9-oG4"/>
287 + <constraint firstAttribute="width" constant="200" id="MAf-tL-aEA"/>
288 + </constraints>
289 + </imageView>
290 + </subviews>
291 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
292 + <constraints>
293 + <constraint firstItem="Zkh-qS-gYz" firstAttribute="centerX" secondItem="g3y-cV-fMg" secondAttribute="centerX" id="PnZ-55-u2G"/>
294 + <constraint firstAttribute="bottom" secondItem="Zkh-qS-gYz" secondAttribute="bottom" constant="30" id="WHc-Fb-R48"/>
295 + <constraint firstAttribute="height" constant="250" id="WnV-ph-lxQ"/>
296 + <constraint firstItem="Zkh-qS-gYz" firstAttribute="top" secondItem="g3y-cV-fMg" secondAttribute="top" constant="20" id="lUq-E0-XWZ"/>
297 + </constraints>
298 + </view>
299 + </subviews>
300 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
301 + <constraints>
302 + <constraint firstItem="g3y-cV-fMg" firstAttribute="leading" secondItem="YkU-9O-TIA" secondAttribute="leading" id="BsA-zX-5pc"/>
303 + <constraint firstItem="eUm-Wc-G5O" firstAttribute="top" secondItem="YkU-9O-TIA" secondAttribute="top" id="EKt-pT-pvf"/>
304 + <constraint firstItem="eUm-Wc-G5O" firstAttribute="leading" secondItem="YkU-9O-TIA" secondAttribute="leading" id="QN2-kp-Jes"/>
305 + <constraint firstAttribute="trailing" secondItem="g3y-cV-fMg" secondAttribute="trailing" id="RaR-Mz-V26"/>
306 + <constraint firstItem="g3y-cV-fMg" firstAttribute="top" secondItem="eUm-Wc-G5O" secondAttribute="bottom" id="a87-KC-HwB"/>
307 + <constraint firstAttribute="trailing" secondItem="eUm-Wc-G5O" secondAttribute="trailing" id="ci5-TU-kpQ"/>
308 + <constraint firstAttribute="bottom" secondItem="g3y-cV-fMg" secondAttribute="bottom" id="xVE-F8-Zzh"/>
309 + </constraints>
310 + </view>
311 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="12M-YC-Cox" userLabel="TermsButtonView">
312 + <rect key="frame" x="23.999999999999993" y="895.66666666666663" width="123.33333333333331" height="35"/>
313 + <subviews>
314 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Όροι Χρήσης" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uSf-AS-iFa" userLabel="TermsButtonTitleLabel">
315 + <rect key="frame" x="0.0" y="5" width="101.33333333333333" height="25"/>
316 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
317 + <nil key="textColor"/>
318 + <nil key="highlightedColor"/>
319 + </label>
320 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="TeG-69-TfN" userLabel="TermsButtonArrowImage">
321 + <rect key="frame" x="109.33333333333334" y="15.000000000000114" width="9" height="5"/>
322 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
323 + <constraints>
324 + <constraint firstAttribute="width" constant="9" id="Mvm-l4-0Qv"/>
325 + <constraint firstAttribute="height" constant="5" id="P8V-hT-LdL"/>
326 + </constraints>
327 + </imageView>
328 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="eGV-3B-aQo" userLabel="TermsButton">
329 + <rect key="frame" x="0.0" y="0.0" width="123.33333333333333" height="35"/>
330 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
331 + <state key="normal" title="Button"/>
332 + <buttonConfiguration key="configuration" style="plain" title="Button">
333 + <color key="baseForegroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
334 + </buttonConfiguration>
335 + </button>
336 + </subviews>
337 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
338 + <constraints>
339 + <constraint firstAttribute="trailing" secondItem="TeG-69-TfN" secondAttribute="trailing" constant="5" id="1nA-8b-mNq"/>
340 + <constraint firstItem="TeG-69-TfN" firstAttribute="leading" secondItem="uSf-AS-iFa" secondAttribute="trailing" constant="8" id="3Br-ig-6Ty"/>
341 + <constraint firstItem="uSf-AS-iFa" firstAttribute="leading" secondItem="12M-YC-Cox" secondAttribute="leading" id="3Yt-dW-LUF"/>
342 + <constraint firstAttribute="trailing" secondItem="eGV-3B-aQo" secondAttribute="trailing" id="7LJ-BO-WHh"/>
343 + <constraint firstItem="TeG-69-TfN" firstAttribute="centerY" secondItem="12M-YC-Cox" secondAttribute="centerY" id="CdC-4X-HfA"/>
344 + <constraint firstItem="eGV-3B-aQo" firstAttribute="top" secondItem="12M-YC-Cox" secondAttribute="top" id="Ibk-ZQ-b1j"/>
345 + <constraint firstItem="uSf-AS-iFa" firstAttribute="top" secondItem="12M-YC-Cox" secondAttribute="top" constant="5" id="MCG-6H-uMT"/>
346 + <constraint firstItem="eGV-3B-aQo" firstAttribute="leading" secondItem="12M-YC-Cox" secondAttribute="leading" id="S8K-hE-afS"/>
347 + <constraint firstAttribute="bottom" secondItem="uSf-AS-iFa" secondAttribute="bottom" constant="5" id="nJH-Wu-ZCd"/>
348 + <constraint firstAttribute="bottom" secondItem="eGV-3B-aQo" secondAttribute="bottom" id="sGt-sy-MSw"/>
349 + </constraints>
350 + </view>
351 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jug-xV-lmv" userLabel="TermsLabel">
352 + <rect key="frame" x="24" y="940.66666666666674" width="345" height="20.333333333333371"/>
353 + <constraints>
354 + <constraint firstAttribute="height" constant="20.329999999999998" id="9VB-9j-Q79"/>
355 + </constraints>
356 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
357 + <nil key="textColor"/>
358 + <nil key="highlightedColor"/>
359 + </label>
360 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bTa-jT-Ufb" userLabel="MapButton">
361 + <rect key="frame" x="24" y="1001" width="345" height="55"/>
362 + <constraints>
363 + <constraint firstAttribute="height" constant="55" id="5AV-zY-O6v"/>
364 + </constraints>
365 + <state key="normal" title="Button"/>
366 + <buttonConfiguration key="configuration" style="plain" title="Button"/>
367 + </button>
368 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lU8-hR-MF0" userLabel="WebsiteButton">
369 + <rect key="frame" x="24" y="1076" width="345" height="55"/>
370 + <constraints>
371 + <constraint firstAttribute="height" constant="55" id="aeV-F1-tWk"/>
372 + </constraints>
373 + <state key="normal" title="Button"/>
374 + <buttonConfiguration key="configuration" style="plain" title="Button"/>
375 + </button>
376 + </subviews>
377 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
378 + <constraints>
379 + <constraint firstAttribute="trailing" secondItem="PZ8-Go-A85" secondAttribute="trailing" constant="24" id="0BS-5a-p2w"/>
380 + <constraint firstAttribute="trailing" secondItem="raJ-sJ-NGX" secondAttribute="trailing" constant="16" id="3pn-zS-erd"/>
381 + <constraint firstAttribute="trailing" secondItem="50f-Uw-WmD" secondAttribute="trailing" id="5vF-D2-mBO"/>
382 + <constraint firstItem="12M-YC-Cox" firstAttribute="top" secondItem="YkU-9O-TIA" secondAttribute="bottom" constant="50" id="6cC-FH-1Xw"/>
383 + <constraint firstItem="50f-Uw-WmD" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" id="7Rd-U6-d9j"/>
384 + <constraint firstItem="lU8-hR-MF0" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="9R6-Lj-xSo"/>
385 + <constraint firstAttribute="trailing" secondItem="29d-hw-9hc" secondAttribute="trailing" constant="24" id="A4S-YK-o00"/>
386 + <constraint firstItem="aSO-pm-a0W" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="BIn-gA-oSw"/>
387 + <constraint firstItem="a1t-wH-dMg" firstAttribute="leading" secondItem="kQb-LM-Zaa" secondAttribute="trailing" constant="11" id="DlZ-NN-vE2"/>
388 + <constraint firstItem="12M-YC-Cox" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="Eal-pm-W9t"/>
389 + <constraint firstItem="PZ8-Go-A85" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="Fgh-6n-hpZ"/>
390 + <constraint firstAttribute="trailing" secondItem="a1t-wH-dMg" secondAttribute="trailing" constant="18" id="H8F-yd-t0Z"/>
391 + <constraint firstAttribute="trailing" secondItem="iWC-mi-WKw" secondAttribute="trailing" constant="24" id="HII-Zz-ySA"/>
392 + <constraint firstItem="iWC-mi-WKw" firstAttribute="top" secondItem="aSO-pm-a0W" secondAttribute="bottom" id="HZs-3D-vZV"/>
393 + <constraint firstItem="kQb-LM-Zaa" firstAttribute="leading" secondItem="aSO-pm-a0W" secondAttribute="trailing" constant="11" id="MAX-rt-Ne3"/>
394 + <constraint firstItem="PZ8-Go-A85" firstAttribute="top" secondItem="iWC-mi-WKw" secondAttribute="bottom" constant="14" id="PYW-1u-Cgl"/>
395 + <constraint firstAttribute="trailing" secondItem="bTa-jT-Ufb" secondAttribute="trailing" constant="24" id="Qcz-Xf-6ks"/>
396 + <constraint firstAttribute="trailing" secondItem="tOt-gP-Et5" secondAttribute="trailing" constant="24" id="TEj-0l-zzv"/>
397 + <constraint firstItem="bTa-jT-Ufb" firstAttribute="top" secondItem="jug-xV-lmv" secondAttribute="bottom" constant="40" id="WGs-Pa-TME"/>
398 + <constraint firstItem="kQb-LM-Zaa" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="17" id="Z5G-42-yfN"/>
399 + <constraint firstItem="50f-Uw-WmD" firstAttribute="top" secondItem="mci-HQ-9iu" secondAttribute="top" id="a5j-3R-Mwh"/>
400 + <constraint firstAttribute="trailing" secondItem="jug-xV-lmv" secondAttribute="trailing" constant="24" id="b0Q-bb-wh3"/>
401 + <constraint firstItem="a1t-wH-dMg" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="17" id="bSw-JI-jDV"/>
402 + <constraint firstItem="29d-hw-9hc" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="cGC-SD-gUM"/>
403 + <constraint firstItem="iWC-mi-WKw" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="dMq-cH-vOX"/>
404 + <constraint firstItem="raJ-sJ-NGX" firstAttribute="top" secondItem="mci-HQ-9iu" secondAttribute="top" constant="17" id="g7b-Ql-ifv"/>
405 + <constraint firstItem="lU8-hR-MF0" firstAttribute="top" secondItem="bTa-jT-Ufb" secondAttribute="bottom" constant="20" id="hGL-sc-uEw"/>
406 + <constraint firstItem="YkU-9O-TIA" firstAttribute="top" secondItem="29d-hw-9hc" secondAttribute="bottom" constant="23" id="igh-S5-wVl"/>
407 + <constraint firstItem="aSO-pm-a0W" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="23" id="jvc-rb-E6b"/>
408 + <constraint firstItem="tOt-gP-Et5" firstAttribute="top" secondItem="PZ8-Go-A85" secondAttribute="bottom" constant="20" id="kQ3-4v-3Jp"/>
409 + <constraint firstItem="jug-xV-lmv" firstAttribute="top" secondItem="12M-YC-Cox" secondAttribute="bottom" constant="9.9999999999998863" id="kSx-qT-pPa"/>
410 + <constraint firstAttribute="bottom" secondItem="lU8-hR-MF0" secondAttribute="bottom" constant="46" id="l1j-ca-Uq9"/>
411 + <constraint firstAttribute="trailing" secondItem="lU8-hR-MF0" secondAttribute="trailing" constant="24" id="lEm-My-Oi9"/>
412 + <constraint firstItem="bTa-jT-Ufb" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="nR2-Py-LTi"/>
413 + <constraint firstItem="jug-xV-lmv" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="oUa-cz-J7N"/>
414 + <constraint firstAttribute="trailing" secondItem="YkU-9O-TIA" secondAttribute="trailing" constant="24" id="qPb-Zk-uAy"/>
415 + <constraint firstItem="YkU-9O-TIA" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="qaA-KW-dD7"/>
416 + <constraint firstItem="29d-hw-9hc" firstAttribute="top" secondItem="tOt-gP-Et5" secondAttribute="bottom" constant="34" id="xG9-Pc-sWu"/>
417 + <constraint firstItem="tOt-gP-Et5" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="xz5-C4-0GD"/>
418 + </constraints>
419 + </view>
420 + </subviews>
421 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
422 + <constraints>
423 + <constraint firstItem="mci-HQ-9iu" firstAttribute="top" secondItem="h4g-s9-7SF" secondAttribute="top" id="03G-xq-Mcz"/>
424 + <constraint firstItem="mci-HQ-9iu" firstAttribute="trailing" secondItem="h4g-s9-7SF" secondAttribute="trailing" id="GPq-Ja-g8u"/>
425 + <constraint firstItem="mci-HQ-9iu" firstAttribute="leading" secondItem="h4g-s9-7SF" secondAttribute="leading" id="MEM-3Q-VXV"/>
426 + <constraint firstItem="mci-HQ-9iu" firstAttribute="bottom" secondItem="h4g-s9-7SF" secondAttribute="bottom" id="qUk-qX-b3J"/>
427 + <constraint firstItem="mci-HQ-9iu" firstAttribute="width" secondItem="VdI-CU-gtr" secondAttribute="width" id="r9B-kb-TPd"/>
428 + </constraints>
429 + <viewLayoutGuide key="contentLayoutGuide" id="h4g-s9-7SF"/>
430 + <viewLayoutGuide key="frameLayoutGuide" id="VdI-CU-gtr"/>
431 + </scrollView>
432 + </subviews>
433 + <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
434 + <constraints>
435 + <constraint firstAttribute="trailing" secondItem="GDr-bX-h2w" secondAttribute="trailing" id="6Rw-Bg-NO4"/>
436 + <constraint firstItem="mci-HQ-9iu" firstAttribute="height" relation="greaterThanOrEqual" secondItem="SHO-CC-9Fd" secondAttribute="height" id="MbQ-SS-x84"/>
437 + <constraint firstItem="GDr-bX-h2w" firstAttribute="leading" secondItem="SHO-CC-9Fd" secondAttribute="leading" id="MlF-Ct-Ncs"/>
438 + <constraint firstAttribute="bottom" secondItem="GDr-bX-h2w" secondAttribute="bottom" id="ffd-WV-jyV"/>
439 + <constraint firstItem="GDr-bX-h2w" firstAttribute="top" secondItem="SHO-CC-9Fd" secondAttribute="top" id="o5D-CB-c8M"/>
440 + </constraints>
441 + </view>
442 + </subviews>
443 + <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
444 + <color key="backgroundColor" systemColor="systemBackgroundColor"/>
445 + <constraints>
446 + <constraint firstItem="SHO-CC-9Fd" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="HgA-qe-JaT"/>
447 + <constraint firstItem="SHO-CC-9Fd" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="c1X-3g-JjK"/>
448 + <constraint firstAttribute="trailing" secondItem="SHO-CC-9Fd" secondAttribute="trailing" id="g67-1Q-pk8"/>
449 + <constraint firstAttribute="bottom" secondItem="SHO-CC-9Fd" secondAttribute="bottom" id="tcy-z9-Apq"/>
450 + </constraints>
451 + <point key="canvasLocation" x="141" y="154"/>
452 + </view>
453 + </objects>
454 + <resources>
455 + <systemColor name="systemBackgroundColor">
456 + <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
457 + </systemColor>
458 + </resources>
459 +</document>
...@@ -566,6 +566,13 @@ import UIKit ...@@ -566,6 +566,13 @@ import UIKit
566 print("CouponViewController navigation commented out - will handle later") 566 print("CouponViewController navigation commented out - will handle later")
567 } 567 }
568 568
569 + private func openCouponsetViewController(with couponSet: CouponSetItemModel) {
570 + let vc = SwiftWarplyFramework.CouponsetViewController(nibName: "CouponsetViewController", bundle: Bundle.frameworkBundle)
571 + vc.couponSet = couponSet
572 +
573 + self.navigationController?.pushViewController(vc, animated: true)
574 + }
575 +
569 private func openProfileViewController() { 576 private func openProfileViewController() {
570 let vc = SwiftWarplyFramework.ProfileViewController(nibName: "ProfileViewController", bundle: Bundle.frameworkBundle) 577 let vc = SwiftWarplyFramework.ProfileViewController(nibName: "ProfileViewController", bundle: Bundle.frameworkBundle)
571 578
...@@ -680,7 +687,6 @@ extension MyRewardsViewController: MyRewardsOffersScrollTableViewCellDelegate { ...@@ -680,7 +687,6 @@ extension MyRewardsViewController: MyRewardsOffersScrollTableViewCellDelegate {
680 } 687 }
681 688
682 func didSelectCouponSet(_ couponSet: CouponSetItemModel) { 689 func didSelectCouponSet(_ couponSet: CouponSetItemModel) {
683 - // New logic for CouponSetItemModel - will handle navigation later 690 + openCouponsetViewController(with: couponSet)
684 - print("CouponSet selected: \(couponSet._name)")
685 } 691 }
686 } 692 }
......