@codeleap/mobile 1.4.0 → 1.4.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.
Files changed (191) hide show
  1. package/.eslintignore +1 -1
  2. package/.eslintrc.js +3 -3
  3. package/.vscode/settings.json +10 -10
  4. package/CodeLeap-Mobile-Packages.code-workspace +7 -7
  5. package/dist/components/ActivityIndicator.d.ts +13 -13
  6. package/dist/components/ActivityIndicator.js +50 -51
  7. package/dist/components/ActivityIndicator.js.map +1 -1
  8. package/dist/components/Animated.d.ts +15 -15
  9. package/dist/components/Animated.js +54 -54
  10. package/dist/components/Animated.js.map +0 -0
  11. package/dist/components/Button.d.ts +119 -119
  12. package/dist/components/Button.js +77 -77
  13. package/dist/components/Button.js.map +1 -1
  14. package/dist/components/Checkbox/index.d.ts +14 -14
  15. package/dist/components/Checkbox/index.js +73 -73
  16. package/dist/components/Checkbox/index.js.map +1 -1
  17. package/dist/components/Checkbox/styles.d.ts +52 -52
  18. package/dist/components/Checkbox/styles.js +48 -48
  19. package/dist/components/Checkbox/styles.js.map +0 -0
  20. package/dist/components/ContentView.d.ts +10 -10
  21. package/dist/components/ContentView.js +50 -50
  22. package/dist/components/ContentView.js.map +0 -0
  23. package/dist/components/FileInput.d.ts +26 -26
  24. package/dist/components/FileInput.js +174 -174
  25. package/dist/components/FileInput.js.map +1 -1
  26. package/dist/components/Icon.d.ts +12 -11
  27. package/dist/components/Icon.js +66 -60
  28. package/dist/components/Icon.js.map +1 -1
  29. package/dist/components/Image.d.ts +18 -17
  30. package/dist/components/Image.js +53 -47
  31. package/dist/components/Image.js.map +1 -1
  32. package/dist/components/List.d.ts +11 -11
  33. package/dist/components/List.js +76 -76
  34. package/dist/components/List.js.map +0 -0
  35. package/dist/components/Modal/index.d.ts +25 -25
  36. package/dist/components/Modal/index.js +108 -108
  37. package/dist/components/Modal/index.js.map +0 -0
  38. package/dist/components/Modal/styles.d.ts +66 -66
  39. package/dist/components/Modal/styles.js +64 -56
  40. package/dist/components/Modal/styles.js.map +1 -1
  41. package/dist/components/Navigation/Navigation.d.ts +3 -3
  42. package/dist/components/Navigation/Navigation.js +83 -75
  43. package/dist/components/Navigation/Navigation.js.map +1 -1
  44. package/dist/components/Navigation/constants.d.ts +5 -5
  45. package/dist/components/Navigation/constants.js +10 -10
  46. package/dist/components/Navigation/constants.js.map +0 -0
  47. package/dist/components/Navigation/index.d.ts +3 -3
  48. package/dist/components/Navigation/index.js +15 -15
  49. package/dist/components/Navigation/index.js.map +0 -0
  50. package/dist/components/Navigation/types.d.ts +26 -26
  51. package/dist/components/Navigation/types.js +7 -7
  52. package/dist/components/Navigation/types.js.map +1 -1
  53. package/dist/components/Navigation/utils.d.ts +3 -3
  54. package/dist/components/Navigation/utils.js +69 -66
  55. package/dist/components/Navigation/utils.js.map +1 -1
  56. package/dist/components/Overlay.d.ts +16 -16
  57. package/dist/components/Overlay.js +65 -65
  58. package/dist/components/Overlay.js.map +1 -1
  59. package/dist/components/Pager/index.d.ts +19 -19
  60. package/dist/components/Pager/index.js +163 -163
  61. package/dist/components/Pager/index.js.map +1 -1
  62. package/dist/components/Pager/styles.d.ts +51 -51
  63. package/dist/components/Pager/styles.js +43 -43
  64. package/dist/components/Pager/styles.js.map +0 -0
  65. package/dist/components/RadioInput/index.d.ts +26 -26
  66. package/dist/components/RadioInput/index.js +68 -68
  67. package/dist/components/RadioInput/index.js.map +1 -1
  68. package/dist/components/RadioInput/styles.d.ts +54 -54
  69. package/dist/components/RadioInput/styles.js +44 -44
  70. package/dist/components/RadioInput/styles.js.map +0 -0
  71. package/dist/components/Scroll.d.ts +11 -11
  72. package/dist/components/Scroll.js +75 -75
  73. package/dist/components/Scroll.js.map +0 -0
  74. package/dist/components/Sections.d.ts +11 -11
  75. package/dist/components/Sections.js +76 -76
  76. package/dist/components/Sections.js.map +0 -0
  77. package/dist/components/Select/index.d.ts +5 -5
  78. package/dist/components/Select/index.js +144 -143
  79. package/dist/components/Select/index.js.map +1 -1
  80. package/dist/components/Select/styles.d.ts +9 -9
  81. package/dist/components/Select/styles.js +56 -56
  82. package/dist/components/Select/styles.js.map +0 -0
  83. package/dist/components/Select/types.d.ts +33 -33
  84. package/dist/components/Select/types.js +2 -2
  85. package/dist/components/Select/types.js.map +0 -0
  86. package/dist/components/Slider/Mark.d.ts +3 -3
  87. package/dist/components/Slider/Mark.js +31 -31
  88. package/dist/components/Slider/Mark.js.map +0 -0
  89. package/dist/components/Slider/Thumb.d.ts +7 -7
  90. package/dist/components/Slider/Thumb.js +29 -29
  91. package/dist/components/Slider/Thumb.js.map +0 -0
  92. package/dist/components/Slider/index.d.ts +3 -3
  93. package/dist/components/Slider/index.js +93 -93
  94. package/dist/components/Slider/index.js.map +0 -0
  95. package/dist/components/Slider/types.d.ts +25 -25
  96. package/dist/components/Slider/types.js +2 -2
  97. package/dist/components/Slider/types.js.map +0 -0
  98. package/dist/components/Switch.d.ts +13 -13
  99. package/dist/components/Switch.js +71 -71
  100. package/dist/components/Switch.js.map +1 -1
  101. package/dist/components/Text.d.ts +12 -12
  102. package/dist/components/Text.js +48 -48
  103. package/dist/components/Text.js.map +0 -0
  104. package/dist/components/TextInput.d.ts +162 -160
  105. package/dist/components/TextInput.js +149 -149
  106. package/dist/components/TextInput.js.map +1 -1
  107. package/dist/components/Touchable.d.ts +14 -14
  108. package/dist/components/Touchable.js +57 -57
  109. package/dist/components/Touchable.js.map +1 -1
  110. package/dist/components/View.d.ts +114 -114
  111. package/dist/components/View.js +50 -50
  112. package/dist/components/View.js.map +0 -0
  113. package/dist/components/components.d.ts +24 -24
  114. package/dist/components/components.js +36 -36
  115. package/dist/components/components.js.map +0 -0
  116. package/dist/index.d.ts +5 -5
  117. package/dist/index.js +24 -24
  118. package/dist/index.js.map +0 -0
  119. package/dist/modules/documentPicker.d.ts +3 -3
  120. package/dist/modules/documentPicker.js +11 -11
  121. package/dist/modules/documentPicker.js.map +1 -1
  122. package/dist/modules/fastImage.d.ts +1 -1
  123. package/dist/modules/fastImage.js +9 -9
  124. package/dist/modules/fastImage.js.map +0 -0
  125. package/dist/modules/reactNavigation.d.ts +3 -3
  126. package/dist/modules/reactNavigation.js +10 -10
  127. package/dist/modules/reactNavigation.js.map +0 -0
  128. package/dist/modules/types/fileTypes.d.ts +138 -138
  129. package/dist/modules/types/fileTypes.js +2 -2
  130. package/dist/modules/types/fileTypes.js.map +0 -0
  131. package/dist/types/utility.d.ts +2 -2
  132. package/dist/types/utility.js +2 -2
  133. package/dist/types/utility.js.map +0 -0
  134. package/dist/utils/OSAlert.d.ts +31 -31
  135. package/dist/utils/OSAlert.js +141 -88
  136. package/dist/utils/OSAlert.js.map +1 -1
  137. package/dist/utils/misc.d.ts +2 -2
  138. package/dist/utils/misc.js +25 -25
  139. package/dist/utils/misc.js.map +0 -0
  140. package/dist/utils/styles.d.ts +1 -1
  141. package/dist/utils/styles.js +12 -12
  142. package/dist/utils/styles.js.map +0 -0
  143. package/package.json +40 -38
  144. package/src/components/ActivityIndicator.tsx +46 -47
  145. package/src/components/Animated.tsx +34 -34
  146. package/src/components/Button.tsx +95 -95
  147. package/src/components/Checkbox/index.tsx +81 -80
  148. package/src/components/Checkbox/styles.ts +72 -72
  149. package/src/components/ContentView.tsx +58 -58
  150. package/src/components/FileInput.tsx +179 -178
  151. package/src/components/Icon.tsx +58 -48
  152. package/src/components/Image.tsx +61 -49
  153. package/src/components/List.tsx +100 -100
  154. package/src/components/Modal/index.tsx +158 -158
  155. package/src/components/Modal/styles.ts +133 -118
  156. package/src/components/Navigation/Navigation.tsx +58 -51
  157. package/src/components/Navigation/constants.ts +8 -8
  158. package/src/components/Navigation/index.tsx +3 -3
  159. package/src/components/Navigation/types.ts +35 -37
  160. package/src/components/Navigation/utils.tsx +59 -54
  161. package/src/components/Overlay.tsx +77 -76
  162. package/src/components/Pager/index.tsx +240 -241
  163. package/src/components/Pager/styles.ts +51 -51
  164. package/src/components/RadioInput/index.tsx +101 -100
  165. package/src/components/RadioInput/styles.ts +67 -67
  166. package/src/components/Scroll.tsx +98 -98
  167. package/src/components/Sections.tsx +100 -0
  168. package/src/components/Select/index.tsx +184 -181
  169. package/src/components/Select/styles.ts +81 -81
  170. package/src/components/Select/types.ts +41 -41
  171. package/src/components/Slider/Mark.tsx +46 -46
  172. package/src/components/Slider/Thumb.tsx +29 -29
  173. package/src/components/Slider/index.tsx +123 -123
  174. package/src/components/Slider/types.ts +25 -25
  175. package/src/components/Switch.tsx +81 -82
  176. package/src/components/Text.tsx +30 -30
  177. package/src/components/TextInput.tsx +204 -203
  178. package/src/components/Touchable.tsx +65 -64
  179. package/src/components/View.tsx +46 -46
  180. package/src/components/components.ts +26 -26
  181. package/src/index.ts +6 -6
  182. package/src/modules/documentPicker.ts +7 -8
  183. package/src/modules/fastImage.ts +2 -2
  184. package/src/modules/index.d.ts +496 -496
  185. package/src/modules/reactNavigation.ts +4 -4
  186. package/src/modules/types/documentPicker.d.ts +215 -215
  187. package/src/modules/types/fileTypes.ts +122 -122
  188. package/src/types/utility.ts +3 -3
  189. package/src/utils/OSAlert.ts +180 -124
  190. package/src/utils/misc.ts +24 -24
  191. package/src/utils/styles.ts +14 -14
