Showing
38 changed files
with
632 additions
and
69 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> | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -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> | ... | ... |
No preview for this file type
214 KB
214 KB
214 KB
| 1 | { | 1 | { |
| 2 | "images" : [ | 2 | "images" : [ |
| 3 | { | 3 | { |
| 4 | - "filename" : "contest_banner_5.png", | 4 | + "filename" : "questionnaire_banner.png", |
| 5 | "idiom" : "universal", | 5 | "idiom" : "universal", |
| 6 | "scale" : "1x" | 6 | "scale" : "1x" |
| 7 | }, | 7 | }, |
| 8 | { | 8 | { |
| 9 | - "filename" : "contest_banner_5 1.png", | 9 | + "filename" : "questionnaire_banner 1.png", |
| 10 | "idiom" : "universal", | 10 | "idiom" : "universal", |
| 11 | "scale" : "2x" | 11 | "scale" : "2x" |
| 12 | }, | 12 | }, |
| 13 | { | 13 | { |
| 14 | - "filename" : "contest_banner_5 2.png", | 14 | + "filename" : "questionnaire_banner 2.png", |
| 15 | "idiom" : "universal", | 15 | "idiom" : "universal", |
| 16 | "scale" : "3x" | 16 | "scale" : "3x" |
| 17 | } | 17 | } | ... | ... |
78.4 KB
78.4 KB
78.4 KB
| ... | @@ -8,7 +8,8 @@ | ... | @@ -8,7 +8,8 @@ |
| 8 | import UIKit | 8 | import UIKit |
| 9 | 9 | ||
| 10 | protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { | 10 | protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { |
| 11 | - func didSelectBannerOffer(_ offer: OfferModel) | 11 | + func didSelectBannerOffer(_ index: Int) |
| 12 | + func didTapProfileButton() | ||
| 12 | } | 13 | } |
| 13 | 14 | ||
| 14 | @objc public class MyRewardsBannerOffersScrollTableViewCell: UITableViewCell { | 15 | @objc public class MyRewardsBannerOffersScrollTableViewCell: UITableViewCell { |
| ... | @@ -17,6 +18,7 @@ protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { | ... | @@ -17,6 +18,7 @@ protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { |
| 17 | @IBOutlet weak var tagView2: UIView! | 18 | @IBOutlet weak var tagView2: UIView! |
| 18 | @IBOutlet weak var tagLabel2: UILabel! | 19 | @IBOutlet weak var tagLabel2: UILabel! |
| 19 | @IBOutlet weak var profileImage: UIImageView! | 20 | @IBOutlet weak var profileImage: UIImageView! |
| 21 | + @IBOutlet weak var profileButton: UIButton! | ||
| 20 | @IBOutlet weak var collectionView: UICollectionView! | 22 | @IBOutlet weak var collectionView: UICollectionView! |
| 21 | @IBOutlet weak var pageControl: UIPageControl! | 23 | @IBOutlet weak var pageControl: UIPageControl! |
| 22 | 24 | ||
| ... | @@ -29,6 +31,8 @@ protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { | ... | @@ -29,6 +31,8 @@ protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { |
| 29 | 31 | ||
| 30 | profileImage.image = UIImage(named: "profile_pic_default", in: MyEmptyClass.resourceBundle(), compatibleWith: nil) | 32 | profileImage.image = UIImage(named: "profile_pic_default", in: MyEmptyClass.resourceBundle(), compatibleWith: nil) |
| 31 | 33 | ||
| 34 | + profileButton.addTarget(self, action: #selector(profileButtonTapped), for: .touchUpInside) | ||
| 35 | + | ||
| 32 | tagView1.backgroundColor = UIColor(rgb: 0x09914E) | 36 | tagView1.backgroundColor = UIColor(rgb: 0x09914E) |
| 33 | tagView1.layer.cornerRadius = 4.0 | 37 | tagView1.layer.cornerRadius = 4.0 |
| 34 | tagLabel1.font = UIFont(name: "PingLCG-Regular", size: 17) | 38 | tagLabel1.font = UIFont(name: "PingLCG-Regular", size: 17) |
| ... | @@ -95,6 +99,10 @@ protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { | ... | @@ -95,6 +99,10 @@ protocol MyRewardsBannerOffersScrollTableViewCellDelegate: AnyObject { |
| 95 | 99 | ||
| 96 | self.collectionView.reloadData(); | 100 | self.collectionView.reloadData(); |
| 97 | } | 101 | } |
| 102 | + | ||
| 103 | + @objc private func profileButtonTapped() { | ||
| 104 | + delegate?.didTapProfileButton() | ||
| 105 | + } | ||
| 98 | } | 106 | } |
| 99 | 107 | ||
| 100 | extension MyRewardsBannerOffersScrollTableViewCell: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate { | 108 | extension MyRewardsBannerOffersScrollTableViewCell: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate { |
| ... | @@ -121,7 +129,7 @@ extension MyRewardsBannerOffersScrollTableViewCell: UICollectionViewDataSource, | ... | @@ -121,7 +129,7 @@ extension MyRewardsBannerOffersScrollTableViewCell: UICollectionViewDataSource, |
| 121 | // Get the selected offer | 129 | // Get the selected offer |
| 122 | if let offer = self.data?.offers[indexPath.row] { | 130 | if let offer = self.data?.offers[indexPath.row] { |
| 123 | // Call the delegate method to notify the parent | 131 | // Call the delegate method to notify the parent |
| 124 | - delegate?.didSelectBannerOffer(offer) | 132 | + delegate?.didSelectBannerOffer(indexPath.row) |
| 125 | } | 133 | } |
| 126 | } | 134 | } |
| 127 | 135 | ... | ... |
This diff is collapsed. Click to expand it.
| 1 | +// | ||
| 2 | +// ProfileCouponFiltersTableViewCell.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 29/5/25. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import UIKit | ||
| 9 | + | ||
| 10 | +protocol ProfileCouponFiltersTableViewCellDelegate: AnyObject { | ||
| 11 | + func didSelectFilter(_ filter: CouponFilterModel) | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +@objc public class ProfileCouponFiltersTableViewCell: UITableViewCell { | ||
| 15 | + @IBOutlet weak var titleLabel: UILabel! | ||
| 16 | + @IBOutlet weak var collectionView: UICollectionView! | ||
| 17 | + | ||
| 18 | + weak var delegate: ProfileCouponFiltersTableViewCellDelegate? | ||
| 19 | + var data: [CouponFilterModel]? | ||
| 20 | + | ||
| 21 | + public override func awakeFromNib() { | ||
| 22 | + super.awakeFromNib() | ||
| 23 | + | ||
| 24 | + titleLabel.font = UIFont(name: "PingLCG-Bold", size: 18) | ||
| 25 | + titleLabel.textColor = UIColor(rgb: 0x000F1E) | ||
| 26 | + | ||
| 27 | + // Register XIBs for collection view cells | ||
| 28 | + collectionView.register(UINib(nibName: "ProfileFilterCollectionViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellWithReuseIdentifier: "ProfileFilterCollectionViewCell") | ||
| 29 | + | ||
| 30 | + // Fix background colors | ||
| 31 | +// collectionView.backgroundColor = UIColor.clear | ||
| 32 | +// self.backgroundColor = UIColor.clear | ||
| 33 | +// self.contentView.backgroundColor = UIColor.clear | ||
| 34 | + | ||
| 35 | + // Remove content insets and gaps | ||
| 36 | + collectionView.contentInset = UIEdgeInsets.zero | ||
| 37 | + collectionView.scrollIndicatorInsets = UIEdgeInsets.zero | ||
| 38 | + | ||
| 39 | + if #available(iOS 11.0, *) { | ||
| 40 | + collectionView.contentInsetAdjustmentBehavior = .never | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + // Configure collection view layout | ||
| 44 | + if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { | ||
| 45 | + layout.scrollDirection = .horizontal | ||
| 46 | + layout.minimumLineSpacing = 15 | ||
| 47 | + layout.minimumInteritemSpacing = 0 | ||
| 48 | + layout.sectionInset = UIEdgeInsets(top: 0, left: 24, bottom: 0, right: 24) | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + // Enable paging for smooth banner scrolling | ||
| 52 | + // collectionView.isPagingEnabled = true | ||
| 53 | + collectionView.showsHorizontalScrollIndicator = false | ||
| 54 | + | ||
| 55 | + // Set delegates | ||
| 56 | + collectionView.delegate = self | ||
| 57 | + collectionView.dataSource = self | ||
| 58 | + | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + public override func setSelected(_ selected: Bool, animated: Bool) { | ||
| 62 | + super.setSelected(selected, animated: animated) | ||
| 63 | + | ||
| 64 | + // Configure the view for the selected state | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + func configureCell(data: [CouponFilterModel]?) { | ||
| 68 | + self.data = data | ||
| 69 | + | ||
| 70 | + self.collectionView.reloadData(); | ||
| 71 | + } | ||
| 72 | +} | ||
| 73 | + | ||
| 74 | +extension ProfileCouponFiltersTableViewCell: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { | ||
| 75 | + | ||
| 76 | + | ||
| 77 | + public func numberOfSections(in collectionView: UICollectionView) -> Int { | ||
| 78 | + return 1 | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | ||
| 82 | + return self.data?.count ?? 0 | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | ||
| 86 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProfileFilterCollectionViewCell", for: indexPath) as! ProfileFilterCollectionViewCell | ||
| 87 | + if let filter = self.data?[indexPath.row] { | ||
| 88 | + // TODO: Fix dynamic | ||
| 89 | + let isSelected = self.data?[indexPath.row].title == "Ενεργά" | ||
| 90 | + cell.configureCell(data: filter, isSelected: isSelected) | ||
| 91 | + } | ||
| 92 | + return cell; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | ||
| 96 | + if let filter = self.data?[indexPath.row] { | ||
| 97 | + delegate?.didSelectFilter(filter) | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + // MARK: - UICollectionViewDelegateFlowLayout | ||
| 102 | +// public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | ||
| 103 | +// if self.data?.title == "Αγαπημένα" { | ||
| 104 | +// return CGSize(width: 275, height: 350) | ||
| 105 | +// } else { | ||
| 106 | +// return CGSize(width: 257, height: 232) | ||
| 107 | +// } | ||
| 108 | +// } | ||
| 109 | + | ||
| 110 | + // Distance Between Item Cells | ||
| 111 | + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { | ||
| 112 | + return 15 | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { | ||
| 116 | + return 0 | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + // Cell Margin | ||
| 120 | + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { | ||
| 121 | + return UIEdgeInsets(top: 0, left: 24, bottom: 0, right: 24) | ||
| 122 | + } | ||
| 123 | +} |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" 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="23084"/> | ||
| 6 | + <capability name="Safe area layout guides" minToolsVersion="9.0"/> | ||
| 7 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||
| 8 | + </dependencies> | ||
| 9 | + <objects> | ||
| 10 | + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | ||
| 11 | + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | ||
| 12 | + <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="ProfileCouponFiltersTableViewCell" rowHeight="161" id="KGk-i7-Jjw" customClass="ProfileCouponFiltersTableViewCell" customModule="SwiftWarplyFramework" customModuleProvider="target"> | ||
| 13 | + <rect key="frame" x="0.0" y="0.0" width="320" height="161"/> | ||
| 14 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
| 15 | + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM"> | ||
| 16 | + <rect key="frame" x="0.0" y="0.0" width="320" height="161"/> | ||
| 17 | + <autoresizingMask key="autoresizingMask"/> | ||
| 18 | + <subviews> | ||
| 19 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1kR-zd-duR" userLabel="ParentView"> | ||
| 20 | + <rect key="frame" x="0.0" y="0.0" width="320" height="161"/> | ||
| 21 | + <subviews> | ||
| 22 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mga-ND-qoh"> | ||
| 23 | + <rect key="frame" x="24" y="26" width="272" height="49"/> | ||
| 24 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
| 25 | + <nil key="textColor"/> | ||
| 26 | + <nil key="highlightedColor"/> | ||
| 27 | + </label> | ||
| 28 | + <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="Ddn-dN-xH1"> | ||
| 29 | + <rect key="frame" x="0.0" y="118" width="320" height="43"/> | ||
| 30 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 31 | + <constraints> | ||
| 32 | + <constraint firstAttribute="height" constant="43" id="5nG-1p-kic"/> | ||
| 33 | + </constraints> | ||
| 34 | + <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" automaticEstimatedItemSize="YES" minimumLineSpacing="5" minimumInteritemSpacing="5" id="tAC-pV-kZ6"> | ||
| 35 | + <size key="itemSize" width="128" height="120"/> | ||
| 36 | + <size key="headerReferenceSize" width="0.0" height="0.0"/> | ||
| 37 | + <size key="footerReferenceSize" width="0.0" height="0.0"/> | ||
| 38 | + <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> | ||
| 39 | + </collectionViewFlowLayout> | ||
| 40 | + <cells/> | ||
| 41 | + <connections> | ||
| 42 | + <outlet property="dataSource" destination="KGk-i7-Jjw" id="J6c-fu-dH8"/> | ||
| 43 | + <outlet property="delegate" destination="KGk-i7-Jjw" id="D3M-nO-3sC"/> | ||
| 44 | + </connections> | ||
| 45 | + </collectionView> | ||
| 46 | + </subviews> | ||
| 47 | + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 48 | + <constraints> | ||
| 49 | + <constraint firstItem="Ddn-dN-xH1" firstAttribute="top" secondItem="mga-ND-qoh" secondAttribute="bottom" constant="43" id="1gh-45-u6h"/> | ||
| 50 | + <constraint firstItem="Ddn-dN-xH1" firstAttribute="leading" secondItem="1kR-zd-duR" secondAttribute="leading" id="3IU-v8-7cI"/> | ||
| 51 | + <constraint firstItem="mga-ND-qoh" firstAttribute="top" secondItem="1kR-zd-duR" secondAttribute="top" constant="26" id="J0I-v0-uwq"/> | ||
| 52 | + <constraint firstAttribute="trailing" secondItem="mga-ND-qoh" secondAttribute="trailing" constant="24" id="Ss1-zq-znd"/> | ||
| 53 | + <constraint firstAttribute="bottom" secondItem="Ddn-dN-xH1" secondAttribute="bottom" id="VdN-By-srg"/> | ||
| 54 | + <constraint firstAttribute="trailing" secondItem="Ddn-dN-xH1" secondAttribute="trailing" id="W06-Yi-lzm"/> | ||
| 55 | + <constraint firstItem="mga-ND-qoh" firstAttribute="leading" secondItem="1kR-zd-duR" secondAttribute="leading" constant="24" id="sEy-GV-Pjr"/> | ||
| 56 | + </constraints> | ||
| 57 | + </view> | ||
| 58 | + </subviews> | ||
| 59 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 60 | + <constraints> | ||
| 61 | + <constraint firstItem="1kR-zd-duR" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="BHT-r3-dcg"/> | ||
| 62 | + <constraint firstAttribute="trailing" secondItem="1kR-zd-duR" secondAttribute="trailing" id="eLa-yc-CeZ"/> | ||
| 63 | + <constraint firstAttribute="bottom" secondItem="1kR-zd-duR" secondAttribute="bottom" id="rie-jS-xMj"/> | ||
| 64 | + <constraint firstItem="1kR-zd-duR" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="vgK-SU-fRu"/> | ||
| 65 | + </constraints> | ||
| 66 | + </tableViewCellContentView> | ||
| 67 | + <viewLayoutGuide key="safeArea" id="njF-e1-oar"/> | ||
| 68 | + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 69 | + <connections> | ||
| 70 | + <outlet property="collectionView" destination="Ddn-dN-xH1" id="RzU-o5-6Dw"/> | ||
| 71 | + <outlet property="titleLabel" destination="mga-ND-qoh" id="TxL-cQ-O1P"/> | ||
| 72 | + </connections> | ||
| 73 | + <point key="canvasLocation" x="68.702290076335871" y="29.929577464788736"/> | ||
| 74 | + </tableViewCell> | ||
| 75 | + </objects> | ||
| 76 | +</document> |
| 1 | +// | ||
| 2 | +// ProfileCouponTableViewCell.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 29/5/25. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import UIKit | ||
| 9 | + | ||
| 10 | +@objc public class ProfileCouponTableViewCell: UITableViewCell { | ||
| 11 | + @IBOutlet weak var parentView: UIView! | ||
| 12 | + @IBOutlet weak var bannerImage: UIImageView! | ||
| 13 | + @IBOutlet weak var favoriteImage: UIImageView! | ||
| 14 | + @IBOutlet weak var discountView: UIView! | ||
| 15 | + @IBOutlet weak var discountLabel: UILabel! | ||
| 16 | + @IBOutlet weak var titleLabel: UILabel! | ||
| 17 | + @IBOutlet weak var subtitleLabel: UILabel! | ||
| 18 | + @IBOutlet weak var expirationLabel: UILabel! | ||
| 19 | + @IBOutlet weak var logoImage: UIImageView! | ||
| 20 | + | ||
| 21 | + public override func awakeFromNib() { | ||
| 22 | + super.awakeFromNib() | ||
| 23 | + // Initialization code | ||
| 24 | + | ||
| 25 | + parentView.layer.borderWidth = 1.0 | ||
| 26 | + parentView.layer.borderColor = UIColor(rgb: 0xCCCCCC).cgColor | ||
| 27 | + parentView.layer.cornerRadius = 8.0 | ||
| 28 | + parentView.clipsToBounds = true | ||
| 29 | + | ||
| 30 | + discountView.layer.cornerRadius = 34.0 | ||
| 31 | + | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + func configureCell(data: OfferModel) { | ||
| 35 | + bannerImage.image = UIImage(named: data.bannerImage, in: MyEmptyClass.resourceBundle(), compatibleWith: nil) | ||
| 36 | + favoriteImage.image = UIImage(named: data.isFavorite ? "favorite_filled" : "favorite_empty", in: MyEmptyClass.resourceBundle(), compatibleWith: nil) | ||
| 37 | + | ||
| 38 | + let discountSymbol = | ||
| 39 | + data.discountType == "percentage" ? "%" | ||
| 40 | + : data.discountType == "price" ? "€" | ||
| 41 | + : data.discountType == "buyOneGetOne" ? "1+1" | ||
| 42 | + : data.discountType == "free" ? "Δωρεάν" | ||
| 43 | + : "" | ||
| 44 | + | ||
| 45 | +// discountLabel.text = "\(data.discount)\(discountSymbol)" | ||
| 46 | + discountLabel.text = data.discount | ||
| 47 | + discountLabel.font = UIFont(name: "PingLCG-Bold", size: 25) | ||
| 48 | + discountLabel.textColor = UIColor(rgb: 0xF2F2F2) | ||
| 49 | + | ||
| 50 | + discountView.backgroundColor = UIColor(rgb: data.color) | ||
| 51 | + | ||
| 52 | + titleLabel.text = data.title | ||
| 53 | + titleLabel.font = UIFont(name: "PingLCG-Bold", size: 22) | ||
| 54 | + titleLabel.textColor = UIColor(rgb: 0x000F1E) | ||
| 55 | + | ||
| 56 | + subtitleLabel.text = data.description | ||
| 57 | + subtitleLabel.font = UIFont(name: "PingLCG-Regular", size: 16) | ||
| 58 | + subtitleLabel.textColor = UIColor(rgb: 0x00111B) | ||
| 59 | + | ||
| 60 | + expirationLabel.text = data.expirationDate | ||
| 61 | + expirationLabel.font = UIFont(name: "PingLCG-Regular", size: 13) | ||
| 62 | + expirationLabel.textColor = UIColor(rgb: 0x00111B) | ||
| 63 | + | ||
| 64 | + logoImage.image = UIImage(named: data.merchantLogo, in: MyEmptyClass.resourceBundle(), compatibleWith: nil) | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + public override func setSelected(_ selected: Bool, animated: Bool) { | ||
| 68 | + super.setSelected(selected, animated: animated) | ||
| 69 | + | ||
| 70 | + // Configure the view for the selected state | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | +} |
This diff is collapsed. Click to expand it.
| 1 | +// | ||
| 2 | +// ProfileFilterCollectionViewCell.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 29/5/25. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import UIKit | ||
| 9 | + | ||
| 10 | +@objc public class ProfileFilterCollectionViewCell: UICollectionViewCell { | ||
| 11 | + @IBOutlet weak var parentView: UIView! | ||
| 12 | + @IBOutlet weak var titleLabel: UILabel! | ||
| 13 | + | ||
| 14 | + public override func awakeFromNib() { | ||
| 15 | + super.awakeFromNib() | ||
| 16 | + // Initialization code | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | + func configureCell(data: CouponFilterModel, isSelected: Bool) { | ||
| 20 | + if (isSelected) { | ||
| 21 | + parentView.backgroundColor = UIColor(rgb: 0x000F1E) | ||
| 22 | + parentView.layer.cornerRadius = 4.0 | ||
| 23 | + | ||
| 24 | + titleLabel.font = UIFont(name: "PingLCG-Bold", size: 16) | ||
| 25 | + titleLabel.textColor = UIColor(rgb: 0xFFFFFF) | ||
| 26 | + | ||
| 27 | + } else { | ||
| 28 | + parentView.backgroundColor = .clear | ||
| 29 | + parentView.layer.borderWidth = 2 | ||
| 30 | + parentView.layer.borderColor = UIColor(rgb: 0x56586A).cgColor | ||
| 31 | + parentView.layer.cornerRadius = 4.0 | ||
| 32 | + | ||
| 33 | + titleLabel.font = UIFont(name: "PingLCG-Bold", size: 16) | ||
| 34 | + titleLabel.textColor = UIColor(rgb: 0xFFFFFF) | ||
| 35 | + } | ||
| 36 | + titleLabel.text = data.title | ||
| 37 | + } | ||
| 38 | +} |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" 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="23084"/> | ||
| 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"/> | ||
| 12 | + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | ||
| 13 | + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="ProfileFilterCollectionViewCell" id="gTV-IL-0wX" customClass="ProfileFilterCollectionViewCell" customModule="SwiftWarplyFramework" customModuleProvider="target"> | ||
| 14 | + <rect key="frame" x="0.0" y="0.0" width="145" height="66"/> | ||
| 15 | + <autoresizingMask key="autoresizingMask"/> | ||
| 16 | + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> | ||
| 17 | + <rect key="frame" x="0.0" y="0.0" width="145" height="66"/> | ||
| 18 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
| 19 | + <subviews> | ||
| 20 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NgU-Qp-M8l" userLabel="ParentView"> | ||
| 21 | + <rect key="frame" x="0.0" y="0.0" width="145" height="66"/> | ||
| 22 | + <subviews> | ||
| 23 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xq0-AN-QT6"> | ||
| 24 | + <rect key="frame" x="17" y="12" width="111" height="42"/> | ||
| 25 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
| 26 | + <nil key="textColor"/> | ||
| 27 | + <nil key="highlightedColor"/> | ||
| 28 | + </label> | ||
| 29 | + </subviews> | ||
| 30 | + <color key="backgroundColor" systemColor="systemBackgroundColor"/> | ||
| 31 | + <constraints> | ||
| 32 | + <constraint firstItem="Xq0-AN-QT6" firstAttribute="top" secondItem="NgU-Qp-M8l" secondAttribute="top" constant="12" id="Nro-8v-U0C"/> | ||
| 33 | + <constraint firstAttribute="trailing" secondItem="Xq0-AN-QT6" secondAttribute="trailing" constant="17" id="hKh-jv-VQR"/> | ||
| 34 | + <constraint firstItem="Xq0-AN-QT6" firstAttribute="leading" secondItem="NgU-Qp-M8l" secondAttribute="leading" constant="17" id="na6-tV-KQZ"/> | ||
| 35 | + <constraint firstAttribute="bottom" secondItem="Xq0-AN-QT6" secondAttribute="bottom" constant="12" id="pJO-74-XZO"/> | ||
| 36 | + </constraints> | ||
| 37 | + </view> | ||
| 38 | + </subviews> | ||
| 39 | + </view> | ||
| 40 | + <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/> | ||
| 41 | + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 42 | + <constraints> | ||
| 43 | + <constraint firstItem="NgU-Qp-M8l" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="RYQ-Qn-MSN"/> | ||
| 44 | + <constraint firstAttribute="trailing" secondItem="NgU-Qp-M8l" secondAttribute="trailing" id="efv-x1-lhD"/> | ||
| 45 | + <constraint firstItem="NgU-Qp-M8l" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="l7p-or-kC2"/> | ||
| 46 | + <constraint firstAttribute="bottom" secondItem="NgU-Qp-M8l" secondAttribute="bottom" id="te6-Qr-T6c"/> | ||
| 47 | + </constraints> | ||
| 48 | + <size key="customSize" width="145" height="66"/> | ||
| 49 | + <connections> | ||
| 50 | + <outlet property="parentView" destination="NgU-Qp-M8l" id="qhP-z2-cWY"/> | ||
| 51 | + <outlet property="titleLabel" destination="Xq0-AN-QT6" id="Hft-IP-ITh"/> | ||
| 52 | + </connections> | ||
| 53 | + <point key="canvasLocation" x="109.16030534351144" y="-5.6338028169014089"/> | ||
| 54 | + </collectionViewCell> | ||
| 55 | + </objects> | ||
| 56 | + <resources> | ||
| 57 | + <systemColor name="systemBackgroundColor"> | ||
| 58 | + <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 59 | + </systemColor> | ||
| 60 | + </resources> | ||
| 61 | +</document> |
| 1 | +// | ||
| 2 | +// ProfileHeaderTableViewCell.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 29/5/25. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import UIKit | ||
| 9 | + | ||
| 10 | +@objc public class ProfileHeaderTableViewCell: UITableViewCell { | ||
| 11 | + @IBOutlet weak var tagView1: UIView! | ||
| 12 | + @IBOutlet weak var tagLabel1: UILabel! | ||
| 13 | + @IBOutlet weak var tagView2: UIView! | ||
| 14 | + @IBOutlet weak var tagLabel2: UILabel! | ||
| 15 | + @IBOutlet weak var profileImage: UIImageView! | ||
| 16 | + | ||
| 17 | + public override func awakeFromNib() { | ||
| 18 | + super.awakeFromNib() | ||
| 19 | + | ||
| 20 | + profileImage.image = UIImage(named: "profile_pic_default", in: MyEmptyClass.resourceBundle(), compatibleWith: nil) | ||
| 21 | + | ||
| 22 | + tagView1.backgroundColor = UIColor(rgb: 0x09914E) | ||
| 23 | + tagView1.layer.cornerRadius = 4.0 | ||
| 24 | + tagLabel1.font = UIFont(name: "PingLCG-Regular", size: 17) | ||
| 25 | + tagLabel1.textColor = UIColor(rgb: 0xFFFFFF) | ||
| 26 | + | ||
| 27 | + tagView2.backgroundColor = UIColor(rgb: 0xFC9F25) | ||
| 28 | + tagView2.layer.cornerRadius = 4.0 | ||
| 29 | + tagLabel2.font = UIFont(name: "PingLCG-Regular", size: 17) | ||
| 30 | + tagLabel2.textColor = UIColor(rgb: 0xFFFFFF) | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + public override func setSelected(_ selected: Bool, animated: Bool) { | ||
| 34 | + super.setSelected(selected, animated: animated) | ||
| 35 | + | ||
| 36 | + // Configure the view for the selected state | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | +} |
This diff is collapsed. Click to expand it.
| 1 | +// | ||
| 2 | +// ProfileQuestionnaireTableViewCell.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 29/5/25. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import UIKit | ||
| 9 | + | ||
| 10 | +@objc public class ProfileQuestionnaireTableViewCell: UITableViewCell { | ||
| 11 | + @IBOutlet weak var questionnaireBannerImage: UIImageView! | ||
| 12 | + | ||
| 13 | + public override func awakeFromNib() { | ||
| 14 | + super.awakeFromNib() | ||
| 15 | + | ||
| 16 | + questionnaireBannerImage.image = UIImage(named: "questionnaire_banner", in: MyEmptyClass.resourceBundle(), compatibleWith: nil) | ||
| 17 | + | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + public override func setSelected(_ selected: Bool, animated: Bool) { | ||
| 21 | + super.setSelected(selected, animated: animated) | ||
| 22 | + | ||
| 23 | + // Configure the view for the selected state | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | +} |
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" 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="23084"/> | ||
| 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"/> | ||
| 12 | + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | ||
| 13 | + <tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="ProfileQuestionnaireTableViewCell" rowHeight="211" id="KGk-i7-Jjw" customClass="ProfileQuestionnaireTableViewCell" customModule="SwiftWarplyFramework" customModuleProvider="target"> | ||
| 14 | + <rect key="frame" x="0.0" y="0.0" width="320" height="211"/> | ||
| 15 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
| 16 | + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM"> | ||
| 17 | + <rect key="frame" x="0.0" y="0.0" width="320" height="211"/> | ||
| 18 | + <autoresizingMask key="autoresizingMask"/> | ||
| 19 | + <subviews> | ||
| 20 | + <view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YrO-k4-v2O" userLabel="ParentView"> | ||
| 21 | + <rect key="frame" x="24" y="35" width="272" height="9"/> | ||
| 22 | + <subviews> | ||
| 23 | + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="N8L-PD-UP8"> | ||
| 24 | + <rect key="frame" x="0.0" y="0.0" width="272" height="159"/> | ||
| 25 | + <color key="backgroundColor" systemColor="systemRedColor"/> | ||
| 26 | + <constraints> | ||
| 27 | + <constraint firstAttribute="height" constant="159" id="r1F-lV-yNf"/> | ||
| 28 | + </constraints> | ||
| 29 | + </imageView> | ||
| 30 | + </subviews> | ||
| 31 | + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 32 | + <constraints> | ||
| 33 | + <constraint firstItem="N8L-PD-UP8" firstAttribute="leading" secondItem="YrO-k4-v2O" secondAttribute="leading" id="Ay6-kG-U8L"/> | ||
| 34 | + <constraint firstAttribute="bottom" secondItem="N8L-PD-UP8" secondAttribute="bottom" id="S87-T5-YdQ"/> | ||
| 35 | + <constraint firstAttribute="trailing" secondItem="N8L-PD-UP8" secondAttribute="trailing" id="WGt-wu-sFI"/> | ||
| 36 | + <constraint firstItem="N8L-PD-UP8" firstAttribute="top" secondItem="YrO-k4-v2O" secondAttribute="top" id="ZxG-A7-Zci"/> | ||
| 37 | + </constraints> | ||
| 38 | + </view> | ||
| 39 | + </subviews> | ||
| 40 | + <color key="backgroundColor" red="0.94901960784313721" green="0.94901960784313721" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/> | ||
| 41 | + <constraints> | ||
| 42 | + <constraint firstAttribute="bottom" secondItem="YrO-k4-v2O" secondAttribute="bottom" id="6we-5l-yeL"/> | ||
| 43 | + <constraint firstAttribute="trailing" secondItem="YrO-k4-v2O" secondAttribute="trailing" constant="24" id="7CD-5N-Kwy"/> | ||
| 44 | + <constraint firstItem="YrO-k4-v2O" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="24" id="ExZ-x2-yiF"/> | ||
| 45 | + <constraint firstItem="YrO-k4-v2O" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="35" id="iID-80-Men"/> | ||
| 46 | + </constraints> | ||
| 47 | + </tableViewCellContentView> | ||
| 48 | + <viewLayoutGuide key="safeArea" id="njF-e1-oar"/> | ||
| 49 | + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 50 | + <connections> | ||
| 51 | + <outlet property="questionnaireBannerImage" destination="N8L-PD-UP8" id="BMn-6A-UVw"/> | ||
| 52 | + </connections> | ||
| 53 | + <point key="canvasLocation" x="68.702290076335871" y="47.535211267605639"/> | ||
| 54 | + </tableViewCell> | ||
| 55 | + </objects> | ||
| 56 | + <resources> | ||
| 57 | + <systemColor name="systemRedColor"> | ||
| 58 | + <color red="1" green="0.23137254900000001" blue="0.18823529410000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | ||
| 59 | + </systemColor> | ||
| 60 | + </resources> | ||
| 61 | +</document> |
| 1 | +// | ||
| 2 | +// Models.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 29/5/25. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +struct SectionModel { | ||
| 10 | + let title: String | ||
| 11 | + let count: Int | ||
| 12 | + let offers: [OfferModel] | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +struct OfferModel { | ||
| 16 | + let category: String | ||
| 17 | + let title: String | ||
| 18 | + let description: String | ||
| 19 | + let discount: String | ||
| 20 | + let discountType: String // e.g., "price", "percentage", "free", "buyOneGetOne", etc. | ||
| 21 | + let bannerImage: String | ||
| 22 | + let merchantLogo: String | ||
| 23 | + let expirationDate: String | ||
| 24 | + let color: UInt | ||
| 25 | + var isFavorite: Bool | ||
| 26 | + var active: Bool? | ||
| 27 | + var redeemed: Bool? | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +struct CouponFilterModel { | ||
| 31 | + let title: String | ||
| 32 | +} |
| ... | @@ -7,24 +7,6 @@ | ... | @@ -7,24 +7,6 @@ |
| 7 | 7 | ||
| 8 | import UIKit | 8 | import UIKit |
| 9 | 9 | ||
| 10 | -struct SectionModel { | ||
| 11 | - let title: String | ||
| 12 | - let count: Int | ||
| 13 | - let offers: [OfferModel] | ||
| 14 | -} | ||
| 15 | - | ||
| 16 | -struct OfferModel { | ||
| 17 | - let category: String | ||
| 18 | - let title: String | ||
| 19 | - let description: String | ||
| 20 | - let discount: String | ||
| 21 | - let discountType: String // e.g., "price", "percentage", "free", "buyOneGetOne", etc. | ||
| 22 | - let bannerImage: String | ||
| 23 | - let merchantLogo: String | ||
| 24 | - let expirationDate: String | ||
| 25 | - let color: UInt | ||
| 26 | - var isFavorite: Bool | ||
| 27 | -} | ||
| 28 | 10 | ||
| 29 | @objc public class MyRewardsViewController: UIViewController { | 11 | @objc public class MyRewardsViewController: UIViewController { |
| 30 | @IBOutlet weak var tableView: UITableView! | 12 | @IBOutlet weak var tableView: UITableView! |
| ... | @@ -80,18 +62,6 @@ struct OfferModel { | ... | @@ -80,18 +62,6 @@ struct OfferModel { |
| 80 | color: 0x8A2BE2, | 62 | color: 0x8A2BE2, |
| 81 | isFavorite: false | 63 | isFavorite: false |
| 82 | ), | 64 | ), |
| 83 | - OfferModel( | ||
| 84 | - category: "Διαγωνισμός", | ||
| 85 | - title: "Διαγωνισμός Κού-πονς!", | ||
| 86 | - description: "13 Απίθανα ΔΩΡΑ σε περιμένουν!", | ||
| 87 | - discount: "", | ||
| 88 | - discountType: "contest", | ||
| 89 | - bannerImage: "contest_banner_5", | ||
| 90 | - merchantLogo: "contest_logo", | ||
| 91 | - expirationDate: "30/06/2025", | ||
| 92 | - color: 0x8A2BE2, | ||
| 93 | - isFavorite: false | ||
| 94 | - ), | ||
| 95 | // Top offers | 65 | // Top offers |
| 96 | OfferModel( | 66 | OfferModel( |
| 97 | category: "Top offers", | 67 | category: "Top offers", |
| ... | @@ -301,6 +271,13 @@ struct OfferModel { | ... | @@ -301,6 +271,13 @@ struct OfferModel { |
| 301 | ) | 271 | ) |
| 302 | ] | 272 | ] |
| 303 | 273 | ||
| 274 | + let contestUrls: [String] = [ | ||
| 275 | + "https://warply.s3.amazonaws.com/dei/campaigns/tesla_dev/index.html", | ||
| 276 | + "https://warply.s3.amazonaws.com/dei/campaigns/EnergySaverContest_dev/index.html", | ||
| 277 | + "https://warply.s3.amazonaws.com/dei/campaigns/match_dev/index.html", | ||
| 278 | + "https://warply.s3.amazonaws.com/dei/campaigns/questionnaire_dev" | ||
| 279 | + ] | ||
| 280 | + | ||
| 304 | var bannerOffersSection: SectionModel? | 281 | var bannerOffersSection: SectionModel? |
| 305 | var topOffersSection: SectionModel? | 282 | var topOffersSection: SectionModel? |
| 306 | var favoriteOffersSection: SectionModel? | 283 | var favoriteOffersSection: SectionModel? |
| ... | @@ -423,23 +400,30 @@ struct OfferModel { | ... | @@ -423,23 +400,30 @@ struct OfferModel { |
| 423 | self.tableView.reloadData() | 400 | self.tableView.reloadData() |
| 424 | } | 401 | } |
| 425 | 402 | ||
| 426 | - private func openCampaignViewController(with offer: OfferModel) { | 403 | + private func openCampaignViewController(with index: Int) { |
| 427 | 404 | ||
| 428 | let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self)) | 405 | let storyboard = UIStoryboard(name: "Main", bundle: Bundle(for: MyEmptyClass.self)) |
| 429 | if let vc = storyboard.instantiateViewController(withIdentifier: "CampaignViewController") as? SwiftWarplyFramework.CampaignViewController { | 406 | if let vc = storyboard.instantiateViewController(withIdentifier: "CampaignViewController") as? SwiftWarplyFramework.CampaignViewController { |
| 430 | - vc.campaignUrl = "https://warply.s3.amazonaws.com/dei/campaigns/DehEasterContest_stage/index.html" | 407 | +// vc.campaignUrl = "https://warply.s3.amazonaws.com/dei/campaigns/DehEasterContest_stage/index.html" |
| 408 | + vc.campaignUrl = contestUrls[index] | ||
| 431 | vc.showHeader = true | 409 | vc.showHeader = true |
| 432 | self.navigationController?.pushViewController(vc, animated: true) | 410 | self.navigationController?.pushViewController(vc, animated: true) |
| 433 | // self.present(vc, animated: true) | 411 | // self.present(vc, animated: true) |
| 434 | } | 412 | } |
| 435 | } | 413 | } |
| 436 | - | 414 | + |
| 437 | private func openCouponViewController(with offer: OfferModel) { | 415 | private func openCouponViewController(with offer: OfferModel) { |
| 438 | let vc = SwiftWarplyFramework.CouponViewController(nibName: "CouponViewController", bundle: Bundle(for: MyEmptyClass.self)) | 416 | let vc = SwiftWarplyFramework.CouponViewController(nibName: "CouponViewController", bundle: Bundle(for: MyEmptyClass.self)) |
| 439 | vc.coupon = offer | 417 | vc.coupon = offer |
| 440 | 418 | ||
| 441 | self.navigationController?.pushViewController(vc, animated: true) | 419 | self.navigationController?.pushViewController(vc, animated: true) |
| 442 | } | 420 | } |
| 421 | + | ||
| 422 | + private func openProfileViewController() { | ||
| 423 | + let vc = SwiftWarplyFramework.ProfileViewController(nibName: "ProfileViewController", bundle: Bundle(for: MyEmptyClass.self)) | ||
| 424 | + | ||
| 425 | + self.navigationController?.pushViewController(vc, animated: true) | ||
| 426 | + } | ||
| 443 | } | 427 | } |
| 444 | 428 | ||
| 445 | // MARK: - TableView | 429 | // MARK: - TableView |
| ... | @@ -536,9 +520,14 @@ extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ | ... | @@ -536,9 +520,14 @@ extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ |
| 536 | 520 | ||
| 537 | // Add delegate conformance | 521 | // Add delegate conformance |
| 538 | extension MyRewardsViewController: MyRewardsBannerOffersScrollTableViewCellDelegate { | 522 | extension MyRewardsViewController: MyRewardsBannerOffersScrollTableViewCellDelegate { |
| 539 | - func didSelectBannerOffer(_ offer: OfferModel) { | 523 | + func didSelectBannerOffer(_ index: Int) { |
| 540 | // Navigate to CampaignViewController | 524 | // Navigate to CampaignViewController |
| 541 | - openCampaignViewController(with: offer) | 525 | + openCampaignViewController(with: index) |
| 526 | + } | ||
| 527 | + | ||
| 528 | + func didTapProfileButton() { | ||
| 529 | + // Navigate to ProfileViewController | ||
| 530 | + openProfileViewController() | ||
| 542 | } | 531 | } |
| 543 | } | 532 | } |
| 544 | 533 | ... | ... |
| ... | @@ -171,6 +171,14 @@ import UIKit | ... | @@ -171,6 +171,14 @@ import UIKit |
| 171 | redeemed: true | 171 | redeemed: true |
| 172 | ) | 172 | ) |
| 173 | ] | 173 | ] |
| 174 | + | ||
| 175 | + let couponFilters: [CouponFilterModel] = [ | ||
| 176 | + CouponFilterModel(title: "Ενεργά"), | ||
| 177 | + CouponFilterModel(title: "Αγαπημένα"), | ||
| 178 | + CouponFilterModel(title: "Εξαργυρωμένα") | ||
| 179 | + ] | ||
| 180 | + | ||
| 181 | + var couponFilterSelected: CouponFilterModel = CouponFilterModel(title: "Ενεργά") | ||
| 174 | 182 | ||
| 175 | var forYouOffersSection: SectionModel? | 183 | var forYouOffersSection: SectionModel? |
| 176 | var activeOffersSection: SectionModel? | 184 | var activeOffersSection: SectionModel? |
| ... | @@ -187,8 +195,11 @@ import UIKit | ... | @@ -187,8 +195,11 @@ import UIKit |
| 187 | setNavigationTitle("Το προφίλ μου") | 195 | setNavigationTitle("Το προφίλ μου") |
| 188 | 196 | ||
| 189 | // Register XIBs for table view cells | 197 | // Register XIBs for table view cells |
| 190 | - // tableView.register(UINib(nibName: "MyRewardsBannerOffersScrollTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "MyRewardsBannerOffersScrollTableViewCell") | 198 | + tableView.register(UINib(nibName: "ProfileHeaderTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "ProfileHeaderTableViewCell") |
| 191 | - // tableView.register(UINib(nibName: "MyRewardsOffersScrollTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "MyRewardsOffersScrollTableViewCell") | 199 | + tableView.register(UINib(nibName: "ProfileQuestionnaireTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "ProfileQuestionnaireTableViewCell") |
| 200 | + tableView.register(UINib(nibName: "MyRewardsOffersScrollTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "MyRewardsOffersScrollTableViewCell") | ||
| 201 | + tableView.register(UINib(nibName: "ProfileCouponFiltersTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "ProfileCouponFiltersTableViewCell") | ||
| 202 | + tableView.register(UINib(nibName: "ProfileCouponTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "ProfileCouponTableViewCell") | ||
| 192 | 203 | ||
| 193 | // Set up table view | 204 | // Set up table view |
| 194 | tableView.delegate = self | 205 | tableView.delegate = self |
| ... | @@ -211,12 +222,14 @@ import UIKit | ... | @@ -211,12 +222,14 @@ import UIKit |
| 211 | ) | 222 | ) |
| 212 | 223 | ||
| 213 | // Favorite Offers | 224 | // Favorite Offers |
| 214 | - let activeOffers = allOffers.filter { $0.active } | 225 | + let activeOffers = allOffers.filter { $0.active ?? false } |
| 215 | activeOffersSection = SectionModel( | 226 | activeOffersSection = SectionModel( |
| 216 | title: "Ενεργά", | 227 | title: "Ενεργά", |
| 217 | count: activeOffers.count, | 228 | count: activeOffers.count, |
| 218 | offers: activeOffers | 229 | offers: activeOffers |
| 219 | ) | 230 | ) |
| 231 | + | ||
| 232 | + filteredOffersSection = activeOffersSection | ||
| 220 | 233 | ||
| 221 | // Favorite Offers | 234 | // Favorite Offers |
| 222 | let favoriteOffers = allOffers.filter { $0.isFavorite } | 235 | let favoriteOffers = allOffers.filter { $0.isFavorite } |
| ... | @@ -227,7 +240,7 @@ import UIKit | ... | @@ -227,7 +240,7 @@ import UIKit |
| 227 | ) | 240 | ) |
| 228 | 241 | ||
| 229 | // Favorite Offers | 242 | // Favorite Offers |
| 230 | - let redeemedOffers = allOffers.filter { $0.redeemed } | 243 | + let redeemedOffers = allOffers.filter { $0.redeemed ?? false } |
| 231 | redeemedOffersSection = SectionModel( | 244 | redeemedOffersSection = SectionModel( |
| 232 | title: "Αγαπημένα", | 245 | title: "Αγαπημένα", |
| 233 | count: redeemedOffers.count, | 246 | count: redeemedOffers.count, |
| ... | @@ -236,13 +249,20 @@ import UIKit | ... | @@ -236,13 +249,20 @@ import UIKit |
| 236 | 249 | ||
| 237 | self.tableView.reloadData() | 250 | self.tableView.reloadData() |
| 238 | } | 251 | } |
| 252 | + | ||
| 253 | + private func openCouponViewController(with offer: OfferModel) { | ||
| 254 | + let vc = SwiftWarplyFramework.CouponViewController(nibName: "CouponViewController", bundle: Bundle(for: MyEmptyClass.self)) | ||
| 255 | + vc.coupon = offer | ||
| 256 | + | ||
| 257 | + self.navigationController?.pushViewController(vc, animated: true) | ||
| 258 | + } | ||
| 239 | } | 259 | } |
| 240 | 260 | ||
| 241 | // MARK: - TableView | 261 | // MARK: - TableView |
| 242 | -extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ | 262 | +extension ProfileViewController: UITableViewDelegate, UITableViewDataSource { |
| 243 | 263 | ||
| 244 | public func numberOfSections(in tableView: UITableView) -> Int { | 264 | public func numberOfSections(in tableView: UITableView) -> Int { |
| 245 | - return 4 + filteredOffersSection.offers.count | 265 | + return 4 + (filteredOffersSection?.offers.count ?? 0) |
| 246 | } | 266 | } |
| 247 | 267 | ||
| 248 | public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | 268 | public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| ... | @@ -272,35 +292,37 @@ extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ | ... | @@ -272,35 +292,37 @@ extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ |
| 272 | 292 | ||
| 273 | public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | 293 | public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| 274 | if (indexPath.section == 0) { | 294 | if (indexPath.section == 0) { |
| 275 | - let cell = tableView.dequeueReusableCell(withIdentifier: "MyRewardsBannerOffersScrollTableViewCell", for: indexPath) as! MyRewardsBannerOffersScrollTableViewCell | 295 | + let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileHeaderTableViewCell", for: indexPath) as! ProfileHeaderTableViewCell |
| 276 | - cell.delegate = self // Set the banner offers delegate | 296 | +// cell.delegate = self // Set the banner offers delegate |
| 277 | - cell.configureCell(data: self.bannerOffersSection) | 297 | +// cell.configureCell(data: self.bannerOffersSection) |
| 278 | // cell.parent = self | 298 | // cell.parent = self |
| 279 | return cell | 299 | return cell |
| 280 | 300 | ||
| 281 | - } else { | 301 | + } else if (indexPath.section == 1) { |
| 302 | + let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileQuestionnaireTableViewCell", for: indexPath) as! ProfileQuestionnaireTableViewCell | ||
| 303 | + return cell | ||
| 304 | + | ||
| 305 | + } else if (indexPath.section == 2) { | ||
| 282 | let cell = tableView.dequeueReusableCell(withIdentifier: "MyRewardsOffersScrollTableViewCell", for: indexPath) as! MyRewardsOffersScrollTableViewCell | 306 | let cell = tableView.dequeueReusableCell(withIdentifier: "MyRewardsOffersScrollTableViewCell", for: indexPath) as! MyRewardsOffersScrollTableViewCell |
| 283 | 307 | ||
| 284 | cell.delegate = self // Set the offers delegate | 308 | cell.delegate = self // Set the offers delegate |
| 309 | + cell.configureCell(data: self.forYouOffersSection) | ||
| 285 | 310 | ||
| 286 | - if (indexPath.section == 1) { | 311 | + return cell |
| 287 | - cell.configureCell(data: self.topOffersSection) | ||
| 288 | - } else if (indexPath.section == 2) { | ||
| 289 | - cell.configureCell(data: self.favoriteOffersSection) | ||
| 290 | - } else if (indexPath.section == 3) { | ||
| 291 | - cell.configureCell(data: self.sustainableOffersSection) | ||
| 292 | - } else if (indexPath.section == 4) { | ||
| 293 | - cell.configureCell(data: self.familyOffersSection) | ||
| 294 | - } else if (indexPath.section == 5) { | ||
| 295 | - cell.configureCell(data: self.foodOffersSection) | ||
| 296 | - } else if (indexPath.section == 6) { | ||
| 297 | - cell.configureCell(data: self.escapeOffersSection) | ||
| 298 | - } else if (indexPath.section == 7) { | ||
| 299 | - cell.configureCell(data: self.childOffersSection) | ||
| 300 | - } else { | ||
| 301 | - cell.configureCell(data: self.shoppingOffersSection) | ||
| 302 | - } | ||
| 303 | 312 | ||
| 313 | + } else if (indexPath.section == 3) { | ||
| 314 | + let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileCouponFiltersTableViewCell", for: indexPath) as! ProfileCouponFiltersTableViewCell | ||
| 315 | + | ||
| 316 | + cell.delegate = self // Set the offers delegate | ||
| 317 | + cell.configureCell(data: self.couponFilters) | ||
| 318 | + | ||
| 319 | + return cell | ||
| 320 | + | ||
| 321 | + } else { | ||
| 322 | + let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileCouponTableViewCell", for: indexPath) as! ProfileCouponTableViewCell | ||
| 323 | + if let offer = self.filteredOffersSection?.offers[indexPath.row] { | ||
| 324 | + cell.configureCell(data: offer) | ||
| 325 | + } | ||
| 304 | return cell | 326 | return cell |
| 305 | } | 327 | } |
| 306 | 328 | ||
| ... | @@ -330,3 +352,18 @@ extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ | ... | @@ -330,3 +352,18 @@ extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{ |
| 330 | } | 352 | } |
| 331 | } | 353 | } |
| 332 | 354 | ||
| 355 | +// Add delegate conformance | ||
| 356 | +extension ProfileViewController: MyRewardsOffersScrollTableViewCellDelegate { | ||
| 357 | + func didSelectOffer(_ offer: OfferModel) { | ||
| 358 | + // Navigate to CouponViewController | ||
| 359 | + openCouponViewController(with: offer) | ||
| 360 | + } | ||
| 361 | +} | ||
| 362 | + | ||
| 363 | +// Add delegate conformance | ||
| 364 | +extension ProfileViewController: ProfileCouponFiltersTableViewCellDelegate { | ||
| 365 | + func didSelectFilter(_ filter: CouponFilterModel) { | ||
| 366 | + self.couponFilterSelected = filter | ||
| 367 | + self.tableView.reloadData() | ||
| 368 | + } | ||
| 369 | +} | ... | ... |
-
Please register or login to post a comment