@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
@@ -1,62 +1,67 @@
1
- import { createDefaultVariantFactory, RadioInputStyles } from '@codeleap/common';
2
- type RadioParts = 'button' | 'itemWrapper' | 'text' | 'buttonMark'
3
-
4
- type RadioGroupParts = 'label' |'wrapper' |'list'
5
-
6
- export type MobileRadioInputComposition = `${RadioParts}:checked` | RadioParts | RadioGroupParts
7
-
8
- const createRadioStyle = createDefaultVariantFactory<MobileRadioInputComposition>()
9
-
10
- const defaultStyles = RadioInputStyles.default
11
-
12
- export const MobileRadioInputStyles = {
13
- ...RadioInputStyles,
14
- default: createRadioStyle((theme) => {
15
- const style = defaultStyles(theme)
16
-
17
- const itemHeight = theme.typography.baseFontSize * 1.2
18
- const markHeight = itemHeight / 2
19
- const translateX = -(markHeight/2)
20
- const translateY = -(markHeight/2)
21
- return {
22
- ...style,
23
- itemWrapper: {
24
- ...style.itemWrapper,
25
- },
26
- button: {
27
- height: itemHeight,
28
- width: itemHeight,
29
- ...theme.border.primary(1),
30
- borderRadius: theme.borderRadius.large,
31
-
32
- position: 'relative',
33
- ...theme.spacing.marginRight(1),
34
-
35
- },
36
- 'buttonMark': {
37
- backgroundColor: theme.colors.primary,
38
- position: 'absolute',
39
- left: '50%',
40
- top: '50%',
41
- height: markHeight,
42
- width: markHeight,
43
-
44
- transform: [{translateX},{translateY}],
45
- borderRadius: theme.borderRadius.large,
46
- opacity: 0
47
- },
48
- 'buttonMark:checked': {
49
- opacity: 1
50
- },
51
- }
52
- }),
53
- square: createRadioStyle(() => ({
54
- 'buttonMark': {
55
- borderRadius: 0,
56
- },
57
- button: {
58
- borderRadius: 0,
59
-
60
- },
61
- })),
62
- }
1
+ import {
2
+ createDefaultVariantFactory,
3
+ RadioInputStyles,
4
+ } from '@codeleap/common'
5
+ type RadioParts = 'button' | 'itemWrapper' | 'text' | 'buttonMark'
6
+
7
+ type RadioGroupParts = 'label' | 'wrapper' | 'list'
8
+
9
+ export type MobileRadioInputComposition =
10
+ | `${RadioParts}:checked`
11
+ | RadioParts
12
+ | RadioGroupParts
13
+
14
+ const createRadioStyle =
15
+ createDefaultVariantFactory<MobileRadioInputComposition>()
16
+
17
+ const defaultStyles = RadioInputStyles.default
18
+
19
+ export const MobileRadioInputStyles = {
20
+ ...RadioInputStyles,
21
+ default: createRadioStyle((theme) => {
22
+ const style = defaultStyles(theme)
23
+
24
+ const itemHeight = theme.typography.baseFontSize * 1.2
25
+ const markHeight = itemHeight / 2
26
+ const translateX = -(markHeight / 2)
27
+ const translateY = -(markHeight / 2)
28
+ return {
29
+ ...style,
30
+ itemWrapper: {
31
+ ...style.itemWrapper,
32
+ },
33
+ button: {
34
+ height: itemHeight,
35
+ width: itemHeight,
36
+ ...theme.border.primary(1),
37
+ borderRadius: theme.borderRadius.large,
38
+
39
+ position: 'relative',
40
+ ...theme.spacing.marginRight(1),
41
+ },
42
+ buttonMark: {
43
+ backgroundColor: theme.colors.primary,
44
+ position: 'absolute',
45
+ left: '50%',
46
+ top: '50%',
47
+ height: markHeight,
48
+ width: markHeight,
49
+
50
+ transform: [{ translateX }, { translateY }],
51
+ borderRadius: theme.borderRadius.large,
52
+ opacity: 0,
53
+ },
54
+ 'buttonMark:checked': {
55
+ opacity: 1,
56
+ },
57
+ }
58
+ }),
59
+ square: createRadioStyle(() => ({
60
+ buttonMark: {
61
+ borderRadius: 0,
62
+ },
63
+ button: {
64
+ borderRadius: 0,
65
+ },
66
+ })),
67
+ }
@@ -1,87 +1,98 @@
1
- import * as React from 'react'
2
- import { forwardRef, useState } from 'react'
3
- import { deepEqual, onUpdate, useComponentStyle, usePrevious, useStyle } from '@codeleap/common'
4
- import { KeyboardAwareScrollViewProps, KeyboardAwareScrollView as KBDView} from 'react-native-keyboard-aware-scroll-view'
5
- import { RefreshControl, ScrollView } from 'react-native'
6
- import { ViewProps } from './View'
7
-
8
-
9
- export type ScrollProps = KeyboardAwareScrollViewProps & ViewProps & {
10
- onRefresh?:() => void
11
- refreshTimeout?: number
12
- changeData?:any
13
- }
14
-
15
- const KeyboardAwareScrollView = KBDView as unknown as React.ForwardRefExoticComponent<
16
- ViewProps &
17
- {
18
- refreshControl?: JSX.Element
19
- ref?: ScrollView
20
-
21
- }
22
- >
23
-
24
-
25
- export const Scroll = forwardRef<ScrollView, ScrollProps>((scrollProps, ref) => {
26
- const {
27
- variants = [],
28
- style,
29
- refreshTimeout = 3000,
30
- children,
31
- changeData,
32
- ...props
33
- } = scrollProps
34
- const hasRefresh = !!props.onRefresh
35
- const [refreshing, setRefreshing] = useState(false)
36
-
37
- const timer = React.useRef(null)
38
- const previousData = usePrevious(changeData)
39
-
40
- const onRefresh = () => {
41
- if(timer.current){
42
- clearTimeout(timer.current)
43
- }
44
-
45
- setRefreshing(true)
46
-
47
- props.onRefresh()
48
-
49
- timer.current = setTimeout(() => {
50
- setRefreshing(false)
51
- }, refreshTimeout)
52
-
53
- }
54
- onUpdate(() => {
55
- if(refreshing && !deepEqual(previousData, changeData)){
56
- setRefreshing(false)
57
- if(timer.current){
58
- clearTimeout(timer.current)
59
- }
60
- }
61
- },[refreshing, changeData])
62
- const {
63
- Theme
64
- } = useStyle()
65
-
66
- const variantStyles = useComponentStyle('View', {
67
- variants
68
- })
69
-
70
- return (
71
-
72
- <KeyboardAwareScrollView
73
- style={[Theme.presets.full, variantStyles.wrapper, style]}
74
- ref={ref as unknown as ScrollView}
75
- {...props}
76
- refreshControl={
77
- hasRefresh &&
78
- <RefreshControl
79
- refreshing={refreshing}
80
- onRefresh={onRefresh}
81
- />
82
- }
83
- >
84
- { children }
85
- </KeyboardAwareScrollView>
86
- )
87
- })
1
+ import * as React from 'react'
2
+ import { forwardRef, useState } from 'react'
3
+ import {
4
+ deepEqual,
5
+ onUpdate,
6
+ useDefaultComponentStyle,
7
+ usePrevious,
8
+ useCodeleapContext,
9
+ } from '@codeleap/common'
10
+ import {
11
+ KeyboardAwareScrollViewProps,
12
+ KeyboardAwareScrollView as KBDView,
13
+ } from 'react-native-keyboard-aware-scroll-view'
14
+ import { RefreshControl, ScrollView, ScrollViewProps, ViewStyle } from 'react-native'
15
+ import { ViewProps } from './View'
16
+
17
+ export type ScrollProps = KeyboardAwareScrollViewProps &
18
+ ViewProps & {
19
+ onRefresh?: () => void
20
+ refreshTimeout?: number
21
+ changeData?: any
22
+ styles?: ViewStyle
23
+ }
24
+
25
+ const KeyboardAwareScrollView =
26
+ KBDView as unknown as React.ForwardRefExoticComponent<
27
+ ViewProps & {
28
+ refreshControl?: JSX.Element
29
+ ref?: ScrollView
30
+
31
+ } & ScrollViewProps
32
+ >
33
+
34
+ export const Scroll = forwardRef<ScrollView, ScrollProps>(
35
+ (scrollProps, ref) => {
36
+ const {
37
+ variants = [],
38
+ style,
39
+ refreshTimeout = 3000,
40
+ children,
41
+ changeData,
42
+ styles,
43
+ ...props
44
+ } = scrollProps
45
+ const hasRefresh = !!props.onRefresh
46
+ const [refreshing, setRefreshing] = useState(false)
47
+
48
+ const timer = React.useRef(null)
49
+ const previousData = usePrevious(changeData)
50
+
51
+ const onRefresh = () => {
52
+ if (timer.current) {
53
+ clearTimeout(timer.current)
54
+ }
55
+
56
+ setRefreshing(true)
57
+
58
+ props.onRefresh()
59
+
60
+ timer.current = setTimeout(() => {
61
+ setRefreshing(false)
62
+ }, refreshTimeout)
63
+ }
64
+ onUpdate(() => {
65
+ if (refreshing && !deepEqual(previousData, changeData)) {
66
+ setRefreshing(false)
67
+ if (timer.current) {
68
+ clearTimeout(timer.current)
69
+ }
70
+ }
71
+ }, [refreshing, changeData])
72
+ const { Theme } = useCodeleapContext()
73
+
74
+ const variantStyles = useDefaultComponentStyle('View', {
75
+ variants,
76
+ styles: {
77
+ wrapper: styles,
78
+ },
79
+ rootElement: 'wrapper',
80
+ })
81
+
82
+ return (
83
+ <KeyboardAwareScrollView
84
+ style={[Theme.presets.full, style]}
85
+ contentContainerStyle={[variantStyles.wrapper]}
86
+ ref={ref as unknown as ScrollView}
87
+ {...props}
88
+ refreshControl={
89
+ hasRefresh && (
90
+ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
91
+ )
92
+ }
93
+ >
94
+ {children}
95
+ </KeyboardAwareScrollView>
96
+ )
97
+ },
98
+ )
@@ -0,0 +1,100 @@
1
+ import * as React from 'react'
2
+ import { forwardRef, useState } from 'react'
3
+ import {
4
+ deepEqual,
5
+ onUpdate,
6
+ useDefaultComponentStyle,
7
+ usePrevious,
8
+ useCodeleapContext,
9
+ } from '@codeleap/common'
10
+ import {
11
+ KeyboardAwareSectionListProps,
12
+ KeyboardAwareSectionList as KBDView,
13
+ } from 'react-native-keyboard-aware-scroll-view'
14
+ import { RefreshControl, SectionList } from 'react-native'
15
+ import { View, ViewProps } from './View'
16
+
17
+ export type SectionListProps = KeyboardAwareSectionListProps<any> &
18
+ ViewProps & {
19
+ onRefresh?: () => void
20
+ refreshTimeout?: number
21
+ changeData?: any
22
+ separators?: boolean
23
+ }
24
+
25
+ const KeyboardAwareSectionList =
26
+ KBDView as unknown as React.ForwardRefExoticComponent<
27
+ ViewProps & {
28
+ refreshControl?: JSX.Element
29
+ ref?: SectionList
30
+ }
31
+ >
32
+
33
+ export const Sections = forwardRef<SectionList, SectionListProps>(
34
+ (flatListProps, ref) => {
35
+ const {
36
+ variants = [],
37
+ style,
38
+ refreshTimeout = 3000,
39
+ changeData,
40
+ ...props
41
+ } = flatListProps
42
+ const hasRefresh = !!props.onRefresh
43
+ const [refreshing, setRefreshing] = useState(false)
44
+
45
+ const timer = React.useRef(null)
46
+ const previousData = usePrevious(changeData)
47
+
48
+ const onRefresh = () => {
49
+ if (timer.current) {
50
+ clearTimeout(timer.current)
51
+ }
52
+
53
+ setRefreshing(true)
54
+
55
+ props.onRefresh()
56
+
57
+ timer.current = setTimeout(() => {
58
+ setRefreshing(false)
59
+ }, refreshTimeout)
60
+ }
61
+ onUpdate(() => {
62
+ if (refreshing && !deepEqual(previousData, changeData)) {
63
+ setRefreshing(false)
64
+ if (timer.current) {
65
+ clearTimeout(timer.current)
66
+ }
67
+ }
68
+ }, [refreshing, changeData])
69
+ const { Theme } = useCodeleapContext()
70
+
71
+ const variantStyles = useDefaultComponentStyle('View', {
72
+ variants,
73
+ })
74
+
75
+ const renderSeparator = () => {
76
+ return (
77
+ <View variants={['separator']}></View>
78
+ )
79
+ }
80
+
81
+ const separatorProp = props.separators
82
+ const isEmpty = !props.data || !props.data.length
83
+ const separator = !isEmpty && separatorProp == true && renderSeparator
84
+
85
+ return (
86
+ <KeyboardAwareSectionList
87
+ style={[Theme.presets.full, style]}
88
+ contentContainerStyle={[variantStyles.wrapper]}
89
+ ref={ref as unknown as SectionList}
90
+ ItemSeparatorComponent={separator}
91
+ {...props}
92
+ refreshControl={
93
+ hasRefresh && (
94
+ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
95
+ )
96
+ }
97
+ />
98
+ )
99
+ },
100
+ )
@@ -1,8 +1,184 @@
1
- import * as React from 'react'
2
- import { View } from "../View"
3
-
4
- export const Select:React.FC = () => {
5
- return <View >
6
-
7
- </View>
8
- }
1
+ import { IconPlaceholder, useBooleanToggle, getNestedStylesByKey, useDefaultComponentStyle, TypeGuards } from '@codeleap/common'
2
+ import React, { useMemo } from 'react'
3
+ import { Modal, StyleSheet } from 'react-native'
4
+ import { Button } from '../Button'
5
+ import { Scroll } from '../Scroll'
6
+
7
+ import { InputLabel, TextInput } from '../TextInput'
8
+ import { Touchable } from '../Touchable'
9
+ import { AnimatedView, View } from '../View'
10
+ import { MobileSelectStyles } from './styles'
11
+ import { CustomSelectProps } from './types'
12
+
13
+ export const Select = <T extends string|number = string>(selectProps:CustomSelectProps<T>) => {
14
+ const {
15
+ value,
16
+ onValueChange,
17
+ label,
18
+ styles = {},
19
+ options,
20
+ style,
21
+ variants,
22
+ renderItem,
23
+ closeOnSelect = true,
24
+ scroll = false,
25
+ showClose = true,
26
+ showLabelOnModal = true,
27
+ placeholder = 'Select',
28
+ arrowIconName = 'selectArrow',
29
+ footer,
30
+ modalCloseIconName = 'close',
31
+ header,
32
+ closeButtonProps,
33
+ modalLabel,
34
+ ...props
35
+ } = selectProps
36
+
37
+ const [isModalVisible, setModalVisibility] = useBooleanToggle(false)
38
+
39
+ const variantStyles = useDefaultComponentStyle<'u:MobileSelect', typeof MobileSelectStyles>('u:MobileSelect', {
40
+ transform: StyleSheet.flatten,
41
+ rootElement: 'inputWrapper',
42
+ styles,
43
+ variants,
44
+ })
45
+
46
+ const inputStyles = useMemo(
47
+ () => getNestedStylesByKey('input', variantStyles),
48
+ [variantStyles],
49
+ )
50
+
51
+ const closeButtonStyles = useMemo(
52
+ () => getNestedStylesByKey('modalCloseButton', variantStyles),
53
+ [variantStyles],
54
+ )
55
+
56
+ const ListComponent = scroll ? Scroll : View
57
+
58
+ const close = () => setModalVisibility()
59
+ const select = (value) => {
60
+
61
+ onValueChange(value)
62
+ if (closeOnSelect) {
63
+ close()
64
+ }
65
+ }
66
+
67
+ const selectedLabel:string = useMemo(() => {
68
+ const current = options.find(o => o.value === value)
69
+
70
+ const display = current?.label ?? placeholder
71
+
72
+ return TypeGuards.isString(display) ? display : ''
73
+ }, [value, placeholder, options])
74
+
75
+ return <>
76
+ <TextInput
77
+
78
+ caretHidden
79
+ value={selectedLabel}
80
+ rightIcon={{
81
+ name: arrowIconName as IconPlaceholder,
82
+ }}
83
+ editable={false}
84
+ touchableWrapper
85
+ innerWrapperProps={{
86
+ debugName: 'Select',
87
+ onPress: close,
88
+ }}
89
+ label={label}
90
+ debugName={'Select input'}
91
+ styles={inputStyles}
92
+ style={style}
93
+ {...props}
94
+ />
95
+ <AnimatedView pointerEvents={'none'} transition='opacity' style={[
96
+ {
97
+ position: 'absolute',
98
+ top: 0,
99
+ right: 0,
100
+ left: 0,
101
+ bottom: 0,
102
+ },
103
+ variantStyles.backdrop,
104
+ isModalVisible ? variantStyles['backdrop:visible'] : variantStyles['backdrop:hidden'],
105
+ ]} />
106
+
107
+ <Modal
108
+ animationType='slide'
109
+ transparent={true}
110
+ visible={isModalVisible}
111
+ onRequestClose={() => {
112
+ setModalVisibility()
113
+ }}
114
+ pointerEvents={isModalVisible ? 'auto' : 'none'}
115
+ >
116
+ <Touchable
117
+ onPress={close}
118
+ style={{
119
+ position: 'absolute',
120
+ top: 0,
121
+ right: 0,
122
+ left: 0,
123
+ bottom: 0,
124
+ }}
125
+ debugName={`Close modal`}
126
+ />
127
+ <View style={variantStyles.modalWrapper}>
128
+
129
+ <View style={variantStyles.modalBox}>
130
+ {
131
+ (showClose || showLabelOnModal || header) && (
132
+ <View style={variantStyles.modalHeader}>
133
+ {
134
+ header ? header : <>
135
+ {showLabelOnModal && <InputLabel label={modalLabel || label} style={variantStyles.modalLabelText}/>}
136
+ {showClose && <Button
137
+ icon={modalCloseIconName as IconPlaceholder}
138
+ onPress={close}
139
+ styles={closeButtonStyles}
140
+ debugName={'Close modal'}
141
+ {...closeButtonProps}
142
+ />}
143
+ </>
144
+ }
145
+ </View>
146
+ )
147
+ }
148
+ <ListComponent style={variantStyles.modalList}>
149
+ {
150
+ options.map((item, idx) => {
151
+ const isSelected = value === item.value
152
+ if (renderItem) {
153
+ return renderItem({
154
+ ...item,
155
+ selected: isSelected,
156
+ onPress: close,
157
+ styles: variantStyles,
158
+
159
+ })
160
+ }
161
+
162
+ return <Touchable key={idx} style={[
163
+ variantStyles.modalItem,
164
+ isSelected && variantStyles['modalItem:selected'],
165
+ ]} onPress={() => select(item.value)} debugName={`Select ${item.value}`}>
166
+ <InputLabel label={item.label} style={[variantStyles.modalItemText, isSelected && variantStyles['modalItemText:selected']]}/>
167
+ </Touchable>
168
+ })
169
+ }
170
+ </ListComponent>
171
+
172
+ {
173
+ footer && <View style={variantStyles.modalFooter}>
174
+ {footer}
175
+ </View>
176
+ }
177
+ </View>
178
+ </View>
179
+ </Modal>
180
+ </>
181
+ }
182
+
183
+ export * from './styles'
184
+ export * from './types'
@@ -0,0 +1,81 @@
1
+ import { assignTextStyle, ButtonParts, createDefaultVariantFactory, TextInputComposition } from '@codeleap/common'
2
+ import { MobileModalStyles } from '../Modal'
3
+ type ModalParts =
4
+ 'Box' |
5
+ 'Wrapper' |
6
+ 'Header' |
7
+ 'Footer' |
8
+ 'List' |
9
+ 'Item' |
10
+ 'ItemText' |
11
+ 'Item:selected' |
12
+ 'ItemText:selected' |
13
+ 'LabelText' |
14
+ `CloseButton${Capitalize<ButtonParts>}`
15
+
16
+ type InputParts = `input${Capitalize<TextInputComposition>}`
17
+
18
+ export type MobileSelectParts = InputParts
19
+ | `backdrop`
20
+ | `backdrop:visible`
21
+ | `backdrop:hidden`
22
+ | `modal${ModalParts}`
23
+
24
+ export type MobileSelectComposition = MobileSelectParts
25
+
26
+ const createSelectStyle = createDefaultVariantFactory<MobileSelectComposition>()
27
+
28
+ export const MobileSelectStyles = {
29
+ default: createSelectStyle((theme) => ({
30
+ modalBox: {
31
+ // ...MobileModalStyles.default(theme).box,
32
+ backgroundColor: theme.colors.background,
33
+ borderTopLeftRadius: 20,
34
+ borderTopRightRadius: 20,
35
+ zIndex: 1,
36
+ elevation: 5,
37
+ },
38
+ modalWrapper: {
39
+ // ...MobileModalStyles.default(theme).wrapper,
40
+ flex: 1,
41
+ alignItems: 'stretch',
42
+ justifyContent: 'flex-end',
43
+ },
44
+ modalItem: {
45
+ ...theme.spacing.paddingVertical(1),
46
+ ...theme.spacing.paddingHorizontal(2),
47
+ color: theme.colors.text,
48
+ },
49
+ 'modalItemText:selected': {
50
+ color: theme.colors.primary,
51
+ },
52
+ modalList: {
53
+ ...theme.spacing.marginVertical(0.6),
54
+ },
55
+ backdrop: {
56
+ // ...MobileModalStyles.default(theme).overlay,
57
+ zIndex: 10,
58
+ flex: 1,
59
+
60
+ backgroundColor: theme.colors.black,
61
+ },
62
+ 'backdrop:hidden': {
63
+ opacity: 0,
64
+ },
65
+ 'backdrop:visible': {
66
+ opacity: 0.4,
67
+ },
68
+ modalHeader: {
69
+ ...theme.spacing.padding(2),
70
+ flexDirection: 'row',
71
+ ...theme.presets.alignCenter,
72
+ ...theme.presets.justifySpaceBetween,
73
+ },
74
+ modalLabelText: {
75
+ ...assignTextStyle('p2')(theme).text,
76
+ },
77
+ modalCloseButtonWrapper: {
78
+ backgroundColor: 'transparent',
79
+ },
80
+ })),
81
+ }