Manos Chorianopoulos

add CouponsViewController

Showing 17 changed files with 377 additions and 33 deletions
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
7 <key>Pods-SwiftWarplyFramework.xcscheme_^#shared#^_</key> 7 <key>Pods-SwiftWarplyFramework.xcscheme_^#shared#^_</key>
8 <dict> 8 <dict>
9 <key>orderHint</key> 9 <key>orderHint</key>
10 - <integer>0</integer> 10 + <integer>1</integer>
11 </dict> 11 </dict>
12 </dict> 12 </dict>
13 </dict> 13 </dict>
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
7 objects = { 7 objects = {
8 8
9 /* Begin PBXBuildFile section */ 9 /* Begin PBXBuildFile section */
10 + 1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */; };
10 7630AD9A6242D60846D6750C /* Pods_SwiftWarplyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */; }; 11 7630AD9A6242D60846D6750C /* Pods_SwiftWarplyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */; };
11 E6A77853282933340045BBA8 /* SwiftWarplyFramework.docc in Sources */ = {isa = PBXBuildFile; fileRef = E6A77852282933340045BBA8 /* SwiftWarplyFramework.docc */; }; 12 E6A77853282933340045BBA8 /* SwiftWarplyFramework.docc in Sources */ = {isa = PBXBuildFile; fileRef = E6A77852282933340045BBA8 /* SwiftWarplyFramework.docc */; };
12 E6A77854282933340045BBA8 /* SwiftWarplyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = E6A77851282933340045BBA8 /* SwiftWarplyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 E6A77854282933340045BBA8 /* SwiftWarplyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = E6A77851282933340045BBA8 /* SwiftWarplyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
...@@ -137,6 +138,7 @@ ...@@ -137,6 +138,7 @@
137 /* End PBXBuildFile section */ 138 /* End PBXBuildFile section */
138 139
139 /* Begin PBXFileReference section */ 140 /* Begin PBXFileReference section */
141 + 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsTableViewCell.swift; sourceTree = "<group>"; };
140 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>"; }; 142 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>"; };
141 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>"; }; 143 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>"; };
142 C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SwiftWarplyFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 144 C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SwiftWarplyFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
...@@ -320,6 +322,7 @@ ...@@ -320,6 +322,7 @@
320 isa = PBXGroup; 322 isa = PBXGroup;
321 children = ( 323 children = (
322 E6A7785E282933E40045BBA8 /* CouponsViewController.swift */, 324 E6A7785E282933E40045BBA8 /* CouponsViewController.swift */,
325 + 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */,
323 E6A7785D282933E40045BBA8 /* CouponViewController.swift */, 326 E6A7785D282933E40045BBA8 /* CouponViewController.swift */,
324 E6A77863282933E50045BBA8 /* DetailsViewController.swift */, 327 E6A77863282933E50045BBA8 /* DetailsViewController.swift */,
325 E6A778DE282933E60045BBA8 /* GiftsViewController.swift */, 328 E6A778DE282933E60045BBA8 /* GiftsViewController.swift */,
...@@ -750,6 +753,7 @@ ...@@ -750,6 +753,7 @@
750 E6A77935282933E70045BBA8 /* UIWebView+AFNetworking.m in Sources */, 753 E6A77935282933E70045BBA8 /* UIWebView+AFNetworking.m in Sources */,
751 E6A77925282933E70045BBA8 /* UIProgressView+AFNetworking.m in Sources */, 754 E6A77925282933E70045BBA8 /* UIProgressView+AFNetworking.m in Sources */,
752 E6A77944282933E70045BBA8 /* AFSecurityPolicy.m in Sources */, 755 E6A77944282933E70045BBA8 /* AFSecurityPolicy.m in Sources */,
756 + 1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */,
753 E6A77A32282BA9C60045BBA8 /* CampaignViewController.swift in Sources */, 757 E6A77A32282BA9C60045BBA8 /* CampaignViewController.swift in Sources */,
754 E6A77917282933E60045BBA8 /* UIViewController+WLAdditions.m in Sources */, 758 E6A77917282933E60045BBA8 /* UIViewController+WLAdditions.m in Sources */,
755 E6A77943282933E70045BBA8 /* AFNetworkReachabilityManager.m in Sources */, 759 E6A77943282933E70045BBA8 /* AFNetworkReachabilityManager.m in Sources */,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
7 <key>SwiftWarplyFramework.xcscheme_^#shared#^_</key> 7 <key>SwiftWarplyFramework.xcscheme_^#shared#^_</key>
8 <dict> 8 <dict>
9 <key>orderHint</key> 9 <key>orderHint</key>
10 - <integer>1</integer> 10 + <integer>0</integer>
11 </dict> 11 </dict>
12 </dict> 12 </dict>
13 </dict> 13 </dict>
......
...@@ -9,6 +9,7 @@ import UIKit ...@@ -9,6 +9,7 @@ import UIKit
9 9
10 class CouponViewController: UIViewController { 10 class CouponViewController: UIViewController {
11 @IBOutlet weak var mainView: UIView! 11 @IBOutlet weak var mainView: UIView!
12 + @IBOutlet weak var backgroundImage: UIImageView!
12 @IBOutlet weak var scrollView: UIScrollView! 13 @IBOutlet weak var scrollView: UIScrollView!
13 @IBOutlet weak var scrollContentView: UIView! 14 @IBOutlet weak var scrollContentView: UIView!
14 @IBOutlet weak var couponImageHeight: NSLayoutConstraint! 15 @IBOutlet weak var couponImageHeight: NSLayoutConstraint!
...@@ -28,6 +29,8 @@ class CouponViewController: UIViewController { ...@@ -28,6 +29,8 @@ class CouponViewController: UIViewController {
28 setBackButton() 29 setBackButton()
29 setNavigationTitle("Εκπτωτικό κουπόνι") 30 setNavigationTitle("Εκπτωτικό κουπόνι")
30 31
32 + backgroundImage.image = UIImage(named: "coupons_scrollview_white")
33 +
31 scrollView.clipsToBounds = true 34 scrollView.clipsToBounds = true
32 scrollView.layer.cornerRadius = 30 35 scrollView.layer.cornerRadius = 30
33 scrollView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius 36 scrollView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius
......
1 +//
2 +// CouponsTableViewCell.swift
3 +// SwiftWarplyFramework
4 +//
5 +// Created by Manos Chorianopoulos on 18/5/22.
6 +//
7 +
8 +import Foundation
9 +import UIKit
10 +import WarplySDKFrameworkIOS
11 +
12 +class CouponsTableViewCell: UITableViewCell {
13 + @IBOutlet weak var couponBgImage: UIImageView!
14 + @IBOutlet weak var couponImage: UIImageView!
15 + @IBOutlet weak var borderView: UIView!
16 + @IBOutlet weak var nameLabel: UILabel!
17 + @IBOutlet weak var dicountLabel: UILabel!
18 + @IBOutlet weak var discriptionLabel: UILabel!
19 + @IBOutlet weak var expirationLabel: UILabel!
20 +
21 +
22 + override func awakeFromNib() {
23 + super.awakeFromNib()
24 + // Initialization code
25 +
26 + couponBgImage.image = UIImage(named: "coupon_bg")
27 +
28 + borderView.addDashedBorderVertical(color: UIColor(red: 0.44, green: 0.44, blue: 0.44, alpha: 1.00), width: 1.0, height: 110.0)
29 + }
30 +
31 + override func setSelected(_ selected: Bool, animated: Bool) {
32 + super.setSelected(selected, animated: animated)
33 +
34 + // Configure the view for the selected state
35 + }
36 +
37 + override func layoutSubviews() {
38 + super.layoutSubviews()
39 + //set the values for top,left,bottom,right margins
40 + let margins = UIEdgeInsets(top: 0, left: 0, bottom: 30, right: 0)
41 + contentView.frame = contentView.frame.inset(by: margins)
42 + }
43 +
44 +
45 + func configureCell(coupon: swiftApi.CouponItemModel) {
46 +// COUPONSET: desc, img_preview, name, terms
47 +// COUPON: coupon, expiration, discount, status
48 +
49 + let couponSetData: swiftApi.CouponSetItemModel? = coupon.couponset_data
50 +
51 + couponImage.load(link: couponSetData?.img_preview ?? "", placeholder: UIImage(), cache: URLCache())
52 + nameLabel.text = couponSetData?.name ?? ""
53 + dicountLabel.text = (coupon.discount ?? "") + "€"
54 + discriptionLabel.text = couponSetData?.short_description ?? ""
55 + expirationLabel.text = "Ισχύει έως "+(coupon.expiration ?? "")
56 + }
57 +
58 +}
...@@ -7,21 +7,86 @@ ...@@ -7,21 +7,86 @@
7 7
8 import Foundation 8 import Foundation
9 import UIKit 9 import UIKit
10 +import WarplySDKFrameworkIOS
10 11
11 @objc public class CouponsViewController: UIViewController { 12 @objc public class CouponsViewController: UIViewController {
13 + @IBOutlet weak var backgroundImage: UIImageView!
14 + @IBOutlet weak var tableView: UITableView!
12 15
13 - @IBOutlet weak var couponButton: UIButton! 16 + var coupons:Array<swiftApi.CouponItemModel> = []
17 +
18 + override func viewDidLoad() {
19 + super.viewDidLoad()
20 +
21 + getCouponsRequest()
14 22
15 - public override func viewWillAppear(_ animated: Bool) {
16 - super.viewWillAppear(animated)
17 setBackButton() 23 setBackButton()
18 - setNavigationTitle("Εκπτωτικό κουπόνι") 24 + setNavigationTitle("Ενεργά κουπόνια")
25 +
26 + backgroundImage.image = UIImage(named: "coupons_scrollview_dark")
27 +
28 + tableView.delegate = self
29 + tableView.dataSource = self
30 +
31 + tableView.clipsToBounds = true
32 + tableView.layer.cornerRadius = 30
33 + tableView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius
34 + tableView.contentInset.top = 50
19 } 35 }
20 36
21 37
22 - @IBAction func navigateToCoupon(_ sender: Any) { 38 +
23 - let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self)) 39 + // MARK: - API Functions
24 - let vc = storyboard.instantiateViewController(withIdentifier: "CouponViewController") as UIViewController 40 + func getCouponsRequest() {
25 - self.navigationController?.pushViewController(vc, animated: true) 41 + swiftApi().getCouponsAsync(getCouponsCallback)
26 } 42 }
43 +
44 + func getCouponsCallback (_ couponsData: Array<swiftApi.CouponItemModel>?) -> Void {
45 + if (couponsData != nil) {
46 + let activeCouponData = swiftApi().filterActiveCoupons(couponsData ?? [])
47 +
48 + self.coupons = activeCouponData
49 +
50 + DispatchQueue.main.async {
51 + self.tableView.reloadData()
52 + }
53 + } else {
54 + self.coupons = []
55 + }
56 + }
57 +
58 +}
59 +
60 +// MARK: - TableView
61 +extension CouponsViewController: UITableViewDelegate, UITableViewDataSource{
62 +
63 + func numberOfSections(in tableView: UITableView) -> Int {
64 + return 1
65 + }
66 +
67 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
68 + return self.coupons.count
69 + }
70 +
71 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
72 + return 120.0 + 30.0
73 +// return UITableViewAutomaticDimension
74 + }
75 +
76 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
77 + let cell = tableView.dequeueReusableCell(withIdentifier: "CouponsTableViewCellId", for: indexPath) as! CouponsTableViewCell
78 +
79 + cell.configureCell(coupon: coupons[indexPath.row])
80 +
81 + return cell
82 + }
83 +
84 + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
85 +
86 + // TODO: navigate to CouponBarcode
87 + // let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self))
88 + // let vc = storyboard.instantiateViewController(withIdentifier: "CouponBarcodeViewController") as UIViewController
89 + // self.navigationController?.pushViewController(vc, animated: true)
90 + }
91 +
27 } 92 }
......
...@@ -12,39 +12,159 @@ ...@@ -12,39 +12,159 @@
12 <!--Coupons View Controller--> 12 <!--Coupons View Controller-->
13 <scene sceneID="s0d-6b-0kx"> 13 <scene sceneID="s0d-6b-0kx">
14 <objects> 14 <objects>
15 - <viewController storyboardIdentifier="CouponsViewController" id="zti-Lv-RCc" customClass="CouponsViewController" customModule="SwiftWarplyFramework" customModuleProvider="target" sceneMemberID="viewController"> 15 + <viewController storyboardIdentifier="CouponsViewController" id="UpJ-ey-hJ5" customClass="CouponsViewController" customModule="SwiftWarplyFramework" customModuleProvider="target" sceneMemberID="viewController">
16 - <view key="view" contentMode="scaleToFill" id="OHf-ga-xvH"> 16 + <view key="view" contentMode="scaleToFill" id="XzS-AB-unt">
17 <rect key="frame" x="0.0" y="0.0" width="414" height="896"/> 17 <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
18 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 18 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
19 <subviews> 19 <subviews>
20 - <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="coupons_scrollview" translatesAutoresizingMaskIntoConstraints="NO" id="t7M-3j-iFe"> 20 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FoX-v7-tak" userLabel="Main View">
21 - <rect key="frame" x="0.0" y="88" width="414" height="808"/> 21 + <rect key="frame" x="0.0" y="44" width="414" height="852"/>
22 - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 22 + <subviews>
23 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="coupons_scrollview_dark" translatesAutoresizingMaskIntoConstraints="NO" id="5rB-1e-ygb">
24 + <rect key="frame" x="0.0" y="0.0" width="414" height="852"/>
23 </imageView> 25 </imageView>
24 - <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ebo-cU-G6Q"> 26 + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" allowsSelection="NO" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="KhH-tg-FBN">
25 - <rect key="frame" x="0.0" y="88" width="414" height="808"/> 27 + <rect key="frame" x="0.0" y="5" width="414" height="847"/>
26 - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 28 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
29 + <color key="sectionIndexBackgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
30 + <prototypes>
31 + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CouponsTableViewCellId" id="Ivk-7o-eVp" customClass="CouponsTableViewCell" customModule="SwiftWarplyFramework" customModuleProvider="target">
32 + <rect key="frame" x="0.0" y="44.5" width="414" height="115"/>
33 + <autoresizingMask key="autoresizingMask"/>
34 + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Ivk-7o-eVp" id="OpF-ry-8Pc">
35 + <rect key="frame" x="0.0" y="0.0" width="414" height="115"/>
36 + <autoresizingMask key="autoresizingMask"/>
27 <subviews> 37 <subviews>
28 - <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Vy5-PH-dRI"> 38 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JaN-ia-6ul">
29 - <rect key="frame" x="151" y="107" width="114" height="31"/> 39 + <rect key="frame" x="10" y="0.0" width="394" height="115"/>
30 - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 40 + <subviews>
31 - <state key="normal" title="Button"/> 41 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="coupon_bg" translatesAutoresizingMaskIntoConstraints="NO" id="2YB-QL-me8">
32 - <buttonConfiguration key="configuration" style="plain" title="Go to Coupon"/> 42 + <rect key="frame" x="0.0" y="0.0" width="394" height="115"/>
43 + </imageView>
44 + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qgV-LI-5lL">
45 + <rect key="frame" x="20" y="10" width="79" height="95"/>
46 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
47 + </imageView>
48 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kWi-pp-keF">
49 + <rect key="frame" x="104" y="5" width="10" height="105"/>
50 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
51 + <constraints>
52 + <constraint firstAttribute="width" constant="10" id="UQ1-xk-Qqc"/>
53 + </constraints>
54 + </view>
55 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gWw-Mr-bn2">
56 + <rect key="frame" x="119" y="15" width="255" height="19.5"/>
57 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
58 + <color key="textColor" red="0.22745098039215686" green="0.32156862745098036" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
59 + <nil key="highlightedColor"/>
60 + </label>
61 + <stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="URC-i5-9Gw">
62 + <rect key="frame" x="119" y="39.5" width="255" height="36"/>
63 + <subviews>
64 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ssk-9S-HMD">
65 + <rect key="frame" x="0.0" y="0.0" width="127.5" height="36"/>
66 + <fontDescription key="fontDescription" type="boldSystem" pointSize="30"/>
67 + <color key="textColor" red="0.22745098039215686" green="0.32156862745098036" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
68 + <nil key="highlightedColor"/>
69 + </label>
70 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hWa-mr-cXD">
71 + <rect key="frame" x="132.5" y="0.0" width="122.5" height="36"/>
72 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/>
73 + <color key="textColor" red="0.38039215686274508" green="0.44313725490196076" blue="0.50588235294117645" alpha="1" colorSpace="calibratedRGB"/>
74 + <nil key="highlightedColor"/>
75 + </label>
76 + </subviews>
77 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
78 + <constraints>
79 + <constraint firstItem="Ssk-9S-HMD" firstAttribute="width" secondItem="URC-i5-9Gw" secondAttribute="width" multiplier="0.5" id="OLz-q3-DQc"/>
80 + </constraints>
81 + </stackView>
82 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Kdt-I2-GtS">
83 + <rect key="frame" x="119" y="86.5" width="255" height="13.5"/>
84 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="11"/>
85 + <color key="textColor" red="0.38039215686274508" green="0.44313725490196076" blue="0.50588235294117645" alpha="1" colorSpace="calibratedRGB"/>
86 + <nil key="highlightedColor"/>
87 + </label>
88 + </subviews>
89 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
90 + <constraints>
91 + <constraint firstItem="Kdt-I2-GtS" firstAttribute="leading" secondItem="kWi-pp-keF" secondAttribute="trailing" constant="5" id="4H7-U6-dwU"/>
92 + <constraint firstItem="kWi-pp-keF" firstAttribute="leading" secondItem="qgV-LI-5lL" secondAttribute="trailing" constant="5" id="7Oc-6i-WAJ"/>
93 + <constraint firstAttribute="trailing" secondItem="Kdt-I2-GtS" secondAttribute="trailing" constant="20" id="87u-XE-PUf"/>
94 + <constraint firstItem="URC-i5-9Gw" firstAttribute="leading" secondItem="kWi-pp-keF" secondAttribute="trailing" constant="5" id="CAI-TE-31b"/>
95 + <constraint firstItem="gWw-Mr-bn2" firstAttribute="leading" secondItem="kWi-pp-keF" secondAttribute="trailing" constant="5" id="DIf-jd-4i9"/>
96 + <constraint firstItem="2YB-QL-me8" firstAttribute="top" secondItem="JaN-ia-6ul" secondAttribute="top" id="Kg9-3h-9yX"/>
97 + <constraint firstItem="gWw-Mr-bn2" firstAttribute="top" secondItem="JaN-ia-6ul" secondAttribute="top" constant="15" id="L2J-sA-Qyz"/>
98 + <constraint firstAttribute="trailing" secondItem="2YB-QL-me8" secondAttribute="trailing" id="LKX-8Q-weK"/>
99 + <constraint firstItem="kWi-pp-keF" firstAttribute="top" secondItem="JaN-ia-6ul" secondAttribute="top" constant="5" id="Nw1-Du-inS"/>
100 + <constraint firstAttribute="bottom" secondItem="2YB-QL-me8" secondAttribute="bottom" id="QuD-tm-o3p"/>
101 + <constraint firstItem="2YB-QL-me8" firstAttribute="leading" secondItem="JaN-ia-6ul" secondAttribute="leading" id="RGp-Mx-kq9"/>
102 + <constraint firstAttribute="trailing" secondItem="URC-i5-9Gw" secondAttribute="trailing" constant="20" id="X88-Je-614"/>
103 + <constraint firstAttribute="bottom" secondItem="Kdt-I2-GtS" secondAttribute="bottom" constant="15" id="YOO-8b-oBD"/>
104 + <constraint firstItem="qgV-LI-5lL" firstAttribute="leading" secondItem="JaN-ia-6ul" secondAttribute="leading" constant="20" id="Zz2-s3-Lli"/>
105 + <constraint firstItem="URC-i5-9Gw" firstAttribute="top" relation="greaterThanOrEqual" secondItem="gWw-Mr-bn2" secondAttribute="bottom" constant="5" id="gv1-5w-f05"/>
106 + <constraint firstItem="URC-i5-9Gw" firstAttribute="centerY" secondItem="JaN-ia-6ul" secondAttribute="centerY" id="lCc-I4-VSe"/>
107 + <constraint firstAttribute="bottom" secondItem="kWi-pp-keF" secondAttribute="bottom" constant="5" id="mqK-8D-WIR"/>
108 + <constraint firstAttribute="trailing" secondItem="gWw-Mr-bn2" secondAttribute="trailing" constant="20" id="oL8-6u-dOS"/>
109 + <constraint firstItem="qgV-LI-5lL" firstAttribute="width" secondItem="JaN-ia-6ul" secondAttribute="width" multiplier="0.2" id="pqq-lg-4bn"/>
110 + <constraint firstItem="Kdt-I2-GtS" firstAttribute="top" relation="greaterThanOrEqual" secondItem="URC-i5-9Gw" secondAttribute="bottom" constant="5" id="rGz-OI-ook"/>
111 + <constraint firstAttribute="bottom" secondItem="qgV-LI-5lL" secondAttribute="bottom" constant="10" id="ryN-Yr-NRM"/>
112 + <constraint firstItem="qgV-LI-5lL" firstAttribute="top" secondItem="JaN-ia-6ul" secondAttribute="top" constant="10" id="z0W-2B-JKp"/>
113 + </constraints>
114 + </view>
115 + </subviews>
116 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
117 + <constraints>
118 + <constraint firstAttribute="trailing" secondItem="JaN-ia-6ul" secondAttribute="trailing" constant="10" id="1eX-rz-i5G"/>
119 + <constraint firstItem="JaN-ia-6ul" firstAttribute="leading" secondItem="OpF-ry-8Pc" secondAttribute="leading" constant="10" id="XJA-hx-mRX"/>
120 + <constraint firstItem="JaN-ia-6ul" firstAttribute="top" secondItem="OpF-ry-8Pc" secondAttribute="top" id="bxl-4U-Dqm"/>
121 + <constraint firstAttribute="bottom" secondItem="JaN-ia-6ul" secondAttribute="bottom" id="zeG-7a-iyk"/>
122 + </constraints>
123 + </tableViewCellContentView>
124 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
33 <connections> 125 <connections>
34 - <action selector="navigateToCoupon:" destination="zti-Lv-RCc" eventType="touchUpInside" id="G78-ub-QiI"/> 126 + <outlet property="borderView" destination="kWi-pp-keF" id="j4k-29-fIC"/>
127 + <outlet property="couponBgImage" destination="2YB-QL-me8" id="nCY-Ir-Nkb"/>
128 + <outlet property="couponImage" destination="qgV-LI-5lL" id="am7-DT-7Ln"/>
129 + <outlet property="dicountLabel" destination="Ssk-9S-HMD" id="WS3-nG-Sue"/>
130 + <outlet property="discriptionLabel" destination="hWa-mr-cXD" id="q6c-pM-iXa"/>
131 + <outlet property="expirationLabel" destination="Kdt-I2-GtS" id="cYp-01-3RL"/>
132 + <outlet property="nameLabel" destination="gWw-Mr-bn2" id="rT2-kW-Z2F"/>
35 </connections> 133 </connections>
36 - </button> 134 + </tableViewCell>
135 + </prototypes>
136 + <connections>
137 + <outlet property="dataSource" destination="UpJ-ey-hJ5" id="paH-E4-ldj"/>
138 + <outlet property="delegate" destination="UpJ-ey-hJ5" id="lXT-i0-gPS"/>
139 + </connections>
140 + </tableView>
37 </subviews> 141 </subviews>
38 - <viewLayoutGuide key="contentLayoutGuide" id="gl4-uV-tMn"/> 142 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
39 - <viewLayoutGuide key="frameLayoutGuide" id="5Jr-wv-06A"/> 143 + <constraints>
40 - </scrollView> 144 + <constraint firstItem="KhH-tg-FBN" firstAttribute="top" secondItem="FoX-v7-tak" secondAttribute="top" constant="5" id="DSl-zy-v7y"/>
145 + <constraint firstAttribute="bottom" secondItem="KhH-tg-FBN" secondAttribute="bottom" id="Dk8-ID-x8T"/>
146 + <constraint firstItem="5rB-1e-ygb" firstAttribute="top" secondItem="FoX-v7-tak" secondAttribute="top" id="R4t-dF-JMv"/>
147 + <constraint firstItem="5rB-1e-ygb" firstAttribute="leading" secondItem="FoX-v7-tak" secondAttribute="leading" id="Yyu-T7-XaB"/>
148 + <constraint firstAttribute="trailing" secondItem="5rB-1e-ygb" secondAttribute="trailing" id="h1f-x6-eGo"/>
149 + <constraint firstAttribute="bottom" secondItem="5rB-1e-ygb" secondAttribute="bottom" id="mFa-RR-qQj"/>
150 + <constraint firstItem="KhH-tg-FBN" firstAttribute="leading" secondItem="FoX-v7-tak" secondAttribute="leading" id="oXI-zv-0nB"/>
151 + <constraint firstAttribute="trailing" secondItem="KhH-tg-FBN" secondAttribute="trailing" id="tAn-PH-mZ8"/>
152 + </constraints>
153 + </view>
41 </subviews> 154 </subviews>
42 - <viewLayoutGuide key="safeArea" id="x1D-HA-Wfd"/> 155 + <viewLayoutGuide key="safeArea" id="KbU-RX-se5"/>
43 - <color key="backgroundColor" systemColor="systemBackgroundColor"/> 156 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
157 + <constraints>
158 + <constraint firstItem="FoX-v7-tak" firstAttribute="leading" secondItem="XzS-AB-unt" secondAttribute="leading" id="FRE-tf-mAG"/>
159 + <constraint firstAttribute="bottom" secondItem="FoX-v7-tak" secondAttribute="bottom" id="UlL-zJ-mdc"/>
160 + <constraint firstItem="FoX-v7-tak" firstAttribute="top" secondItem="KbU-RX-se5" secondAttribute="top" id="hDd-5D-Boi"/>
161 + <constraint firstAttribute="trailing" secondItem="FoX-v7-tak" secondAttribute="trailing" id="nro-Jt-pxP"/>
162 + </constraints>
44 </view> 163 </view>
45 - <navigationItem key="navigationItem" id="YHq-Mi-XvW"/> 164 + <navigationItem key="navigationItem" id="mr8-UG-4rX"/>
46 <connections> 165 <connections>
47 - <outlet property="couponButton" destination="Vy5-PH-dRI" id="wX5-IH-ne8"/> 166 + <outlet property="backgroundImage" destination="5rB-1e-ygb" id="Nxt-Pj-vLK"/>
167 + <outlet property="tableView" destination="KhH-tg-FBN" id="EJH-sF-YPj"/>
48 </connections> 168 </connections>
49 </viewController> 169 </viewController>
50 <placeholder placeholderIdentifier="IBFirstResponder" id="N1c-BM-LqY" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/> 170 <placeholder placeholderIdentifier="IBFirstResponder" id="N1c-BM-LqY" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
...@@ -306,6 +426,7 @@ ...@@ -306,6 +426,7 @@
306 </constraints> 426 </constraints>
307 </view> 427 </view>
308 <connections> 428 <connections>
429 + <outlet property="backgroundImage" destination="Oep-XD-blB" id="YaT-qr-rry"/>
309 <outlet property="couponImageHeight" destination="zUx-Yd-in7" id="7vo-8L-d8o"/> 430 <outlet property="couponImageHeight" destination="zUx-Yd-in7" id="7vo-8L-d8o"/>
310 <outlet property="mainView" destination="Jqu-cp-CWU" id="Q0Z-dO-MXL"/> 431 <outlet property="mainView" destination="Jqu-cp-CWU" id="Q0Z-dO-MXL"/>
311 <outlet property="redeemButton" destination="FCd-hv-dHg" id="3Jw-Yn-uNr"/> 432 <outlet property="redeemButton" destination="FCd-hv-dHg" id="3Jw-Yn-uNr"/>
...@@ -366,7 +487,8 @@ ...@@ -366,7 +487,8 @@
366 </scene> 487 </scene>
367 </scenes> 488 </scenes>
368 <resources> 489 <resources>
369 - <image name="coupons_scrollview" width="214" height="463.5"/> 490 + <image name="coupon_bg" width="196" height="64.5"/>
491 + <image name="coupons_scrollview_dark" width="214" height="462"/>
370 <image name="coupons_scrollview_white" width="214" height="462"/> 492 <image name="coupons_scrollview_white" width="214" height="462"/>
371 <image name="ic_down_dark" width="22" height="11.5"/> 493 <image name="ic_down_dark" width="22" height="11.5"/>
372 <systemColor name="systemBackgroundColor"> 494 <systemColor name="systemBackgroundColor">
......
1 +{
2 + "images" : [
3 + {
4 + "filename" : "coupon_bg.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "coupon_bg-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "coupon_bg-2.png",
15 + "idiom" : "universal",
16 + "scale" : "3x"
17 + }
18 + ],
19 + "info" : {
20 + "author" : "xcode",
21 + "version" : 1
22 + }
23 +}
1 +{
2 + "images" : [
3 + {
4 + "filename" : "coupons_scrollview_dark.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "coupons_scrollview_dark-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "coupons_scrollview_dark-2.png",
15 + "idiom" : "universal",
16 + "scale" : "3x"
17 + }
18 + ],
19 + "info" : {
20 + "author" : "xcode",
21 + "version" : 1
22 + }
23 +}
...@@ -63,3 +63,49 @@ extension String { ...@@ -63,3 +63,49 @@ extension String {
63 return htmlToAttributedString?.string ?? "" 63 return htmlToAttributedString?.string ?? ""
64 } 64 }
65 } 65 }
66 +
67 +extension UIView {
68 +
69 + func addDashedBorderVertical(color: UIColor, width: CGFloat, height: CGFloat) {
70 +
71 + let color = color.cgColor
72 + let frameSize = self.frame.size
73 +
74 + let lineLayer = CAShapeLayer()
75 + lineLayer.strokeColor = color
76 + lineLayer.lineWidth = width
77 + lineLayer.lineDashPattern = [5,5]
78 +
79 + let path = CGMutablePath()
80 + path.addLines(between: [CGPoint(x: frameSize.width/2, y: 0), CGPoint(x: frameSize.width/2, y: height)])
81 + lineLayer.path = path
82 + self.layer.addSublayer(lineLayer)
83 + }
84 +}
85 +
86 +extension UIImageView {
87 +
88 + func load(link: String, placeholder: UIImage?, cache: URLCache? = nil) {
89 + guard let url = URL(string: link) else { return }
90 +
91 + let cache = cache ?? URLCache.shared
92 + let request = URLRequest(url: url)
93 + if let data = cache.cachedResponse(for: request)?.data, let image = UIImage(data: data) {
94 + DispatchQueue.main.async {
95 + self.image = image
96 + }
97 + } else {
98 + self.image = placeholder
99 + URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
100 + if let data = data, let response = response, ((response as? HTTPURLResponse)?.statusCode ?? 500) < 300, let image = UIImage(data: data) {
101 + let cachedData = CachedURLResponse(response: response, data: data)
102 + cache.storeCachedResponse(cachedData, for: request)
103 + DispatchQueue.main.async {
104 + self.image = image
105 + }
106 +
107 + }
108 + }).resume()
109 + }
110 + }
111 +}
......