@momo-kits/step 0.0.43-beta.25 → 0.0.43-beta.28
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/Step.horizontal.js +290 -117
- package/Step.horizontal.web.js +298 -121
- package/Step.js +24 -4
- package/Step.vertical.js +268 -112
- package/Step.vertical.web.js +274 -112
- package/Step.web.js +25 -4
- package/package.json +1 -1
package/Step.horizontal.web.js
CHANGED
|
@@ -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
|
-
|
|
30
|
-
width:
|
|
31
|
-
height:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
80
|
+
_renderCircleImage = ({
|
|
81
|
+
icon = '',
|
|
82
|
+
circleColor = '',
|
|
83
|
+
circleBorderColor = '',
|
|
84
|
+
}) => {
|
|
93
85
|
return (
|
|
94
|
-
<View
|
|
95
|
-
<
|
|
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
|
-
|
|
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
|
-
|
|
289
|
+
titleStyle,
|
|
290
|
+
descriptionStyle,
|
|
291
|
+
dateStyle,
|
|
113
292
|
} = this.props;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
{
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
{
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
<
|
|
227
|
-
style={[
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
</
|
|
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
|
-
|
|
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
|
-
|
|
251
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
};
|