@momo-kits/step 0.0.43-beta.26 → 0.0.43-beta.29

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.
@@ -1,5 +1,5 @@
1
1
  import React, { Component } from 'react';
2
- import { View, StyleSheet, Image, Dimensions } from 'react-native';
2
+ import { View, StyleSheet, Image, Dimensions, ScrollView } from 'react-native';
3
3
 
4
4
  import PropTypes from 'prop-types';
5
5
  import Colors from '../../core/colors';
@@ -9,15 +9,6 @@ import { Icons as IconSource } from '../../core/icons';
9
9
  const CIRCLE_SIZE = 24;
10
10
  const SCREEN_WIDTH = Dimensions.get('window').width;
11
11
 
12
- // this is layout of each item (flexdirection row)
13
- // this is left container (flex 0.2, )
14
- // this is value label
15
- // this is image
16
- // this is caption label
17
- // this is desc label
18
- // this is right container (flex 0.8)
19
- // this is line (width flex = 1 or width 100 percent)
20
-
21
12
  const styles = StyleSheet.create({
22
13
  circle: {
23
14
  width: CIRCLE_SIZE,
@@ -26,25 +17,23 @@ const styles = StyleSheet.create({
26
17
  borderWidth: 2,
27
18
  padding: 4,
28
19
  },
29
- checkedCircle: {
30
- width: CIRCLE_SIZE,
31
- height: CIRCLE_SIZE,
32
- borderRadius: CIRCLE_SIZE / 2,
33
- backgroundColor: '#ffadd2',
34
- borderWidth: 2,
35
- borderColor: Colors.pink_09,
20
+ iconImage: {
21
+ width: 16,
22
+ height: 16,
23
+ position: 'absolute',
24
+ top: 2,
25
+ left: 2,
36
26
  },
37
27
  titleDefault: {
28
+ fontSize: 14,
38
29
  color: Colors.black_12,
39
30
  fontWeight: 'normal',
40
31
  },
41
32
  titleActive: {
33
+ fontSize: 14,
42
34
  color: Colors.black_17,
43
35
  fontWeight: 'bold',
44
36
  },
45
- containerStyle: {
46
- minHeight: CIRCLE_SIZE + 20 + CIRCLE_SIZE,
47
- },
48
37
  description: {
49
38
  fontSize: 12,
50
39
  color: Colors.black_12,
@@ -64,7 +53,6 @@ const styles = StyleSheet.create({
64
53
  },
65
54
  lineHorizontal: {
66
55
  height: 2,
67
- marginTop: 26,
68
56
  width: '100%',
69
57
  },
70
58
  minHeight: {
@@ -89,51 +77,259 @@ export default class HorizontalStep extends Component {
89
77
  });
90
78
  };
91
79
 
92
- circleStep = (index) => {
80
+ _renderCircleImage = ({
81
+ icon = '',
82
+ circleColor = '',
83
+ circleBorderColor = '',
84
+ }) => {
93
85
  return (
94
- <View style={[styles.circle]}>
95
- <Text style={styles.number}>{index}</Text>
86
+ <View>
87
+ <View
88
+ style={[
89
+ styles.circle,
90
+ {
91
+ backgroundColor: circleColor,
92
+ borderColor: circleBorderColor,
93
+ },
94
+ ]}>
95
+ <Image
96
+ source={icon}
97
+ style={[styles.iconImage, { tintColor: '#ffffff' }]}
98
+ />
99
+ </View>
100
+ </View>
101
+ );
102
+ };
103
+
104
+ _renderCircleText = ({
105
+ circleColor = '',
106
+ circleBorderColor = '',
107
+ index = 0,
108
+ }) => {
109
+ return (
110
+ <View>
111
+ <View
112
+ style={[
113
+ styles.circle,
114
+ {
115
+ backgroundColor: circleColor,
116
+ borderColor: circleBorderColor,
117
+ },
118
+ ]}>
119
+ <Text style={styles.number}>{index + 1}</Text>
120
+ </View>
96
121
  </View>
97
122
  );
98
123
  };
99
124
 
125
+ _renderDateOrValue = ({
126
+ date = '',
127
+ isActiveState = false,
128
+ circleChecked = false,
129
+ minHeight = 0,
130
+ dateStyle = {},
131
+ index = 0,
132
+ }) => {
133
+ // Init states in render function
134
+ let resultComponent = <></>;
135
+ if (!date) {
136
+ return resultComponent;
137
+ }
138
+ if (isActiveState || circleChecked) {
139
+ resultComponent = (
140
+ <Text
141
+ style={[
142
+ styles.date,
143
+ dateStyle,
144
+ { minHeight: 12, marginBottom: 4 },
145
+ ]}>
146
+ {date[index]}
147
+ </Text>
148
+ );
149
+ } else {
150
+ resultComponent = <View style={minHeight}></View>;
151
+ }
152
+ return resultComponent;
153
+ };
154
+
155
+ _renderCircle = ({
156
+ circleColor = '',
157
+ circleBorderColor = '',
158
+ isActiveState = false,
159
+ circleUnchecked = false,
160
+ iconActive = {},
161
+ iconUnchecked = {},
162
+ icon = {},
163
+ index = 0,
164
+ }) => {
165
+ let resultComponent = <></>;
166
+ if (!isActiveState) {
167
+ if (circleUnchecked) {
168
+ if (Object.keys(iconUnchecked).length === 0) {
169
+ resultComponent = this._renderCircleImage({
170
+ icon,
171
+ circleColor,
172
+ circleBorderColor,
173
+ });
174
+ } else {
175
+ resultComponent = this._renderCircleText({
176
+ circleColor,
177
+ circleBorderColor,
178
+ index,
179
+ });
180
+ }
181
+ } else {
182
+ resultComponent = this._renderCircleImage({
183
+ icon,
184
+ circleColor,
185
+ circleBorderColor,
186
+ });
187
+ }
188
+ } else {
189
+ // This is active case
190
+ // If icon diff "" & regex http or https url so will render image component
191
+ if (Object.keys(iconActive).length === 0) {
192
+ resultComponent = this._renderCircleImage({
193
+ icon,
194
+ circleColor,
195
+ circleBorderColor,
196
+ });
197
+ } else {
198
+ // Otherwise render index number in text component
199
+ resultComponent = resultComponent = this._renderCircleText({
200
+ circleColor,
201
+ circleBorderColor,
202
+ index,
203
+ });
204
+ }
205
+ }
206
+ return resultComponent;
207
+ };
208
+
209
+ _renderTitle = ({ textFontStyle = {}, titleStyle = {}, value = {} }) => {
210
+ let resultComponent = (
211
+ <View>
212
+ <Text.Caption
213
+ style={[{ marginTop: 4 }, textFontStyle, titleStyle]}>
214
+ {value}
215
+ </Text.Caption>
216
+ </View>
217
+ );
218
+ return resultComponent;
219
+ };
220
+
221
+ _renderDescription = ({ items = {}, descriptionStyle = {}, index = 0 }) => {
222
+ let resultComponent = <></>;
223
+
224
+ if (items) {
225
+ resultComponent = (
226
+ <View>
227
+ <Text style={[{ fontSize: 10 }, descriptionStyle]}>
228
+ {items[index]}
229
+ </Text>
230
+ </View>
231
+ );
232
+ }
233
+ return resultComponent;
234
+ };
235
+
236
+ _renderLine = ({
237
+ titles = {},
238
+ index = 0,
239
+ lineRight = 0,
240
+ lineWidth = 0,
241
+ lineActive = '',
242
+ date = {},
243
+ }) => {
244
+ let resultComponent = <></>;
245
+
246
+ if (titles?.length - 1 !== index) {
247
+ resultComponent = (
248
+ <View
249
+ style={{
250
+ position: 'absolute',
251
+ right: lineRight,
252
+ width: lineWidth,
253
+ zIndex: -1,
254
+ }}>
255
+ <View
256
+ style={[
257
+ styles.lineHorizontal,
258
+ {
259
+ backgroundColor: lineActive,
260
+ },
261
+ date ? { marginTop: 27 } : { marginTop: 27 - 16 },
262
+ /* subtracting spacing from date */
263
+ ]}
264
+ />
265
+ </View>
266
+ );
267
+ }
268
+ return resultComponent;
269
+ };
270
+
100
271
  circleColumn = (value, index) => {
101
272
  const {
102
273
  currentStep,
103
274
  titles,
104
275
  iconActive,
105
- iconInActive,
276
+ iconChecked,
277
+ iconUnchecked,
278
+ circleColorActive,
279
+ circleColorChecked,
280
+ circleColorUnchecked,
281
+ circleBorderColorActive,
282
+ circleBorderColorChecked,
283
+ circleBorderColorUnchecked,
106
284
  lineColorActive,
107
285
  lineColorInActive,
108
286
  items,
109
- currentStepColor,
110
287
  date,
111
288
  isVertical,
112
- titleFontSize,
289
+ titleStyle,
290
+ descriptionStyle,
291
+ dateStyle,
113
292
  } = this.props;
114
- const icon =
115
- currentStep >= index + 2
116
- ? iconActive || IconSource.ic_check_24
117
- : iconInActive || index + 1;
118
- var circleColor =
119
- currentStep >= index + 1 ? currentStepColor : Colors.black_06;
120
- var circleBorderColor =
121
- currentStep >= index + 1 ? Colors.pink_09 : Colors.black_04;
122
- const textFontStyle =
123
- currentStep === index + 1
124
- ? styles.titleActive
125
- : styles.titleDefault;
126
- const lineActive =
127
- currentStep >= index + 2
128
- ? lineColorActive
129
- ? Colors.pink_09
130
- : '#ffd6e7'
131
- : lineColorInActive || Colors.black_04;
132
- const minHeight = !isVertical && styles.minHeight;
293
+
294
+ // Three circle states
295
+ const isActiveState = currentStep == index + 1;
296
+ const circleChecked = currentStep > index + 1;
297
+ const circleUnchecked = currentStep < index + 1;
298
+
299
+ // Default properties is inactive state
300
+ let icon = {};
301
+ let circleColor = circleColorUnchecked || Colors.black_06;
302
+ let circleBorderColor = circleBorderColorUnchecked || Colors.black_04;
303
+ let textFontStyle = styles.titleDefault;
304
+ let lineActive = lineColorInActive || Colors.black_04;
305
+ let minHeight = !isVertical && styles.minHeight;
306
+
307
+ let tintColor = '#ffd6e7';
308
+
309
+ // This is all properties in active state
310
+ if (isActiveState) {
311
+ icon = iconActive || index + 1;
312
+ circleColor = circleColorActive || '#d82d8b';
313
+ circleBorderColor = circleBorderColorActive || Colors.pink_09;
314
+ textFontStyle = styles.titleActive;
315
+ }
316
+
317
+ if (circleChecked) {
318
+ icon = iconChecked || IconSource.ic_check_24;
319
+ lineActive = lineColorActive || tintColor;
320
+ circleColor = circleColorChecked || '#ffadd2';
321
+ circleBorderColor = circleBorderColorChecked || Colors.pink_09;
322
+ }
323
+
324
+ if (circleUnchecked) {
325
+ icon = iconUnchecked || index + 1;
326
+ }
327
+
133
328
  const lineWidth = Math.round(
134
329
  (SCREEN_WIDTH - 10 - CIRCLE_SIZE - 4) / titles.length,
135
330
  );
136
331
  const lineRight = parseInt(`-${lineWidth / 2}`);
332
+
137
333
  return (
138
334
  <View
139
335
  key={index}
@@ -147,70 +343,43 @@ export default class HorizontalStep extends Component {
147
343
  flexDirection: 'column',
148
344
  alignItems: 'center',
149
345
  }}>
150
- {currentStep >= index + 1 ? (
151
- <Text style={[styles.date, { marginBottom: 4 }]}>
152
- {date}
153
- </Text>
154
- ) : (
155
- <View style={minHeight}></View>
156
- )}
157
- {currentStep <= index + 1 ? (
158
- <View>
159
- {/* image */}
160
- <View
161
- style={[
162
- styles.circle,
163
- {
164
- backgroundColor: circleColor,
165
- borderColor: circleBorderColor,
166
- },
167
- ]}>
168
- <Text style={styles.number}>{icon}</Text>
169
- </View>
170
- </View>
171
- ) : (
172
- <View>
173
- <Image
174
- source={icon}
175
- style={[
176
- styles.checkedCircle,
177
- { tintColor: '#ffd6e7' },
178
- ]}
179
- />
180
- </View>
181
- )}
182
- <View>
183
- <Text.Caption
184
- style={[
185
- { marginTop: 4, fontSize: titleFontSize },
186
- textFontStyle,
187
- ]}>
188
- {value}
189
- </Text.Caption>
190
- </View>
191
-
192
- <View>
193
- <Text style={[{ fontSize: 10 }]}>{items[index]}</Text>
194
- </View>
346
+ {this._renderDateOrValue({
347
+ date,
348
+ isActiveState,
349
+ circleChecked,
350
+ minHeight,
351
+ dateStyle,
352
+ index,
353
+ })}
354
+ {this._renderCircle({
355
+ circleColor,
356
+ circleBorderColor,
357
+ isActiveState,
358
+ circleUnchecked,
359
+ iconActive,
360
+ iconUnchecked,
361
+ icon,
362
+ index,
363
+ })}
364
+ {this._renderTitle({
365
+ textFontStyle,
366
+ titleStyle,
367
+ value,
368
+ })}
369
+ {this._renderDescription({
370
+ items,
371
+ descriptionStyle,
372
+ index,
373
+ })}
195
374
  </View>
196
- {titles?.length - 1 !== index && (
197
- <View
198
- style={{
199
- position: 'absolute',
200
- right: lineRight,
201
- width: lineWidth,
202
- zIndex: -1,
203
- }}>
204
- <View
205
- style={[
206
- styles.lineHorizontal,
207
- {
208
- backgroundColor: lineActive,
209
- },
210
- ]}
211
- />
212
- </View>
213
- )}
375
+ {this._renderLine({
376
+ titles,
377
+ index,
378
+ lineRight,
379
+ lineWidth,
380
+ lineActive,
381
+ date,
382
+ })}
214
383
  </View>
215
384
  );
216
385
  };
@@ -223,16 +392,16 @@ export default class HorizontalStep extends Component {
223
392
  render() {
224
393
  const { style = {} } = this.props;
225
394
  return (
226
- <View
227
- style={[styles.containerStyle, style]}
228
- onLayout={this.onLayout}>
229
- <View
230
- style={{
231
- flexDirection: 'row',
232
- }}>
233
- {this.renderCircle()}
395
+ <ScrollView>
396
+ <View style={[style]} onLayout={this.onLayout}>
397
+ <View
398
+ style={{
399
+ flexDirection: 'row',
400
+ }}>
401
+ {this.renderCircle()}
402
+ </View>
234
403
  </View>
235
- </View>
404
+ </ScrollView>
236
405
  );
237
406
  }
238
407
  }
@@ -244,11 +413,19 @@ HorizontalStep.propTypes = {
244
413
  items: PropTypes.array,
245
414
  isVertical: PropTypes.bool,
246
415
  iconActive: PropTypes.any,
247
- iconInActive: PropTypes.any,
416
+ iconChecked: PropTypes.any,
417
+ iconUnchecked: PropTypes.any,
418
+ circleColorActive: PropTypes.string,
419
+ circleColorChecked: PropTypes.string,
420
+ circleColorUnchecked: PropTypes.string,
421
+ circleBorderColorActive: PropTypes.string,
422
+ circleBorderColorChecked: PropTypes.string,
423
+ circleBorderColorUnchecked: PropTypes.string,
248
424
  lineColorActive: PropTypes.string,
249
425
  lineColorInActive: PropTypes.string,
250
- borderColorActive: PropTypes.string,
251
- borderColorInActive: PropTypes.string,
426
+ titleStyle: PropTypes.object,
427
+ descriptionStyle: PropTypes.object,
428
+ dateStyle: PropTypes.object,
252
429
  };
253
430
 
254
431
  HorizontalStep.defaultProps = {
package/Step.js CHANGED
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import HorizontalStep from './Step.horizontal';
4
4
  import VerticalStep from './Step.vertical';
5
5
 
6
+ import { Colors, IconSource } from '@momo-kits/core';
6
7
  export default class Step extends Component {
7
8
  constructor(props) {
8
9
  super(props);
@@ -25,15 +26,34 @@ Step.propTypes = {
25
26
  items: PropTypes.array,
26
27
  isVertical: PropTypes.bool,
27
28
  iconActive: PropTypes.any,
28
- iconInActive: PropTypes.any,
29
+ iconChecked: PropTypes.any,
30
+ iconUnchecked: PropTypes.any,
31
+ circleColorActive: PropTypes.string,
32
+ circleColorChecked: PropTypes.string,
33
+ circleColorUnchecked: PropTypes.string,
34
+ circleBorderColorActive: PropTypes.string,
35
+ circleBorderColorChecked: PropTypes.string,
36
+ circleBorderColorUnchecked: PropTypes.string,
29
37
  lineColorActive: PropTypes.string,
30
38
  lineColorInActive: PropTypes.string,
31
- borderColorActive: PropTypes.string,
32
- borderColorInActive: PropTypes.string,
33
- titleFontSize: PropTypes.number,
39
+ titleStyle: PropTypes.object,
40
+ descriptionStyle: PropTypes.object,
41
+ dateStyle: PropTypes.object,
34
42
  };
35
43
 
36
44
  Step.defaultProps = {
37
45
  titles: [],
38
46
  currentStep: 0,
47
+ isVertical: false,
48
+ iconActive: 'index + 1',
49
+ iconChecked: IconSource.ic_check_24,
50
+ iconUnchecked: 'index + 1',
51
+ circleColorActive: '#d82d8b',
52
+ circleColorChecked: '#ffadd2',
53
+ circleColorUnchecked: Colors.black_06,
54
+ circleBorderColorActive: Colors.pink_09,
55
+ circleBorderColorChecked: Colors.pink_09,
56
+ circleBorderColorUnchecked: Colors.black_04,
57
+ lineColorActive: '#ffd6e7',
58
+ lineColorInActive: Colors.black_04,
39
59
  };