@momo-kits/native-kits 0.114.2-beta.1 → 0.114.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compose/build.gradle.kts +1 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +28 -30
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +29 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +3 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/dateTimePicker/DateTimePicker.kt +178 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/dateTimePicker/DateTimePickerExample.kt +90 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/dateTimePicker/DateTimePickerTypes.kt +15 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/dateTimePicker/DateTimePickerUtils.kt +226 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/dateTimePicker/WheelPicker.kt +201 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +83 -123
- package/ios/Application/ApplicationEnvironment.swift +17 -9
- package/ios/Application/HeaderRight.swift +29 -30
- package/ios/Template/TrustBanner/TrustBanner.swift +75 -144
- package/local.properties +2 -2
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ public struct HeaderRightData {
|
|
|
6
6
|
var useMore: Bool
|
|
7
7
|
var tools: [ToolGroup]
|
|
8
8
|
var toolCallback: ((String) -> Void)?
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
public init(
|
|
11
11
|
useShortcut: Bool = false,
|
|
12
12
|
useMore: Bool = false,
|
|
@@ -25,7 +25,7 @@ public struct Tool {
|
|
|
25
25
|
var icon: String
|
|
26
26
|
var showBadge: Bool
|
|
27
27
|
var name: [String: String]
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
public init(
|
|
30
30
|
key: String,
|
|
31
31
|
icon: String,
|
|
@@ -37,7 +37,7 @@ public struct Tool {
|
|
|
37
37
|
self.showBadge = showBadge
|
|
38
38
|
self.name = name
|
|
39
39
|
}
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
func toMap() -> [String: Any] {
|
|
42
42
|
return [
|
|
43
43
|
"key": key,
|
|
@@ -51,7 +51,7 @@ public struct Tool {
|
|
|
51
51
|
public struct ToolGroup {
|
|
52
52
|
var title: [String: String]
|
|
53
53
|
var items: [Tool]
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
public init(
|
|
56
56
|
title: [String: String] = [:],
|
|
57
57
|
items: [Tool]
|
|
@@ -59,7 +59,7 @@ public struct ToolGroup {
|
|
|
59
59
|
self.title = title
|
|
60
60
|
self.items = items
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
func toMap() -> [String: Any] {
|
|
64
64
|
return [
|
|
65
65
|
"title": title,
|
|
@@ -79,7 +79,7 @@ public struct HeaderRight: View {
|
|
|
79
79
|
self.headerRight = headerRight
|
|
80
80
|
}
|
|
81
81
|
var headerRight: HeaderRightData?
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
public var body: some View {
|
|
84
84
|
HStack(alignment: .center) {
|
|
85
85
|
ToolkitHeaderRight(headerRight: headerRight)
|
|
@@ -92,17 +92,17 @@ struct ToolkitHeaderRight: View {
|
|
|
92
92
|
@State private var isFavorite: Bool = false
|
|
93
93
|
@State private var isLoading: Bool = false
|
|
94
94
|
@EnvironmentObject private var environment: ApplicationEnvironment
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
// MARK: - Actions
|
|
97
97
|
private func onPressShortcut() {
|
|
98
|
-
environment.composeApi
|
|
98
|
+
environment.composeApi?.request(
|
|
99
99
|
funcName: "onToolAction",
|
|
100
100
|
params: ["item": ["key": "onFavorite"]]
|
|
101
101
|
) { _ in
|
|
102
102
|
isFavorite.toggle()
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
private func onPressHelpCenter() {
|
|
107
107
|
let context = environment.applicationContext
|
|
108
108
|
let paramMap: [String: Any] = [
|
|
@@ -112,20 +112,19 @@ struct ToolkitHeaderRight: View {
|
|
|
112
112
|
"icon": context?.appIcon,
|
|
113
113
|
"description": context?.description
|
|
114
114
|
]
|
|
115
|
-
environment.composeApi
|
|
115
|
+
environment.composeApi?.request(
|
|
116
116
|
funcName: "showHelpCenter",
|
|
117
117
|
params: paramMap
|
|
118
118
|
) { _ in }
|
|
119
119
|
}
|
|
120
|
-
|
|
120
|
+
|
|
121
121
|
private func onPressClose() {
|
|
122
|
-
environment.composeApi
|
|
122
|
+
environment.composeApi?.request(
|
|
123
123
|
funcName: "dismiss",
|
|
124
124
|
params: ""
|
|
125
125
|
) { _ in }
|
|
126
126
|
}
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
|
|
129
128
|
private func onPressMore() {
|
|
130
129
|
let context = environment.applicationContext
|
|
131
130
|
let params: [String: Any] = [
|
|
@@ -136,13 +135,13 @@ struct ToolkitHeaderRight: View {
|
|
|
136
135
|
"name": context?.appName,
|
|
137
136
|
"icon": context?.appIcon,
|
|
138
137
|
"description": context?.description,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
138
|
+
"support": context?.support,
|
|
139
|
+
"toolkitConfig": context?.toolkitConfig,
|
|
140
|
+
"providerId": context?.providerId,
|
|
141
|
+
"permissions": context?.permissions
|
|
143
142
|
]
|
|
144
143
|
]
|
|
145
|
-
environment.composeApi
|
|
144
|
+
environment.composeApi?.request(
|
|
146
145
|
funcName: "showTools",
|
|
147
146
|
params: params
|
|
148
147
|
) { response in
|
|
@@ -157,12 +156,12 @@ struct ToolkitHeaderRight: View {
|
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
158
|
}
|
|
160
|
-
|
|
159
|
+
|
|
161
160
|
private func getNavigationButtonConfig() -> NavigationButtonConfig {
|
|
162
161
|
let totalTools = headerRight?.tools.reduce(0) { $0 + $1.items.count } ?? 0
|
|
163
162
|
var icon = isFavorite ? "pin_star_checked" : "pin_star"
|
|
164
163
|
var onClickHandler: () -> Void = onPressShortcut
|
|
165
|
-
|
|
164
|
+
|
|
166
165
|
if totalTools > 1 || headerRight?.useMore == true {
|
|
167
166
|
icon = "navigation_more_icon"
|
|
168
167
|
onClickHandler = onPressMore
|
|
@@ -172,16 +171,16 @@ struct ToolkitHeaderRight: View {
|
|
|
172
171
|
headerRight?.toolCallback?(singleTool.key)
|
|
173
172
|
}
|
|
174
173
|
}
|
|
175
|
-
|
|
174
|
+
|
|
176
175
|
return NavigationButtonConfig(icon: icon, onPress: onClickHandler)
|
|
177
176
|
}
|
|
178
|
-
|
|
177
|
+
|
|
179
178
|
var body: some View {
|
|
180
179
|
let navButtonConfig = getNavigationButtonConfig()
|
|
181
180
|
let showBadge = headerRight?.tools.contains { group in
|
|
182
181
|
group.items.contains { $0.showBadge }
|
|
183
182
|
} ?? false
|
|
184
|
-
|
|
183
|
+
|
|
185
184
|
HStack(alignment: .center) {
|
|
186
185
|
if headerRight?.useShortcut == true {
|
|
187
186
|
NavigationButton(
|
|
@@ -191,18 +190,18 @@ struct ToolkitHeaderRight: View {
|
|
|
191
190
|
onClick: navButtonConfig.onPress
|
|
192
191
|
)
|
|
193
192
|
}
|
|
194
|
-
|
|
193
|
+
|
|
195
194
|
HStack(alignment: .center, spacing: 0) {
|
|
196
195
|
Icon(source: "help_center", size: 20)
|
|
197
196
|
.padding(4)
|
|
198
197
|
.onTapGesture {
|
|
199
198
|
onPressHelpCenter()
|
|
200
199
|
}
|
|
201
|
-
|
|
200
|
+
|
|
202
201
|
Rectangle()
|
|
203
202
|
.fill(Colors.black20)
|
|
204
203
|
.frame(width: 0.5, height: 12)
|
|
205
|
-
|
|
204
|
+
|
|
206
205
|
Icon(source: "16_navigation_close_circle", size: 20, color: Colors.black17)
|
|
207
206
|
.padding(4)
|
|
208
207
|
.onTapGesture {
|
|
@@ -226,7 +225,7 @@ struct NavigationButton: View {
|
|
|
226
225
|
var icon: String
|
|
227
226
|
var showBadge: Bool
|
|
228
227
|
var onClick: () -> Void
|
|
229
|
-
|
|
228
|
+
|
|
230
229
|
var body: some View {
|
|
231
230
|
ZStack {
|
|
232
231
|
Circle()
|
|
@@ -235,9 +234,9 @@ struct NavigationButton: View {
|
|
|
235
234
|
Circle()
|
|
236
235
|
.stroke(Color.black.opacity(0.2), lineWidth: 0.2)
|
|
237
236
|
)
|
|
238
|
-
|
|
237
|
+
|
|
239
238
|
Icon(source: icon, size: 16)
|
|
240
|
-
|
|
239
|
+
|
|
241
240
|
if showBadge {
|
|
242
241
|
BadgeDot(size: .small)
|
|
243
242
|
.offset(x: -2, y: -2)
|
|
@@ -11,179 +11,110 @@ import SDWebImageSwiftUI
|
|
|
11
11
|
|
|
12
12
|
let jsonUrl = "https://static.momocdn.net/app/json/component-kits/design_system.json"
|
|
13
13
|
|
|
14
|
-
struct TrustBannerData: Decodable {
|
|
15
|
-
let
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
struct TrustBanner: Decodable {
|
|
19
|
-
let content: Dictionary<String, String>
|
|
14
|
+
public struct TrustBannerData: Decodable {
|
|
15
|
+
let content: [String: String]
|
|
16
|
+
let subContent: [String: String]
|
|
20
17
|
let pciImage: String
|
|
21
18
|
let sslImage: String
|
|
22
19
|
let urlConfig: String
|
|
23
|
-
let featureCode: String
|
|
24
20
|
let icons: [String]
|
|
25
21
|
let momoImage: String
|
|
26
|
-
|
|
22
|
+
|
|
27
23
|
enum CodingKeys: String, CodingKey {
|
|
28
|
-
case content
|
|
24
|
+
case content
|
|
25
|
+
case subContent
|
|
26
|
+
case pciImage
|
|
27
|
+
case sslImage
|
|
28
|
+
case icons
|
|
29
|
+
case momoImage
|
|
29
30
|
case urlConfig = "url_config"
|
|
30
|
-
case featureCode = "feature_code"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
let defaultBanner =
|
|
35
|
-
content: ["vi": "
|
|
36
|
-
"en": "
|
|
34
|
+
let defaultBanner = TrustBannerData(
|
|
35
|
+
content: ["vi": "An toàn tài sản & Bảo mật thông tin của bạn là ưu tiên hàng đầu của MoMo.",
|
|
36
|
+
"en": "Ensuring financial security and data privacy is MoMo's highest priority."],
|
|
37
|
+
subContent: [
|
|
38
|
+
"vi": "Tìm hiểu thêm",
|
|
39
|
+
"en": "Learn more"
|
|
40
|
+
],
|
|
37
41
|
pciImage: "https://static.momocdn.net/app/img/kits/trustBanner/pci.png",
|
|
38
42
|
sslImage: "https://static.momocdn.net/app/img/kits/trustBanner/ssl.png",
|
|
39
|
-
urlConfig: "
|
|
40
|
-
featureCode: "login_and_security",
|
|
43
|
+
urlConfig: "login_and_security",
|
|
41
44
|
icons: [
|
|
42
45
|
"https://static.momocdn.net/app/img/kits/trustBanner/ic_viettinbank.png",
|
|
43
46
|
"https://static.momocdn.net/app/img/kits/trustBanner/ic_agribank.png",
|
|
44
47
|
"https://static.momocdn.net/app/img/kits/trustBanner/ic_vietcombank.png",
|
|
45
48
|
"https://static.momocdn.net/app/img/kits/trustBanner/ic_bidv.png"
|
|
46
49
|
],
|
|
47
|
-
momoImage: "https://static.momocdn.net/app/img/kits/trustBanner/
|
|
50
|
+
momoImage: "https://static.momocdn.net/app/img/kits/trustBanner/ic_secu.png"
|
|
48
51
|
)
|
|
49
52
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
init() {
|
|
56
|
-
fetchData(from: jsonUrl)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
func fetchData(from urlString: String) {
|
|
60
|
-
guard let url = URL(string: urlString) else { return }
|
|
61
|
-
|
|
62
|
-
URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
|
|
63
|
-
guard let self = self else { return }
|
|
64
|
-
|
|
65
|
-
if let error = error {
|
|
66
|
-
print("Data fetching error: \(error)")
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
guard let data = data else {
|
|
71
|
-
print("No data received")
|
|
72
|
-
return
|
|
73
|
-
}
|
|
74
|
-
do {
|
|
75
|
-
let decodedData = try JSONDecoder().decode(TrustBannerData.self, from: data)
|
|
76
|
-
DispatchQueue.main.async {
|
|
77
|
-
self.trustBanner = decodedData
|
|
78
|
-
}
|
|
79
|
-
} catch {
|
|
80
|
-
print("Decoding error: \(error)")
|
|
81
|
-
}
|
|
82
|
-
}.resume()
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public struct TrustBannerView: View {
|
|
87
|
-
var serviceName: String? = ""
|
|
88
|
-
var screenName: String? = ""
|
|
89
|
-
var onPress: ((_ params: NSDictionary) -> Void)?
|
|
90
|
-
var trackEvent: ((_ eventName: String, _ params: NSDictionary) -> Void)?
|
|
91
|
-
var language: String?
|
|
92
|
-
|
|
93
|
-
@ObservedObject private var viewModel = TrustBannerViewModel()
|
|
94
|
-
|
|
95
|
-
public init(serviceName: String?,
|
|
96
|
-
screenName: String?,
|
|
97
|
-
onPress: ((_ params: NSDictionary) -> Void)?,
|
|
98
|
-
trackEvent: ((_ eventName: String,_ params: NSDictionary) -> Void)?, language: String? = "vi") {
|
|
99
|
-
if let trackEvent = trackEvent {
|
|
100
|
-
trackEvent("service_component_displayed", ["service_name": serviceName ?? "", "screen_name": screenName ?? "", "component_name": "logo_trust"])
|
|
101
|
-
}
|
|
53
|
+
public struct TrustBanner: View {
|
|
54
|
+
@EnvironmentObject var applicationEnvironment: ApplicationEnvironment
|
|
55
|
+
|
|
56
|
+
var onPress: ((String)->Void)?
|
|
57
|
+
|
|
58
|
+
public init(onPress: ((String)->Void)?) {
|
|
102
59
|
self.onPress = onPress
|
|
103
|
-
self.trackEvent = trackEvent
|
|
104
|
-
self.screenName = screenName
|
|
105
|
-
self.serviceName = serviceName
|
|
106
|
-
self.language = language
|
|
107
60
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
61
|
+
|
|
62
|
+
var language: String? = "vi"
|
|
63
|
+
|
|
64
|
+
func onPressSecurity() {
|
|
65
|
+
if (onPress != nil) {
|
|
66
|
+
onPress!(applicationEnvironment.config?.trustBanner?.urlConfig ?? defaultBanner.urlConfig)
|
|
112
67
|
}
|
|
113
68
|
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
struct TrustBannerContentView: View {
|
|
117
|
-
var trustBanner: TrustBanner
|
|
118
|
-
var onPress: ((_ params: NSDictionary) -> Void)?
|
|
119
|
-
var trackEvent: ((_ eventName: String, _ params: NSDictionary) -> Void)?
|
|
120
|
-
var serviceName: String?
|
|
121
|
-
var screenName: String?
|
|
122
|
-
var language: String?
|
|
123
69
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
70
|
+
|
|
71
|
+
public var body: some View {
|
|
72
|
+
HStack(alignment: .center, spacing: 8) {
|
|
73
|
+
WebImage(url: URL(string: applicationEnvironment.config?.trustBanner?.momoImage ?? defaultBanner.momoImage))
|
|
74
|
+
.resizable()
|
|
75
|
+
.scaledToFit()
|
|
76
|
+
.frame(width: 64, height: 64)
|
|
77
|
+
VStack(alignment: .leading){
|
|
78
|
+
Text(applicationEnvironment.config?.trustBanner?.content[language ?? "vi"] as? String ?? defaultBanner.content[language ?? "vi"])
|
|
79
|
+
.foregroundColor(Color(hex: "484848"))
|
|
80
|
+
.lineLimit(2)
|
|
81
|
+
.font(.system(size: 13, weight: Font.Weight.regular))
|
|
82
|
+
.lineSpacing(3)
|
|
83
|
+
.padding(.bottom, 8)
|
|
84
|
+
HStack {
|
|
85
|
+
HStack(spacing: 0) {
|
|
86
|
+
Text(applicationEnvironment.config?.trustBanner?.subContent[language ?? "vi"] as? String ?? defaultBanner.subContent[language ?? "vi"])
|
|
87
|
+
.foregroundColor(Colors.pink03)
|
|
88
|
+
.font(.system(size: 13, weight: .bold))
|
|
89
|
+
.padding(.trailing, 4)
|
|
90
|
+
|
|
91
|
+
Icon(source: "arrow_chevron_right_small", color: Colors.pink03)
|
|
92
|
+
}.onTapGesture {
|
|
93
|
+
onPressSecurity()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Spacer()
|
|
137
97
|
HStack{
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
.frame(width: 52, height: 20)
|
|
147
|
-
}
|
|
148
|
-
Spacer()
|
|
149
|
-
HStack(spacing: -6){
|
|
150
|
-
ForEach(trustBanner.icons, id: \.self) { iconURL in
|
|
151
|
-
WebImage(url: URL(string: iconURL))
|
|
152
|
-
.resizable()
|
|
153
|
-
.scaledToFit()
|
|
154
|
-
.frame(width:24, height: 24)
|
|
155
|
-
.background(Color.white)
|
|
156
|
-
.cornerRadius(12)
|
|
157
|
-
.overlay(
|
|
158
|
-
Circle().stroke(Color(hex: 0xFFE8E8E8), lineWidth: 1)
|
|
159
|
-
)
|
|
160
|
-
}
|
|
161
|
-
Text("36+")
|
|
162
|
-
.font(.system(size: 10, weight: Font.Weight.regular))
|
|
163
|
-
.frame(width: 24, height: 24, alignment: .center)
|
|
164
|
-
.foregroundColor(Color(hex: 0xFFEB2F96))
|
|
165
|
-
.background(Color(hex: 0xFFFDEAF4))
|
|
166
|
-
.cornerRadius(12)
|
|
167
|
-
.overlay(
|
|
168
|
-
Circle()
|
|
169
|
-
.stroke(Color(hex: 0xFFE8E8E8), lineWidth: 1)
|
|
170
|
-
)
|
|
171
|
-
}.frame(width: 96, height: 24)
|
|
98
|
+
WebImage(url: URL(string: applicationEnvironment.config?.trustBanner?.pciImage ?? defaultBanner.pciImage))
|
|
99
|
+
.resizable()
|
|
100
|
+
.scaledToFit()
|
|
101
|
+
.frame(width: 24, height: 20)
|
|
102
|
+
WebImage(url: URL(string: applicationEnvironment.config?.trustBanner?.sslImage ?? defaultBanner.sslImage))
|
|
103
|
+
.resizable()
|
|
104
|
+
.scaledToFit()
|
|
105
|
+
.frame(width: 52, height: 20)
|
|
172
106
|
}
|
|
173
107
|
}
|
|
108
|
+
|
|
174
109
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
if let onPress = onPress {
|
|
184
|
-
onPress(["service_name": self.serviceName ?? "", "screen_name": self.screenName ?? "", "component_name": "logo_trust", "url_config": trustBanner.urlConfig, "feature_code": trustBanner.featureCode])
|
|
185
|
-
}
|
|
186
|
-
}
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
.padding(.all, 12)
|
|
113
|
+
.background(Color(hex: "F2F8FF"))
|
|
114
|
+
.cornerRadius(12)
|
|
115
|
+
.onTapGesture {
|
|
116
|
+
onPressSecurity()
|
|
187
117
|
}
|
|
118
|
+
.frame(maxWidth: UIScreen.main.bounds.size.width)
|
|
188
119
|
}
|
|
189
120
|
}
|
package/local.properties
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
# Location of the SDK. This is only used by Gradle.
|
|
5
5
|
# For customization when using a Version Control System, please read the
|
|
6
6
|
# header note.
|
|
7
|
-
#
|
|
8
|
-
sdk.dir=/Users/
|
|
7
|
+
#Tue Apr 23 16:40:15 ICT 2024
|
|
8
|
+
sdk.dir=/Users/hung.dao1/Library/Android/sdk
|