@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,11 +1,23 @@
1
- import {createDefaultVariantFactory, includePresets} from '@codeleap/common'
1
+ import { createDefaultVariantFactory, includePresets } from '@codeleap/common'
2
2
 
3
- type CheckboxParts = 'wrapper' | 'label' | 'input' | 'checkmark' | 'checkmarkWrapper' | 'error'
3
+ type CheckboxParts =
4
+ | 'wrapper'
5
+ | 'label'
6
+ | 'input'
7
+ | 'checkmark'
8
+ | 'checkmarkWrapper'
9
+ | 'error';
4
10
 
5
- export type MobileCheckboxComposition = CheckboxParts | `${CheckboxParts}:checked` | `${CheckboxParts}:disabled` | `${CheckboxParts}:error`;
6
- const createCheckboxStyle = createDefaultVariantFactory<MobileCheckboxComposition>()
11
+ export type MobileCheckboxComposition =
12
+ | CheckboxParts
13
+ | `${CheckboxParts}:checked`
14
+ | `${CheckboxParts}:disabled`
15
+ | `${CheckboxParts}:error`;
16
+ const createCheckboxStyle =
17
+ createDefaultVariantFactory<MobileCheckboxComposition>()
7
18
 
8
- const presets = includePresets((styles) => createCheckboxStyle(() => ({ wrapper: styles })))
19
+ const presets = includePresets((styles) => createCheckboxStyle(() => ({ wrapper: styles })),
20
+ )
9
21
 
10
22
  export const MobileCheckboxStyles = {
11
23
  ...presets,
@@ -15,49 +27,46 @@ export const MobileCheckboxStyles = {
15
27
  const markHeight = size * 0.5
16
28
  const markWidth = size * 0.25
17
29
 
18
- const translateX = -(markWidth/2)
19
- const translateY = -(markHeight/2)
30
+ const translateX = -(markWidth / 2)
31
+ const translateY = -(markHeight / 2)
20
32
  return {
21
- wrapper: {
22
-
23
- },
33
+ wrapper: {},
24
34
  input: {
25
35
  flexDirection: 'row',
26
36
  ...theme.presets.alignCenter,
27
- borderRadius: theme.borderRadius.small
37
+ borderRadius: theme.borderRadius.small,
28
38
  },
29
39
  label: {
30
40
  ...theme.spacing.marginLeft(0.5),
31
41
  },
32
-
42
+
33
43
  checkmark: {
34
- position: 'absolute',
35
- top: '40%',
36
- left: '50%',
37
-
38
- height: markHeight,
39
- width: markWidth,
40
- transform: [{translateX}, {translateY}, {rotate: '45deg'},]
44
+ position: 'absolute',
45
+ top: '40%',
46
+ left: '50%',
47
+
48
+ height: markHeight,
49
+ width: markWidth,
50
+ transform: [{ translateX }, { translateY }, { rotate: '45deg' }],
41
51
  },
42
- "checkmark:checked": {
52
+ 'checkmark:checked': {
43
53
  ...theme.border.white({
44
54
  width: 2,
45
- directions: ['right','bottom']
55
+ directions: ['right', 'bottom'],
46
56
  }),
47
57
  },
48
58
  checkmarkWrapper: {
49
- position: 'relative',
50
- width: size,
51
- height: size,
52
- ...theme.border.gray(1)
59
+ position: 'relative',
60
+ width: size,
61
+ height: size,
62
+ ...theme.border.neutral(1),
53
63
  },
54
- "checkmarkWrapper:checked": {
55
- backgroundColor: theme.colors.primary
64
+ 'checkmarkWrapper:checked': {
65
+ backgroundColor: theme.colors.primary,
56
66
  },
57
67
  error: {
58
- color: theme.colors.negative
59
- }
68
+ color: theme.colors.negative,
69
+ },
60
70
  }
61
71
  }),
62
-
63
72
  }
@@ -1,37 +1,43 @@
1
1
  import React from 'react'
2
- import { ComponentVariants, ContentViewStyles, useComponentStyle, ViewComposition } from '@codeleap/common'
2
+ import {
3
+ ComponentVariants,
4
+ ContentViewStyles,
5
+ useDefaultComponentStyle,
6
+ ViewComposition,
7
+ } from '@codeleap/common'
3
8
  import { ViewProps, View } from './View'
4
9
  import { Text } from './Text'
5
10
  import { StylesOf } from '../types/utility'
6
11
  import { ActivityIndicator } from './ActivityIndicator'
