@codeleap/mobile 1.3.1 → 1.4.0

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 (197) 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.js +9 -6
  6. package/dist/components/ActivityIndicator.js.map +1 -1
  7. package/dist/components/Animated.d.ts +1 -89
  8. package/dist/components/Animated.js +2 -2
  9. package/dist/components/Animated.js.map +1 -1
  10. package/dist/components/Button.d.ts +107 -98
  11. package/dist/components/Button.js +29 -9
  12. package/dist/components/Button.js.map +1 -1
  13. package/dist/components/Checkbox/index.d.ts +1 -1
  14. package/dist/components/Checkbox/index.js +7 -8
  15. package/dist/components/Checkbox/index.js.map +1 -1
  16. package/dist/components/Checkbox/styles.d.ts +47 -43
  17. package/dist/components/Checkbox/styles.js +8 -8
  18. package/dist/components/Checkbox/styles.js.map +1 -1
  19. package/dist/components/ContentView.js +4 -2
  20. package/dist/components/ContentView.js.map +1 -1
  21. package/dist/components/FileInput.d.ts +10 -3
  22. package/dist/components/FileInput.js +94 -32
  23. package/dist/components/FileInput.js.map +1 -1
  24. package/dist/components/Icon.d.ts +4 -6
  25. package/dist/components/Icon.js +25 -11
  26. package/dist/components/Icon.js.map +1 -1
  27. package/dist/components/Image.d.ts +7 -6
  28. package/dist/components/Image.js +4 -4
  29. package/dist/components/Image.js.map +1 -1
  30. package/dist/components/List.d.ts +11 -0
  31. package/dist/components/List.js +77 -0
  32. package/dist/components/List.js.map +1 -0
  33. package/dist/components/Modal/index.d.ts +2 -1
  34. package/dist/components/Modal/index.js +23 -30
  35. package/dist/components/Modal/index.js.map +1 -1
  36. package/dist/components/Modal/styles.d.ts +51 -47
  37. package/dist/components/Modal/styles.js +13 -18
  38. package/dist/components/Modal/styles.js.map +1 -1
  39. package/dist/components/Navigation/Navigation.d.ts +3 -0
  40. package/dist/components/Navigation/Navigation.js +76 -0
  41. package/dist/components/Navigation/Navigation.js.map +1 -0
  42. package/dist/components/Navigation/constants.d.ts +5 -0
  43. package/dist/components/Navigation/constants.js +11 -0
  44. package/dist/components/Navigation/constants.js.map +1 -0
  45. package/dist/components/Navigation/index.d.ts +3 -0
  46. package/dist/components/Navigation/index.js +16 -0
  47. package/dist/components/Navigation/index.js.map +1 -0
  48. package/dist/components/Navigation/types.d.ts +26 -0
  49. package/dist/components/Navigation/types.js +8 -0
  50. package/dist/components/Navigation/types.js.map +1 -0
  51. package/dist/components/Navigation/utils.d.ts +3 -0
  52. package/dist/components/Navigation/utils.js +67 -0
  53. package/dist/components/Navigation/utils.js.map +1 -0
  54. package/dist/components/Overlay.d.ts +5 -5
  55. package/dist/components/Overlay.js +13 -15
  56. package/dist/components/Overlay.js.map +1 -1
  57. package/dist/components/Pager/index.d.ts +19 -0
  58. package/dist/components/Pager/index.js +164 -0
  59. package/dist/components/Pager/index.js.map +1 -0
  60. package/dist/components/Pager/styles.d.ts +51 -0
  61. package/dist/components/Pager/styles.js +44 -0
  62. package/dist/components/Pager/styles.js.map +1 -0
  63. package/dist/components/RadioInput/index.d.ts +1 -0
  64. package/dist/components/RadioInput/index.js +13 -19
  65. package/dist/components/RadioInput/index.js.map +1 -1
  66. package/dist/components/RadioInput/styles.d.ts +48 -44
  67. package/dist/components/RadioInput/styles.js +4 -4
  68. package/dist/components/RadioInput/styles.js.map +1 -1
  69. package/dist/components/Scroll.d.ts +3 -2
  70. package/dist/components/Scroll.js +11 -8
  71. package/dist/components/Scroll.js.map +1 -1
  72. package/dist/components/Sections.d.ts +11 -0
  73. package/dist/components/Sections.js +77 -0
  74. package/dist/components/Sections.js.map +1 -0
  75. package/dist/components/Select/index.d.ts +5 -2
  76. package/dist/components/Select/index.js +118 -5
  77. package/dist/components/Select/index.js.map +1 -1
  78. package/dist/components/Select/styles.d.ts +9 -0
  79. package/dist/components/Select/styles.js +57 -0
  80. package/dist/components/Select/styles.js.map +1 -0
  81. package/dist/components/Select/types.d.ts +33 -0
  82. package/dist/components/Select/types.js +3 -0
  83. package/dist/components/Select/types.js.map +1 -0
  84. package/dist/components/Slider/Mark.d.ts +3 -0
  85. package/dist/components/Slider/Mark.js +32 -0
  86. package/dist/components/Slider/Mark.js.map +1 -0
  87. package/dist/components/Slider/Thumb.d.ts +7 -0
  88. package/dist/components/Slider/Thumb.js +30 -0
  89. package/dist/components/Slider/Thumb.js.map +1 -0
  90. package/dist/components/Slider/index.d.ts +3 -0
  91. package/dist/components/Slider/index.js +94 -0
  92. package/dist/components/Slider/index.js.map +1 -0
  93. package/dist/components/{Slider.d.ts → Slider/types.d.ts} +12 -7
  94. package/dist/components/Slider/types.js +3 -0
  95. package/dist/components/Slider/types.js.map +1 -0
  96. package/dist/components/Switch.d.ts +2 -2
  97. package/dist/components/Switch.js +6 -7
  98. package/dist/components/Switch.js.map +1 -1
  99. package/dist/components/Text.js +5 -5
  100. package/dist/components/Text.js.map +1 -1
  101. package/dist/components/TextInput.d.ts +108 -94
  102. package/dist/components/TextInput.js +28 -25
  103. package/dist/components/TextInput.js.map +1 -1
  104. package/dist/components/Touchable.d.ts +1 -0
  105. package/dist/components/Touchable.js +9 -11
  106. package/dist/components/Touchable.js.map +1 -1
  107. package/dist/components/View.d.ts +97 -175
  108. package/dist/components/View.js +4 -4
  109. package/dist/components/View.js.map +1 -1
  110. package/dist/components/{index.d.ts → components.d.ts} +3 -0
  111. package/dist/components/{index.js → components.js} +4 -1
  112. package/dist/components/components.js.map +1 -0
  113. package/dist/index.d.ts +3 -1
  114. package/dist/index.js +5 -2
  115. package/dist/index.js.map +1 -1
  116. package/dist/modules/documentPicker.d.ts +3 -1
  117. package/dist/modules/documentPicker.js +6 -4
  118. package/dist/modules/documentPicker.js.map +1 -1
  119. package/dist/modules/fastImage.js +1 -1
  120. package/dist/modules/fastImage.js.map +1 -1
  121. package/dist/modules/reactNavigation.d.ts +3 -0
  122. package/dist/modules/reactNavigation.js +11 -0
  123. package/dist/modules/reactNavigation.js.map +1 -0
  124. package/dist/modules/types/fileTypes.d.ts +138 -0
  125. package/dist/modules/types/fileTypes.js +3 -0
  126. package/dist/modules/types/fileTypes.js.map +1 -0
  127. package/dist/types/utility.d.ts +1 -1
  128. package/dist/utils/OSAlert.d.ts +3 -3
  129. package/dist/utils/OSAlert.js.map +1 -1
  130. package/dist/utils/misc.d.ts +2 -0
  131. package/dist/utils/misc.js +26 -0
  132. package/dist/utils/misc.js.map +1 -0
  133. package/dist/utils/styles.js +1 -1
  134. package/dist/utils/styles.js.map +1 -1
  135. package/package.json +6 -3
  136. package/src/components/ActivityIndicator.tsx +38 -28
  137. package/src/components/Animated.tsx +22 -19
  138. package/src/components/Button.tsx +67 -34
  139. package/src/components/Checkbox/index.tsx +60 -48
  140. package/src/components/Checkbox/styles.ts +39 -30
  141. package/src/components/ContentView.tsx +24 -18
  142. package/src/components/FileInput.tsx +161 -52
  143. package/src/components/Icon.tsx +36 -23
  144. package/src/components/Image.tsx +42 -36
  145. package/src/components/List.tsx +100 -0
  146. package/src/components/Modal/index.tsx +109 -94
  147. package/src/components/Modal/styles.ts +62 -66
  148. package/src/components/Navigation/Navigation.tsx +51 -0
  149. package/src/components/Navigation/constants.ts +8 -0
  150. package/src/components/Navigation/index.tsx +3 -0
  151. package/src/components/Navigation/types.ts +37 -0
  152. package/src/components/Navigation/utils.tsx +54 -0
  153. package/src/components/Overlay.tsx +68 -64
  154. package/src/components/Pager/index.tsx +241 -0
  155. package/src/components/Pager/styles.ts +51 -0
  156. package/src/components/RadioInput/index.tsx +76 -52
  157. package/src/components/RadioInput/styles.ts +23 -18
  158. package/src/components/Scroll.tsx +84 -73
  159. package/src/components/Select/index.tsx +179 -6
  160. package/src/components/Select/styles.ts +81 -0
  161. package/src/components/Select/types.ts +41 -0
  162. package/src/components/Slider/Mark.tsx +46 -0
  163. package/src/components/Slider/Thumb.tsx +29 -0
  164. package/src/components/Slider/index.tsx +123 -0
  165. package/src/components/Slider/types.ts +25 -0
  166. package/src/components/Switch.tsx +63 -54
  167. package/src/components/Text.tsx +22 -23
  168. package/src/components/TextInput.tsx +195 -198
  169. package/src/components/Touchable.tsx +43 -30
  170. package/src/components/View.tsx +32 -29
  171. package/src/components/components.ts +26 -0
  172. package/src/index.ts +6 -3
  173. package/src/modules/documentPicker.ts +8 -2
  174. package/src/modules/fastImage.ts +2 -2
  175. package/src/modules/index.d.ts +496 -0
  176. package/src/modules/reactNavigation.ts +4 -0
  177. package/src/modules/types/documentPicker.d.ts +215 -0
  178. package/src/modules/types/fileTypes.ts +138 -0
  179. package/src/types/utility.ts +2 -2
  180. package/src/utils/OSAlert.ts +35 -33
  181. package/src/utils/misc.ts +24 -0
  182. package/src/utils/styles.ts +14 -17
  183. package/dist/components/Drawer.d.ts +0 -23
  184. package/dist/components/Drawer.js +0 -78
  185. package/dist/components/Drawer.js.map +0 -1
  186. package/dist/components/Navigation.d.ts +0 -30
  187. package/dist/components/Navigation.js +0 -126
  188. package/dist/components/Navigation.js.map +0 -1
  189. package/dist/components/Slider.js +0 -130
  190. package/dist/components/Slider.js.map +0 -1
  191. package/dist/components/index.js.map +0 -1
  192. package/dist/modules/cropPicker.d.ts +0 -1
  193. package/dist/modules/cropPicker.js +0 -10
  194. package/dist/modules/cropPicker.js.map +0 -1
  195. package/src/components/Navigation.tsx +0 -125
  196. package/src/components/Slider.tsx +0 -198
  197. package/src/components/index.ts +0 -23
