@codeleap/mobile 1.9.18 → 1.9.21

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/CodeLeap-Mobile-Packages.code-workspace +7 -7
  2. package/dist/components/ActivityIndicator.d.ts +13 -13
  3. package/dist/components/ActivityIndicator.js +54 -54
  4. package/dist/components/ActivityIndicator.js.map +0 -0
  5. package/dist/components/Animated.d.ts +15 -15
  6. package/dist/components/Animated.js +58 -58
  7. package/dist/components/Animated.js.map +0 -0
  8. package/dist/components/Button.d.ts +125 -125
  9. package/dist/components/Button.js +82 -82
  10. package/dist/components/Button.js.map +0 -0
  11. package/dist/components/Checkbox/index.d.ts +15 -15
  12. package/dist/components/Checkbox/index.js +79 -77
  13. package/dist/components/Checkbox/index.js.map +1 -1
  14. package/dist/components/Checkbox/styles.d.ts +55 -55
  15. package/dist/components/Checkbox/styles.js +51 -48
  16. package/dist/components/Checkbox/styles.js.map +1 -1
  17. package/dist/components/ContentView.d.ts +10 -10
  18. package/dist/components/ContentView.js +50 -50
  19. package/dist/components/ContentView.js.map +0 -0
  20. package/dist/components/FileInput.d.ts +31 -28
  21. package/dist/components/FileInput.js +230 -195
  22. package/dist/components/FileInput.js.map +1 -1
  23. package/dist/components/Icon.d.ts +12 -12
  24. package/dist/components/Icon.js +70 -70
  25. package/dist/components/Icon.js.map +0 -0
  26. package/dist/components/Image.d.ts +18 -18
  27. package/dist/components/Image.js +59 -59
  28. package/dist/components/Image.js.map +0 -0
  29. package/dist/components/List.d.ts +14 -14
  30. package/dist/components/List.js +83 -83
  31. package/dist/components/List.js.map +0 -0
  32. package/dist/components/Modal/index.d.ts +26 -26
  33. package/dist/components/Modal/index.js +112 -112
  34. package/dist/components/Modal/index.js.map +0 -0
  35. package/dist/components/Modal/styles.d.ts +69 -69
  36. package/dist/components/Modal/styles.js +64 -64
  37. package/dist/components/Modal/styles.js.map +0 -0
  38. package/dist/components/Navigation/Navigation.d.ts +3 -3
  39. package/dist/components/Navigation/Navigation.js +87 -87
  40. package/dist/components/Navigation/Navigation.js.map +0 -0
  41. package/dist/components/Navigation/constants.d.ts +5 -5
  42. package/dist/components/Navigation/constants.js +10 -10
  43. package/dist/components/Navigation/constants.js.map +0 -0
  44. package/dist/components/Navigation/index.d.ts +3 -3
  45. package/dist/components/Navigation/index.js +19 -19
  46. package/dist/components/Navigation/index.js.map +0 -0
  47. package/dist/components/Navigation/types.d.ts +26 -26
  48. package/dist/components/Navigation/types.js +7 -7
  49. package/dist/components/Navigation/types.js.map +0 -0
  50. package/dist/components/Navigation/utils.d.ts +3 -3
  51. package/dist/components/Navigation/utils.js +69 -69
  52. package/dist/components/Navigation/utils.js.map +0 -0
  53. package/dist/components/Overlay.d.ts +16 -16
  54. package/dist/components/Overlay.js +69 -69
  55. package/dist/components/Overlay.js.map +0 -0
  56. package/dist/components/Pager/index.d.ts +20 -20
  57. package/dist/components/Pager/index.js +167 -167
  58. package/dist/components/Pager/index.js.map +0 -0
  59. package/dist/components/Pager/styles.d.ts +54 -54
  60. package/dist/components/Pager/styles.js +43 -43
  61. package/dist/components/Pager/styles.js.map +0 -0
  62. package/dist/components/RadioInput/index.d.ts +26 -26
  63. package/dist/components/RadioInput/index.js +72 -72
  64. package/dist/components/RadioInput/index.js.map +0 -0
  65. package/dist/components/RadioInput/styles.d.ts +57 -57
  66. package/dist/components/RadioInput/styles.js +44 -44
  67. package/dist/components/RadioInput/styles.js.map +0 -0
  68. package/dist/components/Scroll.d.ts +13 -13
  69. package/dist/components/Scroll.js +81 -81
  70. package/dist/components/Scroll.js.map +0 -0
  71. package/dist/components/Sections.d.ts +11 -11
  72. package/dist/components/Sections.js +80 -80
  73. package/dist/components/Sections.js.map +0 -0
  74. package/dist/components/Select/index.d.ts +5 -5
  75. package/dist/components/Select/index.js +150 -150
  76. package/dist/components/Select/index.js.map +0 -0
  77. package/dist/components/Select/styles.d.ts +9 -9
  78. package/dist/components/Select/styles.js +56 -56
  79. package/dist/components/Select/styles.js.map +0 -0
  80. package/dist/components/Select/types.d.ts +40 -40
  81. package/dist/components/Select/types.js +2 -2
  82. package/dist/components/Select/types.js.map +0 -0
  83. package/dist/components/Slider/Mark.d.ts +3 -3
  84. package/dist/components/Slider/Mark.js +31 -31
  85. package/dist/components/Slider/Mark.js.map +0 -0
  86. package/dist/components/Slider/Thumb.d.ts +7 -7
  87. package/dist/components/Slider/Thumb.js +29 -29
  88. package/dist/components/Slider/Thumb.js.map +0 -0
  89. package/dist/components/Slider/index.d.ts +3 -3
  90. package/dist/components/Slider/index.js +97 -97
  91. package/dist/components/Slider/index.js.map +0 -0
  92. package/dist/components/Slider/types.d.ts +25 -25
  93. package/dist/components/Slider/types.js +2 -2
  94. package/dist/components/Slider/types.js.map +0 -0
  95. package/dist/components/Switch.d.ts +13 -13
  96. package/dist/components/Switch.js +75 -75
  97. package/dist/components/Switch.js.map +0 -0
  98. package/dist/components/Text.d.ts +12 -12
  99. package/dist/components/Text.js +52 -52
  100. package/dist/components/Text.js.map +0 -0
  101. package/dist/components/TextInput.d.ts +183 -183
  102. package/dist/components/TextInput.js +180 -178
  103. package/dist/components/TextInput.js.map +1 -1
  104. package/dist/components/Touchable.d.ts +14 -14
  105. package/dist/components/Touchable.js +61 -61
  106. package/dist/components/Touchable.js.map +1 -1
  107. package/dist/components/View.d.ts +120 -120
  108. package/dist/components/View.js +54 -54
  109. package/dist/components/View.js.map +0 -0
  110. package/dist/components/components.d.ts +25 -25
  111. package/dist/components/components.js +41 -41
  112. package/dist/components/components.js.map +0 -0
  113. package/dist/index.d.ts +5 -5
  114. package/dist/index.js +28 -28
  115. package/dist/index.js.map +0 -0
  116. package/dist/modules/documentPicker.d.ts +3 -3
  117. package/dist/modules/documentPicker.js +11 -11
  118. package/dist/modules/documentPicker.js.map +0 -0
  119. package/dist/modules/fastImage.d.ts +1 -1
  120. package/dist/modules/fastImage.js +9 -9
  121. package/dist/modules/fastImage.js.map +0 -0
  122. package/dist/modules/reactNavigation.d.ts +3 -3
  123. package/dist/modules/reactNavigation.js +10 -10
  124. package/dist/modules/reactNavigation.js.map +0 -0
  125. package/dist/modules/textInputMask.d.ts +12 -12
  126. package/dist/modules/textInputMask.js +7 -7
  127. package/dist/modules/types/fileTypes.d.ts +138 -138
  128. package/dist/modules/types/fileTypes.js +2 -2
  129. package/dist/modules/types/fileTypes.js.map +0 -0
  130. package/dist/modules/types/textInputMask.d.ts +12 -12
  131. package/dist/modules/types/textInputMask.js +2 -2
  132. package/dist/types/utility.d.ts +2 -2
  133. package/dist/types/utility.js +2 -2
  134. package/dist/types/utility.js.map +0 -0
  135. package/dist/utils/OSAlert.d.ts +31 -31
  136. package/dist/utils/OSAlert.js +141 -141
  137. package/dist/utils/OSAlert.js.map +0 -0
  138. package/dist/utils/misc.d.ts +2 -2
  139. package/dist/utils/misc.js +25 -25
  140. package/dist/utils/misc.js.map +0 -0
  141. package/dist/utils/styles.d.ts +1 -1
  142. package/dist/utils/styles.js +12 -12
  143. package/dist/utils/styles.js.map +0 -0
  144. package/package.json +40 -40
  145. package/src/components/ActivityIndicator.tsx +46 -46
  146. package/src/components/Animated.tsx +34 -34
  147. package/src/components/Button.tsx +95 -95
  148. package/src/components/Checkbox/index.tsx +85 -85
  149. package/src/components/Checkbox/styles.ts +76 -76
  150. package/src/components/ContentView.tsx +58 -58
  151. package/src/components/FileInput.tsx +230 -229
  152. package/src/components/Icon.tsx +58 -58
  153. package/src/components/Image.tsx +61 -61
  154. package/src/components/List.tsx +111 -111
  155. package/src/components/Modal/index.tsx +161 -161
  156. package/src/components/Modal/styles.ts +133 -133
  157. package/src/components/Navigation/Navigation.tsx +58 -58
  158. package/src/components/Navigation/constants.ts +8 -8
  159. package/src/components/Navigation/index.tsx +3 -3
  160. package/src/components/Navigation/types.ts +35 -35
  161. package/src/components/Navigation/utils.tsx +59 -59
  162. package/src/components/Overlay.tsx +77 -77
  163. package/src/components/Pager/index.tsx +242 -242
  164. package/src/components/Pager/styles.ts +51 -51
  165. package/src/components/RadioInput/index.tsx +101 -101
  166. package/src/components/RadioInput/styles.ts +67 -67
  167. package/src/components/Scroll.tsx +106 -106
  168. package/src/components/Sections.tsx +101 -101
  169. package/src/components/Select/index.tsx +195 -195
  170. package/src/components/Select/styles.ts +81 -81
  171. package/src/components/Select/types.ts +46 -46
  172. package/src/components/Slider/Mark.tsx +46 -46
  173. package/src/components/Slider/Thumb.tsx +29 -29
  174. package/src/components/Slider/index.tsx +123 -123
  175. package/src/components/Slider/types.ts +25 -25
  176. package/src/components/Switch.tsx +81 -81
  177. package/src/components/Text.tsx +30 -30
  178. package/src/components/TextInput.tsx +247 -245
  179. package/src/components/Touchable.tsx +65 -67
  180. package/src/components/View.tsx +46 -46
  181. package/src/components/components.ts +26 -26
  182. package/src/index.ts +6 -6
  183. package/src/modules/documentPicker.ts +7 -7
  184. package/src/modules/fastImage.ts +2 -2
  185. package/src/modules/index.d.ts +496 -496
  186. package/src/modules/reactNavigation.ts +4 -4
  187. package/src/modules/textInputMask.ts +9 -9
  188. package/src/modules/types/documentPicker.d.ts +215 -215
  189. package/src/modules/types/fileTypes.ts +138 -138
  190. package/src/modules/types/textInputMask.ts +13 -13
  191. package/src/types/utility.ts +3 -3
  192. package/src/utils/OSAlert.ts +180 -180
  193. package/src/utils/misc.ts +24 -24
  194. package/src/utils/styles.ts +14 -14
