Manos Chorianopoulos

add DetailsView

Showing 40 changed files with 751 additions and 2 deletions
1 +{
2 + "images" : [
3 + {
4 + "filename" : "ic_cart.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_cart-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_cart-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" : "ic_cosmote_logo.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_cosmote_logo-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_cosmote_logo-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" : "ic_down.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_down-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_down-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" : "ic_gift.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_gift-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_gift-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" : "ic_plane.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_plane-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_plane-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" : "ic_smile.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_smile-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_smile-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" : "ic_steering_wheel.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_steering_wheel-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_steering_wheel-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" : "ic_up.png",
5 + "idiom" : "universal",
6 + "scale" : "1x"
7 + },
8 + {
9 + "filename" : "ic_up-1.png",
10 + "idiom" : "universal",
11 + "scale" : "2x"
12 + },
13 + {
14 + "filename" : "ic_up-2.png",
15 + "idiom" : "universal",
16 + "scale" : "3x"
17 + }
18 + ],
19 + "info" : {
20 + "author" : "xcode",
21 + "version" : 1
22 + }
23 +}
...@@ -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>1</integer> 10 + <integer>0</integer>
11 </dict> 11 </dict>
12 </dict> 12 </dict>
13 </dict> 13 </dict>
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
11 1E7086672811A96E00704CA8 /* CouponBarcodeViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7086662811A96E00704CA8 /* CouponBarcodeViewInterface.swift */; }; 11 1E7086672811A96E00704CA8 /* CouponBarcodeViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7086662811A96E00704CA8 /* CouponBarcodeViewInterface.swift */; };
12 1E735FF2281067320050A298 /* CampaignWebview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E735FF1281067320050A298 /* CampaignWebview.swift */; }; 12 1E735FF2281067320050A298 /* CampaignWebview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E735FF1281067320050A298 /* CampaignWebview.swift */; };
13 1E735FF42810681E0050A298 /* CampaignWebviewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E735FF32810681E0050A298 /* CampaignWebviewInterface.swift */; }; 13 1E735FF42810681E0050A298 /* CampaignWebviewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E735FF32810681E0050A298 /* CampaignWebviewInterface.swift */; };
14 + 1E7536732822B72500149CC9 /* DetailsViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7536722822B72500149CC9 /* DetailsViewInterface.swift */; };
15 + 1E7536752822B76000149CC9 /* DetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7536742822B76000149CC9 /* DetailsView.swift */; };
14 1E879E25281AC96A0089F489 /* OldCouponsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E879E24281AC96A0089F489 /* OldCouponsView.swift */; }; 16 1E879E25281AC96A0089F489 /* OldCouponsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E879E24281AC96A0089F489 /* OldCouponsView.swift */; };
15 1E879E27281AC99F0089F489 /* OldCouponsViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E879E26281AC99F0089F489 /* OldCouponsViewInterface.swift */; }; 17 1E879E27281AC99F0089F489 /* OldCouponsViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E879E26281AC99F0089F489 /* OldCouponsViewInterface.swift */; };
16 1E98EC1428199C4F007524A0 /* AllGiftsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E98EC1328199C4F007524A0 /* AllGiftsView.swift */; }; 18 1E98EC1428199C4F007524A0 /* AllGiftsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E98EC1328199C4F007524A0 /* AllGiftsView.swift */; };
...@@ -156,6 +158,8 @@ ...@@ -156,6 +158,8 @@
156 1E7086662811A96E00704CA8 /* CouponBarcodeViewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponBarcodeViewInterface.swift; sourceTree = "<group>"; }; 158 1E7086662811A96E00704CA8 /* CouponBarcodeViewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponBarcodeViewInterface.swift; sourceTree = "<group>"; };
157 1E735FF1281067320050A298 /* CampaignWebview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampaignWebview.swift; sourceTree = "<group>"; }; 159 1E735FF1281067320050A298 /* CampaignWebview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampaignWebview.swift; sourceTree = "<group>"; };
158 1E735FF32810681E0050A298 /* CampaignWebviewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampaignWebviewInterface.swift; sourceTree = "<group>"; }; 160 1E735FF32810681E0050A298 /* CampaignWebviewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CampaignWebviewInterface.swift; sourceTree = "<group>"; };
161 + 1E7536722822B72500149CC9 /* DetailsViewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsViewInterface.swift; sourceTree = "<group>"; };
162 + 1E7536742822B76000149CC9 /* DetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsView.swift; sourceTree = "<group>"; };
159 1E879E24281AC96A0089F489 /* OldCouponsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OldCouponsView.swift; sourceTree = "<group>"; }; 163 1E879E24281AC96A0089F489 /* OldCouponsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OldCouponsView.swift; sourceTree = "<group>"; };
160 1E879E26281AC99F0089F489 /* OldCouponsViewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OldCouponsViewInterface.swift; sourceTree = "<group>"; }; 164 1E879E26281AC99F0089F489 /* OldCouponsViewInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OldCouponsViewInterface.swift; sourceTree = "<group>"; };
161 1E98EC1328199C4F007524A0 /* AllGiftsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllGiftsView.swift; sourceTree = "<group>"; }; 165 1E98EC1328199C4F007524A0 /* AllGiftsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllGiftsView.swift; sourceTree = "<group>"; };
...@@ -359,6 +363,8 @@ ...@@ -359,6 +363,8 @@
359 E639EFA0280810E300B9DD94 /* CouponsView.swift */, 363 E639EFA0280810E300B9DD94 /* CouponsView.swift */,
360 E639EFA1280810E300B9DD94 /* CouponsViewInterface.swift */, 364 E639EFA1280810E300B9DD94 /* CouponsViewInterface.swift */,
361 1EBEB02C280D69D800BF802C /* GiftsView.swift */, 365 1EBEB02C280D69D800BF802C /* GiftsView.swift */,
366 + 1E7536722822B72500149CC9 /* DetailsViewInterface.swift */,
367 + 1E7536742822B76000149CC9 /* DetailsView.swift */,
362 1E98EC1328199C4F007524A0 /* AllGiftsView.swift */, 368 1E98EC1328199C4F007524A0 /* AllGiftsView.swift */,
363 1E879E24281AC96A0089F489 /* OldCouponsView.swift */, 369 1E879E24281AC96A0089F489 /* OldCouponsView.swift */,
364 1E879E26281AC99F0089F489 /* OldCouponsViewInterface.swift */, 370 1E879E26281AC99F0089F489 /* OldCouponsViewInterface.swift */,
...@@ -827,6 +833,7 @@ ...@@ -827,6 +833,7 @@
827 1E98EC1628199C86007524A0 /* AllGiftsViewInterface.swift in Sources */, 833 1E98EC1628199C86007524A0 /* AllGiftsViewInterface.swift in Sources */,
828 E6D8DF1427A942920006A3A9 /* WLLocationManager.m in Sources */, 834 E6D8DF1427A942920006A3A9 /* WLLocationManager.m in Sources */,
829 E6D8DF6027A9429E0006A3A9 /* MyApi.m in Sources */, 835 E6D8DF6027A9429E0006A3A9 /* MyApi.m in Sources */,
836 + 1E7536752822B76000149CC9 /* DetailsView.swift in Sources */,
830 E6D8DF3F27A942920006A3A9 /* AFImageDownloader.m in Sources */, 837 E6D8DF3F27A942920006A3A9 /* AFImageDownloader.m in Sources */,
831 E6D8DEF727A942920006A3A9 /* WLNativeAdsCollectionMode.m in Sources */, 838 E6D8DEF727A942920006A3A9 /* WLNativeAdsCollectionMode.m in Sources */,
832 E6D8DEF427A942920006A3A9 /* WLCustomNativeCollectionViewCell.m in Sources */, 839 E6D8DEF427A942920006A3A9 /* WLCustomNativeCollectionViewCell.m in Sources */,
...@@ -849,6 +856,7 @@ ...@@ -849,6 +856,7 @@
849 E6D8DEEE27A942920006A3A9 /* WarplyReactMethods.m in Sources */, 856 E6D8DEEE27A942920006A3A9 /* WarplyReactMethods.m in Sources */,
850 E6D8DEF927A942920006A3A9 /* WLNativeAdCollectionViewCell.m in Sources */, 857 E6D8DEF927A942920006A3A9 /* WLNativeAdCollectionViewCell.m in Sources */,
851 E634A36B2822999B0069DE27 /* CouponsViewController.swift in Sources */, 858 E634A36B2822999B0069DE27 /* CouponsViewController.swift in Sources */,
859 + 1E7536732822B72500149CC9 /* DetailsViewInterface.swift in Sources */,
852 E6D8DF4E27A942920006A3A9 /* FMDatabaseQueue.m in Sources */, 860 E6D8DF4E27A942920006A3A9 /* FMDatabaseQueue.m in Sources */,
853 E6D8DF0827A942920006A3A9 /* WLBaseItem.m in Sources */, 861 E6D8DF0827A942920006A3A9 /* WLBaseItem.m in Sources */,
854 E6D8DF0727A942920006A3A9 /* WLInboxItemViewController.m in Sources */, 862 E6D8DF0727A942920006A3A9 /* WLInboxItemViewController.m in Sources */,
......
...@@ -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>0</integer> 10 + <integer>1</integer>
11 </dict> 11 </dict>
12 </dict> 12 </dict>
13 </dict> 13 </dict>
......
1 +//
2 +// DetailsView.swift
3 +// WarplySDKFrameworkIOS
4 +//
5 +// Created by Manos Chorianopoulos on 3/5/22.
6 +//
7 +
8 +
9 +#if canImport(SwiftUI)
10 +import SwiftUI
11 +import Combine
12 +import Foundation
13 +import UIKit
14 +
15 +
16 +extension DetailsView {
17 + struct headerView: View {
18 + var goBack: () -> ()
19 +
20 + var uiscreen = UIScreen.main.bounds
21 +
22 + var body: some View {
23 + HStack(alignment: .center) {
24 + Button {
25 + // Button Action
26 + print("Back Button tapped!")
27 + goBack()
28 + } label: {
29 + Image("ic_back", bundle: Bundle(for: MyEmptyClass.self))
30 + .resizable()
31 + .aspectRatio(contentMode: .fit)
32 + .frame(width: self.uiscreen.height * 0.025, height: self.uiscreen.height * 0.02)
33 + }
34 +
35 + Text("Ανάλυση")
36 + .fontWeight(.medium)
37 + .font(.system(size: 16))
38 + .foregroundColor(Color(red: 0.20784313725490197, green: 0.3176470588235294, blue: 0.40784313725490196))
39 + .multilineTextAlignment(.center)
40 + .frame(maxWidth: .infinity)
41 + .padding(.horizontal)
42 + .offset(x: -self.uiscreen.height * 0.025)
43 + }
44 + .frame(maxWidth: .infinity)
45 + .padding(.horizontal)
46 + .padding(.vertical, 10)
47 + }
48 + }
49 +
50 + struct Tabs: View {
51 + @Binding var tabs: [String] // The tab titles
52 + @Binding var selection: Int // Currently selected tab
53 +
54 + let uiscreen = UIScreen.main.bounds
55 +
56 + var body: some View {
57 + // Pack the tabs horizontally and allow them to be scrolled
58 +// GeometryReader { geometry in
59 +// ScrollView(.horizontal, showsIndicators: false) {
60 + HStack(alignment: .center, spacing: self.uiscreen.width * 0.05) {
61 + ForEach(tabs, id: \.self) {
62 + self.tab(title: $0)
63 + }
64 + }
65 + .padding(.horizontal, self.uiscreen.width * 0.1)
66 + .frame(maxWidth: .infinity)
67 + .padding(.vertical, 5)
68 +// .frame(minWidth: geometry.size.width)
69 +// }
70 +// .frame(maxWidth: .infinity)
71 +// }
72 +// .frame(maxWidth: .infinity)
73 +// }
74 + }
75 +
76 + private func tab(title: String) -> some View {
77 + let index = self.tabs.firstIndex(of: title)!
78 + let isSelected = index == selection
79 +
80 + return Button (action: {
81 + // // Allows for animated transitions of the underline,
82 + // // as well as other views on the same screen
83 + withAnimation {
84 + self.selection = index
85 + }
86 + }) {
87 + VStack(alignment: .center, spacing: 5.0) {
88 + Text(title)
89 + .font(.system(size: 16))
90 + .fontWeight(.medium)
91 + .foregroundColor(isSelected ? Color(red: 0.1803921568627451, green: 0.6980392156862745, blue: 0.7254901960784313) : Color(red: 0.20784313725490197, green: 0.3176470588235294, blue: 0.40784313725490196))
92 + .multilineTextAlignment(.center)
93 + .frame(maxWidth: .infinity)
94 +
95 + VStack {}
96 + .frame(height: 3)
97 + .frame(width: uiscreen.width * 0.2)
98 + .foregroundColor(.clear)
99 + .background(isSelected ?
100 + 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: .leading, endPoint: .trailing)
101 + : LinearGradient(gradient: Gradient(colors: [.clear, .clear]), startPoint: .leading, endPoint: .trailing)
102 + )
103 + .cornerRadius(20)
104 + }
105 + .frame(maxWidth: .infinity)
106 + }
107 + .frame(maxWidth: .infinity)
108 +
109 + }
110 + }
111 +
112 + struct ImageView: View {
113 + @ObservedObject var imageLoader:UrlImageModel
114 + @State var width:CGFloat
115 + @State var isFill:Bool
116 +
117 + var uiscreen = UIScreen.main.bounds
118 +
119 + init(withURL url:String , width:CGFloat, isFill:Bool) {
120 + imageLoader = UrlImageModel(urlString:url)
121 + self.width = width
122 + self.isFill = isFill
123 + }
124 +
125 + var body: some View {
126 +
127 + Image(uiImage: imageLoader.image ?? UIImage())
128 + .resizable()
129 + .aspectRatio(contentMode: isFill ? .fill : .fit)
130 + .frame(width: self.width)
131 + .frame(maxHeight: .infinity)
132 + }
133 + }
134 +
135 +
136 +
137 + struct DropdownOption: Hashable {
138 + let key: String
139 + let value: String
140 +
141 + public static func == (lhs: DropdownOption, rhs: DropdownOption) -> Bool {
142 + return lhs.key == rhs.key
143 + }
144 + }
145 +
146 + struct DropdownRow: View {
147 + var option: DropdownOption
148 + var onOptionSelected: ((_ option: DropdownOption) -> Void)?
149 +
150 + var body: some View {
151 + Button(action: {
152 + if let onOptionSelected = self.onOptionSelected {
153 + onOptionSelected(self.option)
154 + }
155 + }) {
156 + HStack {
157 + Text(self.option.value)
158 + .font(.system(size: 14))
159 + .fontWeight(.regular)
160 + .foregroundColor(Color(red: 0.23529411764705882, green: 0.23137254901960785, blue: 0.2823529411764706))
161 + Spacer()
162 + }
163 + }
164 + .padding(.horizontal, 16)
165 + .padding(.vertical, 5)
166 + }
167 + }
168 +
169 + struct Dropdown: View {
170 + var options: [DropdownOption]
171 + var onOptionSelected: ((_ option: DropdownOption) -> Void)?
172 + var backColor: Color
173 +
174 + var body: some View {
175 + ScrollView {
176 + VStack(alignment: .leading, spacing: 0) {
177 + ForEach(self.options, id: \.self) { option in
178 + DropdownRow(option: option, onOptionSelected: self.onOptionSelected)
179 + }
180 + }
181 + }
182 + .frame(minHeight: CGFloat(options.count) * 30, maxHeight: 250)
183 + .padding(.vertical, 5)
184 + .background(self.backColor)
185 + .cornerRadius(8)
186 + }
187 + }
188 +
189 + struct DropdownSelector: View {
190 + @State private var shouldShowDropdown = false
191 + @State private var selectedOption: DropdownOption? = nil
192 +// var placeholder: String
193 + var options: [DropdownOption]
194 + var onOptionSelected: ((_ option: DropdownOption) -> Void)?
195 + var backColor: Color
196 + private let buttonHeight: CGFloat = 50
197 +
198 + init(options: [DropdownOption], onOptionSelected: ((_ option: DropdownOption) -> Void)?, backColor: Color) {
199 + self.selectedOption = options[0]
200 + self.options = options
201 + self.onOptionSelected = onOptionSelected
202 + self.backColor = backColor
203 + }
204 +
205 + var body: some View {
206 + Button(action: {
207 + self.shouldShowDropdown.toggle()
208 + }) {
209 + HStack {
210 +// Text(selectedOption == nil ? placeholder : selectedOption!.value)
211 + Text(selectedOption?.value ?? "")
212 + .font(.system(size: 14))
213 + .fontWeight(.bold)
214 + .foregroundColor(Color(red: 0.23529411764705882, green: 0.23137254901960785, blue: 0.2823529411764706))
215 +// .foregroundColor(selectedOption == nil ? Color.gray: Color.black)
216 +
217 + Spacer()
218 +
219 + Image((self.shouldShowDropdown ? "ic_up" : "ic_down"), bundle: Bundle(for: MyEmptyClass.self))
220 + .resizable()
221 + .aspectRatio(contentMode: .fit)
222 + .frame(width: 15, height: 10)
223 +
224 + }
225 + }
226 + .padding(.horizontal)
227 + .cornerRadius(5)
228 + .frame(height: self.buttonHeight)
229 + .frame(maxWidth: .infinity)
230 + .overlay(
231 + VStack {
232 + if self.shouldShowDropdown {
233 + Spacer(minLength: buttonHeight + 10)
234 + Dropdown(
235 + options: self.options,
236 + onOptionSelected: { option in
237 + shouldShowDropdown = false
238 + selectedOption = option
239 + self.onOptionSelected?(option)
240 + },
241 + backColor: self.backColor
242 + )
243 + }
244 + }, alignment: .topLeading
245 + )
246 + .background(
247 + RoundedRectangle(cornerRadius: 8).fill(self.backColor)
248 + )
249 + }
250 + }
251 +
252 + //MARK:- Chart Data
253 + struct ChartData: Identifiable {
254 + var id = UUID()
255 + var color : Color
256 + var percent : CGFloat
257 + var value : CGFloat
258 + var title : String
259 + var image : String
260 + }
261 +
262 + class ChartDataContainer : ObservableObject {
263 + @Published var chartData: Array<ChartData>
264 +
265 +
266 + init(chartData: Array<ChartData>) {
267 + self.chartData = chartData
268 + calc()
269 + }
270 +
271 + func calc(){
272 + var value : CGFloat = 0
273 +
274 + for i in 0..<chartData.count {
275 + value += chartData[i].percent
276 + chartData[i].value = value
277 + }
278 + }
279 + }
280 +
281 + //MARK:- Donut Graph
282 + struct DonutChart : View {
283 + @ObservedObject var charDataObj: ChartDataContainer
284 +// @State var indexOfTappedSlice = -1
285 +
286 + var uiscreen = UIScreen.main.bounds
287 +
288 + init (charDataObj: ChartDataContainer) {
289 + self.charDataObj = charDataObj
290 + }
291 +
292 + var body: some View {
293 + VStack {
294 + ZStack {
295 + ForEach(Array(charDataObj.chartData.enumerated()), id: \.offset) { index, item in
296 + Circle()
297 + .trim(from: index == 0 ? 0.0 : charDataObj.chartData[index-1].value/100,
298 + to: charDataObj.chartData[index].value/100)
299 + .stroke(charDataObj.chartData[index].color,lineWidth: 12)
300 +// .onTapGesture {
301 +// indexOfTappedSlice = indexOfTappedSlice == index ? -1 : index
302 +// }
303 +// .scaleEffect(index == indexOfTappedSlice ? 1.1 : 1.0)
304 + .animation(.spring())
305 + }
306 + Image("ic_cosmote_logo", bundle: Bundle(for: MyEmptyClass.self))
307 + .resizable()
308 + .aspectRatio(contentMode: .fit)
309 + .frame(width: self.uiscreen.width * 0.3, height: self.uiscreen.height * 0.04)
310 +
311 +// if indexOfTappedSlice != -1 {
312 +// Text(String(format: "%.2f", Double(charDataObj.chartData[indexOfTappedSlice].percent))+"%")
313 +// .font(.title)
314 +// }
315 + }
316 + .frame(width: self.uiscreen.width * 0.5, height: self.uiscreen.width * 0.5)
317 + .padding()
318 + .onAppear() {
319 + self.charDataObj.calc()
320 + }
321 + }
322 + }
323 + }
324 +
325 +}
326 +
327 +@available(iOS 13.0.0, *)
328 +struct DetailsView: View {
329 + var parentView: UIView
330 +
331 + var coupons:Array<swiftApi.CouponItemModel> = []
332 +
333 + var uiscreen = UIScreen.main.bounds
334 +
335 + @State private var selectedTab = 0
336 + @State private var selectedCouponOption: DropdownOption? = couponOptions[0]
337 + @State private var selectedRedeemOption: DropdownOption? = redeemOptions[0]
338 +
339 + let couponsChartData: Array<ChartData> = [
340 + ChartData(color: Color(red: 0.57, green: 0.82, blue: 0.02), percent: 60, value: 0, title: "Διασκέδαση", image: "ic_smile"),
341 + ChartData(color: Color(red: 0.24, green: 0.32, blue: 0.40), percent: 22, value: 0, title: "Supermarket", image: "ic_cart"),
342 + ChartData(color: Color(red: 0.14, green: 0.66, blue: 0.71), percent: 18, value: 0, title: "Ταξίδια", image: "ic_plane")
343 + ]
344 +
345 +
346 + let giftsChartData: Array<ChartData> = [
347 + ChartData(color: Color(red: 0.57, green: 0.82, blue: 0.02), percent: 50, value: 0, title: "Δώρο Γενεθλίων", image: "ic_gift"),
348 + ChartData(color: Color(red: 0.24, green: 0.32, blue: 0.40), percent: 50, value: 0, title: "Safe driving", image: "ic_steering_wheel")
349 + ]
350 +
351 + @State var charDataObj: ChartDataContainer
352 +
353 + static var uniqueKey: String {
354 + UUID().uuidString
355 + }
356 +
357 + static let couponOptions: [DropdownOption] = [
358 + DropdownOption(key: uniqueKey, value: "Κουπόνια"),
359 + DropdownOption(key: uniqueKey, value: "Δώρα"),
360 + ]
361 +
362 + static let redeemOptions: [DropdownOption] = [
363 + DropdownOption(key: uniqueKey, value: "Εξαργύρωση"),
364 + DropdownOption(key: uniqueKey, value: "Συλλογή"),
365 + ]
366 +
367 + init(parentView: UIView) { //initializer method
368 +
369 + let instanceOfMySwiftApi = swiftApi()
370 + let couponsData = instanceOfMySwiftApi.getCoupons()
371 +
372 + self.coupons = couponsData
373 + self.parentView = parentView
374 +
375 + self.charDataObj = ChartDataContainer(chartData: couponsChartData)
376 + }
377 +
378 + func goBack(){
379 + for subview in parentView.subviews {
380 + if(subview.tag == 10) {
381 + subview.removeFromSuperview()
382 + }
383 + }
384 + }
385 +
386 + var body: some View {
387 +
388 + VStack {
389 + headerView(goBack: goBack)
390 +
391 + Tabs(tabs: .constant(["Μηνιαία", "6Μηνο", "12Μηνο"]),
392 + selection: $selectedTab)
393 +
394 + VStack {
395 + GeometryReader { geometry in
396 + ScrollView(showsIndicators: false) {
397 + VStack {
398 + VStack {
399 +
400 + DropdownSelector(
401 + // placeholder: "Δώρα",
402 + options: DetailsView.couponOptions,
403 + onOptionSelected: { option in
404 + print(option)
405 + selectedCouponOption = option
406 +
407 + if (option == DetailsView.couponOptions[0]) {
408 + self.charDataObj = ChartDataContainer(chartData: couponsChartData)
409 + } else {
410 + self.charDataObj = ChartDataContainer(chartData: giftsChartData)
411 + }
412 + },
413 + backColor: Color(red: 0.9607843137254902, green: 0.9607843137254902, blue: 0.9607843137254902)
414 + )
415 + .padding(.horizontal, 25)
416 + .padding(.top, self.uiscreen.height * 0.02)
417 + .zIndex(2)
418 +
419 + DonutChart(charDataObj: self.charDataObj)
420 + .padding(.vertical, self.uiscreen.height * 0.03)
421 +
422 + DropdownSelector(
423 + // placeholder: "Δώρα",
424 + options: DetailsView.redeemOptions,
425 + onOptionSelected: { option in
426 + selectedRedeemOption = option
427 + },
428 + backColor: Color(red: 0.9333333333333333, green: 0.9686274509803922, blue: 1.0)
429 + )
430 + .padding(.horizontal, 25)
431 + .zIndex(1)
432 +
433 + VStack {
434 + VStack(spacing: self.uiscreen.width * 0.06) {
435 + ForEach(Array(charDataObj.chartData.enumerated()), id: \.offset) { index, item in
436 + HStack {
437 + Image(charDataObj.chartData[index].image, bundle: Bundle(for: MyEmptyClass.self))
438 + .resizable()
439 + .aspectRatio(contentMode: .fit)
440 + .frame(width: self.uiscreen.height * 0.02, height: self.uiscreen.height * 0.02)
441 +
442 + Text(charDataObj.chartData[index].title)
443 + .fontWeight(.medium)
444 + .font(.system(size: 14))
445 + .foregroundColor(Color(red: 0.30196078431372547, green: 0.2980392156862745, blue: 0.34509803921568627))
446 + .padding(.horizontal)
447 +
448 + Spacer()
449 +
450 +// Text(String(format: "%.2f", Double(charDataObj.chartData[index].percent))+"%")
451 + Text(String(format: "%.0f", Double(charDataObj.chartData[index].percent))+"%")
452 + .fontWeight(.medium)
453 + .font(.system(size: 16))
454 + .foregroundColor(charDataObj.chartData[index].color)
455 + }
456 + .frame(maxWidth: .infinity)
457 + }
458 + }
459 + .padding(.all, self.uiscreen.width * 0.06)
460 + .frame(maxWidth: .infinity)
461 + }
462 + .frame(width:self.uiscreen.width * 0.86)
463 +// .frame(maxHeight: .infinity)
464 + .background(Color(red: 0.9490196078431372, green: 0.9490196078431372, blue: 0.9490196078431372, opacity: 0.49))
465 + .cornerRadius(10)
466 + .padding(.top, self.uiscreen.height * 0.04)
467 +
468 + Spacer()
469 +
470 + VStack(alignment: .center) {
471 + Button {
472 + // Button Action
473 + print("More Details Button tapped!")
474 + } label: {
475 + HStack {
476 + Text("Αναλυτικά")
477 + .fontWeight(.medium)
478 + .font(.system(size: 16))
479 + .foregroundColor(Color.white)
480 + .multilineTextAlignment(.center)
481 + .padding(.all)
482 + }
483 + .frame(maxWidth: .infinity)
484 + }
485 + .frame(width: self.uiscreen.width * 0.8)
486 + .background(Color(red: 0.4745098039215686, green: 0.7490196078431373, blue: 0.0784313725490196))
487 + .cornerRadius(7)
488 + }
489 + .frame(maxWidth: .infinity)
490 + .padding(.top, self.uiscreen.height * 0.04)
491 + .padding(.bottom, self.uiscreen.height * 0.02)
492 +// .padding(.horizontal, 25)
493 +
494 + }
495 + .frame(width:self.uiscreen.width * 0.93)
496 + .frame(maxHeight: .infinity)
497 + .background(Color.white)
498 + .cornerRadius(10)
499 + }
500 + .padding(.vertical, self.uiscreen.height * 0.02)
501 + .frame(minHeight: geometry.size.height)
502 +// .frame(maxHeight: .infinity)
503 +
504 + }
505 + .cornerRadius(10, corners: [.topLeft])
506 + .frame(width:self.uiscreen.width)
507 + .frame(maxHeight: .infinity)
508 + }
509 + .frame(width:self.uiscreen.width)
510 + .frame(maxHeight: .infinity)
511 + }
512 + .frame(width:self.uiscreen.width)
513 + .frame(maxHeight: .infinity)
514 + .padding(.top, 5)
515 + .background(
516 + Image("coupons_scrollview", bundle: Bundle(for: MyEmptyClass.self))
517 + .resizable()
518 + )
519 +
520 + }
521 + .edgesIgnoringSafeArea([.bottom])
522 + .frame(width:self.uiscreen.width)
523 + .frame(maxHeight: .infinity)
524 + }
525 +}
526 +#endif
527 +
528 +//struct DetailsView_Previews: PreviewProvider {
529 +// static var previews: some View {
530 +// DetailsView()
531 +// }
532 +//}
1 +//
2 +// DetailsViewInterface.swift
3 +// WarplySDKFrameworkIOS
4 +//
5 +// Created by Manos Chorianopoulos on 3/5/22.
6 +//
7 +
8 +import Foundation
9 +import SwiftUI
10 +
11 +@available(iOS 13.0.0, *)
12 +@objc public class DetailsViewInterface : NSObject {
13 +
14 + @objc(detailsViewController:) static public func detailsViewController(parentView: UIView?) -> UIViewController {
15 + return UIHostingController(rootView: DetailsView(parentView: parentView!))
16 + }
17 +
18 +}
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
29 - (UIViewController *) openMoreForYou:(UIView*) parentView; 29 - (UIViewController *) openMoreForYou:(UIView*) parentView;
30 - (UIViewController *) openCampaign:(UIView*) parentView campaign:(NSString*) campaign; 30 - (UIViewController *) openCampaign:(UIView*) parentView campaign:(NSString*) campaign;
31 - (UIViewController *) openSteps:(UIView*) parentView; 31 - (UIViewController *) openSteps:(UIView*) parentView;
32 +- (UIViewController *) openDetails:(UIView*) parentView;
32 - (NSDictionary *) provideInfoForCampaign; 33 - (NSDictionary *) provideInfoForCampaign;
33 - (void) applicationDidEnterBackground:(UIApplication *)application; 34 - (void) applicationDidEnterBackground:(UIApplication *)application;
34 - (void) applicationWillEnterForeground:(UIApplication *)application; 35 - (void) applicationWillEnterForeground:(UIApplication *)application;
......
...@@ -150,6 +150,12 @@ CMPedometer *pedometer; ...@@ -150,6 +150,12 @@ CMPedometer *pedometer;
150 return stepsViewController; 150 return stepsViewController;
151 } 151 }
152 152
153 +- (UIViewController *) openDetails:(UIView*) parentView{
154 +
155 + UIViewController *detailsViewController = [DetailsViewInterface detailsViewController:parentView];
156 + return detailsViewController;
157 +}
158 +
153 - (NSDictionary *) provideInfoForCampaign { 159 - (NSDictionary *) provideInfoForCampaign {
154 NSMutableDictionary* info = [[NSMutableDictionary alloc] init]; 160 NSMutableDictionary* info = [[NSMutableDictionary alloc] init];
155 info[@"web_id"] = [Warply sharedService].webId; 161 info[@"web_id"] = [Warply sharedService].webId;
......