@codeleap/mobile 1.3.1 → 1.4.2

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,69 +1,179 @@
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'
4
- import { StylesOf } from '../types/utility'
5
- import { Button, ButtonProps } from './Button'
6
- import { View } from './View'
7
- import { InputLabel } from './TextInput'
8
-
9
- export type FileInputRef = {
10
- openFilePicker: () => void
11
- }
12
-
13
- 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
22
- }
23
-
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)
28
-
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
- }
46
- }
47
-
48
- const variantStyles = useComponentStyle('FileInput', {
49
- styles,
50
- variants,
51
-
52
- })
53
-
54
-
55
- useImperativeHandle(ref, () => ({
56
- openFilePicker
57
- }))
58
-
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
- )
66
- }
67
-
68
- return null
69
- })
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'
20
+
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: alertProps?.options?.[0]?.text || 'Camera',
125
+ onPress: () => {
126
+ ImageCropPicker.openCamera(mergedOptions).then(handlePickerResolution)
127
+ },
128
+ ...alertProps?.options[1],
129
+ },
130
+ {
131
+ text: 'Library',
132
+ onPress: () => {
133
+ ImageCropPicker.openPicker(mergedOptions).then(handlePickerResolution)
134
+ },
135
+ ...alertProps?.options[2],
136
+ },
137
+ {
138
+ text: 'Cancel',
139
+ style: 'cancel',
140
+ onPress: () => {},
141
+ ...alertProps?.options[0],
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
+ debugName={'Open file picker'}
170
+ icon={iconName || ('fileInputButton' as IconPlaceholder)}
171
+ variants={filenames ? '' : 'icon'}
172
+ {...buttonProps}
173
+ />
174
+ </View>
175
+ )
176
+ }
177
+
178
+ return null
179
+ })
@@ -1,35 +1,58 @@
1
- import * as React from 'react'
2
- import { ComponentVariants, IconPlaceholder, IconStyles, useComponentStyle, useStyle } from '@codeleap/common'
3
- import { StyleSheet } from 'react-native'
4
-
5
- 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
20
-
21
- const Component = Theme?.icons?.[name]
22
-
23
- const {logger} = useStyle()
24
- const variantStyles = useComponentStyle('Icon', {
25
- variants,
26
- styles: {
27
- icon: StyleSheet.flatten([style]),
28
- }
29
- })
30
- if (!Component) {
31
- logger.warn('Icon', `No icon found in theme for name "${name}"`, 'Component')
32
- return null
33
- }
34
- return <Component style={variantStyles.icon}/>
35
- }
1
+ import * as React from 'react'
2
+ import {
3
+ ComponentVariants,
4
+ IconPlaceholder,
5
+ IconStyles,
6
+ useDefaultComponentStyle,
7
+ useCodeleapContext,
8
+ arePropsEqual,
9
+ } from '@codeleap/common'
10
+ import { StyleSheet } from 'react-native'
11
+ import { View } from './View'
12
+
13
+ export type IconProps = {
14
+ name: IconPlaceholder
15
+ style?: any
16
+ color?: string
17
+ variants?: ComponentVariants<typeof IconStyles>['variants']
18
+ renderEmptySpace?: boolean
19
+ size?: number
20
+ }
21
+
22
+ export const IconComponent: React.FC<IconProps> = ({ name, style, variants, renderEmptySpace, ...otherProps }) => {
23
+ const { Theme, logger } = useCodeleapContext()
24
+
25
+ const variantStyles = useDefaultComponentStyle('Icon', {
26
+ variants,
27
+ transform: StyleSheet.flatten,
28
+ styles: {
29
+ icon: style,
30
+ },
31
+ rootElement: 'icon',
32
+ })
33
+
34
+ if (!name) {
35
+ return renderEmptySpace ? <View style={variantStyles.icon}/> : null
36
+ }
37
+
38
+ const Component = Theme?.icons?.[name]
39
+
40
+ if (!Component) {
41
+ logger.warn(
42
+ `Icon: No icon found in theme for name "${name}".`,
43
+ { props: { style, name, variants, variantStyles }},
44
+ 'Component',
45
+ )
46
+ return null
47
+ }
48
+ return <Component {...otherProps} style={variantStyles.icon} />
49
+ }
50
+
51
+ function areEqual(prevProps, nextProps) {
52
+ const check = ['name', 'style', 'variants', 'renderEmptySpace']
53
+ const res = arePropsEqual(prevProps, nextProps, { check })
54
+ return res
55
+ }
56
+
57
+ export const Icon = React.memo(IconComponent, areEqual)
58
+
@@ -1,43 +1,59 @@
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'
6
-
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
- }
16
-
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})
28
-
29
- const styles = [variantStyles.wrapper, style]
30
-
31
-
32
- if(fast){
33
- return <FastImage
34
- style={styles}
35
- resizeMode={ FastImage.resizeMode[resizeMode || 'contain']}
36
- {...imageProps}
37
- />
38
- }
39
- return <NativeImage
40
- style={styles}
41
- {...(imageProps as any)}
42
- />
43
- }
1
+ import * as React from 'react'
2
+ import {
3
+ ComponentVariants,
4
+ ImageStyles,
5
+ MobileInputFile,
6
+ useDefaultComponentStyle,
7
+ arePropsEqual,
8
+ } from '@codeleap/common'
9
+ import { ComponentPropsWithoutRef } from 'react'
10
+ import {
11
+ Image as NativeImage,
12
+ ImageStyle,
13
+ StyleProp,
14
+ TextStyle,
15
+ ViewStyle,
16
+ } from 'react-native'
17
+ import { FastImage } from '../modules/fastImage'
18
+
19
+ type NativeImageProps = ComponentPropsWithoutRef<typeof NativeImage>
20
+ export type ImageProps = Omit<NativeImageProps, 'source' | 'style'> & {
21
+ variants?: ComponentVariants<typeof ImageStyles>['variants']
22
+ fast?: boolean
23
+ style?: StyleProp<ImageStyle | TextStyle | ViewStyle>
24
+ source:
25
+ | (NativeImageProps['source'] & {
26
+ priority?: keyof typeof FastImage.priority
27
+ })
28
+ | MobileInputFile
29
+ | string
30
+ resizeMode?: keyof typeof FastImage.resizeMode
31
+ }
32
+
33
+ export const ImageComponent: React.FC<ImageProps> = (props) => {
34
+ const { variants, style, fast = true, resizeMode = 'contain', ...imageProps } = props
35
+
36
+ const variantStyles = useDefaultComponentStyle('Image', { variants })
37
+
38
+ const styles = [variantStyles.wrapper, style]
39
+
40
+ if (fast) {
41
+ return (
42
+ <FastImage
43
+ style={styles}
44
+ resizeMode={FastImage.resizeMode[resizeMode || 'contain']}
45
+ {...imageProps}
46
+ />
47
+ )
48
+ }
49
+ return <NativeImage style={styles} resizeMode={resizeMode} {...(imageProps as any)} />
50
+ }
51
+
52
+ function areEqual(prevProps, nextProps) {
53
+ const check = ['source', 'style', 'variants', 'resizeMode', 'fast']
54
+ const res = arePropsEqual(prevProps, nextProps, { check })
55
+ return res
56
+ }
57
+
58
+ export const Image = React.memo(ImageComponent, areEqual)
59
+
@@ -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
+ )