@codeleap/mobile 1.9.1 → 1.9.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.
Files changed (196) hide show
  1. package/CodeLeap-Mobile-Packages.code-workspace +7 -7
  2. package/dist/components/ActivityIndicator.d.ts +13 -13
  3. package/dist/components/ActivityIndicator.js +50 -54
  4. package/dist/components/ActivityIndicator.js.map +1 -1
  5. package/dist/components/Animated.d.ts +15 -15
  6. package/dist/components/Animated.js +54 -58
  7. package/dist/components/Animated.js.map +1 -1
  8. package/dist/components/Button.d.ts +125 -125
  9. package/dist/components/Button.js +78 -82
  10. package/dist/components/Button.js.map +1 -1
  11. package/dist/components/Checkbox/index.d.ts +14 -15
  12. package/dist/components/Checkbox/index.js +73 -77
  13. package/dist/components/Checkbox/index.js.map +1 -1
  14. package/dist/components/Checkbox/styles.d.ts +55 -55
  15. package/dist/components/Checkbox/styles.js +48 -48
  16. package/dist/components/Checkbox/styles.js.map +0 -0
  17. package/dist/components/ContentView.d.ts +10 -10
  18. package/dist/components/ContentView.js +50 -50
  19. package/dist/components/ContentView.js.map +0 -0
  20. package/dist/components/FileInput.d.ts +26 -27
  21. package/dist/components/FileInput.js +174 -178
  22. package/dist/components/FileInput.js.map +1 -1
  23. package/dist/components/Icon.d.ts +12 -12
  24. package/dist/components/Icon.js +66 -70
  25. package/dist/components/Icon.js.map +1 -1
  26. package/dist/components/Image.d.ts +18 -18
  27. package/dist/components/Image.js +55 -59
  28. package/dist/components/Image.js.map +1 -1
  29. package/dist/components/List.d.ts +13 -13
  30. package/dist/components/List.js +78 -82
  31. package/dist/components/List.js.map +1 -1
  32. package/dist/components/Modal/index.d.ts +26 -26
  33. package/dist/components/Modal/index.js +108 -112
  34. package/dist/components/Modal/index.js.map +1 -1
  35. package/dist/components/Modal/styles.d.ts +69 -69
  36. package/dist/components/Modal/styles.js +64 -64
  37. package/dist/components/Modal/styles.js.map +0 -0
  38. package/dist/components/Navigation/Navigation.d.ts +3 -3
  39. package/dist/components/Navigation/Navigation.js +83 -87
  40. package/dist/components/Navigation/Navigation.js.map +1 -1
  41. package/dist/components/Navigation/constants.d.ts +5 -5
  42. package/dist/components/Navigation/constants.js +10 -10
  43. package/dist/components/Navigation/constants.js.map +0 -0
  44. package/dist/components/Navigation/index.d.ts +3 -3
  45. package/dist/components/Navigation/index.js +15 -19
  46. package/dist/components/Navigation/index.js.map +1 -1
  47. package/dist/components/Navigation/types.d.ts +26 -26
  48. package/dist/components/Navigation/types.js +7 -7
  49. package/dist/components/Navigation/types.js.map +0 -0
  50. package/dist/components/Navigation/utils.d.ts +3 -3
  51. package/dist/components/Navigation/utils.js +69 -69
  52. package/dist/components/Navigation/utils.js.map +0 -0
  53. package/dist/components/Overlay.d.ts +16 -16
  54. package/dist/components/Overlay.js +65 -69
  55. package/dist/components/Overlay.js.map +1 -1
  56. package/dist/components/Pager/index.d.ts +20 -20
  57. package/dist/components/Pager/index.js +163 -167
  58. package/dist/components/Pager/index.js.map +1 -1
  59. package/dist/components/Pager/styles.d.ts +54 -54
  60. package/dist/components/Pager/styles.js +43 -43
  61. package/dist/components/Pager/styles.js.map +0 -0
  62. package/dist/components/RadioInput/index.d.ts +26 -26
  63. package/dist/components/RadioInput/index.js +68 -72
  64. package/dist/components/RadioInput/index.js.map +1 -1
  65. package/dist/components/RadioInput/styles.d.ts +57 -57
  66. package/dist/components/RadioInput/styles.js +44 -44
  67. package/dist/components/RadioInput/styles.js.map +0 -0
  68. package/dist/components/Scroll.d.ts +12 -12
  69. package/dist/components/Scroll.js +76 -80
  70. package/dist/components/Scroll.js.map +1 -1
  71. package/dist/components/Sections.d.ts +11 -11
  72. package/dist/components/Sections.js +76 -80
  73. package/dist/components/Sections.js.map +1 -1
  74. package/dist/components/Select/index.d.ts +5 -5
  75. package/dist/components/Select/index.js +146 -150
  76. package/dist/components/Select/index.js.map +1 -1
  77. package/dist/components/Select/styles.d.ts +9 -9
  78. package/dist/components/Select/styles.js +56 -56
  79. package/dist/components/Select/styles.js.map +0 -0
  80. package/dist/components/Select/types.d.ts +39 -39
  81. package/dist/components/Select/types.js +2 -2
  82. package/dist/components/Select/types.js.map +0 -0
  83. package/dist/components/Slider/Mark.d.ts +3 -3
  84. package/dist/components/Slider/Mark.js +31 -31
  85. package/dist/components/Slider/Mark.js.map +0 -0
  86. package/dist/components/Slider/Thumb.d.ts +7 -7
  87. package/dist/components/Slider/Thumb.js +29 -29
  88. package/dist/components/Slider/Thumb.js.map +0 -0
  89. package/dist/components/Slider/index.d.ts +3 -3
  90. package/dist/components/Slider/index.js +93 -97
  91. package/dist/components/Slider/index.js.map +1 -1
  92. package/dist/components/Slider/types.d.ts +25 -25
  93. package/dist/components/Slider/types.js +2 -2
  94. package/dist/components/Slider/types.js.map +0 -0
  95. package/dist/components/Switch.d.ts +13 -13
  96. package/dist/components/Switch.js +71 -75
  97. package/dist/components/Switch.js.map +1 -1
  98. package/dist/components/Text.d.ts +12 -12
  99. package/dist/components/Text.js +48 -52
  100. package/dist/components/Text.js.map +1 -1
  101. package/dist/components/TextInput.d.ts +171 -183
  102. package/dist/components/TextInput.js +157 -178
  103. package/dist/components/TextInput.js.map +1 -1
  104. package/dist/components/Touchable.d.ts +14 -14
  105. package/dist/components/Touchable.js +57 -61
  106. package/dist/components/Touchable.js.map +1 -1
  107. package/dist/components/View.d.ts +120 -120
  108. package/dist/components/View.js +50 -54
  109. package/dist/components/View.js.map +1 -1
  110. package/dist/components/components.d.ts +24 -25
  111. package/dist/components/components.js +36 -41
  112. package/dist/components/components.js.map +1 -1
  113. package/dist/index.d.ts +5 -5
  114. package/dist/index.js +24 -28
  115. package/dist/index.js.map +1 -1
  116. package/dist/modules/documentPicker.d.ts +3 -3
  117. package/dist/modules/documentPicker.js +11 -11
  118. package/dist/modules/documentPicker.js.map +0 -0
  119. package/dist/modules/fastImage.d.ts +1 -1
  120. package/dist/modules/fastImage.js +9 -9
  121. package/dist/modules/fastImage.js.map +0 -0
  122. package/dist/modules/reactNavigation.d.ts +3 -3
  123. package/dist/modules/reactNavigation.js +10 -10
  124. package/dist/modules/reactNavigation.js.map +0 -0
  125. package/dist/modules/types/fileTypes.d.ts +138 -138
  126. package/dist/modules/types/fileTypes.js +2 -2
  127. package/dist/modules/types/fileTypes.js.map +0 -0
  128. package/dist/types/utility.d.ts +2 -2
  129. package/dist/types/utility.js +2 -2
  130. package/dist/types/utility.js.map +0 -0
  131. package/dist/utils/OSAlert.d.ts +31 -31
  132. package/dist/utils/OSAlert.js +141 -141
  133. package/dist/utils/OSAlert.js.map +1 -1
  134. package/dist/utils/misc.d.ts +2 -2
  135. package/dist/utils/misc.js +25 -25
  136. package/dist/utils/misc.js.map +0 -0
  137. package/dist/utils/styles.d.ts +1 -1
  138. package/dist/utils/styles.js +12 -12
  139. package/dist/utils/styles.js.map +0 -0
  140. package/package.json +39 -39
  141. package/src/components/ActivityIndicator.tsx +46 -46
  142. package/src/components/Animated.tsx +34 -34
  143. package/src/components/Button.tsx +95 -95
  144. package/src/components/Checkbox/index.tsx +83 -83
  145. package/src/components/Checkbox/styles.ts +72 -72
  146. package/src/components/ContentView.tsx +58 -58
  147. package/src/components/FileInput.tsx +181 -181
  148. package/src/components/Icon.tsx +58 -58
  149. package/src/components/Image.tsx +61 -61
  150. package/src/components/List.tsx +109 -109
  151. package/src/components/Modal/index.tsx +161 -161
  152. package/src/components/Modal/styles.ts +133 -133
  153. package/src/components/Navigation/Navigation.tsx +58 -58
  154. package/src/components/Navigation/constants.ts +8 -8
  155. package/src/components/Navigation/index.tsx +3 -3
  156. package/src/components/Navigation/types.ts +35 -35
  157. package/src/components/Navigation/utils.tsx +59 -59
  158. package/src/components/Overlay.tsx +77 -77
  159. package/src/components/Pager/index.tsx +242 -242
  160. package/src/components/Pager/styles.ts +51 -51
  161. package/src/components/RadioInput/index.tsx +101 -101
  162. package/src/components/RadioInput/styles.ts +67 -67
  163. package/src/components/Scroll.tsx +104 -104
  164. package/src/components/Sections.tsx +101 -101
  165. package/src/components/Select/index.tsx +195 -195
  166. package/src/components/Select/styles.ts +81 -81
  167. package/src/components/Select/types.ts +45 -45
  168. package/src/components/Slider/Mark.tsx +46 -46
  169. package/src/components/Slider/Thumb.tsx +29 -29
  170. package/src/components/Slider/index.tsx +123 -123
  171. package/src/components/Slider/types.ts +25 -25
  172. package/src/components/Switch.tsx +81 -81
  173. package/src/components/Text.tsx +30 -30
  174. package/src/components/TextInput.tsx +246 -246
  175. package/src/components/Touchable.tsx +64 -64
  176. package/src/components/View.tsx +46 -46
  177. package/src/components/components.ts +26 -26
  178. package/src/index.ts +6 -6
  179. package/src/modules/documentPicker.ts +7 -7
  180. package/src/modules/fastImage.ts +2 -2
  181. package/src/modules/index.d.ts +496 -496
  182. package/src/modules/reactNavigation.ts +4 -4
  183. package/src/modules/textInputMask.ts +7 -7
  184. package/src/modules/types/documentPicker.d.ts +215 -215
  185. package/src/modules/types/fileTypes.ts +138 -138
  186. package/src/modules/types/textInputMask.ts +9 -9
  187. package/src/types/utility.ts +3 -3
  188. package/src/utils/OSAlert.ts +180 -180
  189. package/src/utils/misc.ts +24 -24
  190. package/src/utils/styles.ts +14 -14
  191. package/dist/modules/textInputMask.d.ts +0 -7
  192. package/dist/modules/textInputMask.js +0 -10
  193. package/dist/modules/textInputMask.js.map +0 -1
  194. package/dist/modules/types/textInputMask.d.ts +0 -9
  195. package/dist/modules/types/textInputMask.js +0 -3
  196. package/dist/modules/types/textInputMask.js.map +0 -1
