@codeleap/mobile 1.3.0 → 1.4.1

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 (206) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +3 -0
  3. package/.vscode/settings.json +11 -0
  4. package/CodeLeap-Mobile-Packages.code-workspace +8 -0
  5. package/dist/components/ActivityIndicator.d.ts +13 -13
  6. package/dist/components/ActivityIndicator.js +50 -48
  7. package/dist/components/ActivityIndicator.js.map +1 -1
  8. package/dist/components/Animated.d.ts +15 -103
  9. package/dist/components/Animated.js +54 -54
  10. package/dist/components/Animated.js.map +1 -1
  11. package/dist/components/Button.d.ts +119 -110
  12. package/dist/components/Button.js +77 -57
  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 -74
  16. package/dist/components/Checkbox/index.js.map +1 -1
  17. package/dist/components/Checkbox/styles.d.ts +52 -48
  18. package/dist/components/Checkbox/styles.js +48 -48
  19. package/dist/components/Checkbox/styles.js.map +1 -1
  20. package/dist/components/ContentView.d.ts +10 -10
  21. package/dist/components/ContentView.js +50 -48
  22. package/dist/components/ContentView.js.map +1 -1
  23. package/dist/components/FileInput.d.ts +26 -19
  24. package/dist/components/FileInput.js +174 -112
  25. package/dist/components/FileInput.js.map +1 -1
  26. package/dist/components/Icon.d.ts +12 -13
  27. package/dist/components/Icon.js +66 -46
  28. package/dist/components/Icon.js.map +1 -1
  29. package/dist/components/Image.d.ts +18 -16
  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 -0
  33. package/dist/components/List.js +77 -0
  34. package/dist/components/List.js.map +1 -0
  35. package/dist/components/Modal/index.d.ts +25 -24
  36. package/dist/components/Modal/index.js +108 -115
  37. package/dist/components/Modal/index.js.map +1 -1
  38. package/dist/components/Modal/styles.d.ts +66 -62
  39. package/dist/components/Modal/styles.js +64 -61
  40. package/dist/components/Modal/styles.js.map +1 -1
  41. package/dist/components/Navigation/Navigation.d.ts +3 -0
  42. package/dist/components/Navigation/Navigation.js +84 -0
  43. package/dist/components/Navigation/Navigation.js.map +1 -0
  44. package/dist/components/Navigation/constants.d.ts +5 -0
  45. package/dist/components/Navigation/constants.js +11 -0
  46. package/dist/components/Navigation/constants.js.map +1 -0
  47. package/dist/components/Navigation/index.d.ts +3 -0
  48. package/dist/components/Navigation/index.js +16 -0
  49. package/dist/components/Navigation/index.js.map +1 -0
  50. package/dist/components/Navigation/types.d.ts +26 -0
  51. package/dist/components/Navigation/types.js +8 -0
  52. package/dist/components/Navigation/types.js.map +1 -0
  53. package/dist/components/Navigation/utils.d.ts +3 -0
  54. package/dist/components/Navigation/utils.js +70 -0
  55. package/dist/components/Navigation/utils.js.map +1 -0
  56. package/dist/components/Overlay.d.ts +16 -16
  57. package/dist/components/Overlay.js +65 -67
  58. package/dist/components/Overlay.js.map +1 -1
  59. package/dist/components/Pager/index.d.ts +19 -0
  60. package/dist/components/Pager/index.js +164 -0
  61. package/dist/components/Pager/index.js.map +1 -0
  62. package/dist/components/Pager/styles.d.ts +51 -0
  63. package/dist/components/Pager/styles.js +44 -0
  64. package/dist/components/Pager/styles.js.map +1 -0
  65. package/dist/components/RadioInput/index.d.ts +26 -25
  66. package/dist/components/RadioInput/index.js +68 -74
  67. package/dist/components/RadioInput/index.js.map +1 -1
  68. package/dist/components/RadioInput/styles.d.ts +54 -50
  69. package/dist/components/RadioInput/styles.js +44 -44
  70. package/dist/components/RadioInput/styles.js.map +1 -1
  71. package/dist/components/Scroll.d.ts +11 -10
  72. package/dist/components/Scroll.js +75 -72
  73. package/dist/components/Scroll.js.map +1 -1
  74. package/dist/components/Sections.d.ts +11 -0
  75. package/dist/components/Sections.js +77 -0
  76. package/dist/components/Sections.js.map +1 -0
  77. package/dist/components/Select/index.d.ts +5 -2
  78. package/dist/components/Select/index.js +144 -30
  79. package/dist/components/Select/index.js.map +1 -1
  80. package/dist/components/Select/styles.d.ts +9 -0
  81. package/dist/components/Select/styles.js +57 -0
  82. package/dist/components/Select/styles.js.map +1 -0
  83. package/dist/components/Select/types.d.ts +33 -0
  84. package/dist/components/Select/types.js +3 -0
  85. package/dist/components/Select/types.js.map +1 -0
  86. package/dist/components/Slider/Mark.d.ts +3 -0
  87. package/dist/components/Slider/Mark.js +32 -0
  88. package/dist/components/Slider/Mark.js.map +1 -0
  89. package/dist/components/Slider/Thumb.d.ts +7 -0
  90. package/dist/components/Slider/Thumb.js +30 -0
  91. package/dist/components/Slider/Thumb.js.map +1 -0
  92. package/dist/components/Slider/index.d.ts +3 -0
  93. package/dist/components/Slider/index.js +94 -0
  94. package/dist/components/Slider/index.js.map +1 -0
  95. package/dist/components/{Slider.d.ts → Slider/types.d.ts} +25 -20
  96. package/dist/components/Slider/types.js +3 -0
  97. package/dist/components/Slider/types.js.map +1 -0
  98. package/dist/components/Switch.d.ts +13 -13
  99. package/dist/components/Switch.js +71 -72
  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 +1 -1
  104. package/dist/components/TextInput.d.ts +162 -146
  105. package/dist/components/TextInput.js +149 -146
  106. package/dist/components/TextInput.js.map +1 -1
  107. package/dist/components/Touchable.d.ts +14 -13
  108. package/dist/components/Touchable.js +57 -59
  109. package/dist/components/Touchable.js.map +1 -1
  110. package/dist/components/View.d.ts +114 -192
  111. package/dist/components/View.js +50 -50
  112. package/dist/components/View.js.map +1 -1
  113. package/dist/components/{index.d.ts → components.d.ts} +24 -21
  114. package/dist/components/{index.js → components.js} +37 -34
  115. package/dist/components/components.js.map +1 -0
  116. package/dist/index.d.ts +5 -3
  117. package/dist/index.js +24 -21
  118. package/dist/index.js.map +1 -1
  119. package/dist/modules/documentPicker.d.ts +3 -1
  120. package/dist/modules/documentPicker.js +11 -9
  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 +1 -1
  125. package/dist/modules/reactNavigation.d.ts +3 -0
  126. package/dist/modules/reactNavigation.js +11 -0
  127. package/dist/modules/reactNavigation.js.map +1 -0
  128. package/dist/modules/types/fileTypes.d.ts +138 -0
  129. package/dist/modules/types/fileTypes.js +3 -0
  130. package/dist/modules/types/fileTypes.js.map +1 -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 -0
  138. package/dist/utils/misc.js +26 -0
  139. package/dist/utils/misc.js.map +1 -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 +1 -1
  143. package/package.json +40 -35
  144. package/src/components/ActivityIndicator.tsx +46 -37
  145. package/src/components/Animated.tsx +34 -31
  146. package/src/components/Button.tsx +95 -62
  147. package/src/components/Checkbox/index.tsx +81 -68
  148. package/src/components/Checkbox/styles.ts +72 -63
  149. package/src/components/ContentView.tsx +58 -52
  150. package/src/components/FileInput.tsx +179 -69
  151. package/src/components/Icon.tsx +58 -35
  152. package/src/components/Image.tsx +59 -43
  153. package/src/components/List.tsx +100 -0
  154. package/src/components/Modal/index.tsx +158 -143
  155. package/src/components/Modal/styles.ts +133 -122
  156. package/src/components/Navigation/Navigation.tsx +58 -0
  157. package/src/components/Navigation/constants.ts +8 -0
  158. package/src/components/Navigation/index.tsx +3 -0
  159. package/src/components/Navigation/types.ts +35 -0
  160. package/src/components/Navigation/utils.tsx +59 -0
  161. package/src/components/Overlay.tsx +77 -72
  162. package/src/components/Pager/index.tsx +240 -0
  163. package/src/components/Pager/styles.ts +51 -0
  164. package/src/components/RadioInput/index.tsx +101 -76
  165. package/src/components/RadioInput/styles.ts +67 -62
  166. package/src/components/Scroll.tsx +98 -87
  167. package/src/components/Sections.tsx +100 -0
  168. package/src/components/Select/index.tsx +184 -8
  169. package/src/components/Select/styles.ts +81 -0
  170. package/src/components/Select/types.ts +41 -0
  171. package/src/components/Slider/Mark.tsx +46 -0
  172. package/src/components/Slider/Thumb.tsx +29 -0
  173. package/src/components/Slider/index.tsx +123 -0
  174. package/src/components/Slider/types.ts +25 -0
  175. package/src/components/Switch.tsx +81 -73
  176. package/src/components/Text.tsx +30 -31
  177. package/src/components/TextInput.tsx +204 -206
  178. package/src/components/Touchable.tsx +65 -51
  179. package/src/components/View.tsx +46 -43
  180. package/src/components/components.ts +26 -0
  181. package/src/index.ts +6 -3
  182. package/src/modules/documentPicker.ts +7 -2
  183. package/src/modules/fastImage.ts +2 -2
  184. package/src/modules/index.d.ts +496 -0
  185. package/src/modules/reactNavigation.ts +4 -0
  186. package/src/modules/types/documentPicker.d.ts +215 -0
  187. package/src/modules/types/fileTypes.ts +138 -0
  188. package/src/types/utility.ts +3 -3
  189. package/src/utils/OSAlert.ts +180 -122
  190. package/src/utils/misc.ts +24 -0
  191. package/src/utils/styles.ts +14 -17
  192. package/dist/components/Drawer.d.ts +0 -23
  193. package/dist/components/Drawer.js +0 -78
  194. package/dist/components/Drawer.js.map +0 -1
  195. package/dist/components/Navigation.d.ts +0 -30
  196. package/dist/components/Navigation.js +0 -126
  197. package/dist/components/Navigation.js.map +0 -1
  198. package/dist/components/Slider.js +0 -130
  199. package/dist/components/Slider.js.map +0 -1
  200. package/dist/components/index.js.map +0 -1
  201. package/dist/modules/cropPicker.d.ts +0 -1
  202. package/dist/modules/cropPicker.js +0 -10
  203. package/dist/modules/cropPicker.js.map +0 -1
  204. package/src/components/Navigation.tsx +0 -125
  205. package/src/components/Slider.tsx +0 -198
  206. package/src/components/index.ts +0 -23