@@ -1,82 +1,81 @@
1
- import * as React from 'react'
2
- import {
3
- SwitchStyles,
4
- SwitchComposition,
5
- ComponentVariants,
6
- useDefaultComponentStyle,
7
- StylesOf,
8
- useCodeleapContext,
9
- FormTypes,
10
- useValidate,
11
- } from '@codeleap/common'
12
- import { ComponentPropsWithRef, forwardRef, ReactNode } from 'react'
13
- import { StyleSheet, Switch as NativeSwitch } from 'react-native'
14
- import { InputLabel, FormError } from './TextInput'
15
- import { View } from './View'
16
-
17
- type NativeSwitchProps = Omit<
18
- ComponentPropsWithRef<typeof NativeSwitch>,
19
- 'thumbColor' | 'trackColor'
20
- >;
21
- type SwitchProps = NativeSwitchProps & {
22
- variants?: ComponentVariants<typeof SwitchStyles>['variants'];
23
- label?: ReactNode;
24
- styles?: StylesOf<SwitchComposition>;
25
- validate?: FormTypes.ValidatorFunctionWithoutForm | string;
26
- };
27
-
28
-
29
- export const Switch = forwardRef<NativeSwitch, SwitchProps>(
30
- (switchProps, ref) => {
31
- const {
32
- variants = [],
33
- style = {},
34
- styles = {},
35
- validate,
36
- label,
37
- value,
38
- ...props
39
- } = switchProps
40
-
41
- const variantStyles = useDefaultComponentStyle('Switch', {
42
- variants,
43
- })
44
- const { error, showError } = useValidate(switchProps.value, validate)
45
- function getStyles(key: SwitchComposition) {
46
- return [
47
- variantStyles[key],
48
- styles[key],
49
- key === 'wrapper' ? style : {},
50
- showError ? variantStyles[key + ':error'] : {},
51
- showError ? styles[key + ':error'] : {},
52
- value ? variantStyles[key + ':on'] : {},
53
- value ? styles[key + ':on'] : {},
54
- switchProps.disabled ? variantStyles[key + ':disabled'] : {},
55
- switchProps.disabled ? styles[key + ':disabled'] : {},
56
- ]
57
- }
58
-
59
- const inputStyles = getStyles('input')
60
-
61
- const { color, backgroundColor } = StyleSheet.flatten(inputStyles)
62
- const { Theme } = useCodeleapContext()
63
-
64
- const thumbColor = color || Theme.colors.primary
65
- const trackColor = backgroundColor || Theme.colors.gray
66
- return (
67
- <View style={getStyles('wrapper')}>
68
- <View style={getStyles('inputWrapper')}>
69
- <NativeSwitch
70
- thumbColor={thumbColor}
71
- trackColor={{ false: trackColor, true: trackColor }}
72
- ios_backgroundColor={trackColor}
73
- value={value}
74
- {...props}
75
- />
76
- <InputLabel label={label} style={getStyles('label')} />
77
- </View>
78
- <FormError message={error.message} style={getStyles('error')} />
79
- </View>
80
- )
81
- },
82
- ) as React.FC<SwitchProps>
1
+ import * as React from 'react'
2
+ import {
3
+ SwitchStyles,
4
+ SwitchComposition,
5
+ ComponentVariants,
6
+ useDefaultComponentStyle,
7
+ StylesOf,
8
+ useCodeleapContext,
9
+ FormTypes,
10
+ useValidate,
11
+ } from '@codeleap/common'
12
+ import { ComponentPropsWithRef, forwardRef, ReactNode } from 'react'
13
+ import { StyleSheet, Switch as NativeSwitch } from 'react-native'
14
+ import { InputLabel, FormError } from './TextInput'
15
+ import { View } from './View'
16
+
17
+ type NativeSwitchProps = Omit<
18
+ ComponentPropsWithRef<typeof NativeSwitch>,
19
+ 'thumbColor' | 'trackColor'
20
+ >
21
+ type SwitchProps = NativeSwitchProps & {
22
+ variants?: ComponentVariants<typeof SwitchStyles>['variants']
23
+ label?: ReactNode
24
+ styles?: StylesOf<SwitchComposition>
25
+ validate?: FormTypes.ValidatorFunctionWithoutForm | string
26
+ }
27
+
28
+ export const Switch = forwardRef<NativeSwitch, SwitchProps>(
29
+ (switchProps, ref) => {
30
+ const {
31
+ variants = [],
32
+ style = {},
33
+ styles = {},
34
+ validate,
35
+ label,
36
+ value,
37
+ ...props
38
+ } = switchProps
39
+
40
+ const variantStyles = useDefaultComponentStyle('Switch', {
41
+ variants,
42
+ })
43
+ const { error, showError } = useValidate(switchProps.value, validate)
44
+ function getStyles(key: SwitchComposition) {
45
+ return [
46
+ variantStyles[key],
47
+ styles[key],
48
+ key === 'wrapper' ? style : {},
49
+ showError ? variantStyles[key + ':error'] : {},
50
+ showError ? styles[key + ':error'] : {},
51
+ value ? variantStyles[key + ':on'] : {},
52
+ value ? styles[key + ':on'] : {},
53
+ switchProps.disabled ? variantStyles[key + ':disabled'] : {},
54
+ switchProps.disabled ? styles[key + ':disabled'] : {},
55
+ ]
56
+ }
57
+
58
+ const inputStyles = getStyles('input')
59
+
60
+ const { color, backgroundColor } = StyleSheet.flatten(inputStyles)
61
+ const { Theme } = useCodeleapContext()
62
+
63
+ const thumbColor = color || Theme.colors.primary
64
+ const trackColor = backgroundColor || Theme.colors.gray
65
+ return (
66
+ <View style={getStyles('wrapper')}>
67
+ <View style={getStyles('inputWrapper')}>
68
+ <NativeSwitch
69
+ thumbColor={thumbColor}
70
+ trackColor={{ false: trackColor, true: trackColor }}
71
+ ios_backgroundColor={trackColor}
72
+ value={value}
73
+ {...props}
74
+ />
75
+ <InputLabel label={label} style={getStyles('label')} />
76
+ </View>
77
+ <FormError message={error.message} style={getStyles('error')} />
78
+ </View>
79
+ )
80
+ },
81
+ ) as React.FC<SwitchProps>
@@ -1,30 +1,30 @@
1
- import * as React from 'react'
2
- import { ComponentPropsWithoutRef, forwardRef } from 'react'
3
- import {
4
- ComponentVariants,
5
- useDefaultComponentStyle,
6
- BaseViewProps,
7
- TextStyles,
8
- } from '@codeleap/common'
9
- import { Text as NativeText } from 'react-native'
10
-
11
- export type TextProps = ComponentPropsWithoutRef<typeof NativeText> & {
12
- text?: string;
13
- variants?: ComponentVariants<typeof TextStyles>['variants'];
14
- } & BaseViewProps;
15
-
16
- export const Text = forwardRef<NativeText, TextProps>((textProps, ref) => {
17
- const { variants = [], text, style, ...props } = textProps
18
-
19
- const variantStyles = useDefaultComponentStyle('Text', {
20
- variants,
21
- rootElement: 'text',
22
- })
23
-
24
- const styles = [variantStyles.text, style]
25
- return (
26
- <NativeText {...props} style={styles} ref={ref}>
27
- {text}
28
- </NativeText>
29
- )
30
- })
1
+ import * as React from 'react'
2
+ import { ComponentPropsWithoutRef, forwardRef } from 'react'
3
+ import {
4
+ ComponentVariants,
5
+ useDefaultComponentStyle,
6
+ BaseViewProps,
7
+ TextStyles,
8
+ } from '@codeleap/common'
9
+ import { Text as NativeText } from 'react-native'
10
+
11
+ export type TextProps = ComponentPropsWithoutRef<typeof NativeText> & {
12
+ text?: string
13
+ variants?: ComponentVariants<typeof TextStyles>['variants']
14
+ } & BaseViewProps
15
+
16
+ export const Text = forwardRef<NativeText, TextProps>((textProps, ref) => {
17
+ const { variants = [], text, style, ...props } = textProps
18
+
19
+ const variantStyles = useDefaultComponentStyle('Text', {
20
+ variants,
21
+ rootElement: 'text',
22
+ })
23
+
24
+ const styles = [variantStyles.text, style]
25
+ return (
26
+ <NativeText {...props} style={styles} ref={ref}>
27
+ {text}
28
+ </NativeText>
29
+ )
30
+ })
@@ -1,203 +1,204 @@
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 { Button } from './Button'
16
- import { StylesOf } from '../types/utility'
17
- import { Icon } from './Icon'
18
- import { NativeSyntheticEvent, StyleSheet, TextInput as NativeTextInput, TextInputChangeEventData } from 'react-native'
19
- import { Touchable, TouchableProps } from './Touchable'
20
-
21
- type IconProp = { name: IconPlaceholder, action?: () => void }
22
-
23
- type NativeProps = ComponentPropsWithoutRef<typeof NativeTextInput>
24
-
25
- export type TextInputProps =
26
- ComponentVariants<typeof TextInputStyles> &
27
- Omit<NativeProps, 'value'> &
28
- {
29
- multiline?: boolean;
30
- onChangeText?: (text: string) => void;
31
- disabled?: boolean;
32
- edited?: boolean;
33
- type?: string;
34
- label?: React.ReactNode
35
-
36
- leftIcon?: IconProp
37
- rightIcon?: IconProp
38
- styles?: StylesOf<TextInputComposition>
39
- validate?: FormTypes.ValidatorFunctionWithoutForm | string
40
- value?: string
41
- password?: boolean
42
- visibilityToggle?: boolean
43
- touchableWrapper?: boolean
44
- innerWrapperProps?: TouchableProps | ViewProps
45
- };
46
-
47
- export const TextInput = forwardRef<NativeTextInput, TextInputProps>((rawprops, inputRef) => {
48
- const {
49
- onChange,
50
- type,
51
- value,
52
- onChangeText,
53
- disabled,
54
- edited,
55
- onFocus,
56
- onBlur,
57
- multiline,
58
- variants,
59
- label,
60
- leftIcon,
61
- rightIcon,
62
- styles,
63
- validate,
64
- password,
65
- visibilityToggle,
66
- touchableWrapper,
67
- innerWrapperProps,
68
- ...props
69
- } = rawprops
70
-
71
- const [isFocused, setFocus] = useState(false)
72
- const [editedState, setEdited] = useState(edited)
73
-
74
- const input = useRef<any>(null)
75
- const [textIsVisible, setTextVisible] = useBooleanToggle(false)
76
- const variantStyles = useDefaultComponentStyle('TextInput', {
77
- variants,
78
- styles,
79
- })
80
- const InputElement = NativeTextInput
81
-
82
- const handleBlur: TextInputProps['onBlur'] = (e) => {
83
- if (!editedState && value) setEdited(true)
84
- setFocus(false)
85
-
86
- if (onBlur) {
87
- onBlur(e)
88
- }
89
- }
90
-
91
- const handleFocus: TextInputProps['onFocus'] = (e) => {
92
- setFocus(true)
93
- if (onFocus) {
94
- onFocus(e)
95
- }
96
- }
97
-
98
- const handleChange = (event: NativeSyntheticEvent<TextInputChangeEventData>) => {
99
- const text = event.nativeEvent.text
100
-
101
- if (onChange) onChange(event)
102
- if (onChangeText) onChangeText(text)
103
- }
104
-
105
- useImperativeHandle(inputRef, () => ({...input.current, focus: () => {
106
- input.current?.focus?.()
107
- }, isTextInput: true}))
108
-
109
- const { showError, error } = useValidate(value, validate)
110
-
111
- const leftIconStyle = {
112
- ...variantStyles.icon,
113
- ...(isFocused ? variantStyles['icon:focus'] : {}),
114
- ...(showError ? variantStyles['icon:error'] : {}),
115
- ...variantStyles.leftIcon,
116
- ...(isFocused ? variantStyles['leftIcon:focus'] : {}),
117
- ...(showError ? variantStyles['leftIcon:error'] : {}),
118
- }
119
-
120
- const rightIconStyle = {
121
- ...variantStyles.icon,
122
- ...(isFocused ? variantStyles['icon:focus'] : {}),
123
- ...(showError ? variantStyles['icon:error'] : {}),
124
- ...variantStyles.rightIcon,
125
- ...(isFocused ? variantStyles['rightIcon:focus'] : {}),
126
- ...(showError ? variantStyles['rightIcon:error'] : {}),
127
- }
128
-
129
- function getStyles(key: TextInputComposition) {
130
- const requestedStyles = [
131
- variantStyles[key],
132
- isFocused ? variantStyles[key + ':focus'] : {},
133
- showError ? variantStyles[key + ':error'] : {},
134
- ]
135
- return requestedStyles
136
- }
137
-
138
- const InnerWrapper = touchableWrapper ? Touchable : View
139
-
140
- return (
141
- <View
142
- style={getStyles('wrapper')}
143
- >
144
- <InputLabel label={label} style={getStyles('label')} />
145
- <InnerWrapper style={getStyles('innerWrapper')} {...innerWrapperProps}>
146
- <InputIcon {...leftIcon} style={leftIconStyle} />
147
- <InputElement
148
- ref={input}
149
- secureTextEntry={password && !textIsVisible}
150
- onChange={handleChange}
151
- value={value}
152
- editable={disabled}
153
- onFocus={handleFocus}
154
- onBlur={handleBlur}
155
- placeholderTextColor={StyleSheet.flatten(getStyles('placeholder'))?.color}
156
- {...props}
157
- style={getStyles('textField')}
158
- />
159
- {
160
- visibilityToggle ?
161
- <InputIcon name={
162
- (textIsVisible ? 'input-visiblity:visible' : 'input-visiblity:hidden') as IconPlaceholder
163
- } action={() => setTextVisible()} style={rightIconStyle} />
164
- :
165
- <InputIcon {...rightIcon} style={rightIconStyle} />
166
- }
167
- </InnerWrapper>
168
- <FormError message={error.message} style={{
169
- ...variantStyles.error,
170
- }} />
171
- </View>
172
- )
173
- })
174
-
175
- export const FormError = ({ message, ...props }) => {
176
- if (['number', 'string', 'undefined'].includes(typeof message)) {
177
- return <Text text={`${message || ' '}`} variants={['p2', 'marginTop:1']} {...props} />
178
- }
179
- return message
180
- }
181
-
182
- export const InputIcon: React.FC<{ style: any } & IconProp> = ({ name, style, action }) => {
183
- if (!name) return null
184
- if (action) {
185
- return <Button icon={name} onPress={() => action()} styles={{
186
- icon: style,
187
- }} variants={['icon']} />
188
- }
189
- return <Icon name={name} style={style} />
190
- }
191
-
192
- export const InputLabel = ({ label, style }) => {
193
- if (!label) return null
194
-
195
- switch (typeof label) {
196
- case 'string':
197
- return <Text style={style} text={label} />
198
- case 'object':
199
- return label
200
- default:
201
- return null
202
- }
203
- }
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 { Button } from './Button'
16
+ import { StylesOf } from '../types/utility'
17
+ import { Icon } from './Icon'
18
+ import { NativeSyntheticEvent, StyleSheet, TextInput as NativeTextInput, TextInputChangeEventData } from 'react-native'
19
+ import { Touchable, TouchableProps } from './Touchable'
20
+
21
+ type IconProp = { name: IconPlaceholder; action?: () => void }
22
+
23
+ type NativeProps = ComponentPropsWithoutRef<typeof NativeTextInput>
24
+
25
+ export type TextInputProps =
26
+ ComponentVariants<typeof TextInputStyles> &
27
+ Omit<NativeProps, 'value'> &
28
+ {
29
+ multiline?: boolean
30
+ onChangeText?: (text: string) => void
31
+ disabled?: boolean
32
+ edited?: boolean
33
+ type?: string
34
+ label?: React.ReactNode
35
+ debugName: string
36
+ leftIcon?: IconProp
37
+ rightIcon?: IconProp
38
+ styles?: StylesOf<TextInputComposition>
39
+ validate?: FormTypes.ValidatorFunctionWithoutForm | string
40
+ value?: string
41
+ password?: boolean
42
+ visibilityToggle?: boolean
43
+ touchableWrapper?: boolean
44
+ innerWrapperProps?: TouchableProps | ViewProps
45
+ }
46
+
47
+ export const TextInput = forwardRef<NativeTextInput, TextInputProps>((rawprops, inputRef) => {
48
+ const {
49
+ onChange,
50
+ type,
51
+ value,
52
+ onChangeText,
53
+ disabled,
54
+ edited,
55
+ onFocus,
56
+ onBlur,
57
+ multiline,
58
+ variants,
59
+ label,
60
+ leftIcon,
61
+ rightIcon,
62
+ styles,
63
+ validate,
64
+ password,
65
+ visibilityToggle,
66
+ touchableWrapper,
67
+ innerWrapperProps,
68
+ debugName,
69
+ ...props
70
+ } = rawprops
71
+
72
+ const [isFocused, setFocus] = useState(false)
73
+ const [editedState, setEdited] = useState(edited)
74
+
75
+ const input = useRef<any>(null)
76
+ const [textIsVisible, setTextVisible] = useBooleanToggle(false)
77
+ const variantStyles = useDefaultComponentStyle('TextInput', {
78
+ variants,
79
+ styles,
80
+ })
81
+ const InputElement = NativeTextInput
82
+
83
+ const handleBlur: TextInputProps['onBlur'] = (e) => {
84
+ if (!editedState && value) setEdited(true)
85
+ setFocus(false)
86
+
87
+ if (onBlur) {
88
+ onBlur(e)
89
+ }
90
+ }
91
+
92
+ const handleFocus: TextInputProps['onFocus'] = (e) => {
93
+ setFocus(true)
94
+ if (onFocus) {
95
+ onFocus(e)
96
+ }
97
+ }
98
+
99
+ const handleChange = (event: NativeSyntheticEvent<TextInputChangeEventData>) => {
100
+ const text = event.nativeEvent.text
101
+
102
+ if (onChange) onChange(event)
103
+ if (onChangeText) onChangeText(text)
104
+ }
105
+
106
+ useImperativeHandle(inputRef, () => ({ ...input.current, focus: () => {
107
+ input.current?.focus?.()
108
+ }, isTextInput: true }))
109
+
110
+ const { showError, error } = useValidate(value, validate)
111
+
112
+ const leftIconStyle = {
113
+ ...variantStyles.icon,
114
+ ...(isFocused ? variantStyles['icon:focus'] : {}),
115
+ ...(showError ? variantStyles['icon:error'] : {}),
116
+ ...variantStyles.leftIcon,
117
+ ...(isFocused ? variantStyles['leftIcon:focus'] : {}),
118
+ ...(showError ? variantStyles['leftIcon:error'] : {}),
119
+ }
120
+
121
+ const rightIconStyle = {
122
+ ...variantStyles.icon,
123
+ ...(isFocused ? variantStyles['icon:focus'] : {}),
124
+ ...(showError ? variantStyles['icon:error'] : {}),
125
+ ...variantStyles.rightIcon,
126
+ ...(isFocused ? variantStyles['rightIcon:focus'] : {}),
127
+ ...(showError ? variantStyles['rightIcon:error'] : {}),
128
+ }
129
+
130
+ function getStyles(key: TextInputComposition) {
131
+ const requestedStyles = [
132
+ variantStyles[key],
133
+ isFocused ? variantStyles[key + ':focus'] : {},
134
+ showError ? variantStyles[key + ':error'] : {},
135
+ ]
136
+ return requestedStyles
137
+ }
138
+
139
+ const InnerWrapper = touchableWrapper ? Touchable : View
140
+
141
+ return (
142
+ <View
143
+ style={getStyles('wrapper')}
144
+ >
145
+ <InputLabel label={label} style={getStyles('label')} />
146
+ <InnerWrapper debugName={debugName} style={getStyles('innerWrapper')} {...innerWrapperProps}>
147
+ <InputIcon {...leftIcon} style={leftIconStyle} />
148
+ <InputElement
149
+ ref={input}
150
+ secureTextEntry={password && !textIsVisible}
151
+ onChange={handleChange}
152
+ value={value}
153
+ editable={disabled}
154
+ onFocus={handleFocus}
155
+ onBlur={handleBlur}
156
+ placeholderTextColor={StyleSheet.flatten(getStyles('placeholder'))?.color}
157
+ {...props}
158
+ style={getStyles('textField')}
159
+ />
160
+ {
161
+ visibilityToggle ?
162
+ <InputIcon name={
163
+ (textIsVisible ? 'input-visiblity:visible' : 'input-visiblity:hidden') as IconPlaceholder
164
+ } action={() => setTextVisible()} style={rightIconStyle} />
165
+ :
166
+ <InputIcon {...rightIcon} style={rightIconStyle} />
167
+ }
168
+ </InnerWrapper>
169
+ <FormError message={error.message} style={{
170
+ ...variantStyles.error,
171
+ }} />
172
+ </View>
173
+ )
174
+ })
175
+
176
+ export const FormError = ({ message, ...props }) => {
177
+ if (['number', 'string', 'undefined'].includes(typeof message)) {
178
+ return <Text text={`${message || ' '}`} variants={['p2', 'marginTop:1']} {...props} />
179
+ }
180
+ return message
181
+ }
182
+
183
+ export const InputIcon: React.FC<{ style: any } & IconProp> = ({ name, style, action }) => {
184
+ if (!name) return null
185
+ if (action) {
186
+ return <Button icon={name} debugName={`${name} icon button`} onPress={() => action()} styles={{
187
+ icon: style,
188
+ }} variants={['icon']} />
189
+ }
190
+ return <Icon name={name} style={style} />
191
+ }
192
+
193
+ export const InputLabel = ({ label, style }) => {
194
+ if (!label) return null
195
+
196
+ switch (typeof label) {
197
+ case 'string':
198
+ return <Text style={style} text={label} />
199
+ case 'object':
200
+ return label
201
+ default:
202
+ return null
203
+ }
204
+ }