@@ -1,246 +1,246 @@
1
- import * as React from 'react'
2
- import {
3
- ComponentVariants,
4
- FormTypes,
5
- IconPlaceholder,
6
- TextInputComposition,
7
- TextInputStyles,
8
- useBooleanToggle,
9
- useComponentStyle,
10
- useDefaultComponentStyle,
11
- useValidate,
12
- } from '@codeleap/common'
13
- import { ComponentPropsWithoutRef, forwardRef, useImperativeHandle, useRef, useState } from 'react'
14
- import { Text } from './Text'
15
- import { View, ViewProps } from './View'
16
- import { Button } from './Button'
17
- import { StylesOf } from '../types/utility'
18
- import { Icon } from './Icon'
19
- import { NativeSyntheticEvent, StyleSheet, TextInput as NativeTextInput, TextInputChangeEventData } from 'react-native'
20
- import { Touchable, TouchableProps } from './Touchable'
21
- import { MaskedTextInput } from '../modules/textInputMask'
22
- import { TextInputMaskProps } from '../modules/types/textInputMask'
23
-
24
- type IconProp = { name: IconPlaceholder; action?: () => void }
25
-
26
- type NativeProps = ComponentPropsWithoutRef<typeof NativeTextInput>
27
-
28
- export type TextInputProps =
29
- ComponentVariants<typeof TextInputStyles> &
30
- Omit<NativeProps, 'value'> &
31
- {
32
- multiline?: boolean
33
- onChangeText?: (text: string) => void
34
- disabled?: boolean
35
- edited?: boolean
36
- type?: string
37
- label?: React.ReactNode
38
- debugName: string
39
- leftIcon?: IconProp
40
- rightIcon?: IconProp
41
- styles?: StylesOf<TextInputComposition>
42
- validate?: FormTypes.ValidatorFunctionWithoutForm | string
43
- value?: string
44
- password?: boolean
45
- visibilityToggle?: boolean
46
- touchableWrapper?: boolean
47
- onPress?: () => void
48
- masking?: FormTypes.TextField['masking']
49
- innerWrapperProps?: TouchableProps | ViewProps
50
- onChangeMask?: TextInputMaskProps['onChangeText']
51
- required?:boolean
52
- }
53
-
54
- export const TextInput = forwardRef<NativeTextInput, TextInputProps>((rawprops, inputRef) => {
55
- const {
56
- onChange,
57
- type,
58
- value,
59
- onChangeText,
60
- disabled,
61
- edited,
62
- onFocus,
63
- onBlur,
64
- variants,
65
- label,
66
- leftIcon,
67
- rightIcon,
68
- styles,
69
- validate,
70
- password,
71
- visibilityToggle,
72
- touchableWrapper,
73
- innerWrapperProps,
74
- masking = null,
75
- onChangeMask,
76
- debugName,
77
- required = false,
78
- ...props
79
- } = rawprops
80
-
81
- const [isFocused, setFocus] = useState(false)
82
- const [editedState, setEdited] = useState(edited)
83
-
84
- const input = useRef<any>(null)
85
- const [textIsVisible, setTextVisible] = useBooleanToggle(false)
86
- const variantStyles = useDefaultComponentStyle('TextInput', {
87
- variants,
88
- styles,
89
- })
90
- const InputElement = masking ? MaskedTextInput : NativeTextInput
91
-
92
- const handleBlur: TextInputProps['onBlur'] = (e) => {
93
- if (!editedState && value) setEdited(true)
94
- setFocus(false)
95
-
96
- if (onBlur) {
97
- onBlur(e)
98
- }
99
- }
100
-
101
- const handleFocus: TextInputProps['onFocus'] = (e) => {
102
- setFocus(true)
103
- if (onFocus) {
104
- onFocus(e)
105
- }
106
- }
107
- const handleMaskChange = (masked, unmasked, obfuscated) => {
108
- if (onChangeText) onChangeText(masking.saveFormatted ? masked : unmasked)
109
- if (onChangeMask) onChangeMask(masked, unmasked, obfuscated)
110
- }
111
- const handleChange = (event: NativeSyntheticEvent<TextInputChangeEventData>) => {
112
- const text = event.nativeEvent.text
113
-
114
- if (onChange) onChange(event)
115
- if (onChangeText) onChangeText(text)
116
- }
117
-
118
- useImperativeHandle(inputRef, () => ({ ...input.current, focus: () => {
119
- input.current?.focus?.()
120
- }, isTextInput: true }))
121
-
122
- const { showError, error } = useValidate(value, validate)
123
-
124
- const leftIconStyle = {
125
- ...variantStyles.icon,
126
- ...(isFocused ? variantStyles['icon:focus'] : {}),
127
- ...(showError ? variantStyles['icon:error'] : {}),
128
- ...variantStyles.leftIcon,
129
- ...(isFocused ? variantStyles['leftIcon:focus'] : {}),
130
- ...(showError ? variantStyles['leftIcon:error'] : {}),
131
- }
132
-
133
- const rightIconStyle = {
134
- ...variantStyles.icon,
135
- ...(isFocused ? variantStyles['icon:focus'] : {}),
136
- ...(showError ? variantStyles['icon:error'] : {}),
137
- ...variantStyles.rightIcon,
138
- ...(isFocused ? variantStyles['rightIcon:focus'] : {}),
139
- ...(showError ? variantStyles['rightIcon:error'] : {}),
140
- }
141
-
142
- const buttonIconWrapperStyle = {
143
- ...variantStyles.buttonIconWrapper,
144
- ...(isFocused ? variantStyles['buttonIconWrapper:focus'] : {}),
145
- ...(showError ? variantStyles['buttonIconWrapper:error'] : {}),
146
- }
147
- function getStyles(key: TextInputComposition) {
148
- const requestedStyles = [
149
- variantStyles[key],
150
- isFocused ? variantStyles[key + ':focus'] : {},
151
- showError ? variantStyles[key + ':error'] : {},
152
- ]
153
- return requestedStyles
154
- }
155
-
156
- function handlePress() {
157
- if (props.onPress) {
158
- props.onPress()
159
- } else {
160
- input.current?.focus?.()
161
- }
162
- }
163
-
164
- return (
165
- <Touchable
166
- style={getStyles('wrapper')}
167
- debugName={debugName}
168
- onPress={handlePress}
169
- {...innerWrapperProps}
170
- >
171
- <InputLabel
172
- label={label}
173
- style={getStyles('label')}
174
- asteriskStyle={getStyles('requiredAsterisk')}
175
- wrapperStyle={getStyles('labelWrapper')}
176
- required={required}
177
- />
178
- <View style={getStyles('innerWrapper')} {...innerWrapperProps}>
179
- <InputIcon {...leftIcon} style={leftIconStyle} wrapperStyle={buttonIconWrapperStyle} />
180
- {/* @ts-ignore */}
181
- <InputElement
182
- ref={input}
183
- secureTextEntry={password && !textIsVisible}
184
- onChange={(e) => masking ? onChange?.(e) : handleChange(e)}
185
- value={value}
186
- editable={disabled}
187
- onFocus={handleFocus}
188
- onBlur={handleBlur}
189
- placeholderTextColor={StyleSheet.flatten(getStyles('placeholder'))?.color}
190
- selectionColor={StyleSheet.flatten(getStyles('selection'))?.color}
191
- mask={masking?.mask}
192
- {...props}
193
- {...(masking ? { onChangeText: handleMaskChange } : {})}
194
- style={getStyles('textField')}
195
- />
196
- {
197
- visibilityToggle ?
198
- <InputIcon name={
199
- (textIsVisible ? 'input-visiblity:visible' : 'input-visiblity:hidden') as IconPlaceholder
200
- } action={() => setTextVisible()} style={rightIconStyle} wrapperStyle={buttonIconWrapperStyle}/>
201
- :
202
- <InputIcon {...rightIcon} style={rightIconStyle} wrapperStyle={buttonIconWrapperStyle} />
203
- }
204
- </View>
205
- <FormError message={error.message} style={getStyles('error')} />
206
- </Touchable>
207
- )
208
- })
209
-
210
- export const FormError = ({ message, ...props }) => {
211
- if (['number', 'string', 'undefined'].includes(typeof message)) {
212
- const text = message ? `${message.charAt(0).toUpperCase() + message.slice(1)}` : ' '
213
- return <Text text={text} variants={['p2', 'marginTop:1']} {...props} />
214
- }
215
- return message
216
- }
217
-
218
- export const InputIcon: React.FC<{ style: any; wrapperStyle: any } & IconProp> = ({ name, style, action, wrapperStyle = {}}) => {
219
- if (!name) return null
220
- if (action) {
221
- return <Touchable debugName={`${name} icon button`} onPress={() => action()} style={wrapperStyle} >
222
- <Icon name={name} style={style}/>
223
- </Touchable>
224
- }
225
- return <Icon name={name} style={style} />
226
- }
227
-
228
- export const InputLabel = ({ label, variants = [], styles = {}, style, asteriskStyle = null, required = false, wrapperStyle = null }) => {
229
- const labelStyles = useDefaultComponentStyle('TextInput', {
230
- variants, styles, transform: StyleSheet.flatten,
231
- })
232
-
233
- if (!label) return null
234
-
235
- switch (typeof label) {
236
- case 'string':
237
- return <View style={ wrapperStyle || labelStyles.labelWrapper}>
238
- <Text style={style || labelStyles.label} text={label} />
239
- {required && <Text style={asteriskStyle || labelStyles.requiredAsterisk} text={' *'} />}
240
- </View>
241
- case 'object':
242
- return label
243
- default:
244
- return null
245
- }
246
- }
1
+ import * as React from 'react'
2
+ import {
3
+ ComponentVariants,
4
+ FormTypes,
5
+ IconPlaceholder,
6
+ TextInputComposition,
7
+ TextInputStyles,
8
+ useBooleanToggle,
9
+ useComponentStyle,
10
+ useDefaultComponentStyle,
11
+ useValidate,
12
+ } from '@codeleap/common'
13
+ import { ComponentPropsWithoutRef, forwardRef, useImperativeHandle, useRef, useState } from 'react'
14
+ import { Text } from './Text'
15
+ import { View, ViewProps } from './View'
16
+ import { Button } from './Button'
17
+ import { StylesOf } from '../types/utility'
18
+ import { Icon } from './Icon'
19
+ import { NativeSyntheticEvent, StyleSheet, TextInput as NativeTextInput, TextInputChangeEventData } from 'react-native'
20
+ import { Touchable, TouchableProps } from './Touchable'
21
+ import { MaskedTextInput } from '../modules/textInputMask'
22
+ import { TextInputMaskProps } from '../modules/types/textInputMask'
23
+
24
+ type IconProp = { name: IconPlaceholder; action?: () => void }
25
+
26
+ type NativeProps = ComponentPropsWithoutRef<typeof NativeTextInput>
27
+
28
+ export type TextInputProps =
29
+ ComponentVariants<typeof TextInputStyles> &
30
+ Omit<NativeProps, 'value'> &
31
+ {
32
+ multiline?: boolean
33
+ onChangeText?: (text: string) => void
34
+ disabled?: boolean
35
+ edited?: boolean
36
+ type?: string
37
+ label?: React.ReactNode
38
+ debugName: string
39
+ leftIcon?: IconProp
40
+ rightIcon?: IconProp
41
+ styles?: StylesOf<TextInputComposition>
42
+ validate?: FormTypes.ValidatorFunctionWithoutForm | string
43
+ value?: string
44
+ password?: boolean
45
+ visibilityToggle?: boolean
46
+ touchableWrapper?: boolean
47
+ onPress?: () => void
48
+ masking?: FormTypes.TextField['masking']
49
+ innerWrapperProps?: TouchableProps | ViewProps
50
+ onChangeMask?: TextInputMaskProps['onChangeText']
51
+ required?:boolean
52
+ }
53
+
54
+ export const TextInput = forwardRef<NativeTextInput, TextInputProps>((rawprops, inputRef) => {
55
+ const {
56
+ onChange,
57
+ type,
58
+ value,
59
+ onChangeText,
60
+ disabled,
61
+ edited,
62
+ onFocus,
63
+ onBlur,
64
+ variants,
65
+ label,
66
+ leftIcon,
67
+ rightIcon,
68
+ styles,
69
+ validate,
70
+ password,
71
+ visibilityToggle,
72
+ touchableWrapper,
73
+ innerWrapperProps,
74
+ masking = null,
75
+ onChangeMask,
76
+ debugName,
77
+ required = false,
78
+ ...props
79
+ } = rawprops
80
+
81
+ const [isFocused, setFocus] = useState(false)
82
+ const [editedState, setEdited] = useState(edited)
83
+
84
+ const input = useRef<any>(null)
85
+ const [textIsVisible, setTextVisible] = useBooleanToggle(false)
86
+ const variantStyles = useDefaultComponentStyle('TextInput', {
87
+ variants,
88
+ styles,
89
+ })
90
+ const InputElement = masking ? MaskedTextInput : NativeTextInput
91
+
92
+ const handleBlur: TextInputProps['onBlur'] = (e) => {
93
+ if (!editedState && value) setEdited(true)
94
+ setFocus(false)
95
+
96
+ if (onBlur) {
97
+ onBlur(e)
98
+ }
99
+ }
100
+
101
+ const handleFocus: TextInputProps['onFocus'] = (e) => {
102
+ setFocus(true)
103
+ if (onFocus) {
104
+ onFocus(e)
105
+ }
106
+ }
107
+ const handleMaskChange = (masked, unmasked, obfuscated) => {
108
+ if (onChangeText) onChangeText(masking.saveFormatted ? masked : unmasked)
109
+ if (onChangeMask) onChangeMask(masked, unmasked, obfuscated)
110
+ }
111
+ const handleChange = (event: NativeSyntheticEvent<TextInputChangeEventData>) => {
112
+ const text = event.nativeEvent.text
113
+
114
+ if (onChange) onChange(event)
115
+ if (onChangeText) onChangeText(text)
116
+ }
117
+
118
+ useImperativeHandle(inputRef, () => ({ ...input.current, focus: () => {
119
+ input.current?.focus?.()
120
+ }, isTextInput: true }))
121
+
122
+ const { showError, error } = useValidate(value, validate)
123
+
124
+ const leftIconStyle = {
125
+ ...variantStyles.icon,
126
+ ...(isFocused ? variantStyles['icon:focus'] : {}),
127
+ ...(showError ? variantStyles['icon:error'] : {}),
128
+ ...variantStyles.leftIcon,
129
+ ...(isFocused ? variantStyles['leftIcon:focus'] : {}),
130
+ ...(showError ? variantStyles['leftIcon:error'] : {}),
131
+ }
132
+
133
+ const rightIconStyle = {
134
+ ...variantStyles.icon,
135
+ ...(isFocused ? variantStyles['icon:focus'] : {}),
136
+ ...(showError ? variantStyles['icon:error'] : {}),
137
+ ...variantStyles.rightIcon,
138
+ ...(isFocused ? variantStyles['rightIcon:focus'] : {}),
139
+ ...(showError ? variantStyles['rightIcon:error'] : {}),
140
+ }
141
+
142
+ const buttonIconWrapperStyle = {
143
+ ...variantStyles.buttonIconWrapper,
144
+ ...(isFocused ? variantStyles['buttonIconWrapper:focus'] : {}),
145
+ ...(showError ? variantStyles['buttonIconWrapper:error'] : {}),
146
+ }
147
+ function getStyles(key: TextInputComposition) {
148
+ const requestedStyles = [
149
+ variantStyles[key],
150
+ isFocused ? variantStyles[key + ':focus'] : {},
151
+ showError ? variantStyles[key + ':error'] : {},
152
+ ]
153
+ return requestedStyles
154
+ }
155
+
156
+ function handlePress() {
157
+ if (props.onPress) {
158
+ props.onPress()
159
+ } else {
160
+ input.current?.focus?.()
161
+ }
162
+ }
163
+
164
+ return (
165
+ <Touchable
166
+ style={getStyles('wrapper')}
167
+ debugName={debugName}
168
+ onPress={handlePress}
169
+ {...innerWrapperProps}
170
+ >
171
+ <InputLabel
172
+ label={label}
173
+ style={getStyles('label')}
174
+ asteriskStyle={getStyles('requiredAsterisk')}
175
+ wrapperStyle={getStyles('labelWrapper')}
176
+ required={required}
177
+ />
178
+ <View style={getStyles('innerWrapper')} {...innerWrapperProps}>
179
+ <InputIcon {...leftIcon} style={leftIconStyle} wrapperStyle={buttonIconWrapperStyle} />
180
+ {/* @ts-ignore */}
181
+ <InputElement
182
+ ref={input}
183
+ secureTextEntry={password && !textIsVisible}
184
+ onChange={(e) => masking ? onChange?.(e) : handleChange(e)}
185
+ value={value}
186
+ editable={disabled}
187
+ onFocus={handleFocus}
188
+ onBlur={handleBlur}
189
+ placeholderTextColor={StyleSheet.flatten(getStyles('placeholder'))?.color}
190
+ selectionColor={StyleSheet.flatten(getStyles('selection'))?.color}
191
+ mask={masking?.mask}
192
+ {...props}
193
+ {...(masking ? { onChangeText: handleMaskChange } : {})}
194
+ style={getStyles('textField')}
195
+ />
196
+ {
197
+ visibilityToggle ?
198
+ <InputIcon name={
199
+ (textIsVisible ? 'input-visiblity:visible' : 'input-visiblity:hidden') as IconPlaceholder
200
+ } action={() => setTextVisible()} style={rightIconStyle} wrapperStyle={buttonIconWrapperStyle}/>
201
+ :
202
+ <InputIcon {...rightIcon} style={rightIconStyle} wrapperStyle={buttonIconWrapperStyle} />
203
+ }
204
+ </View>
205
+ <FormError message={error.message} style={getStyles('error')} />
206
+ </Touchable>
207
+ )
208
+ })
209
+
210
+ export const FormError = ({ message, ...props }) => {
211
+ if (['number', 'string', 'undefined'].includes(typeof message)) {
212
+ const text = message ? `${message.charAt(0).toUpperCase() + message.slice(1)}` : ' '
213
+ return <Text text={text} variants={['p2', 'marginTop:1']} {...props} />
214
+ }
215
+ return message
216
+ }
217
+
218
+ export const InputIcon: React.FC<{ style: any; wrapperStyle: any } & IconProp> = ({ name, style, action, wrapperStyle = {}}) => {
219
+ if (!name) return null
220
+ if (action) {
221
+ return <Touchable debugName={`${name} icon button`} onPress={() => action()} style={wrapperStyle} >
222
+ <Icon name={name} style={style}/>
223
+ </Touchable>
224
+ }
225
+ return <Icon name={name} style={style} />
226
+ }
227
+
228
+ export const InputLabel = ({ label, variants = [], styles = {}, style, asteriskStyle = null, required = false, wrapperStyle = null }) => {
229
+ const labelStyles = useDefaultComponentStyle('TextInput', {
230
+ variants, styles, transform: StyleSheet.flatten,
231
+ })
232
+
233
+ if (!label) return null
234
+
235
+ switch (typeof label) {
236
+ case 'string':
237
+ return <View style={ wrapperStyle || labelStyles.labelWrapper}>
238
+ <Text style={style || labelStyles.label} text={label} />
239
+ {required && <Text style={asteriskStyle || labelStyles.requiredAsterisk} text={' *'} />}
240
+ </View>
241
+ case 'object':
242
+ return label
243
+ default:
244
+ return null
245
+ }
246
+ }
@@ -1,64 +1,64 @@
1
- import * as React from 'react'
2
- import { ComponentPropsWithoutRef, forwardRef } from 'react'
3
- import {
4
- ComponentVariants,
5
- useDefaultComponentStyle,
6
- BaseViewProps,
7
- ViewStyles,
8
- useCodeleapContext,
9
- AnyFunction,
10
- } from '@codeleap/common'
11
- import { TouchableOpacity as NativeTouchable } from 'react-native'
12
-
13
- import { createAnimatableComponent } from 'react-native-animatable'
14
- export type TouchableProps = Omit<
15
- ComponentPropsWithoutRef<typeof NativeTouchable>,
16
- 'onPress'
17
- > & {
18
- variants?: ComponentVariants<typeof ViewStyles>['variants']
19
- component?: any
20
- ref?: React.Ref<NativeTouchable>
21
- debugName: string
22
- debugComponent?: string
23
- onPress?: AnyFunction
24
- } & BaseViewProps
25
-
26
- export const Touchable: React.FC<TouchableProps> = forwardRef<
27
- NativeTouchable,
28
- TouchableProps
29
- >((touchableProps, ref) => {
30
- const {
31
- variants = [],
32
- children,
33
- onPress,
34
- style,
35
- debugName,
36
- debugComponent,
37
- ...props
38
- } = touchableProps
39
-
40
- const variantStyles = useDefaultComponentStyle('View', {
41
- variants,
42
- })
43
-
44
- const { logger } = useCodeleapContext()
45
- const press = () => {
46
- if (!onPress) { throw { message: 'No onPress passed to touchable', touchableProps } }
47
- logger.log(
48
- `<${debugComponent || 'Touchable'}/> pressed`,
49
- { debugName, style, variants },
50
- 'User interaction',
51
- )
52
- onPress && onPress()
53
- }
54
-
55
- const styles = [variantStyles.wrapper, style]
56
-
57
- return (
58
- <NativeTouchable onPress={press} style={styles} {...props} ref={ref}>
59
- {children}
60
- </NativeTouchable>
61
- )
62
- })
63
-
64
- export const AnimatedTouchable = createAnimatableComponent(Touchable) as unknown as typeof Touchable
1
+ import * as React from 'react'
2
+ import { ComponentPropsWithoutRef, forwardRef } from 'react'
3
+ import {
4
+ ComponentVariants,
5
+ useDefaultComponentStyle,
6
+ BaseViewProps,
7
+ ViewStyles,
8
+ useCodeleapContext,
9
+ AnyFunction,
10
+ } from '@codeleap/common'
11
+ import { TouchableOpacity as NativeTouchable } from 'react-native'
12
+
13
+ import { createAnimatableComponent } from 'react-native-animatable'
14
+ export type TouchableProps = Omit<
15
+ ComponentPropsWithoutRef<typeof NativeTouchable>,
16
+ 'onPress'
17
+ > & {
18
+ variants?: ComponentVariants<typeof ViewStyles>['variants']
19
+ component?: any
20
+ ref?: React.Ref<NativeTouchable>
21
+ debugName: string
22
+ debugComponent?: string
23
+ onPress?: AnyFunction
24
+ } & BaseViewProps
25
+
26
+ export const Touchable: React.FC<TouchableProps> = forwardRef<
27
+ NativeTouchable,
28
+ TouchableProps
29
+ >((touchableProps, ref) => {
30
+ const {
31
+ variants = [],
32
+ children,
33
+ onPress,
34
+ style,
35
+ debugName,
36
+ debugComponent,
37
+ ...props
38
+ } = touchableProps
39
+
40
+ const variantStyles = useDefaultComponentStyle('View', {
41
+ variants,
42
+ })
43
+
44
+ const { logger } = useCodeleapContext()
45
+ const press = () => {
46
+ if (!onPress) { throw { message: 'No onPress passed to touchable', touchableProps } }
47
+ logger.log(
48
+ `<${debugComponent || 'Touchable'}/> pressed`,
49
+ { debugName, style, variants },
50
+ 'User interaction',
51
+ )
52
+ onPress && onPress()
53
+ }
54
+
55
+ const styles = [variantStyles.wrapper, style]
56
+
57
+ return (
58
+ <NativeTouchable onPress={press} style={styles} {...props} ref={ref}>
59
+ {children}
60
+ </NativeTouchable>
61
+ )
62
+ })
63
+
64
+ export const AnimatedTouchable = createAnimatableComponent(Touchable) as unknown as typeof Touchable