@widergy/mobile-ui 1.8.1 → 1.8.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [1.8.3](https://github.com/widergy/mobile-ui/compare/v1.8.2...v1.8.3) (2024-05-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * allow persisting selected option in utautocomplete ([#286](https://github.com/widergy/mobile-ui/issues/286)) ([4e0ac6c](https://github.com/widergy/mobile-ui/commit/4e0ac6cb654190a133893ff27820b953dc1c3f30))
7
+
8
+ ## [1.8.2](https://github.com/widergy/mobile-ui/compare/v1.8.1...v1.8.2) (2024-05-10)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * uttracker dashes ([#281](https://github.com/widergy/mobile-ui/issues/281)) ([d676fc2](https://github.com/widergy/mobile-ui/commit/d676fc24a4301779bc091cffe54f69bee375a8a8))
14
+
1
15
  ## [1.8.1](https://github.com/widergy/mobile-ui/compare/v1.8.0...v1.8.1) (2024-05-09)
2
16
 
3
17
 
@@ -1,5 +1,5 @@
1
1
  import { arrayOf, bool, element, func, oneOf, shape, string } from 'prop-types';
2
- import React, { useMemo } from 'react';
2
+ import React, { useEffect, useState } from 'react';
3
3
  import { View } from 'react-native';
4
4
 
5
5
  import { WINDOW_HEIGHT } from '../../utils/scaleUtils';
@@ -18,14 +18,19 @@ const UTAutocomplete = ({
18
18
  variant,
19
19
  autoCompletePlaceholder,
20
20
  MenuOptionComponent,
21
- filterOptions
21
+ filterOptions,
22
+ persistSelectedOption = false
22
23
  }) => {
23
- const selectedOption = useMemo(
24
- () => options?.find(option => option.value === input.value),
25
- [options, input.value]
26
- );
24
+ const [selectedOption, setSelectedOption] = useState();
25
+
26
+ useEffect(() => {
27
+ const foundOption = options?.find(option => option.value === input.value);
28
+ if (foundOption || !persistSelectedOption) setSelectedOption(foundOption);
29
+ if (!foundOption && !persistSelectedOption) input.onChange('');
30
+ }, [input, options, persistSelectedOption]);
27
31
 
28
32
  const handleOnPress = item => {
33
+ setSelectedOption(item);
29
34
  input.onChange(item.value);
30
35
  };
31
36
 
@@ -48,7 +53,7 @@ const UTAutocomplete = ({
48
53
  >
49
54
  <UTTextInput
50
55
  variant={variant}
51
- value={selectedOption?.label}
56
+ value={selectedOption?.label || ''}
52
57
  error={error}
53
58
  label={label}
54
59
  labelBackgroundColor={labelBackgroundColor}
@@ -82,7 +87,8 @@ UTAutocomplete.propTypes = {
82
87
  variant: string,
83
88
  autoCompletePlaceholder: string,
84
89
  MenuOptionComponent: element,
85
- filterOptions: bool
90
+ filterOptions: bool,
91
+ persistSelectedOption: bool
86
92
  };
87
93
 
88
94
  export default UTAutocomplete;
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { View } from 'react-native';
3
+ import { bool, number } from 'prop-types';
4
+ import merge from 'lodash/merge';
5
+ import { ViewPropTypes } from 'deprecated-react-native-prop-types';
6
+
7
+ import { IS_IOS } from '../../../../utils/platformUtils/constants';
8
+
9
+ import ownStyles from './styles';
10
+
11
+ const Connector = ({ currentPosition = 0, first, nextPosition = 0, style }) => {
12
+ const themedStyles = merge({}, ownStyles, style);
13
+
14
+ return (
15
+ <View
16
+ style={[themedStyles.wrapper(currentPosition, first, nextPosition), IS_IOS && themedStyles.wrapperIOS]}
17
+ >
18
+ <View style={[themedStyles.connector, IS_IOS && themedStyles.connectorIOS]} />
19
+ </View>
20
+ );
21
+ };
22
+
23
+ Connector.propTypes = {
24
+ currentPosition: number,
25
+ first: bool,
26
+ nextPosition: number,
27
+ style: ViewPropTypes.style
28
+ };
29
+
30
+ export default Connector;
@@ -0,0 +1,29 @@
1
+ import { StyleSheet } from 'react-native';
2
+
3
+ import { OVAL_SIZE } from '../../styles';
4
+
5
+ export default StyleSheet.create({
6
+ connector: {
7
+ borderColor: 'gray',
8
+ borderLeftWidth: 2,
9
+ borderStyle: 'dashed',
10
+ flexGrow: 1
11
+ },
12
+ connectorIOS: {
13
+ borderWidth: 2,
14
+ margin: -3,
15
+ marginLeft: 0,
16
+ flex: 1
17
+ },
18
+ wrapper: (currentPosition, first, nextPosition) => ({
19
+ height: nextPosition - currentPosition - OVAL_SIZE - (first ? 5 : 0) - 10,
20
+ paddingLeft: OVAL_SIZE / 2 - 1,
21
+ position: 'absolute',
22
+ top: currentPosition + OVAL_SIZE + (first ? 5 : 0) + 5,
23
+ width: 2
24
+ }),
25
+ wrapperIOS: {
26
+ overflow: 'hidden',
27
+ width: OVAL_SIZE
28
+ }
29
+ });
@@ -1,6 +1,6 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { View } from 'react-native';
3
- import { bool, func } from 'prop-types';
3
+ import { bool, func, number } from 'prop-types';
4
4
  import merge from 'lodash/merge';
5
5
 
6
6
  import Label from '../../../Label';
@@ -12,30 +12,25 @@ import ownStyles, { ownVariantStyles } from './styles';
12
12
 
13
13
  const ERROR_ICON_SIZE = 16;
14
14
 
15
- const Step = ({
16
- first,
17
- isActive,
18
- isCompleted,
19
- last,
20
- setFirstStepPosition,
21
- setLastStepPosition,
22
- step,
23
- style = {},
24
- variant
25
- }) => {
15
+ const Step = ({ first, index, isActive, isCompleted, setStepsPositions, step, style = {}, variant }) => {
26
16
  const stepCompleted = isCompleted(step.id);
27
17
  const stepActive = isActive(step.id);
28
18
 
29
19
  const themedStyles = merge({}, ownStyles, ownVariantStyles[variant], style[variant]);
30
-
31
20
  const [stepIconOffset, setStepIconOffset] = useState(0);
21
+ const [currentPosition, setCurrentPosition] = useState(0);
22
+
23
+ useEffect(() => {
24
+ setStepsPositions(prev => {
25
+ const newPrev = [...prev];
26
+ newPrev[index] = currentPosition + stepIconOffset;
27
+ return newPrev;
28
+ });
29
+ }, [stepIconOffset, currentPosition, setCurrentPosition, index, setStepsPositions]);
32
30
 
33
31
  return (
34
32
  <View
35
- onLayout={e => {
36
- if (first) setFirstStepPosition(e.nativeEvent.layout.y + stepIconOffset);
37
- if (last) setLastStepPosition(e.nativeEvent.layout.y + stepIconOffset);
38
- }}
33
+ onLayout={e => setCurrentPosition(e.nativeEvent.layout.y)}
39
34
  style={[
40
35
  themedStyles.outerContainer,
41
36
  stepCompleted && themedStyles.completedOuterContainer,
@@ -44,7 +39,7 @@ const Step = ({
44
39
  ]}
45
40
  >
46
41
  <View
47
- onLayout={e => (first || last) && setStepIconOffset(e.nativeEvent.layout.y)}
42
+ onLayout={e => setStepIconOffset(e.nativeEvent.layout.y)}
48
43
  style={[
49
44
  themedStyles.container,
50
45
  stepCompleted && themedStyles.completedContainer,
@@ -102,11 +97,10 @@ const Step = ({
102
97
 
103
98
  Step.propTypes = {
104
99
  first: bool,
100
+ index: number,
105
101
  isActive: func,
106
102
  isCompleted: func,
107
- last: bool,
108
- setFirstStepPosition: func,
109
- setLastStepPosition: func,
103
+ setStepsPositions: func,
110
104
  step: StepPropTypes,
111
105
  variant: VariantPropTypes
112
106
  };
@@ -14,12 +14,15 @@ export const ownVariantStyles = {
14
14
  },
15
15
  activeTitleColor: 'red',
16
16
  completedContainer: {
17
- borderColor: '#F38595'
17
+ borderColor: 'red'
18
18
  },
19
19
  completedInnerContainer: {
20
- backgroundColor: '#F38595'
20
+ backgroundColor: 'red'
21
+ },
22
+ completedOuterContainer: {
23
+ opacity: 0.5
21
24
  },
22
- completedTitleColor: '#F38595'
25
+ completedTitleColor: 'red'
23
26
  },
24
27
  [STANDARD]: {
25
28
  activeContainer: {
@@ -30,12 +33,15 @@ export const ownVariantStyles = {
30
33
  },
31
34
  activeTitleColor: 'blue',
32
35
  completedContainer: {
33
- borderColor: '#93ACFF'
36
+ borderColor: 'blue'
34
37
  },
35
38
  completedInnerContainer: {
36
- backgroundColor: '#93ACFF'
39
+ backgroundColor: 'blue'
40
+ },
41
+ completedOuterContainer: {
42
+ opacity: 0.5
37
43
  },
38
- completedTitleColor: '#93ACFF'
44
+ completedTitleColor: 'blue'
39
45
  }
40
46
  };
41
47
 
@@ -1,9 +1,8 @@
1
1
  import React, { Fragment, useState } from 'react';
2
2
  import { View } from 'react-native';
3
3
  import merge from 'lodash/merge';
4
- import { number, string } from 'prop-types';
4
+ import { number, object, string } from 'prop-types';
5
5
  import Collapsible from 'react-native-collapsible';
6
- import { ViewPropTypes } from 'deprecated-react-native-prop-types';
7
6
 
8
7
  import Icon from '../Icon';
9
8
  import Touchable from '../Touchable';
@@ -12,7 +11,7 @@ import { useTheme } from '../../theming';
12
11
 
13
12
  import ownStyles, { DETAILS_ICON_CARD_SIZE, DETAILS_ICON_FLAT_SIZE, ownModeStyles } from './styles';
14
13
  import Step from './components/Step';
15
- import Connectors from './components/Connectors';
14
+ import Connector from './components/Connector';
16
15
  import SubStep from './components/SubStep';
17
16
  import { DetailsTabPropTypes, ModePropTypes, StepsPropTypes, VariantPropTypes } from './propTypes';
18
17
  import { CARD, FLAT, STANDARD } from './constants';
@@ -21,11 +20,8 @@ const UTTracker = ({ currentStep, detailsTab, mode = CARD, steps, style, title,
21
20
  const theme = useTheme();
22
21
  const themedStyles = merge({}, ownStyles, ownModeStyles[mode], theme.UTTracker, style);
23
22
 
24
- const [stepperHeight, setStepperHeight] = useState(0);
25
- const [lastStepPosition, setLastStepPosition] = useState(0);
26
- const [firstStepPosition, setFirstStepPosition] = useState(0);
27
-
28
23
  const [isCollapsed, setIsCollapsed] = useState(true);
24
+ const [stepsPositions, setStepsPositions] = useState([]);
29
25
 
30
26
  const isCompleted = stepNumber => stepNumber < currentStep;
31
27
  const isActive = stepNumber => stepNumber === currentStep;
@@ -57,22 +53,17 @@ const UTTracker = ({ currentStep, detailsTab, mode = CARD, steps, style, title,
57
53
  </Touchable>
58
54
  )}
59
55
  {steps && (
60
- <View onLayout={e => setStepperHeight(e.nativeEvent.layout.height)}>
61
- <Connectors
62
- style={themedStyles.connectors}
63
- {...{ firstStepPosition, lastStepPosition, stepperHeight }}
64
- />
56
+ <View>
65
57
  {steps.map((step, index) => (
66
58
  <Fragment key={step.id}>
67
59
  <Step
68
60
  first={index === 0}
69
- last={index === steps.length - 1}
70
61
  style={themedStyles.step}
71
62
  {...{
63
+ index,
72
64
  isActive,
73
65
  isCompleted,
74
- setFirstStepPosition,
75
- setLastStepPosition,
66
+ setStepsPositions,
76
67
  step,
77
68
  variant
78
69
  }}
@@ -83,6 +74,13 @@ const UTTracker = ({ currentStep, detailsTab, mode = CARD, steps, style, title,
83
74
  <SubStep key={subStep.id} {...subStep} style={themedStyles.subStep} />
84
75
  ))}
85
76
  </Collapsible>
77
+ {index !== steps.length - 1 && (
78
+ <Connector
79
+ currentPosition={stepsPositions[index]}
80
+ first={index === 0}
81
+ nextPosition={stepsPositions[index + 1]}
82
+ />
83
+ )}
86
84
  </Fragment>
87
85
  ))}
88
86
  </View>
@@ -112,7 +110,8 @@ UTTracker.propTypes = {
112
110
  detailsTab: DetailsTabPropTypes,
113
111
  mode: ModePropTypes,
114
112
  steps: StepsPropTypes,
115
- style: ViewPropTypes.style,
113
+ // eslint-disable-next-line react/forbid-prop-types
114
+ style: object,
116
115
  title: string,
117
116
  variant: VariantPropTypes
118
117
  };
@@ -2,11 +2,11 @@ import { arrayOf, bool, number, oneOf, shape, string } from 'prop-types';
2
2
 
3
3
  import { CARD, ERROR, FLAT, STANDARD } from './constants';
4
4
 
5
- export const SubStepsPropTypes = arrayOf(shape({ id: number, subtitle: string, title: string }));
5
+ export const SubStepPropTypes = shape({ id: number, subtitle: string, title: string });
6
6
 
7
7
  export const StepPropTypes = shape({
8
8
  id: number,
9
- subSteps: arrayOf(SubStepsPropTypes),
9
+ subSteps: arrayOf(SubStepPropTypes),
10
10
  subtitle: string,
11
11
  title: string
12
12
  });
@@ -42,7 +42,7 @@ const UTWorkflowContainer = ({
42
42
  return (
43
43
  <SafeAreaView style={themedStyles.container}>
44
44
  {topbar && <UTTopbar {...{ currentStage, currentStep, stages, stepsCount, theme, topbar }} />}
45
- <ScrollView contentContainerStyle={themedStyles.content}>
45
+ <ScrollView contentContainerStyle={themedStyles.content} keyboardShouldPersistTaps="handled">
46
46
  {title && (
47
47
  <UTHeader
48
48
  {...{
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@widergy/mobile-ui",
3
3
  "description": "Widergy Mobile Components",
4
4
  "author": "widergy",
5
- "version": "1.8.1",
5
+ "version": "1.8.3",
6
6
  "repository": "https://github.com/widergy/mobile-ui.git",
7
7
  "main": "lib/index.js",
8
8
  "files": [