12
+ import { StyleSheet } from 'react-native'
7
13
 
8
- export type ContentViewProps = Omit<ViewProps, 'variants' | 'responsiveVariants'> & {
9
- placeholderMsg: string
10
- loading?: boolean
11
- styles?: StylesOf<ViewComposition>
12
- } & ComponentVariants<typeof ContentViewStyles>
14
+ export type ContentViewProps = Omit<
15
+ ViewProps,
16
+ 'variants' | 'responsiveVariants'
17
+ > & {
18
+ placeholderMsg: string;
19
+ loading?: boolean;
20
+ styles?: StylesOf<ViewComposition>;
21
+ } & ComponentVariants<typeof ContentViewStyles>;
13
22
 
14
- const WrapContent = ({ children, ...props }) => <View {...props}>{children}</View>
23
+ const WrapContent = ({ children, ...props }) => (
24
+ <View {...props}>{children}</View>
25
+ )
15
26
 
16
27
  export const ContentView: React.FC<ContentViewProps> = (rawProps) => {
17
- const {
18
- children,
19
- placeholderMsg,
20
- loading,
21
- variants,
22
- styles,
23
- ...props
24
- } = rawProps
28
+ const { children, placeholderMsg, loading, variants, styles, ...props } =
29
+ rawProps
25
30
 
26
- const variantStyle = useComponentStyle('ContentView', {
31
+ const variantStyle = useDefaultComponentStyle('ContentView', {
27
32
  variants,
33
+ transform: StyleSheet.flatten,
28
34
  styles,
29
35
  })
30
36
 
31
37
  if (loading) {
32
38
  return (
33
39
  <WrapContent {...props} style={variantStyle.wrapper}>
34
- <ActivityIndicator styles={{wrapper: variantStyle.loader}}/>
40
+ <ActivityIndicator styles={{ wrapper: variantStyle.loader }} />
35
41
  </WrapContent>
36
42
  )
37
43
  }
@@ -49,4 +55,4 @@ export const ContentView: React.FC<ContentViewProps> = (rawProps) => {
49
55
  <Text text={placeholderMsg} />
50
56
  </WrapContent>
51
57
  )
52
- }
58
+ }
@@ -1,69 +1,178 @@
1
- import React, { forwardRef, useImperativeHandle, useRef } from 'react'
2
- import { DocumentPicker } from '../modules/documentPicker'
3
- import { ComponentVariants, FileInputComposition, FileInputStyles, IconPlaceholder, MobileInputFile, useComponentStyle, useStyle} from '@codeleap/common'
1
+ import React, { forwardRef, useImperativeHandle } from 'react'
2
+ import { DocumentPicker, ImageCropPicker } from '../modules/documentPicker'
3
+ import {
4
+ ComponentVariants,
5
+ FileInputComposition,
6
+ FileInputStyles,
7
+ IconPlaceholder,
8
+ MobileInputFile,
9
+ parseFilePathData,
10
+ useDefaultComponentStyle,
11
+ useCodeleapContext,
12
+ } from '@codeleap/common'
4
13
  import { StylesOf } from '../types/utility'
5
14
  import { Button, ButtonProps } from './Button'
6
15
  import { View } from './View'
7
16
  import { InputLabel } from './TextInput'
17
+ import OSAlert from '../utils/OSAlert'
18
+ import { Options } from 'react-native-image-crop-picker'
19
+ import { DocumentPickerOptions } from '../modules/types/documentPicker'
8
20
 
9
21
  export type FileInputRef = {
10
- openFilePicker: () => void
11
- }
22
+ openFilePicker: () => void;
23
+ };
12
24
 
13
25
  export type FileInputProps = {
14
- label?: string;
15
- iconName?: IconPlaceholder
16
- styles?: StylesOf<FileInputComposition>;
17
- mode: 'hidden' | 'button'
18
- variants?: ComponentVariants<typeof FileInputStyles>['variants']
19
- onFileSelect(files:MobileInputFile[]): void
20
- options?: DocumentPicker.DocumentPickerOptions
21
- buttonProps?: ButtonProps
26
+ label?: string;
27
+ iconName?: IconPlaceholder;
28
+ styles?: StylesOf<FileInputComposition>;
29
+ mode: 'hidden' | 'button';
30
+ variants?: ComponentVariants<typeof FileInputStyles>['variants'];
31
+ onFileSelect(files: MobileInputFile[]): void;
32
+ options?: DocumentPickerOptions<any>;
33
+ buttonProps?: ButtonProps;
34
+ ref?: FileInputRef;
35
+ placeholder?: string
36
+ type?: 'image' | 'anyFile'
37
+ alertProps?: Parameters<typeof OSAlert.ask>[0]
38
+ pickerOptions?: Partial<Options>
39
+ };
40
+
41
+ const pickerDefaults = {
42
+ width: 300,
43
+ height: 400,
44
+ cropping: true,
22
45
  }