@@ -1,87 +1,98 @@
1
1
  import * as React from 'react'
2
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'
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'
6
15
  import { ViewProps } from './View'
7
16
 
17
+ export type ScrollProps = KeyboardAwareScrollViewProps &
18
+ ViewProps & {
19
+ onRefresh?: () => void;
20
+ refreshTimeout?: number;
21
+ changeData?: any;
22
+ styles?: ViewStyle
23
+ };
8
24
 
9
- export type ScrollProps = KeyboardAwareScrollViewProps & ViewProps & {
10
- onRefresh?:() => void
11
- refreshTimeout?: number
12
- changeData?:any
13
- }
25
+ const KeyboardAwareScrollView =
26
+ KBDView as unknown as React.ForwardRefExoticComponent<
27
+ ViewProps & {
28
+ refreshControl?: JSX.Element;
29
+ ref?: ScrollView;
30
+
31
+ } & ScrollViewProps
32
+ >
14
33
 
15
- const KeyboardAwareScrollView = KBDView as unknown as React.ForwardRefExoticComponent<
16
- ViewProps &
17
- {
18
- refreshControl?: JSX.Element
19
- ref?: ScrollView
20
-
21
- }
22
- >
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)
23
47
 
48
+ const timer = React.useRef(null)
49
+ const previousData = usePrevious(changeData)
24
50
 
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){
51
+ const onRefresh = () => {
52
+ if (timer.current) {
58
53
  clearTimeout(timer.current)
59
54
  }
60
- }
61
- },[refreshing, changeData])
62
- const {
63
- Theme
64
- } = useStyle()
65
55
 