@@ -1,61 +1,61 @@
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
- // @ts-ignore
45
- tintColor={style?.tintColor}
46
- resizeMode={FastImage.resizeMode[resizeMode || 'contain']}
47
- {...imageProps}
48
- />
49
- )
50
- }
51
- return <NativeImage style={styles} resizeMode={resizeMode} {...(imageProps as any)} />
52
- }
53
-
54
- function areEqual(prevProps, nextProps) {
55
- const check = ['source', 'style', 'variants', 'resizeMode', 'fast']
56
- const res = arePropsEqual(prevProps, nextProps, { check })
57
- return res
58
- }
59
-
60
- export const Image = React.memo(ImageComponent, areEqual)
61
-
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
+ // @ts-ignore
45
+ tintColor={style?.tintColor}
46
+ resizeMode={FastImage.resizeMode[resizeMode || 'contain']}
47
+ {...imageProps}
48
+ />
49
+ )
50
+ }
51
+ return <NativeImage style={styles} resizeMode={resizeMode} {...(imageProps as any)} />
52
+ }
53
+
54
+ function areEqual(prevProps, nextProps) {
55
+ const check = ['source', 'style', 'variants', 'resizeMode', 'fast']
56
+ const res = arePropsEqual(prevProps, nextProps, { check })
57
+ return res
58
+ }
59
+
60
+ export const Image = React.memo(ImageComponent, areEqual)
61
+
@@ -1,111 +1,111 @@
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
-
12
- KeyboardAwareFlatList as KBDView,
13
- // @ts-ignore
14
- } from 'react-native-keyboard-aware-scroll-view'
15
-
16
- import { RefreshControl, FlatList } from 'react-native'
17
- import { View, ViewProps } from './View'
18
-
19
- type RNFlatListProps<T = any> = FlatList<T>['props']
20
- export type FlatListProps<T = any> = RNFlatListProps<T> &
21
- ViewProps & {
22
- onRefresh?: () => void
23
- refreshTimeout?: number
24
- changeData?: any
25
- separators?: boolean
26
- refreshing?: boolean
27
- keyboardAware?: boolean
28
- }
29
-
30
- const KeyboardAwareFlatList =
31
- KBDView as unknown as React.ForwardRefExoticComponent<
32
- ViewProps & {
33
- refreshControl?: JSX.Element
34
- ref?: FlatList
35
- }
36
- >
37
-
38
- const ListCP = forwardRef<FlatList, FlatListProps>(
39
- (flatListProps, ref) => {
40
- const {
41
- variants = [],
42
- style,
43
- refreshTimeout = 3000,
44
- changeData,
45
- keyboardAware = true,
46
- ...props
47
- } = flatListProps
48
- const hasRefresh = !!props.onRefresh
49
- const [refreshingState, setRefreshing] = useState(false)
50
- const refreshingDisplay = props.refreshing !== undefined ? props.refreshing : refreshingState
51
-
52
- const timer = React.useRef(null)
53
- const previousData = usePrevious(changeData)
54
-
55
- const onRefresh = () => {
56
- if (timer.current) {
57
- clearTimeout(timer.current)
58
- }
59
-
60
- setRefreshing(true)
61
-
62
- props.onRefresh()
63
-
64
- timer.current = setTimeout(() => {
65
- setRefreshing(false)
66
- }, refreshTimeout)
67
- }
68
- onUpdate(() => {
69
- if (refreshingDisplay && !deepEqual(previousData, changeData)) {
70
- setRefreshing(false)
71
- if (timer.current) {
72
- clearTimeout(timer.current)
73
- }
74
- }
75
- }, [refreshingDisplay, changeData])
76
- const { Theme } = useCodeleapContext()
77
-
78
- const variantStyles = useDefaultComponentStyle('View', {
79
- variants,
80
- })
81
-
82
- const renderSeparator = () => {
83
- return (
84
- <View variants={['separator']}></View>
85
- )
86
- }
87
-
88
- const separatorProp = props.separators
89
- const isEmpty = !props.data || !props.data.length
90
- const separator = !isEmpty && separatorProp == true && renderSeparator
91
-
92
- const Component = keyboardAware ? KeyboardAwareFlatList : FlatList
93
-
94
- return (
95
- <Component
96
- style={[Theme.presets.full, style]}
97
- contentContainerStyle={[variantStyles.wrapper]}
98
- ref={ref as unknown as FlatList}
99
- ItemSeparatorComponent={separator}
100
- refreshControl={
101
- hasRefresh && (
102
- <RefreshControl refreshing={refreshingDisplay} onRefresh={onRefresh} />
103
- )
104
- }
105
- {...props}
106
- />
107
- )
108
- },
109
- )
110
-
111
- export const List = ListCP as (<T = any>(props: FlatListProps<T>) => JSX.Element)
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
+
12
+ KeyboardAwareFlatList as KBDView,
13
+ // @ts-ignore
14
+ } from 'react-native-keyboard-aware-scroll-view'
15
+
16
+ import { RefreshControl, FlatList } from 'react-native'
17
+ import { View, ViewProps } from './View'
18
+
19
+ type RNFlatListProps<T = any> = FlatList<T>['props']
20
+ export type FlatListProps<T = any> = RNFlatListProps<T> &
21
+ ViewProps & {
22
+ onRefresh?: () => void
23
+ refreshTimeout?: number
24
+ changeData?: any
25
+ separators?: boolean
26
+ refreshing?: boolean
27
+ keyboardAware?: boolean
28
+ }
29
+
30
+ const KeyboardAwareFlatList =
31
+ KBDView as unknown as React.ForwardRefExoticComponent<
32
+ ViewProps & {
33
+ refreshControl?: JSX.Element
34
+ ref?: FlatList
35
+ }
36
+ >
37
+
38
+ const ListCP = forwardRef<FlatList, FlatListProps>(
39
+ (flatListProps, ref) => {
40
+ const {
41
+ variants = [],
42
+ style,
43
+ refreshTimeout = 3000,
44
+ changeData,
45
+ keyboardAware = true,
46
+ ...props
47
+ } = flatListProps
48
+ const hasRefresh = !!props.onRefresh
49
+ const [refreshingState, setRefreshing] = useState(false)
50
+ const refreshingDisplay = props.refreshing !== undefined ? props.refreshing : refreshingState
51
+
52
+ const timer = React.useRef(null)
53
+ const previousData = usePrevious(changeData)
54
+
55
+ const onRefresh = () => {
56
+ if (timer.current) {
57
+ clearTimeout(timer.current)
58
+ }
59
+
60
+ setRefreshing(true)
61
+
62
+ props.onRefresh()
63
+
64
+ timer.current = setTimeout(() => {
65
+ setRefreshing(false)
66
+ }, refreshTimeout)
67
+ }
68
+ onUpdate(() => {
69
+ if (refreshingDisplay && !deepEqual(previousData, changeData)) {
70
+ setRefreshing(false)
71
+ if (timer.current) {
72
+ clearTimeout(timer.current)
73
+ }
74
+ }
75
+ }, [refreshingDisplay, changeData])
76
+ const { Theme } = useCodeleapContext()
77
+
78
+ const variantStyles = useDefaultComponentStyle('View', {
79
+ variants,
80
+ })
81
+
82
+ const renderSeparator = () => {
83
+ return (
84
+ <View variants={['separator']}></View>
85
+ )
86
+ }
87
+
88
+ const separatorProp = props.separators
89
+ const isEmpty = !props.data || !props.data.length
90
+ const separator = !isEmpty && separatorProp == true && renderSeparator
91
+
92
+ const Component = keyboardAware ? KeyboardAwareFlatList : FlatList
93
+
94
+ return (
95
+ <Component
96
+ style={[Theme.presets.full, style]}
97
+ contentContainerStyle={[variantStyles.wrapper]}
98
+ ref={ref as unknown as FlatList}
99
+ ItemSeparatorComponent={separator}
100
+ refreshControl={
101
+ hasRefresh && (
102
+ <RefreshControl refreshing={refreshingDisplay} onRefresh={onRefresh} />
103
+ )
104
+ }
105
+ {...props}
106
+ />
107
+ )
108
+ },
109
+ )
110
+
111
+ export const List = ListCP as (<T = any>(props: FlatListProps<T>) => JSX.Element)
@@ -1,161 +1,161 @@
1
- import * as React from 'react'
2
- import { View, ViewProps, AnimatedView } from '../View'
3
- import { Button, ButtonProps } from '../Button'
4
- import { Scroll } from '../Scroll'
5
- import {
6
- capitalize,
7
- ComponentVariants,
8
- IconPlaceholder,
9
- onUpdate,
10
- useDefaultComponentStyle,
11
- useCodeleapContext,
12
- } from '@codeleap/common'
13
- import {
14
- MobileModalComposition,
15
- MobileModalStyles,
16
- MobileModalParts,
17
- } from './styles'
18
- import { StyleSheet } from 'react-native'
19
- import { StylesOf } from '../../types/utility'
20
-
21
- import { Touchable } from '../Touchable'
22
- import { Text } from '../Text'
23
- import { Animated } from '../Animated'
24
-
25
- export * from './styles'
26
-
27
- export type ModalProps = Omit<ViewProps, 'variants' | 'styles'> & {
28
- variants?: ComponentVariants<typeof MobileModalStyles>['variants']
29
- styles?: StylesOf<MobileModalComposition>
30
- dismissOnBackdrop?: boolean
31
- buttonProps?: ButtonProps
32
- accessible?: boolean
33
- showClose?: boolean
34
- closable?: boolean
35
- footer?: React.ReactNode
36
- title?: React.ReactNode
37
- debugName?: string
38
- closeIconName?: IconPlaceholder
39
- visible: boolean
40
- toggle?: () => void
41
- scroll?: boolean
42
- keyboardAware?: boolean
43
- }
44
-
45
- export const Modal: React.FC<ModalProps> = (modalProps) => {
46
- const {
47
- variants = [],
48
- styles = {},
49
- visible,
50
- showClose,
51
- closable = true,
52
- title,
53
- footer,
54
- children,
55
- toggle = () => null,
56
- dismissOnBackdrop = true,
57
- closeIconName = 'close',
58
- debugName,
59
- scroll = true,
60
- keyboardAware = true,
61
- ...props
62
- } = modalProps
63
-
64
- const variantStyles = useDefaultComponentStyle('Modal', {
65
- variants: variants as any,
66
- transform: StyleSheet.flatten,
67
- styles,
68
- }) as ModalProps['styles']
69
-
70
- function getStyles(key: MobileModalParts) {
71
- const s = [
72
- variantStyles[key],
73
- styles[key],
74
- visible ? variantStyles[key + ':visible'] : {},
75
- visible ? styles[key + ':visible'] : {},
76
- ]
77
-
78
- return s
79
- }
80
-
81
- const buttonStyles = React.useMemo(() => {
82
- const buttonEntries = {}
83
-
84
- for (const [key, style] of Object.entries(variantStyles)) {
85
- if (key.startsWith('closeButton')) {
86
- buttonEntries[capitalize(key.replace('closeButton', ''), true)] = style
87
- }
88
- }
89
- return buttonEntries
90
- }, [variantStyles])
91
-
92
- const boxAnimation = {
93
- hidden: {
94
- ...variantStyles['box:pose'],
95
- ...styles['box:pose'],
96
- },
97
- visible: {
98
- ...variantStyles['box:pose:visible'],
99
- ...styles['box:pose:visible'],
100
- },
101
- }
102
-
103
- return (
104
- <View
105
- style={getStyles('wrapper')}
106
- pointerEvents={visible ? 'auto' : 'none'}
107
- >
108
- <AnimatedView style={getStyles('overlay')} transition={'opacity'} />
109
- <Scroll
110
- style={getStyles('innerWrapper')}
111
- contentContainerStyle={getStyles('innerWrapperScroll')}
112
- scrollEnabled={scroll}
113
- keyboardAware={keyboardAware}
114
- >
115
- {dismissOnBackdrop && (
116
- <Touchable
117
- debugName={`${debugName} modal backdrop`}
118
- activeOpacity={1}
119
- onPress={() => toggle()}
120
- style={getStyles('touchableBackdrop')}
121
- />
122
- )}
123
- <Animated
124
- component='View'
125
- config={boxAnimation}
126
- pose={visible ? 'visible' : 'hidden'}
127
- style={getStyles('box')}
128
- >
129
- {(title || showClose) && (
130
- <View style={getStyles('header')}>
131
- {typeof title === 'string' ? (
132
- <Text text={title} style={getStyles('title')} />
133
- ) : (
134
- title
135
- )}
136
-
137
- {showClose && closable && (
138
- <Button
139
- debugName={`${debugName} modal close button`}
140
- icon={closeIconName as IconPlaceholder}
141
- variants={['icon']}
142
- onPress={toggle}
143
- styles={buttonStyles}
144
- />
145
- )}
146
- </View>
147
- )}
148
-
149
- <View style={getStyles('body')}>{children}</View>
150
- {footer && (
151
- <View style={getStyles('footer')}>
152
- {typeof footer === 'string' ? <Text text={footer} /> : footer}
153
- </View>
154
- )}
155
- </Animated>
156
- </Scroll>
157
- </View>
158
- )
159
- }
160
-
161
- export default Modal
1
+ import * as React from 'react'
2
+ import { View, ViewProps, AnimatedView } from '../View'
3
+ import { Button, ButtonProps } from '../Button'
4
+ import { Scroll } from '../Scroll'
5
+ import {
6
+ capitalize,
7
+ ComponentVariants,
8
+ IconPlaceholder,
9
+ onUpdate,
10
+ useDefaultComponentStyle,
11
+ useCodeleapContext,
12
+ } from '@codeleap/common'
13
+ import {
14
+ MobileModalComposition,
15
+ MobileModalStyles,
16
+ MobileModalParts,
17
+ } from './styles'
18
+ import { StyleSheet } from 'react-native'
19
+ import { StylesOf } from '../../types/utility'
20
+
21
+ import { Touchable } from '../Touchable'
22
+ import { Text } from '../Text'
23
+ import { Animated } from '../Animated'
24
+
25
+ export * from './styles'
26
+
27
+ export type ModalProps = Omit<ViewProps, 'variants' | 'styles'> & {
28
+ variants?: ComponentVariants<typeof MobileModalStyles>['variants']
29
+ styles?: StylesOf<MobileModalComposition>
30
+ dismissOnBackdrop?: boolean
31
+ buttonProps?: ButtonProps
32
+ accessible?: boolean
33
+ showClose?: boolean
34
+ closable?: boolean
35
+ footer?: React.ReactNode
36
+ title?: React.ReactNode
37
+ debugName?: string
38
+ closeIconName?: IconPlaceholder
39
+ visible: boolean
40
+ toggle?: () => void
41
+ scroll?: boolean
42
+ keyboardAware?: boolean
43
+ }
44
+
45
+ export const Modal: React.FC<ModalProps> = (modalProps) => {
46
+ const {
47
+ variants = [],
48
+ styles = {},
49
+ visible,
50
+ showClose,
51
+ closable = true,
52
+ title,
53
+ footer,
54
+ children,
55
+ toggle = () => null,
56
+ dismissOnBackdrop = true,
57
+ closeIconName = 'close',
58
+ debugName,
59
+ scroll = true,
60
+ keyboardAware = true,
61
+ ...props
62
+ } = modalProps
63
+
64
+ const variantStyles = useDefaultComponentStyle('Modal', {
65
+ variants: variants as any,
66
+ transform: StyleSheet.flatten,
67
+ styles,
68
+ }) as ModalProps['styles']
69
+
70
+ function getStyles(key: MobileModalParts) {
71
+ const s = [
72
+ variantStyles[key],
73
+ styles[key],
74
+ visible ? variantStyles[key + ':visible'] : {},
75
+ visible ? styles[key + ':visible'] : {},
76
+ ]
77
+
78
+ return s
79
+ }
80
+
81
+ const buttonStyles = React.useMemo(() => {
82
+ const buttonEntries = {}
83
+
84
+ for (const [key, style] of Object.entries(variantStyles)) {
85
+ if (key.startsWith('closeButton')) {
86
+ buttonEntries[capitalize(key.replace('closeButton', ''), true)] = style
87
+ }
88
+ }
89
+ return buttonEntries
90
+ }, [variantStyles])
91
+
92
+ const boxAnimation = {
93
+ hidden: {
94
+ ...variantStyles['box:pose'],
95
+ ...styles['box:pose'],
96
+ },
97
+ visible: {
98
+ ...variantStyles['box:pose:visible'],
99
+ ...styles['box:pose:visible'],
100
+ },
101
+ }
102
+
103
+ return (
104
+ <View
105
+ style={getStyles('wrapper')}
106
+ pointerEvents={visible ? 'auto' : 'none'}
107
+ >
108
+ <AnimatedView style={getStyles('overlay')} transition={'opacity'} />
109
+ <Scroll
110
+ style={getStyles('innerWrapper')}
111
+ contentContainerStyle={getStyles('innerWrapperScroll')}
112
+ scrollEnabled={scroll}
113
+ keyboardAware={keyboardAware}
114
+ >
115
+ {dismissOnBackdrop && (
116
+ <Touchable
117
+ debugName={`${debugName} modal backdrop`}
118
+ activeOpacity={1}
119
+ onPress={() => toggle()}
120
+ style={getStyles('touchableBackdrop')}
121
+ />
122
+ )}
123
+ <Animated
124
+ component='View'
125
+ config={boxAnimation}
126
+ pose={visible ? 'visible' : 'hidden'}
127
+ style={getStyles('box')}
128
+ >
129
+ {(title || showClose) && (
130
+ <View style={getStyles('header')}>
131
+ {typeof title === 'string' ? (
132
+ <Text text={title} style={getStyles('title')} />
133
+ ) : (
134
+ title
135
+ )}
136
+
137
+ {showClose && closable && (
138
+ <Button
139
+ debugName={`${debugName} modal close button`}
140
+ icon={closeIconName as IconPlaceholder}
141
+ variants={['icon']}
142
+ onPress={toggle}
143
+ styles={buttonStyles}
144
+ />
145
+ )}
146
+ </View>
147
+ )}
148
+
149
+ <View style={getStyles('body')}>{children}</View>
150
+ {footer && (
151
+ <View style={getStyles('footer')}>
152
+ {typeof footer === 'string' ? <Text text={footer} /> : footer}
153
+ </View>
154
+ )}
155
+ </Animated>
156
+ </Scroll>
157
+ </View>
158
+ )
159
+ }
160
+
161
+ export default Modal