@codeleap/mobile 1.2.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 (194) 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 +15 -0
  8. package/dist/components/Animated.js +55 -0
  9. package/dist/components/Animated.js.map +1 -0
  10. package/dist/components/Button.d.ts +107 -104
  11. package/dist/components/Button.js +30 -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 +26 -2
  22. package/dist/components/FileInput.js +151 -4
  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 +25 -0
  34. package/dist/components/Modal/index.js +109 -0
  35. package/dist/components/Modal/index.js.map +1 -0
  36. package/dist/components/Modal/styles.d.ts +66 -0
  37. package/dist/components/Modal/styles.js +57 -0
  38. package/dist/components/Modal/styles.js.map +1 -0
  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 +16 -0
  55. package/dist/components/Overlay.js +66 -0
  56. package/dist/components/Overlay.js.map +1 -0
  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 -96
  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 +42 -35
  103. package/dist/components/TextInput.js.map +1 -1
  104. package/dist/components/Touchable.d.ts +9 -14
  105. package/dist/components/Touchable.js +11 -15
  106. package/dist/components/Touchable.js.map +1 -1
  107. package/dist/components/View.d.ts +105 -181
  108. package/dist/components/View.js +6 -8
  109. package/dist/components/View.js.map +1 -1
  110. package/dist/components/{index.d.ts → components.d.ts} +6 -0
  111. package/dist/components/{index.js → components.js} +7 -1
  112. package/dist/components/components.js.map +1 -0
  113. package/dist/index.d.ts +4 -1
  114. package/dist/index.js +7 -2
  115. package/dist/index.js.map +1 -1
  116. package/dist/modules/documentPicker.d.ts +3 -0
  117. package/dist/modules/documentPicker.js +12 -0
  118. package/dist/modules/documentPicker.js.map +1 -0
  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 +10 -4
  136. package/src/components/ActivityIndicator.tsx +38 -28
  137. package/src/components/Animated.tsx +34 -0
  138. package/src/components/Button.tsx +68 -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 +177 -5
  143. package/src/components/Icon.tsx +36 -23
  144. package/src/components/Image.tsx +41 -35
  145. package/src/components/List.tsx +100 -0
  146. package/src/components/Modal/index.tsx +158 -0
  147. package/src/components/Modal/styles.ts +118 -0
  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 +76 -0
  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 +194 -191
  169. package/src/components/Touchable.tsx +45 -35
  170. package/src/components/View.tsx +33 -40
  171. package/src/components/components.ts +26 -0
  172. package/src/index.ts +6 -2
  173. package/src/modules/documentPicker.ts +8 -0
  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 +13 -16
  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/src/components/Navigation.tsx +0 -125
  193. package/src/components/Slider.tsx +0 -198
  194. package/src/components/index.ts +0 -19
@@ -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,6 +1,178 @@
1
- import * as React from 'react'
2
- import { Text } from 'react-native'
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'
13
+ import { StylesOf } from '../types/utility'
14
+ import { Button, ButtonProps } from './Button'
15
+ import { View } from './View'
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'
3
20
 
4
- export const FileInput = React.forwardRef(() => {
5
- return <Text >Not implemented</Text>
6
- })
21
+ export type FileInputRef = {
22
+ openFilePicker: () => void;
23
+ };
24
+
25
+ export type FileInputProps = {
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,
45
+ }
46
+
47
+ function parsePickerData(data:any):MobileInputFile {
48
+
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
+ }
101
+ }
102
+ }
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
+ }
114
+
115
+ const openFilePicker = async () => {
116
+
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()
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
+ }
176
+
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, 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
- }
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}
43
+ resizeMode={FastImage.resizeMode[resizeMode || 'contain']}
41
44
  {...imageProps}
42
- />
43
- }
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
+ )