66
- const variantStyles = useComponentStyle('View', {
67
- variants
68
- })
56
+ setRefreshing(true)
69
57
 
70
- return (
58
+ props.onRefresh()
71
59
 
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
- />
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
+ }
82
70
  }
83
- >
84
- { children }
85
- </KeyboardAwareScrollView>
86
- )
87
- })
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
+ )
@@ -1,8 +1,181 @@
1
- import * as React from 'react'
2
- import { View } from "../View"
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'
3
6
 
4
- export const Select:React.FC = () => {
5
- return <View >
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'
6
12
 
7
- </View>
8
- }
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
+ onPress: close,
87
+ }}
88
+ label={label}
89
+ styles={inputStyles}
90
+ style={style}
91
+ {...props}
92
+ />
93
+ <AnimatedView pointerEvents={'none'} transition='opacity' style={[
94
+ {
95
+ position: 'absolute',
96
+ top: 0,
97
+ right: 0,
98
+ left: 0,
99
+ bottom: 0,
100
+ },
101
+ variantStyles.backdrop,
102
+ isModalVisible ? variantStyles['backdrop:visible'] : variantStyles['backdrop:hidden'],
103
+ ]} />
104
+
105
+ <Modal
106
+ animationType='slide'
107
+ transparent={true}
108
+ visible={isModalVisible}
109
+ onRequestClose={() => {
110
+ setModalVisibility()
111
+ }}
112
+ pointerEvents={isModalVisible ? 'auto': 'none'}
113
+ >
114
+ <Touchable
115
+ onPress={close}
116
+ style={{
117
+ position: 'absolute',
118
+ top: 0,
119
+ right: 0,
120
+ left: 0,
121
+ bottom: 0,
122
+ }}
123
+ />
124
+ <View style={variantStyles.modalWrapper}>
125
+
126
+ <View style={variantStyles.modalBox}>
127
+ {
128
+ (showClose || showLabelOnModal || header) && (
129
+ <View style={variantStyles.modalHeader}>
130
+ {
131
+ header ? header : <>
132
+ {showLabelOnModal && <InputLabel label={modalLabel || label} style={variantStyles.modalLabelText}/>}
133
+ {showClose && <Button
134
+ icon={modalCloseIconName as IconPlaceholder}
135
+ onPress={close}
136
+ styles={closeButtonStyles}
137
+ {...closeButtonProps}
138
+ />}
139
+ </>
140
+ }
141
+ </View>
142
+ )
143
+ }
144
+ <ListComponent style={variantStyles.modalList}>
145
+ {
146
+ options.map((item, idx) => {
147
+ const isSelected = value === item.value
148
+ if (renderItem) {
149
+ return renderItem({
150
+ ...item,
151
+ selected: isSelected,
152
+ onPress: close,
153
+ styles: variantStyles,
154
+
155
+ })
156
+ }
157
+
158
+ return <Touchable key={idx} style={[
159
+ variantStyles.modalItem,
160
+ isSelected && variantStyles['modalItem:selected'],
161
+ ]} onPress={() => select(item.value)}>
162
+ <InputLabel label={item.label} style={[variantStyles.modalItemText, isSelected && variantStyles['modalItemText:selected']]}/>
163
+ </Touchable>
164
+ })
165
+ }
166
+ </ListComponent>
167
+
168
+ {
169
+ footer && <View style={variantStyles.modalFooter}>
170
+ {footer}
171
+ </View>
172
+ }
173
+ </View>
174
+ </View>
175
+ </Modal>
176
+ </>
177
+ }
178
+
179
+
180
+ export * from './styles'
181
+ 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
+ }
@@ -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
+