23
46
 
24
- export const FileInput: React.FC<FileInputProps> = forwardRef<FileInputRef, FileInputProps>((fileInputProps,ref) => {
25
- const {mode = 'hidden', onFileSelect, iconName, styles, label, variants, options, buttonProps} = fileInputProps
26
-
27
- const [file, setFile] = React.useState(null)
47
+ function parsePickerData(data:any):MobileInputFile {
28
48
 
29
- const {logger} = useStyle()
30
-
31
- const openFilePicker = async () => {
32
- try {
33
- let files = await DocumentPicker.pick(options)
34
- if(!Array.isArray(files)){
35
- files = [files]
36
- }
37
- setFile(files)
38
- onFileSelect(files.map((file) => ({preview: file, file})))
39
- } catch (err) {
40
- if (DocumentPicker.isCancel(err)) {
41
- logger.log('User cancelled the picker.', null, 'Component')
42
- } else {
43
- throw err
44
- }
45
- }
49
+ const filePathData = parseFilePathData(data.path)
50
+ const d:MobileInputFile['file'] = {
51
+ name: filePathData.name,
52
+ size: data.size,
53
+ type: data.mime,
54
+ uri: data.path,
55
+ fileCopyUri: data.path,
56
+ }
57
+
58
+ return {
59
+ file: d,
60
+ preview: data.path,
61
+ }
62
+ }
63
+
64
+ export const FileInput = forwardRef<
65
+ FileInputRef,
66
+ FileInputProps
67
+ >((fileInputProps, ref) => {
68
+ const {
69
+ mode = 'hidden',
70
+ onFileSelect,
71
+ iconName,
72
+ styles,
73
+ label,
74
+ variants,
75
+ options,
76
+ type = 'image',
77
+ alertProps,
78
+ placeholder = 'Select a file',
79
+ pickerOptions,
80
+ buttonProps,
81
+ } = fileInputProps
82
+
83
+ const [file, setFile] = React.useState(null)
84
+
85
+ const { logger } = useCodeleapContext()
86
+
87
+ async function openFileSystem(){
88
+ try {
89
+ let files = await DocumentPicker.pick(options)
90
+ if (!Array.isArray(files)) {
91
+ files = [files]
92
+ }
93
+ setFile(files)
94
+ onFileSelect(files.map((file) => ({ preview: file.uri, file })))
95
+ } catch (err) {
96
+ if (DocumentPicker.isCancel(err)) {
97
+ logger.log('User cancelled the picker.', null, 'Component')
98
+ } else {
99
+ throw err
100
+ }
46
101
  }
47
-
48
- const variantStyles = useComponentStyle('FileInput', {
49
- styles,
50
- variants,
51
-
52
- })
102
+ }
53
103
 
104
+ const mergedOptions = {
105
+ ...pickerDefaults,
106
+ ...pickerOptions,
107
+ } as Options
108
+
109
+ const handlePickerResolution = data => {
110
+ onFileSelect(mergedOptions.multiple ? data.map(parsePickerData) : [
111
+ parsePickerData(data),
112
+ ])
113
+ }
54
114
 
55
- useImperativeHandle(ref, () => ({
56
- openFilePicker
57
- }))
115
+ const openFilePicker = async () => {
58
116
 
59
- const filenames = file ? file.map((f) => f.name) : ''
60
- if(mode === 'button'){
61
- return (<View style={variantStyles.wrapper}>
62
- <InputLabel label={label} style={variantStyles.label}/>
63
- <Button onPress={() => openFilePicker()} text={filenames } icon={ iconName || 'fileInputButton' as IconPlaceholder} variants={filenames ? '' : 'icon' } {...buttonProps}/>
64
- </View>
65
- )
117
+ if (type === 'image'){
118
+ OSAlert.ask({
119
+ title: 'Change Image',
120
+ body: 'Do you want to take a new picture or select an existing one?',
121
+ ...alertProps,
122
+ options: [
123
+ {
124
+ text: 'Cancel',
125
+ onPress: () => {},
126
+ ...alertProps?.options[0],
127
+ },
128
+ {
129
+ text: alertProps?.options?.[0]?.text || 'Camera',
130
+ onPress: () => {
131
+ ImageCropPicker.openCamera(mergedOptions).then(handlePickerResolution)
132
+ },
133
+ ...alertProps?.options[1],
134
+ },
135
+ {
136
+ text: 'Library',
137
+ onPress: () => {
138
+ ImageCropPicker.openPicker(mergedOptions).then(handlePickerResolution)
139
+
140
+ },
141
+ ...alertProps?.options[2],
142
+ },
143
+
144
+ ],
145
+ })
146
+ } else {
147
+ openFileSystem()
66
148
  }
149
+
150
+ }
151
+
152
+ const variantStyles = useDefaultComponentStyle('FileInput', {
153
+ styles,
154
+ variants,
155
+ })
156
+
157
+ useImperativeHandle(ref, () => ({
158
+ openFilePicker,
159
+ }))
160
+
161
+ const filenames = file ? file.map((f) => f.name) : ''
162
+ if (mode === 'button') {
163
+ return (
164
+ <View style={variantStyles.wrapper}>
165
+ <InputLabel label={label} style={variantStyles.label} />
166
+ <Button
167
+ onPress={() => openFilePicker()}
168
+ text={filenames || placeholder}
169
+ icon={iconName || ('fileInputButton' as IconPlaceholder)}
170
+ variants={filenames ? '' : 'icon'}
171
+ {...buttonProps}
172
+ />
173
+ </View>
174
+ )
175
+ }
67
176
 
68
- return null
69
- })
177
+ return null
178
+ })
@@ -1,35 +1,48 @@
1
1
  import * as React from 'react'
2
- import { ComponentVariants, IconPlaceholder, IconStyles, useComponentStyle, useStyle } from '@codeleap/common'
2
+ import {
3
+ ComponentVariants,
4
+ IconPlaceholder,
5
+ IconStyles,
6
+ useDefaultComponentStyle,
7
+ useCodeleapContext,
8
+ } from '@codeleap/common'
3
9
  import { StyleSheet } from 'react-native'
10
+ import { View } from './View'
4
11
 
5
12
  export type IconProps = {
6
- name:IconPlaceholder
7
- style?: {
8
- color: string
9
- size?:string|number
10
- width?:string|number
11
- height?:string|number
12
- }
13
- variants?: ComponentVariants<typeof IconStyles>['variants']
14
- }
15
-
16
- export const Icon:React.FC<IconProps> = ({name, style, variants}) => {
17
- const {Theme} = useStyle()
18
-
19
- if (!name) return null
13
+ name: IconPlaceholder
14
+ style?: any
15
+ color?: string
16
+ variants?: ComponentVariants<typeof IconStyles>['variants']
17
+ renderEmptySpace?: boolean
18
+ size?: number
19
+ };
20
+
21
+ export const Icon: React.FC<IconProps> = ({ name, style, variants, renderEmptySpace, ...otherProps }) => {
22
+ const { Theme, logger } = useCodeleapContext()
20
23
 
21
- const Component = Theme?.icons?.[name]
22
-
23
- const {logger} = useStyle()
24
- const variantStyles = useComponentStyle('Icon', {
24
+ const variantStyles = useDefaultComponentStyle('Icon', {
25
25
  variants,
26
+ transform: StyleSheet.flatten,
26
27
  styles: {
27
- icon: StyleSheet.flatten([style]),
28
- }
28
+ icon: style,
29
+ },
30
+ rootElement: 'icon',
29
31
  })
32
+
33
+ if (!name) {
34
+ return renderEmptySpace ? <View style={variantStyles.icon}/> : null
35
+ }
36
+
37
+ const Component = Theme?.icons?.[name]
38
+
30
39
  if (!Component) {
31
- logger.warn('Icon', `No icon found in theme for name "${name}"`, 'Component')
40
+ logger.warn(
41
+ `Icon: No icon found in theme for name "${name}".`,
42
+ { props: { style, name, variants, variantStyles }},
43
+ 'Component',
44
+ )
32
45
  return null
33
46
  }
34
- return <Component style={variantStyles.icon}/>
47
+ return <Component {...otherProps} style={variantStyles.icon} />
35
48
  }
@@ -1,43 +1,49 @@
1
1
  import * as React from 'react'
2
- import { ComponentVariants, ImageStyles, MobileInputFile, useComponentStyle } from "@codeleap/common"
3
- import { ComponentPropsWithoutRef } from "react"
4
- import { Image as NativeImage } from 'react-native'
5
- import {FastImage} from '../modules/fastImage'
2
+ import {
3
+ ComponentVariants,
4
+ ImageStyles,
5
+ MobileInputFile,
6
+ useDefaultComponentStyle,
7
+ } from '@codeleap/common'
8
+ import { ComponentPropsWithoutRef } from 'react'
9
+ import {
10
+ Image as NativeImage,
11
+ ImageStyle,
12
+ StyleProp,
13
+ TextStyle,
14
+ ViewStyle,
15
+ } from 'react-native'
16
+ import { FastImage } from '../modules/fastImage'
6
17
 
7
- type NativeImageProps = ComponentPropsWithoutRef<typeof NativeImage>
8
- export type ImageProps = Omit<NativeImageProps, 'source'> & {
9
- variants?: ComponentVariants<typeof ImageStyles>['variants']
10
- fast?: boolean
11
- source: NativeImageProps['source'] & {
12
- priority?: keyof typeof FastImage.priority
13
- } | MobileInputFile | string
14
- resizeMode?: keyof typeof FastImage.resizeMode
15
- }
18
+ type NativeImageProps = ComponentPropsWithoutRef<typeof NativeImage>;
19
+ export type ImageProps = Omit<NativeImageProps, 'source' | 'style'> & {
20
+ variants?: ComponentVariants<typeof ImageStyles>['variants'];
21
+ fast?: boolean;
22
+ style?: StyleProp<ImageStyle | TextStyle | ViewStyle>;
23
+ source:
24
+ | (NativeImageProps['source'] & {
25
+ priority?: keyof typeof FastImage.priority;
26
+ })
27
+ | MobileInputFile
28
+ | string;
29
+ resizeMode?: keyof typeof FastImage.resizeMode;
30
+ };
16
31
 
17
- export const Image:React.FC<ImageProps> = (props) => {
18
- const {
19
- variants,
20
- style,
21
- fast,
22
- resizeMode,
23
- resizeMethod,
24
- ...imageProps
25
- } = props
26
-
27
- const variantStyles = useComponentStyle('Image', {variants})
32
+ export const Image: React.FC<ImageProps> = (props) => {
33
+ const { variants, style, fast = true, resizeMode = 'contain', ...imageProps } = props
28
34
 
29
- const styles = [variantStyles.wrapper, style]
35
+ const variantStyles = useDefaultComponentStyle('Image', { variants })
30
36
 
37
+ const styles = [variantStyles.wrapper, style]
31
38
 
32
- if(fast){
33
- return <FastImage
34
- style={styles}
35
- resizeMode={ FastImage.resizeMode[resizeMode || 'contain']}
36
- {...imageProps}
37
- />
38
- }
39
- return <NativeImage
39
+ if (fast) {
40
+ return (
41
+ <FastImage
40
42
  style={styles}
41
- {...(imageProps as any)}
42
- />
43
- }
43
+ resizeMode={FastImage.resizeMode[resizeMode || 'contain']}
44
+ {...imageProps}
45
+ />
46
+ )
47
+ }
48
+ return <NativeImage style={styles} resizeMode={resizeMode} {...(imageProps as any)} />
49
+ }
@@ -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
+ KeyboardAwareFlatListProps,
12
+ KeyboardAwareFlatList as KBDView,
13
+ } from 'react-native-keyboard-aware-scroll-view'
14
+ import { RefreshControl, FlatList } from 'react-native'
15
+ import { View, ViewProps } from './View'
16
+
17
+ export type FlatListProps = KeyboardAwareFlatListProps<any> &
18
+ ViewProps & {
19
+ onRefresh?: () => void;
20
+ refreshTimeout?: number;
21
+ changeData?: any;
22
+ separators?: boolean;
23
+ };
24
+
25
+ const KeyboardAwareFlatList =
26
+ KBDView as unknown as React.ForwardRefExoticComponent<
27
+ ViewProps & {
28
+ refreshControl?: JSX.Element;
29
+ ref?: FlatList;
30
+ }
31
+ >
32
+
33
+ export const List = forwardRef<FlatList, FlatListProps>(
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
+ <KeyboardAwareFlatList
87
+ style={[Theme.presets.full, style]}
88
+ contentContainerStyle={[variantStyles.wrapper]}
89
+ ref={ref as unknown as FlatList}
90
+ ItemSeparatorComponent={separator}
91
+ {...props}
92
+ refreshControl={
93
+ hasRefresh && (
94
+ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
95
+ )
96
+ }
97
+ />
98
+ )
99
+ },
100
+ )