@codeleap/mobile 1.9.24 → 1.9.27

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