@momo-kits/native-kits 0.113.3-beta.5 → 0.113.3-beta.7

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.
@@ -115,11 +115,12 @@ fun ToolkitHeaderRight(headerRight: HeaderRightData? = null) {
115
115
  }
116
116
 
117
117
  fun onPressClose() {
118
- api?.request("dismiss", "", {_ -> })
118
+ api?.request("dismiss", "", { _ -> })
119
119
  }
120
120
 
121
121
  fun onPressMore() {
122
- api?.request("showTools",
122
+ api?.request(
123
+ "showTools",
123
124
  mapOf(
124
125
  "tools" to headerRight?.tools?.map { it.toMap() },
125
126
  "context" to mapOf(
@@ -180,10 +181,18 @@ fun ToolkitHeaderRight(headerRight: HeaderRightData? = null) {
180
181
  group.items.any { it.showBadge }
181
182
  }
182
183
 
184
+ val toolkitWidth = if (context !== null) 65.dp else 28.dp
185
+
186
+ var isShowShortcut = headerRight?.useShortcut == true
187
+ //backup case context null of more icon
188
+ if (headerRight?.useMore == true && context == null) {
189
+ isShowShortcut = false
190
+ }
191
+
183
192
  Row(
184
193
  verticalAlignment = Alignment.CenterVertically
185
194
  ) {
186
- if (headerRight?.useShortcut == true) {
195
+ if (isShowShortcut) {
187
196
  NavigationButton(
188
197
  disabled = isLoading,
189
198
  icon = navButtonConfig.icon,
@@ -197,20 +206,26 @@ fun ToolkitHeaderRight(headerRight: HeaderRightData? = null) {
197
206
  modifier = Modifier
198
207
  .padding(start = Spacing.S)
199
208
  .border(0.2.dp, Color(0x33000000), shape = RoundedCornerShape(14.dp))
200
- .width(65.dp)
209
+ .width(toolkitWidth)
201
210
  .height(28.dp)
202
211
  .clip(shape = RoundedCornerShape(14.dp))
203
212
  .background(Color(0x99FFFFFF))
204
213
  ) {
205
- Icon(source = "help_center", size = 20.dp, modifier = Modifier.padding(4.dp).clickable {
206
- onPressHelpCenter()
207
- })
208
- Box(
209
- modifier = Modifier
210
- .width(0.5.dp)
211
- .height(12.dp)
212
- .background(Colors.black_20)
213
- )
214
+ if (context != null) {
215
+ Icon(
216
+ source = "help_center",
217
+ size = 20.dp,
218
+ modifier = Modifier.padding(4.dp).clickable {
219
+ onPressHelpCenter()
220
+ })
221
+ Box(
222
+ modifier = Modifier
223
+ .width(0.5.dp)
224
+ .height(12.dp)
225
+ .background(Colors.black_20)
226
+ )
227
+ }
228
+
214
229
  Icon(
215
230
  source = "16_navigation_close_circle",
216
231
  size = 20.dp,
@@ -9,6 +9,8 @@ import androidx.compose.runtime.remember
9
9
  import androidx.compose.runtime.setValue
10
10
  import androidx.compose.runtime.staticCompositionLocalOf
11
11
  import androidx.compose.ui.unit.Dp
12
+ import kotlinx.serialization.Serializable
13
+ import kotlinx.serialization.json.internal.FormatLanguage
12
14
  import vn.momo.kits.components.TrustBannerData
13
15
  import vn.momo.kits.const.AppStatusBar
14
16
  import vn.momo.kits.const.AppTheme
@@ -48,6 +50,10 @@ data class MiniAppContext(
48
50
  val appId: String = "",
49
51
  val appCode: String = "",
50
52
  val description: Any? = null,
53
+ val support: Map<String, Any?> = emptyMap(),
54
+ val toolkitConfig: Map<String, Any?> = emptyMap(),
55
+ val providerId: String = "",
56
+ val permissions: List<Map<String, Any>>? = emptyList()
51
57
  )
52
58
 
53
59
  val PlatformApi = staticCompositionLocalOf<Any?> { null }
@@ -64,6 +70,10 @@ val AppConfig = staticCompositionLocalOf<KitConfig?> {
64
70
  null
65
71
  }
66
72
 
73
+ val AppLanguage = staticCompositionLocalOf<String?> {
74
+ null
75
+ }
76
+
67
77
  data class KitConfig(
68
78
  val trustBanner: TrustBannerData? = null,
69
79
  val headerBar: String? = null,
@@ -77,6 +87,7 @@ fun ApplicationContainer(
77
87
  statusBarHeight: Dp? = AppStatusBar.current,
78
88
  applicationContext: MiniAppContext? = null,
79
89
  config: KitConfig? = null,
90
+ language: String? = null,
80
91
  content: @Composable () -> Unit,
81
92
  ) {
82
93
  var appTheme by remember { mutableStateOf(theme) }
@@ -105,7 +116,8 @@ fun ApplicationContainer(
105
116
  AppNavigator provides Navigator(),
106
117
  AppStatusBar provides appStatusBarHeight,
107
118
  ApplicationContext provides applicationContext,
108
- AppConfig provides config
119
+ AppConfig provides config,
120
+ AppLanguage provides language
109
121
  ) {
110
122
  content()
111
123
  }
@@ -161,7 +161,7 @@ fun Screen(
161
161
  }
162
162
 
163
163
  if (useAnimationSearch && inputSearchProps != null && headerType == HeaderType.EXTENDED) {
164
- Spacer(modifier = Modifier.padding(top = (HEADER_HEIGHT.dp + Spacing.M)))
164
+ Spacer(modifier = Modifier.padding(top = (HEADER_HEIGHT.dp + Spacing.S)))
165
165
  }
166
166
  content()
167
167
  }
@@ -20,6 +20,7 @@ import androidx.compose.ui.layout.ContentScale
20
20
  import androidx.compose.ui.unit.dp
21
21
  import androidx.compose.ui.unit.sp
22
22
  import vn.momo.kits.application.AppConfig
23
+ import vn.momo.kits.application.AppLanguage
23
24
  import vn.momo.kits.modifier.noFeedbackClickable
24
25
 
25
26
  val defaultBanner = TrustBannerData(
@@ -62,10 +63,10 @@ fun TrustBanner(
62
63
  serviceName: String = "",
63
64
  screenName: String = "",
64
65
  onPress: ((Map<String, String>) -> Unit)? = null,
65
- trackEvent: ((String, Map<String, String>) -> Unit)? = null,
66
- language: String = "vi"
66
+ trackEvent: ((String, Map<String, String>) -> Unit)? = null
67
67
  ) {
68
68
  val appConfig = AppConfig.current
69
+ val language = AppLanguage.current ?: "vi"
69
70
  val trustBanner = appConfig?.trustBanner ?: defaultBanner
70
71
  val trackParams = mapOf(
71
72
  "service_name" to serviceName,
@@ -23,12 +23,20 @@ public class MiniAppContext {
23
23
  }
24
24
  }
25
25
 
26
+ public class KitConfig {
27
+ public var trustBanner: TrustBannerData? = nil
28
+ public var headerBar: String? = nil
29
+ public var headerGradient: String? = nil
30
+ }
31
+
26
32
  public class ApplicationEnvironment: ObservableObject {
27
33
  let applicationContext: MiniAppContext?
28
- let composeApi: KitComposeApi
34
+ let composeApi: KitComposeApi?
35
+ let config: KitConfig?
29
36
 
30
- public init(applicationContext: MiniAppContext?, composeApi: KitComposeApi) {
37
+ public init(applicationContext: MiniAppContext? = nil, composeApi: KitComposeApi? = nil, config: KitConfig? = nil) {
31
38
  self.applicationContext = applicationContext
32
39
  self.composeApi = composeApi
40
+ self.config = config
33
41
  }
34
42
  }
@@ -95,7 +95,7 @@ struct ToolkitHeaderRight: View {
95
95
 
96
96
  // MARK: - Actions
97
97
  private func onPressShortcut() {
98
- environment.composeApi.request(
98
+ environment.composeApi?.request(
99
99
  funcName: "onToolAction",
100
100
  params: ["item": ["key": "onFavorite"]]
101
101
  ) { _ in
@@ -112,14 +112,14 @@ struct ToolkitHeaderRight: View {
112
112
  "icon": context?.appIcon,
113
113
  "description": context?.description
114
114
  ]
115
- environment.composeApi.request(
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.request(
122
+ environment.composeApi?.request(
123
123
  funcName: "dismiss",
124
124
  params: ""
125
125
  ) { _ in }
@@ -137,7 +137,7 @@ struct ToolkitHeaderRight: View {
137
137
  "description": context?.description
138
138
  ]
139
139
  ]
140
- environment.composeApi.request(
140
+ environment.composeApi?.request(
141
141
  funcName: "showTools",
142
142
  params: params
143
143
  ) { response in
@@ -103,6 +103,8 @@ public struct PopupDisplay: View {
103
103
  }
104
104
  .background(Color.white.cornerRadius(15))
105
105
  .padding(.horizontal, 12)
106
+ .accessibilityElement(children: .ignore)
107
+ .accessibility(identifier: "popup_notify")
106
108
  }
107
109
 
108
110
  // MARK: Internal
@@ -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 trustBanner: TrustBanner
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, pciImage, sslImage, icons, momoImage
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 = TrustBanner(
35
- content: ["vi": "Bảo mật thông tin & An toàn tài sản của bạn là ưu tiên hàng đầu của MoMo.",
36
- "en": "Your data security and money safety are MoMo's top priorities."],
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: "https://momo.vn/an-toan-bao-mat",
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/ic_momo_secu.png"
50
+ momoImage: "https://static.momocdn.net/app/img/kits/trustBanner/ic_secu.png"
48
51
  )
49
52
 
50
- let defaultData = TrustBannerData(trustBanner: defaultBanner)
51
-
52
- class TrustBannerViewModel: ObservableObject {
53
- @Published var trustBanner: TrustBannerData?
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
- public var body: some View {
110
- if let trustBanner = viewModel.trustBanner {
111
- TrustBannerContentView(trustBanner: trustBanner.trustBanner, onPress: onPress, trackEvent: trackEvent, serviceName: serviceName, screenName: screenName, language: language)
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
- var body: some View {
125
- GeometryReader { geo in
126
- HStack(alignment: .center, spacing: 8) {
127
- WebImage(url: URL(string: trustBanner.momoImage))
128
- .resizable()
129
- .scaledToFit()
130
- .frame(width: 64, height: 64)
131
- VStack(alignment: .leading, spacing: 8){
132
- Text(trustBanner.content[language ?? "vi"] ?? "")
133
- .foregroundColor(Color(hex: 0xFF484848))
134
- .lineLimit(2)
135
- .font(.system(size: 12, weight: Font.Weight.regular))
136
- .frame(width: geo.size.width - 24 - 64 - 8, height: 40,alignment: .leading)
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
- HStack{
139
- WebImage(url: URL(string: trustBanner.pciImage))
140
- .resizable()
141
- .scaledToFit()
142
- .frame(width: 52, height: 20)
143
- WebImage(url: URL(string: trustBanner.sslImage))
144
- .resizable()
145
- .scaledToFit()
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
- .frame(width: geo.size.width - 24)
176
- .padding(EdgeInsets(top: 12, leading: 12, bottom: 12, trailing: 12))
177
- .background(Color(hex: 0xFFF2F8FF))
178
- .cornerRadius(12)
179
- .onTapGesture {
180
- if let trackEvent = trackEvent {
181
- trackEvent("service_component_clicked", ["service_name": self.serviceName ?? "", "screen_name": self.screenName ?? "", "component_name": "logo_trust", "url_config": trustBanner.urlConfig])
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/native-kits",
3
- "version": "0.113.3-beta.5",
3
+ "version": "0.113.3-beta.7",
4
4
  "private": false,
5
5
  "dependencies": {},
6
6
  "devDependencies": {},