@@ -0,0 +1,41 @@
1
+ import {
2
+ ComponentVariants,
3
+ FormTypes,
4
+ IconPlaceholder,
5
+ } from '@codeleap/common'
6
+ import { ReactElement } from 'react'
7
+ import { StylesOf } from '../../types/utility'
8
+ import { ButtonProps } from '../Button'
9
+ import { TextInputProps } from '../TextInput'
10
+ import { MobileSelectComposition, MobileSelectStyles } from './styles'
11
+
12
+ export type SelectRenderFNProps<T> = FormTypes.Options<T>[number] & {
13
+ styles: StylesOf<MobileSelectComposition>
14
+ onPress: () => void
15
+ selected?: boolean
16
+ }
17
+
18
+ export type SelectRenderFN<T> = (props: SelectRenderFNProps<T>) => JSX.Element
19
+
20
+ export type CustomSelectProps<T> = {
21
+ value: T
22
+ placeholder?: FormTypes.Label
23
+ label?: FormTypes.Label
24
+ options?: FormTypes.Options<T>
25
+ onDropdownToggle?: (isOpen?: boolean) => void
26
+ onValueChange?: (value: T) => void
27
+ renderItem?: SelectRenderFN<T>
28
+ styles?: StylesOf<MobileSelectComposition>
29
+ style?: any
30
+ arrowIconName?: IconPlaceholder
31
+ scroll?: boolean
32
+ closeOnSelect?: boolean
33
+ footer?: ReactElement
34
+ header?: ReactElement
35
+ showLabelOnModal?: boolean
36
+ modalCloseIconName?: IconPlaceholder
37
+ showClose?: boolean
38
+ modalLabel?: string
39
+ closeButtonProps?: Partial<ButtonProps>
40
+ } & ComponentVariants<typeof MobileSelectStyles> & TextInputProps
41
+
@@ -0,0 +1,46 @@
1
+ import React from 'react'
2
+ import { StyleProp } from 'react-native'
3
+ import { Text } from '../Text'
4
+ import { View } from '../View'
5
+ import { SliderMarkProps } from './types'
6
+ export const SliderMark: React.FC<SliderMarkProps> = ({
7
+ index,
8
+ sliderProps,
9
+ styles,
10
+ variantStyles,
11
+ }) => {
12
+ const { labels = [], showMarks } = sliderProps
13
+
14
+ const l = labels?.[index] || ''
15
+
16
+ const isFirst = index === 0
17
+ const isLast = index === labels.length - 1
18
+
19
+ const centerAdjustWord = -(l.length * 2)
20
+
21
+ const markStyles: StyleProp<any> = {}
22
+
23
+ const labelStyles: StyleProp<any> = {}
24
+
25
+ if (!isFirst && !isLast) {
26
+ labelStyles.left = centerAdjustWord
27
+ }
28
+
29
+ if (isLast) {
30
+ labelStyles.right = -20
31
+ markStyles.right = -10
32
+ }
33
+ return (
34
+ <>
35
+ {showMarks ? (
36
+ <View style={[markStyles, variantStyles.mark, styles.mark]} />
37
+ ) : null}
38
+ {l ? (
39
+ <Text
40
+ style={[labelStyles, variantStyles.trackLabels, styles.trackLabels]}
41
+ text={l}
42
+ />
43
+ ) : null}
44
+ </>
45
+ )
46
+ }
@@ -0,0 +1,29 @@
1
+ import React from 'react'
2
+ import { StyleSheet } from 'react-native'
3
+ import { Text } from '../Text'
4
+ import { View } from '../View'
5
+ export const ThumbTooltip = ({ children, visible, styles, variantStyles }) => {
6
+ return (
7
+ <View
8
+ style={[
9
+ StyleSheet.flatten([variantStyles.tooltip, styles.tooltip]),
10
+ visible
11
+ ? StyleSheet.flatten([
12
+ variantStyles['tooltip:visible'],
13
+ styles['tooltip:visible'],
14
+ ])
15
+ : StyleSheet.flatten([
16
+ variantStyles['tooltip:hidden'],
17
+ styles['tooltip:hidden'],
18
+ ]),
19
+ ]}
20
+ >
21
+ <Text
22
+ style={[variantStyles.tooltipText, styles.tooltipText]}
23
+ text={children}
24
+ />
25
+ <View style={[variantStyles.tooltipArrow, styles.tooltipArrow]} />
26
+ </View>
27
+ )
28
+ }
29
+
@@ -0,0 +1,123 @@
1
+ import { SliderMark } from './Mark'
2
+ import { ThumbTooltip } from './Thumb'
3
+ import * as React from 'react'
4
+ import { Slider as RNSlider } from '@miblanchard/react-native-slider'
5
+
6
+ import { useRef } from 'react'
7
+ import { StyleSheet } from 'react-native'
8
+ import { View } from '../View'
9
+ import {
10
+ useDefaultComponentStyle,
11
+ } from '@codeleap/common'
12
+ import { InputLabel } from '../TextInput'
13
+ import { SliderProps } from './types'
14
+
15
+ export const Slider: React.FC<SliderProps> = (sliderProps) => {
16
+ const [tooltipVisible, setTooltipVisible] = React.useState(false)
17
+
18
+ const {
19
+ debounce,
20
+ onValueChange,
21
+ labels,
22
+ value,
23
+ label,
24
+ valueOverThumb,
25
+ formatTooltip,
26
+ styles = {},
27
+ style,
28
+ tooltipVisibilityWindow = 830,
29
+ variants,
30
+ ...props
31
+ } = sliderProps
32
+
33
+ const changeDebounce = typeof debounce === 'number' ? debounce : 100
34
+
35
+ const debounceTimeout = useRef(null)
36
+ const toggleTooltipTimeout = useRef(null)
37
+ const valueRef = useRef(value)
38
+
39
+ const variantStyles = useDefaultComponentStyle('Slider', {
40
+ variants,
41
+ })
42
+
43
+ function setValue() {
44
+ onValueChange(valueRef.current)
45
+ }
46
+
47
+ function onChange(val) {
48
+ let eventValue = val
49
+
50
+ if (Array.isArray(val) && typeof value === 'number') {
51
+ eventValue = val[0]
52
+ }
53
+
54
+ if (eventValue === value) return
55
+
56
+ valueRef.current = eventValue as number
57
+
58
+ if (debounceTimeout.current) clearTimeout(debounceTimeout.current)
59
+
60
+ debounceTimeout.current = setTimeout(() => {
61
+ setValue()
62
+ }, changeDebounce)
63
+ }
64
+
65
+ return (
66
+ <View style={[variantStyles.wrapper, style]}>
67
+ <InputLabel label={label} style={[variantStyles.label, styles.label]} />
68
+ <RNSlider
69
+ value={value}
70
+ onSlidingStart={() => {
71
+ if (toggleTooltipTimeout.current) { clearTimeout(toggleTooltipTimeout.current) }
72
+
73
+ setTooltipVisible(true)
74
+ }}
75
+ onSlidingComplete={() => {
76
+ toggleTooltipTimeout.current = setTimeout(
77
+ () => setTooltipVisible(false),
78
+ tooltipVisibilityWindow,
79
+ )
80
+ }}
81
+ onValueChange={onChange}
82
+ renderAboveThumbComponent={(idx) => {
83
+ if (!valueOverThumb) return null
84
+ const thisValue = Array.isArray(value) ? value[idx] : value
85
+ return (
86
+ <ThumbTooltip
87
+ visible={tooltipVisible}
88
+ variantStyles={variantStyles}
89
+ styles={styles}
90
+ >
91
+ {formatTooltip ? formatTooltip(thisValue) : thisValue.toString()}
92
+ </ThumbTooltip>
93
+ )
94
+ }}
95
+ renderTrackMarkComponent={(idx) => (
96
+ <SliderMark
97
+ index={idx}
98
+ sliderProps={sliderProps}
99
+ styles={styles}
100
+ variantStyles={variantStyles}
101
+ />
102
+ )}
103
+ maximumValue={labels ? labels.length - 1 : 10}
104
+ trackMarks={labels ? Object.keys(labels).map((z) => parseInt(z)) : []}
105
+ containerStyle={
106
+ [variantStyles.inputContainer, styles.inputContainer] as any
107
+ }
108
+ thumbStyle={
109
+ StyleSheet.flatten([variantStyles.handle, styles.handle]) as any
110
+ }
111
+ trackStyle={[variantStyles.track, styles.track] as any}
112
+ minimumTrackTintColor={
113
+ StyleSheet.flatten([
114
+ variantStyles.selectedTrack,
115
+ styles.selectedTrack,
116
+ ])?.backgroundColor
117
+ }
118
+ {...props}
119
+ />
120
+ </View>
121
+ )
122
+ }
123
+
@@ -0,0 +1,25 @@
1
+ import { ComponentVariants, Form, SliderComposition, SliderStyles } from '@codeleap/common'
2
+ import { SliderProps as RNSliderProps } from '@miblanchard/react-native-slider/lib/types'
3
+ import { StylesOf } from '../../types/utility'
4
+ import { ViewProps } from '../View'
5
+ export type SliderProps = Partial<Omit<RNSliderProps, 'value' | 'onValueChange'>> & {
6
+ debounce?: number
7
+ labels: string[]
8
+ value: number
9
+ valueOverThumb?: boolean
10
+ showMarks?: boolean
11
+ onValueChange: (val: number) => void
12
+ label: Form.Label
13
+ formatTooltip?: (val: number) => React.ReactNode
14
+ variants?: ComponentVariants<typeof SliderStyles>['variants']
15
+ styles?: StylesOf<SliderComposition>
16
+ style?: ViewProps['style']
17
+ tooltipVisibilityWindow?: number
18
+ }
19
+
20
+ export type SliderMarkProps = {
21
+ sliderProps: SliderProps
22
+ index: number
23
+ styles: SliderProps['styles']
24
+ variantStyles: SliderProps['styles']
25
+ }
@@ -1,73 +1,81 @@
1
- import * as React from 'react'
2
- import { SwitchStyles,SwitchComposition, ComponentVariants, useComponentStyle, StylesOf, useStyle, FormTypes, useValidate } from '@codeleap/common'
3
- import { ComponentPropsWithRef, forwardRef, ReactNode } from 'react'
4
- import { StyleSheet, Switch as NativeSwitch } from 'react-native'
5
- import { InputLabel, FormError} from './TextInput'
6
- import { View } from './View'
7
-
8
-
9
- type NativeSwitchProps = Omit<
10
- ComponentPropsWithRef<typeof NativeSwitch>,
11
- 'thumbColor'|'trackColor'
12
- >
13
- type SwitchProps = NativeSwitchProps & {
14
- variants?: ComponentVariants<typeof SwitchStyles>['variants']
15
- label?: ReactNode
16
- styles?: StylesOf<SwitchComposition>
17
- validate?: FormTypes.ValidatorFunction | string
18
- }
19
-
20
- export const Switch = forwardRef<NativeSwitch,SwitchProps>((switchProps,ref) => {
21
- const {
22
- variants = [],
23
- style = {},
24
- styles = {},
25
- validate,
26
- label,
27
- value,
28
- ...props
29
- } = switchProps
30
-
31
- const variantStyles = useComponentStyle('Switch', {
32
- variants,
33
-
34
- })
35
- const {error,showError} = useValidate(switchProps.value, validate)
36
- function getStyles(key:SwitchComposition){
37
- return [
38
- variantStyles[key],
39
- styles[key],
40
- key === 'wrapper' ? style : {},
41
- showError ? variantStyles[key + ':error'] : {},
42
- showError ? styles[key + ':error'] : {},
43
- value ? variantStyles[key + ':on'] : {},
44
- value ? styles[key + ':on'] : {},
45
- switchProps.disabled ? variantStyles[key + ':disabled'] : {},
46
- switchProps.disabled ? styles[key + ':disabled'] : {},
47
-
48
- ]
49
- }
50
-
51
- const inputStyles = getStyles('input')
52
-
53
- const {color,backgroundColor} = StyleSheet.flatten(inputStyles)
54
- const {Theme} = useStyle()
55
-
56
- const thumbColor = color || Theme.colors.primary
57
- const trackColor = backgroundColor || Theme.colors.gray
58
- return <View style={getStyles('wrapper')}>
59
- <View style={getStyles('inputWrapper')}>
60
-
61
- <NativeSwitch
62
-
63
- thumbColor={thumbColor}
64
- trackColor={{ false:trackColor, true: trackColor}}
65
- ios_backgroundColor={trackColor}
66
- value={value}
67
- {...props}
68
- />
69
- <InputLabel label={label} style={getStyles('label')}/>
70
- </View>
71
- <FormError message={error.message} style={getStyles('error')}/>
72
- </View>
73
- })
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,31 +1,30 @@
1
- import * as React from 'react'
2
- import { ComponentPropsWithoutRef, forwardRef } from 'react'
3
- import { ComponentVariants, useComponentStyle, BaseViewProps, TextStyles } from '@codeleap/common'
4
- import { Text as NativeText } from 'react-native'
5
-
6
-
7
- export type TextProps =
8
- ComponentPropsWithoutRef<typeof NativeText> &
9
- {
10
- text?: string,
11
- variants?: ComponentVariants <typeof TextStyles>['variants'],
12
- } & BaseViewProps
13
-
14
- export const Text = forwardRef<NativeText, TextProps>((textProps, ref) => {
15
- const {
16
- variants = [],
17
- text,
18
- style,
19
- ...props
20
- } = textProps
21
-
22
- const variantStyles = useComponentStyle('Text', {
23
- variants,
24
- rootElement : 'text'
25
- })
26
-
27
- const styles = [variantStyles.text, style]
28
- return <NativeText {...props} style={styles} ref={ref}>
29
- {text}
30
- </NativeText>
31
- })
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
+ })