Showing
23 changed files
with
582 additions
and
120 deletions
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 | +} |
2.28 KB
2.28 KB
2.28 KB
1 | +{ | ||
2 | + "images" : [ | ||
3 | + { | ||
4 | + "filename" : "filters_btn.png", | ||
5 | + "idiom" : "universal", | ||
6 | + "scale" : "1x" | ||
7 | + }, | ||
8 | + { | ||
9 | + "filename" : "filters_btn-1.png", | ||
10 | + "idiom" : "universal", | ||
11 | + "scale" : "2x" | ||
12 | + }, | ||
13 | + { | ||
14 | + "filename" : "filters_btn-2.png", | ||
15 | + "idiom" : "universal", | ||
16 | + "scale" : "3x" | ||
17 | + } | ||
18 | + ], | ||
19 | + "info" : { | ||
20 | + "author" : "xcode", | ||
21 | + "version" : 1 | ||
22 | + } | ||
23 | +} |
2.03 KB
2.03 KB
2.03 KB
1 | +{ | ||
2 | + "images" : [ | ||
3 | + { | ||
4 | + "filename" : "location_icon.png", | ||
5 | + "idiom" : "universal", | ||
6 | + "scale" : "1x" | ||
7 | + }, | ||
8 | + { | ||
9 | + "filename" : "location_icon-1.png", | ||
10 | + "idiom" : "universal", | ||
11 | + "scale" : "2x" | ||
12 | + }, | ||
13 | + { | ||
14 | + "filename" : "location_icon-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" : "search_icon.png", | ||
5 | + "idiom" : "universal", | ||
6 | + "scale" : "1x" | ||
7 | + }, | ||
8 | + { | ||
9 | + "filename" : "search_icon-1.png", | ||
10 | + "idiom" : "universal", | ||
11 | + "scale" : "2x" | ||
12 | + }, | ||
13 | + { | ||
14 | + "filename" : "search_icon-2.png", | ||
15 | + "idiom" : "universal", | ||
16 | + "scale" : "3x" | ||
17 | + } | ||
18 | + ], | ||
19 | + "info" : { | ||
20 | + "author" : "xcode", | ||
21 | + "version" : 1 | ||
22 | + } | ||
23 | +} |
2.58 KB
2.58 KB
2.58 KB
... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
7 | <key>Pods-WarplySDKFrameworkIOS.xcscheme_^#shared#^_</key> | 7 | <key>Pods-WarplySDKFrameworkIOS.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,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
7 | <key>WarplySDKFrameworkIOS.xcscheme_^#shared#^_</key> | 7 | <key>WarplySDKFrameworkIOS.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
... | @@ -8,139 +8,497 @@ | ... | @@ -8,139 +8,497 @@ |
8 | 8 | ||
9 | #if canImport(SwiftUI) | 9 | #if canImport(SwiftUI) |
10 | import SwiftUI | 10 | import SwiftUI |
11 | +import Combine | ||
12 | +import Foundation | ||
13 | +import UIKit | ||
14 | + | ||
15 | + | ||
16 | +class CouponSetItemModel { | ||
17 | + let uuid: String? | ||
18 | + let admin_name: String? | ||
19 | + let name: String? | ||
20 | + let img_preview: String? | ||
21 | + let expiration: String? | ||
22 | + let description: String? | ||
23 | + let short_description: String? | ||
24 | + let discount: String? | ||
25 | + | ||
26 | + init(dictionary: [String: Any]) { | ||
27 | + self.uuid = dictionary["uuid"] as? String? ?? "" | ||
28 | + self.admin_name = dictionary["admin_name"] as? String? ?? "" | ||
29 | + self.name = dictionary["name"] as? String? ?? "" | ||
30 | + self.img_preview = dictionary["img_preview"] as? String? ?? "" | ||
31 | + self.description = dictionary["description"] as? String? ?? "" | ||
32 | + self.short_description = dictionary["short_description"] as? String? ?? "" | ||
33 | + self.discount = dictionary["discount"] as? String? ?? "" | ||
34 | + | ||
35 | + let expirationObject = dictionary["expiration"] as? [String: Any]? ?? ["":""] | ||
36 | + let expirationString = expirationObject?["value"] as? String? ?? "" | ||
37 | + | ||
38 | +// Example expirationString: Optional(2022-12-05 01:55) | ||
39 | + | ||
40 | + let dateFormatter = DateFormatter() | ||
41 | + dateFormatter.dateFormat = "yyyy-MM-dd hh:mm" | ||
42 | + let date = dateFormatter.date(from: expirationString ?? "") | ||
43 | + dateFormatter.dateFormat = "dd/MM/yyyy" | ||
44 | + let resultString = dateFormatter.string(from: date!) | ||
45 | + self.expiration = resultString | ||
46 | + | ||
47 | + } | ||
48 | +} | ||
11 | 49 | ||
12 | class CouponDataModel { | 50 | class CouponDataModel { |
13 | - var data: Array<NSDictionary> = [] | 51 | + var data: Array<CouponSetItemModel> = [] |
14 | 52 | ||
15 | init() { //initializer method | 53 | init() { //initializer method |
16 | let instanceOfMyApi = MyApi() | 54 | let instanceOfMyApi = MyApi() |
17 | let couponSets = instanceOfMyApi.getCouponSets(withActive: true, andVisible: true, andUuids: nil) | 55 | let couponSets = instanceOfMyApi.getCouponSets(withActive: true, andVisible: true, andUuids: nil) |
18 | - let coupons = instanceOfMyApi.getCoupons() as AnyObject? | 56 | + var couponSetsArray:Array<CouponSetItemModel> = [] |
19 | 57 | ||
20 | if let myCouponsSetsDictionary = couponSets as? [String : AnyObject] { | 58 | if let myCouponsSetsDictionary = couponSets as? [String : AnyObject] { |
21 | - let couponSetsData = (myCouponsSetsDictionary["MAPP_COUPON"] as! Array<NSMutableDictionary>) | 59 | + let couponSetsData = (myCouponsSetsDictionary["MAPP_COUPON"] as! NSArray) |
22 | - if let myCouponsDictionary = coupons as? [String : AnyObject] { | ||
23 | - let couponsData = (myCouponsDictionary["result"] as! Array<NSMutableDictionary>) | ||
24 | - if let sets = couponSetsData as? NSArray { | ||
25 | - for set in sets { | ||
26 | - let s = set as! NSDictionary | ||
27 | - if let cpns = couponsData as? NSArray { | ||
28 | - for coupon in cpns { | ||
29 | - var c = coupon as! NSDictionary | ||
30 | -// var temp = NSMutableDictionary(dictionary: s); | ||
31 | - if c["couponset_uuid"] as! String == s["uuid"] as! String { | ||
32 | - var temp = NSMutableDictionary(dictionary: s); | ||
33 | - temp.addEntries(from: c as! [AnyHashable : Any]) | ||
34 | 60 | ||
35 | - self.data.append(temp as NSDictionary) | 61 | + |
62 | + for couponset in couponSetsData { | ||
63 | + let tempCouponset = CouponSetItemModel(dictionary: couponset as! [String : Any]) | ||
64 | + couponSetsArray.append(tempCouponset) | ||
36 | } | 65 | } |
37 | 66 | ||
38 | } | 67 | } |
68 | + self.data = couponSetsArray | ||
39 | } | 69 | } |
40 | 70 | ||
71 | + var getData: Array<CouponSetItemModel> { | ||
72 | + get { // getter | ||
73 | + return data | ||
41 | } | 74 | } |
42 | } | 75 | } |
76 | +} | ||
77 | + | ||
78 | + | ||
79 | +class CampaignItemModel { | ||
80 | + let index_url: String? | ||
81 | + let logo_url: String? | ||
82 | + let offer_category: String? | ||
83 | + let title: String? | ||
84 | + let subtitle: String? | ||
85 | + let session_uuid: String? | ||
86 | + let subcategory: String? | ||
87 | + | ||
88 | + init(dictionary: [String: Any]) { | ||
89 | + self.index_url = dictionary["index_url"] as? String? ?? "" | ||
90 | + self.logo_url = dictionary["logo_url"] as? String? ?? "" | ||
91 | + self.offer_category = dictionary["offer_category"] as? String? ?? "" | ||
92 | + self.title = dictionary["title"] as? String? ?? "" | ||
93 | + self.subtitle = dictionary["subtitle"] as? String? ?? "" | ||
94 | + self.session_uuid = dictionary["session_uuid"] as? String? ?? "" | ||
95 | + | ||
96 | +// let extra_fields = dictionary["extra_fields"] as? [String: Any]? ?? ["":""] | ||
97 | + let extra_fields = dictionary["extra_fields"] as AnyObject | ||
98 | + var extra_fields_parsed:[String: Any] | ||
99 | + | ||
100 | + let json = extra_fields.data(using: String.Encoding.utf8.rawValue) | ||
101 | + do { | ||
102 | + if let jsonArray = try JSONSerialization.jsonObject(with: json!, options: .allowFragments) as? [String:AnyObject] | ||
103 | + { | ||
104 | + extra_fields_parsed = jsonArray; | ||
105 | + self.subcategory = extra_fields_parsed["subcategory"] as? String? ?? "" | ||
106 | + } else { | ||
107 | + self.subcategory = "" | ||
108 | + print("bad json") | ||
43 | } | 109 | } |
44 | - } | 110 | + } catch let error as NSError { |
111 | + self.subcategory = "" | ||
112 | + print(error) | ||
45 | } | 113 | } |
46 | 114 | ||
47 | - var getData: Array<NSDictionary> { | ||
48 | - get { // getter | ||
49 | - return data | ||
50 | - } | ||
51 | } | 115 | } |
52 | } | 116 | } |
53 | 117 | ||
54 | class CampaignDataModel { | 118 | class CampaignDataModel { |
55 | - var data: Array<NSDictionary> = [] | 119 | + var data: Array<CampaignItemModel> = [] |
56 | 120 | ||
57 | init() { //initializer method | 121 | init() { //initializer method |
58 | let instanceOfMyApi = MyApi() | 122 | let instanceOfMyApi = MyApi() |
59 | - let products = instanceOfMyApi.getInbox() | 123 | + let products = instanceOfMyApi.getInbox() as NSMutableArray? |
60 | - | ||
61 | - print("======== Inbox print =========") | ||
62 | - print(products?[0]) | ||
63 | - print("======== Inbox dump =========") | ||
64 | - dump(products?[0]) | ||
65 | - print("======== Inbox =========") | ||
66 | - | ||
67 | - | ||
68 | - // let couponSets = instanceOfMyApi.getCouponSets(withActive: true, andVisible: true, andUuids: nil) | ||
69 | - // let coupons = instanceOfMyApi.getCoupons() as AnyObject? | ||
70 | - | ||
71 | -// if let myCouponsSetsDictionary = couponSets as? [String : AnyObject] { | ||
72 | -// let couponSetsData = (myCouponsSetsDictionary["MAPP_COUPON"] as! Array<NSMutableDictionary>) | ||
73 | -// if let myCouponsDictionary = coupons as? [String : AnyObject] { | ||
74 | -// let couponsData = (myCouponsDictionary["result"] as! Array<NSMutableDictionary>) | ||
75 | -// if let sets = couponSetsData as? NSArray { | ||
76 | -// for set in sets { | ||
77 | -// let s = set as! NSDictionary | ||
78 | -// if let cpns = couponsData as? NSArray { | ||
79 | -// for coupon in cpns { | ||
80 | -// var c = coupon as! NSDictionary | ||
81 | -// // var temp = NSMutableDictionary(dictionary: s); | ||
82 | -// if c["couponset_uuid"] as! String == s["uuid"] as! String { | ||
83 | -// var temp = NSMutableDictionary(dictionary: s); | ||
84 | -// temp.addEntries(from: c as! [AnyHashable : Any]) | ||
85 | - | ||
86 | -// self.data.append(temp as NSDictionary) | ||
87 | -// } | ||
88 | 124 | ||
89 | -// } | 125 | + var giftsArray:Array<CampaignItemModel> = [] |
90 | -// } | 126 | + |
127 | + | ||
128 | + for gift in products ?? [] { | ||
129 | + let tempGift = CampaignItemModel(dictionary: gift as! [String : Any]) | ||
130 | + giftsArray.append(tempGift) | ||
131 | + } | ||
132 | + | ||
133 | + self.data = giftsArray; | ||
91 | 134 | ||
92 | -// } | ||
93 | -// } | ||
94 | -// } | ||
95 | -// } | ||
96 | } | 135 | } |
97 | 136 | ||
98 | - var getData: Array<NSDictionary> { | 137 | + var getData: Array<CampaignItemModel> { |
99 | get { // getter | 138 | get { // getter |
100 | return data | 139 | return data |
101 | } | 140 | } |
102 | } | 141 | } |
103 | } | 142 | } |
104 | 143 | ||
144 | +extension String { | ||
145 | + func htmlToString() -> String { | ||
146 | + return try! NSAttributedString(data: self.data(using: .utf8)!, | ||
147 | + options: [.documentType: NSAttributedString.DocumentType.html], | ||
148 | + documentAttributes: nil).string | ||
149 | + } | ||
150 | +} | ||
151 | + | ||
152 | +extension View { | ||
153 | + func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View { | ||
154 | + clipShape( RoundedCorner(radius: radius, corners: corners) ) | ||
155 | + } | ||
156 | +} | ||
157 | + | ||
158 | +struct RoundedCorner: Shape { | ||
159 | + | ||
160 | + var radius: CGFloat = .infinity | ||
161 | + var corners: UIRectCorner = .allCorners | ||
162 | + | ||
163 | + func path(in rect: CGRect) -> Path { | ||
164 | + let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) | ||
165 | + return Path(path.cgPath) | ||
166 | + } | ||
167 | +} | ||
168 | + | ||
169 | +class ImageLoaderGifts: ObservableObject { | ||
170 | + var didChange = PassthroughSubject<Data, Never>() | ||
171 | + var data = Data() { | ||
172 | + didSet { | ||
173 | + didChange.send(data) | ||
174 | + } | ||
175 | + } | ||
176 | + | ||
177 | + init(urlString:String) { | ||
178 | + guard let url = URL(string: urlString) else { return } | ||
179 | + let task = URLSession.shared.dataTask(with: url) { data, response, error in | ||
180 | + guard let data = data else { return } | ||
181 | + DispatchQueue.main.async { | ||
182 | + self.data = data | ||
183 | + } | ||
184 | + } | ||
185 | + task.resume() | ||
186 | + } | ||
187 | +} | ||
188 | + | ||
189 | + | ||
105 | extension GiftsView { | 190 | extension GiftsView { |
106 | struct headerView: View { | 191 | struct headerView: View { |
192 | + var goBack: () -> () | ||
107 | 193 | ||
108 | var uiscreen = UIScreen.main.bounds | 194 | var uiscreen = UIScreen.main.bounds |
109 | 195 | ||
110 | var body: some View { | 196 | var body: some View { |
111 | - ZStack { | 197 | + HStack(alignment: .center) { |
198 | + Button { | ||
199 | + // Button Action | ||
200 | + print("Back Button tapped!") | ||
201 | + goBack() | ||
202 | + } label: { | ||
112 | Image("ic_back", bundle: Bundle(for: MyEmptyClass.self)) | 203 | Image("ic_back", bundle: Bundle(for: MyEmptyClass.self)) |
113 | .resizable() | 204 | .resizable() |
205 | + .aspectRatio(contentMode: .fit) | ||
114 | .frame(width: self.uiscreen.height * 0.025, height: self.uiscreen.height * 0.02) | 206 | .frame(width: self.uiscreen.height * 0.025, height: self.uiscreen.height * 0.02) |
115 | - .offset(x: -self.uiscreen.width / 2 + self.uiscreen.width * 0.05, y: self.uiscreen.height * 0.07) | 207 | + } |
116 | - Text("Όλα τα κουπόνια μου") | 208 | + |
117 | - .frame(width: self.uiscreen.width * 0.8, height: self.uiscreen.height * 0.025, alignment: .center) | 209 | + Text("Gifts for You") |
118 | - .offset( y: self.uiscreen.height * 0.07) | 210 | + .fontWeight(.medium) |
119 | - .frame(width: self.uiscreen.width) | 211 | + .font(.system(size: 16)) |
212 | + .foregroundColor(Color(red: 0.20784313725490197, green: 0.3176470588235294, blue: 0.40784313725490196)) | ||
213 | + .multilineTextAlignment(.center) | ||
214 | + .frame(maxWidth: .infinity) | ||
215 | + .padding(.horizontal) | ||
216 | + | ||
217 | + Button { | ||
218 | + // Button Action | ||
219 | + print("Location tapped!") | ||
220 | + } label: { | ||
221 | + Image("location_icon", bundle: Bundle(for: MyEmptyClass.self)) | ||
222 | + .resizable() | ||
223 | + .aspectRatio(contentMode: .fit) | ||
224 | + .frame(width: self.uiscreen.height * 0.04, height: self.uiscreen.height * 0.04) | ||
225 | + } | ||
226 | + | ||
227 | + } | ||
228 | + .frame(maxWidth: .infinity) | ||
229 | + .padding(.horizontal) | ||
230 | + .padding(.vertical, 10) | ||
231 | + } | ||
232 | + } | ||
233 | + | ||
234 | + struct searchView: View { | ||
235 | + @State var searchText: String = "" | ||
236 | + | ||
237 | + var uiscreen = UIScreen.main.bounds | ||
238 | + | ||
239 | + var body: some View { | ||
240 | + HStack(alignment: .center) { | ||
241 | + HStack(alignment: .center) { | ||
242 | + Image("search_icon", bundle: Bundle(for: MyEmptyClass.self)) | ||
243 | + .resizable() | ||
244 | + .aspectRatio(contentMode: .fit) | ||
245 | + .frame(width: self.uiscreen.height * 0.025, height: self.uiscreen.height * 0.025) | ||
246 | + .padding([.top, .leading, .bottom], 10) | ||
247 | + TextField("Βρες το gift που σε ενδιαφέρει", text: $searchText) | ||
248 | + .frame(maxWidth: .infinity) | ||
249 | + .padding(.all, 10) | ||
250 | + .foregroundColor(Color(red: 0.48627450980392156, green: 0.48627450980392156, blue: 0.48627450980392156)) | ||
251 | + .font(.system(size: 16, weight: .regular, design: .default)) | ||
252 | + } | ||
253 | + .overlay( | ||
254 | + RoundedRectangle(cornerRadius: 9) | ||
255 | + .stroke(Color(red: 0.8235294117647058, green: 0.8235294117647058, blue: 0.8235294117647058), lineWidth: 1) | ||
256 | + ) | ||
257 | + | ||
258 | + Button { | ||
259 | + // Button Action | ||
260 | + print("Filters tapped!") | ||
261 | + } label: { | ||
262 | + Image("filters_btn", bundle: Bundle(for: MyEmptyClass.self)) | ||
263 | + .resizable() | ||
264 | + .aspectRatio(contentMode: .fit) | ||
265 | + .frame(width: self.uiscreen.height * 0.06, height: self.uiscreen.height * 0.04) | ||
266 | + .padding(.leading, 5) | ||
267 | + } | ||
268 | + } | ||
269 | + .frame(maxWidth: .infinity) | ||
270 | + .padding(.horizontal, 20) | ||
271 | + .padding(.vertical, 5) | ||
272 | + } | ||
273 | + } | ||
274 | + | ||
275 | + struct ImageView: View { | ||
276 | + @ObservedObject var imageLoader:ImageLoaderGifts | ||
277 | + @State var image:UIImage = UIImage() | ||
278 | + @State var width:CGFloat | ||
279 | + @State var isFill:Bool | ||
280 | + | ||
281 | + var uiscreen = UIScreen.main.bounds | ||
282 | + | ||
283 | + init(withURL url:String , width:CGFloat, isFill:Bool) { | ||
284 | + imageLoader = ImageLoaderGifts(urlString:url) | ||
285 | + self.width = width | ||
286 | + self.isFill = isFill | ||
287 | + } | ||
288 | + | ||
289 | + var body: some View { | ||
290 | + | ||
291 | + Image(uiImage: image) | ||
292 | + .resizable() | ||
293 | + .aspectRatio(contentMode: isFill ? .fill : .fit) | ||
294 | + .frame(width: self.width) | ||
295 | + .frame(maxHeight: .infinity) | ||
296 | + .onReceive(imageLoader.didChange) { data in | ||
297 | + self.image = UIImage(data: data) ?? UIImage() | ||
298 | + } | ||
120 | } | 299 | } |
121 | } | 300 | } |
301 | + | ||
302 | + | ||
303 | + struct giftItemView: View { | ||
304 | + var item: CampaignItemModel | ||
305 | + var isFirst: Bool | ||
306 | + var isLast: Bool | ||
307 | + | ||
308 | + var uiscreen = UIScreen.main.bounds | ||
309 | + | ||
310 | + var body: some View { | ||
311 | + Button { | ||
312 | + // GiftItem Action | ||
313 | + print("GiftItem tapped!") | ||
314 | + } label: { | ||
315 | + HStack(alignment: .center) { | ||
316 | + | ||
317 | + ImageView(withURL: item.logo_url ?? "", width: self.uiscreen.width * 0.5, isFill: true) | ||
318 | + | ||
319 | + Text(item.title ?? "") | ||
320 | + .fontWeight(.regular) | ||
321 | + .font(.system(size: 16)) | ||
322 | + .foregroundColor(Color(red: 0.22745098039215686, green: 0.3215686274509804, blue: 0.4)) | ||
323 | + .multilineTextAlignment(.center) | ||
324 | + .frame(maxWidth: .infinity, maxHeight: .infinity) | ||
325 | + .padding(.all, 10) | ||
326 | + .background(Color.white) | ||
327 | + } | ||
328 | + } | ||
329 | + .frame(width: self.uiscreen.width * 0.9, height: self.uiscreen.height * 0.16) | ||
330 | + .background(Color.white) | ||
331 | + .cornerRadius(5) | ||
332 | + .shadow(color: Color(red: 0, green: 0, blue: 0, opacity: 0.16), radius: 30, x: 0, y: 3) | ||
333 | + .padding(.leading, isFirst ? 18 : 0) | ||
334 | + .padding(.trailing, isLast ? 18 : 0) | ||
335 | + } | ||
122 | } | 336 | } |
123 | 337 | ||
124 | - struct giftView: View { | 338 | + struct giftsContainer: View { |
125 | -// @Binding var result: NSDictionary | 339 | + @State var gifts:Array<CampaignItemModel> = [] |
340 | + @State var title:String = "" | ||
126 | 341 | ||
127 | var uiscreen = UIScreen.main.bounds | 342 | var uiscreen = UIScreen.main.bounds |
128 | 343 | ||
129 | var body: some View { | 344 | var body: some View { |
130 | - ZStack { | 345 | + VStack(alignment: .leading) { |
131 | -// URLImage(url: URL(string: result["img_preview"] as! String? ?? "")) | 346 | + |
132 | -// .resizable() | 347 | + Text(title) |
133 | -// .frame(width: self.uiscreen.height * 0.04, height: self.uiscreen.height * 0.04) | 348 | + .fontWeight(.bold) |
134 | -// .cornerRadius(CGFloat(self.uiscreen.height * 0.02)) | 349 | + .font(.system(size: 17)) |
135 | -// .offset(x: -self.uiscreen.width / 2 + self.uiscreen.width * 0.14, y: -self.uiscreen.height * 0.07) | 350 | + .foregroundColor(Color.white) |
351 | + .multilineTextAlignment(.leading) | ||
352 | + .padding(.horizontal) | ||
353 | + .padding(.top, self.uiscreen.height * 0.05) | ||
354 | + .padding(.bottom, self.uiscreen.height * 0.015) | ||
355 | + | ||
356 | + ScrollView(.horizontal, showsIndicators: false) { | ||
357 | + HStack(alignment: .center) { | ||
358 | + ForEach(Array(gifts.enumerated()), id: \.offset) { index, item in | ||
359 | + | ||
360 | + giftItemView(item: item, isFirst: index == 0, isLast: index == (gifts.count-1)) | ||
361 | + } | ||
362 | + | ||
363 | + } | ||
364 | + .frame(maxWidth: .infinity) | ||
365 | + } | ||
366 | + .frame(maxWidth: .infinity) | ||
367 | + | ||
368 | + } | ||
369 | + .frame(maxWidth: .infinity) | ||
370 | + } | ||
371 | + } | ||
372 | + | ||
373 | + struct couponsContainer: View { | ||
374 | + @State var coupons:Array<CouponSetItemModel> = [] | ||
375 | + @State var title:String = "" | ||
376 | + | ||
377 | + var uiscreen = UIScreen.main.bounds | ||
378 | + | ||
379 | + var body: some View { | ||
380 | + VStack(alignment: .leading) { | ||
381 | + | ||
382 | + Text(title) | ||
383 | + .fontWeight(.bold) | ||
384 | + .font(.system(size: 17)) | ||
385 | + .foregroundColor(Color.white) | ||
386 | + .multilineTextAlignment(.leading) | ||
387 | + .padding(.horizontal) | ||
388 | + .padding(.top, self.uiscreen.height * 0.05) | ||
389 | + .padding(.bottom, self.uiscreen.height * 0.015) | ||
390 | + | ||
391 | + ScrollView(.horizontal, showsIndicators: false) { | ||
392 | + HStack(alignment: .center) { | ||
393 | + ForEach(Array(coupons.enumerated()), id: \.offset) { index, item in | ||
394 | + | ||
395 | + couponItemView(item: item, isFirst: index == 0, isLast: index == (coupons.count-1)) | ||
396 | + } | ||
397 | + | ||
398 | + } | ||
399 | + .frame(maxWidth: .infinity) | ||
400 | + } | ||
401 | + .frame(maxWidth: .infinity) | ||
402 | + | ||
403 | + } | ||
404 | + .frame(maxWidth: .infinity) | ||
405 | + .padding(.bottom, self.uiscreen.height * 0.1) | ||
406 | + } | ||
407 | + } | ||
408 | + | ||
409 | + struct couponItemView: View { | ||
410 | + var item: CouponSetItemModel | ||
411 | + var isFirst: Bool | ||
412 | + var isLast: Bool | ||
413 | + | ||
414 | + var uiscreen = UIScreen.main.bounds | ||
415 | + | ||
416 | + var body: some View { | ||
417 | + Button { | ||
418 | + // GiftItem Action | ||
419 | + print("GiftItem tapped!") | ||
420 | + } label: { | ||
421 | + | ||
422 | + HStack(alignment: .center) { | ||
423 | + | ||
424 | + ImageView(withURL: item.img_preview ?? "", width: self.uiscreen.width * 0.15, isFill: false) | ||
425 | + | ||
426 | + VLine() | ||
427 | + .stroke(style: StrokeStyle(lineWidth: 1, dash: [5])) | ||
428 | + .foregroundColor(Color(red: 0.4392156862745098, green: 0.4392156862745098, blue: 0.4392156862745098)) | ||
429 | + .frame(width: 1) | ||
430 | + .padding(.leading, 10) | ||
431 | + | ||
432 | + VStack(alignment: .leading) { | ||
433 | + Text(item.name ?? "") | ||
434 | + .fontWeight(.medium) | ||
435 | + .font(.system(size: 16)) | ||
436 | + .foregroundColor(Color(red: 0.22745098039215686, green: 0.3215686274509804, blue: 0.4)) | ||
437 | + .multilineTextAlignment(.leading) | ||
438 | + .lineLimit(1) | ||
439 | +// .frame(maxWidth: .infinity) | ||
440 | + | ||
441 | + HStack(alignment: .center) { | ||
442 | + Text((item.discount ?? "")+"€") | ||
443 | + .fontWeight(.bold) | ||
444 | + .font(.system(size: 25)) | ||
445 | + .foregroundColor(Color(red: 0.22745098039215686, green: 0.3215686274509804, blue: 0.4)) | ||
446 | + .multilineTextAlignment(.leading) | ||
447 | + .lineLimit(1) | ||
448 | +// .frame(width: self.uiscreen.width * 0.3) | ||
449 | +// .frame(maxWidth: .infinity, maxHeight: .infinity) | ||
450 | + | ||
451 | + Text(item.short_description ?? "") | ||
452 | + .fontWeight(.medium) | ||
453 | + .font(.system(size: 11)) | ||
454 | + .foregroundColor(Color(red: 0.3803921568627451, green: 0.44313725490196076, blue: 0.5058823529411764)) | ||
455 | + .multilineTextAlignment(.leading) | ||
456 | + .lineLimit(3) | ||
457 | +// .frame(maxWidth: .infinity) | ||
458 | +// .padding(.leading, 10) | ||
459 | + } | ||
460 | +// .padding(.vertical, 5) | ||
461 | + .frame(maxHeight: .infinity) | ||
462 | + | ||
463 | + Text("Ισχύει έως "+(item.expiration ?? "")) | ||
464 | + .fontWeight(.medium) | ||
465 | + .font(.system(size: 11)) | ||
466 | + .foregroundColor(Color(red: 0.3803921568627451, green: 0.44313725490196076, blue: 0.5058823529411764)) | ||
467 | + .multilineTextAlignment(.leading) | ||
468 | +// .frame(maxWidth: .infinity) | ||
469 | +// .frame(maxWidth: .infinity, maxHeight: .infinity) | ||
470 | +// .padding(.all, 10) | ||
471 | + } | ||
472 | + .padding(.all, 10) | ||
473 | +// .frame(maxWidth: .infinity, maxHeight: .infinity) | ||
136 | 474 | ||
475 | + Spacer() | ||
476 | + | ||
477 | + } | ||
478 | + .padding(.leading, 28) | ||
479 | + .padding(.trailing) | ||
480 | + } | ||
481 | + .frame(width: self.uiscreen.width * 0.9, height: self.uiscreen.height * 0.14) | ||
482 | + .cornerRadius(5) | ||
483 | + .shadow(color: Color(red: 0, green: 0, blue: 0, opacity: 0.16), radius: 30, x: 0, y: 3) | ||
484 | + .padding(.leading, isFirst ? 18 : 0) | ||
485 | + .padding(.trailing, isLast ? 18 : 0) | ||
486 | + .background( | ||
487 | + Image("coupon_bg", bundle: Bundle(for: MyEmptyClass.self)) | ||
488 | + .resizable(resizingMode: .stretch) | ||
489 | + .frame(maxWidth: .infinity, maxHeight: .infinity) | ||
490 | + .padding(.leading, isFirst ? 18 : 0) | ||
491 | + .padding(.trailing, isLast ? 18 : 0) | ||
492 | + ) | ||
493 | + } | ||
494 | + } | ||
495 | + | ||
496 | + struct VLine: Shape { | ||
497 | + func path(in rect: CGRect) -> Path { | ||
498 | + Path { path in | ||
499 | + path.move(to: CGPoint(x: rect.midX, y: rect.minY)) | ||
500 | + path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY)) | ||
137 | } | 501 | } |
138 | -// .background( | ||
139 | -// Image("coupons_container", bundle: Bundle(for: MyEmptyClass.self)) | ||
140 | -// .resizable() | ||
141 | -//// .edgesIgnoringSafeArea(.all) | ||
142 | -// .frame(width: UIScreen.main.bounds.width * 0.8, height: UIScreen.main.bounds.height * 0.17) | ||
143 | -// ) | ||
144 | } | 502 | } |
145 | } | 503 | } |
146 | 504 | ||
... | @@ -148,48 +506,63 @@ extension GiftsView { | ... | @@ -148,48 +506,63 @@ extension GiftsView { |
148 | 506 | ||
149 | @available(iOS 13.0.0, *) | 507 | @available(iOS 13.0.0, *) |
150 | struct GiftsView: View { | 508 | struct GiftsView: View { |
509 | + var parentView: UIView | ||
151 | 510 | ||
152 | - var data:Array<NSDictionary> = CouponDataModel().getData | 511 | + var coupons:Array<CouponSetItemModel> = CouponDataModel().getData |
153 | - var campains:Any = CampaignDataModel() | 512 | + var campains:Array<CampaignItemModel> = CampaignDataModel().getData.filter { $0.offer_category == "gifts_for_you" } |
154 | 513 | ||
155 | var uiscreen = UIScreen.main.bounds | 514 | var uiscreen = UIScreen.main.bounds |
156 | 515 | ||
516 | + func goBack(){ | ||
517 | + for subview in parentView.subviews { | ||
518 | + if(subview.tag == 5) { | ||
519 | + subview.removeFromSuperview() | ||
520 | + } | ||
521 | + } | ||
522 | + } | ||
523 | + | ||
157 | var body: some View { | 524 | var body: some View { |
158 | VStack { | 525 | VStack { |
159 | - headerView() | 526 | + headerView(goBack: goBack) |
160 | -// ScrollView { | 527 | + searchView() |
161 | -// VStack { | 528 | + |
162 | -// if (data.count) > 0 { | 529 | + ScrollView(showsIndicators: false) { |
163 | -// ForEach(data, id: \.self) { result in | 530 | + VStack { |
164 | -// couponView(result: result) | 531 | + if (campains.filter { $0.subcategory == "gifts" }.count) > 0 { |
165 | -// } | 532 | + giftsContainer(gifts: campains.filter { $0.subcategory == "gifts" }, title: "ΔΩΡΑ") |
166 | -// } | ||
167 | -// } | ||
168 | -// .frame(width:self.uiscreen.width, height:self.uiscreen.height ) | ||
169 | -// } | ||
170 | } | 533 | } |
534 | + | ||
535 | + | ||
536 | + if (campains.filter { $0.subcategory == "rewards" }.count) > 0 { | ||
537 | + giftsContainer(gifts: campains.filter { $0.subcategory == "rewards"}, title: "ΕΠΙΒΡΑΒΕΥΣΕΙΣ" ) | ||
171 | } | 538 | } |
172 | -} | ||
173 | -#endif | ||
174 | -//struct ProfileView_Previews: PreviewProvider { | ||
175 | -// static var previews: some View { | ||
176 | -// ProfileView() | ||
177 | -// } | ||
178 | -//} | ||
179 | 539 | ||
180 | -@available(iOS 13.0.0, *) | 540 | + if (coupons.count) > 0 { |
181 | -struct Previews_GiftsView_Previews: PreviewProvider { | 541 | + couponsContainer(coupons: coupons, title: "ΚΟΥΠΟΝΙΑ" ) |
182 | - static var uiscreen = UIScreen.main.bounds | ||
183 | - static var previews: some View { | ||
184 | - ZStack { | ||
185 | - Image("ic_back", bundle: Bundle(for: MyEmptyClass.self)) | ||
186 | - .resizable() | ||
187 | - .frame(width: self.uiscreen.height * 0.025, height: self.uiscreen.height * 0.02) | ||
188 | - .offset(x: -self.uiscreen.width / 2 + self.uiscreen.width * 0.05, y: self.uiscreen.height * 0.07) | ||
189 | - Text("Όλα τα κουπόνια μου") | ||
190 | - .frame(width: self.uiscreen.width * 0.8, height: self.uiscreen.height * 0.025, alignment: .center) | ||
191 | - .offset( y: self.uiscreen.height * 0.07) | ||
192 | } | 542 | } |
193 | 543 | ||
194 | } | 544 | } |
545 | + .frame(width:self.uiscreen.width) | ||
546 | + } | ||
547 | + .background( | ||
548 | + LinearGradient(gradient: Gradient(colors: [Color(red: 0.06, green: 0.67, blue: 0.84), Color(red: 0.47, green: 0.75, blue: 0.43)]), startPoint: .top, endPoint: .bottom) | ||
549 | + ) | ||
550 | + .cornerRadius(30, corners: [.topLeft]) | ||
551 | + .frame(width:self.uiscreen.width) | ||
552 | + .frame(maxHeight: .infinity) | ||
553 | + } | ||
554 | + .edgesIgnoringSafeArea([.bottom]) | ||
555 | + .frame(width:self.uiscreen.width) | ||
556 | + .frame(maxHeight: .infinity) | ||
557 | + } | ||
195 | } | 558 | } |
559 | +#endif | ||
560 | + | ||
561 | +//@available(iOS 13.0.0, *) | ||
562 | +//struct GiftsView_Previews: PreviewProvider { | ||
563 | +// static var previews: some View { | ||
564 | +// | ||
565 | +// GiftsView() | ||
566 | +// | ||
567 | +// } | ||
568 | +//} | ... | ... |
... | @@ -11,8 +11,8 @@ import SwiftUI | ... | @@ -11,8 +11,8 @@ import SwiftUI |
11 | @available(iOS 13.0.0, *) | 11 | @available(iOS 13.0.0, *) |
12 | @objc public class GiftsViewInterface : NSObject { | 12 | @objc public class GiftsViewInterface : NSObject { |
13 | 13 | ||
14 | - @objc static public func giftsViewController() -> UIViewController { | 14 | + @objc(giftsViewController:) static public func giftsViewController(parentView: UIView?) -> UIViewController { |
15 | - return UIHostingController(rootView: GiftsView()) | 15 | + return UIHostingController(rootView: GiftsView(parentView: parentView!)) |
16 | } | 16 | } |
17 | 17 | ||
18 | } | 18 | } | ... | ... |
... | @@ -16,7 +16,7 @@ | ... | @@ -16,7 +16,7 @@ |
16 | - (void) setToStage; | 16 | - (void) setToStage; |
17 | - (void) setLang:(NSString*) lang; | 17 | - (void) setLang:(NSString*) lang; |
18 | - (UIViewController *) openCoupons:(UIView*) parentView; | 18 | - (UIViewController *) openCoupons:(UIView*) parentView; |
19 | -- (UIViewController *) openGifts; | 19 | +- (UIViewController *) openGifts:(UIView*) parentView; |
20 | - (void) applicationDidEnterBackground:(UIApplication *)application; | 20 | - (void) applicationDidEnterBackground:(UIApplication *)application; |
21 | - (void) applicationWillEnterForeground:(UIApplication *)application; | 21 | - (void) applicationWillEnterForeground:(UIApplication *)application; |
22 | - (void) applicationDidBecomeActive:(UIApplication *)application; | 22 | - (void) applicationDidBecomeActive:(UIApplication *)application; | ... | ... |
... | @@ -52,12 +52,9 @@ NSString *LANG; | ... | @@ -52,12 +52,9 @@ NSString *LANG; |
52 | return couponsViewController; | 52 | return couponsViewController; |
53 | } | 53 | } |
54 | 54 | ||
55 | -- (UIViewController *) openGifts{ | 55 | +- (UIViewController *) openGifts:(UIView*) parentView{ |
56 | 56 | ||
57 | - UIViewController *giftsViewController = [GiftsViewInterface giftsViewController]; | 57 | + UIViewController *giftsViewController = [GiftsViewInterface giftsViewController:parentView]; |
58 | -// controller = [[UINavigationController alloc]initWithRootViewController:profileViewController]; | ||
59 | - | ||
60 | -// [window makeKeyAndVisible]; | ||
61 | return giftsViewController; | 58 | return giftsViewController; |
62 | } | 59 | } |
63 | 60 | ... | ... |
-
Please register or login to post a comment