@codeleap/mobile 1.5.3 → 1.8.1

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 (192) 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 -50
  4. package/dist/components/ActivityIndicator.js.map +1 -1
  5. package/dist/components/Animated.d.ts +15 -15
  6. package/dist/components/Animated.js +58 -54
  7. package/dist/components/Animated.js.map +1 -1
  8. package/dist/components/Button.d.ts +125 -119
  9. package/dist/components/Button.js +82 -77
  10. package/dist/components/Button.js.map +1 -1
  11. package/dist/components/Checkbox/index.d.ts +14 -14
  12. package/dist/components/Checkbox/index.js +77 -73
  13. package/dist/components/Checkbox/index.js.map +1 -1
  14. package/dist/components/Checkbox/styles.d.ts +55 -52
  15. package/dist/components/Checkbox/styles.js +48 -48
  16. package/dist/components/Checkbox/styles.js.map +0 -0
  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 +26 -26
  21. package/dist/components/FileInput.js +178 -174
  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 -66
  25. package/dist/components/Icon.js.map +1 -1
  26. package/dist/components/Icon.js3278065646 +71 -0
  27. package/dist/components/Image.d.ts +18 -18
  28. package/dist/components/Image.js +59 -53
  29. package/dist/components/Image.js.map +1 -1
  30. package/dist/components/List.d.ts +12 -11
  31. package/dist/components/List.js +82 -76
  32. package/dist/components/List.js.map +1 -1
  33. package/dist/components/Modal/index.d.ts +26 -25
  34. package/dist/components/Modal/index.js +112 -108
  35. package/dist/components/Modal/index.js.map +1 -1
  36. package/dist/components/Modal/styles.d.ts +69 -66
  37. package/dist/components/Modal/styles.js +64 -64
  38. package/dist/components/Modal/styles.js.map +0 -0
  39. package/dist/components/Navigation/Navigation.d.ts +2 -3
  40. package/dist/components/Navigation/Navigation.js +87 -83
  41. package/dist/components/Navigation/Navigation.js.map +1 -1
  42. package/dist/components/Navigation/constants.d.ts +5 -5
  43. package/dist/components/Navigation/constants.js +10 -10
  44. package/dist/components/Navigation/constants.js.map +0 -0
  45. package/dist/components/Navigation/index.d.ts +3 -3
  46. package/dist/components/Navigation/index.js +19 -15
  47. package/dist/components/Navigation/index.js.map +1 -1
  48. package/dist/components/Navigation/types.d.ts +26 -26
  49. package/dist/components/Navigation/types.js +7 -7
  50. package/dist/components/Navigation/types.js.map +0 -0
  51. package/dist/components/Navigation/utils.d.ts +3 -3
  52. package/dist/components/Navigation/utils.js +69 -69
  53. package/dist/components/Navigation/utils.js.map +0 -0
  54. package/dist/components/Overlay.d.ts +16 -16
  55. package/dist/components/Overlay.js +69 -65
  56. package/dist/components/Overlay.js.map +1 -1
  57. package/dist/components/Pager/index.d.ts +20 -19
  58. package/dist/components/Pager/index.js +167 -163
  59. package/dist/components/Pager/index.js.map +1 -1
  60. package/dist/components/Pager/styles.d.ts +54 -51
  61. package/dist/components/Pager/styles.js +43 -43
  62. package/dist/components/Pager/styles.js.map +0 -0
  63. package/dist/components/RadioInput/index.d.ts +26 -26
  64. package/dist/components/RadioInput/index.js +72 -68
  65. package/dist/components/RadioInput/index.js.map +1 -1
  66. package/dist/components/RadioInput/styles.d.ts +57 -54
  67. package/dist/components/RadioInput/styles.js +44 -44
  68. package/dist/components/RadioInput/styles.js.map +0 -0
  69. package/dist/components/Scroll.d.ts +12 -11
  70. package/dist/components/Scroll.js +80 -75
  71. package/dist/components/Scroll.js.map +1 -1
  72. package/dist/components/Sections.d.ts +11 -11
  73. package/dist/components/Sections.js +80 -76
  74. package/dist/components/Sections.js.map +1 -1
  75. package/dist/components/Select/index.d.ts +4 -5
  76. package/dist/components/Select/index.js +150 -144
  77. package/dist/components/Select/index.js.map +1 -1
  78. package/dist/components/Select/styles.d.ts +9 -9
  79. package/dist/components/Select/styles.js +56 -56
  80. package/dist/components/Select/styles.js.map +0 -0
  81. package/dist/components/Select/types.d.ts +39 -33
  82. package/dist/components/Select/types.js +2 -2
  83. package/dist/components/Select/types.js.map +0 -0
  84. package/dist/components/Slider/Mark.d.ts +3 -3
  85. package/dist/components/Slider/Mark.js +31 -31
  86. package/dist/components/Slider/Mark.js.map +0 -0
  87. package/dist/components/Slider/Thumb.d.ts +6 -7
  88. package/dist/components/Slider/Thumb.js +29 -29
  89. package/dist/components/Slider/Thumb.js.map +0 -0
  90. package/dist/components/Slider/index.d.ts +3 -3
  91. package/dist/components/Slider/index.js +97 -93
  92. package/dist/components/Slider/index.js.map +1 -1
  93. package/dist/components/Slider/types.d.ts +25 -25
  94. package/dist/components/Slider/types.js +2 -2
  95. package/dist/components/Slider/types.js.map +0 -0
  96. package/dist/components/Switch.d.ts +13 -13
  97. package/dist/components/Switch.js +75 -71
  98. package/dist/components/Switch.js.map +1 -1
  99. package/dist/components/Text.d.ts +12 -12
  100. package/dist/components/Text.js +52 -48
  101. package/dist/components/Text.js.map +1 -1
  102. package/dist/components/TextInput.d.ts +171 -162
  103. package/dist/components/TextInput.js +161 -149
  104. package/dist/components/TextInput.js.map +1 -1
  105. package/dist/components/Touchable.d.ts +14 -14
  106. package/dist/components/Touchable.js +61 -57
  107. package/dist/components/Touchable.js.map +1 -1
  108. package/dist/components/View.d.ts +120 -114
  109. package/dist/components/View.js +54 -50
  110. package/dist/components/View.js.map +1 -1
  111. package/dist/components/components.d.ts +25 -24
  112. package/dist/components/components.js +41 -36
  113. package/dist/components/components.js.map +1 -1
  114. package/dist/index.d.ts +5 -5
  115. package/dist/index.js +28 -24
  116. package/dist/index.js.map +1 -1
  117. package/dist/modules/documentPicker.d.ts +3 -3
  118. package/dist/modules/documentPicker.js +11 -11
  119. package/dist/modules/documentPicker.js.map +0 -0
  120. package/dist/modules/fastImage.d.ts +1 -1
  121. package/dist/modules/fastImage.js +9 -9
  122. package/dist/modules/fastImage.js.map +0 -0
  123. package/dist/modules/reactNavigation.d.ts +3 -3
  124. package/dist/modules/reactNavigation.js +10 -10
  125. package/dist/modules/reactNavigation.js.map +0 -0
  126. package/dist/modules/types/fileTypes.d.ts +138 -138
  127. package/dist/modules/types/fileTypes.js +2 -2
  128. package/dist/modules/types/fileTypes.js.map +0 -0
  129. package/dist/types/utility.d.ts +2 -2
  130. package/dist/types/utility.js +2 -2
  131. package/dist/types/utility.js.map +0 -0
  132. package/dist/utils/OSAlert.d.ts +31 -31
  133. package/dist/utils/OSAlert.js +141 -141
  134. package/dist/utils/OSAlert.js.map +1 -1
  135. package/dist/utils/misc.d.ts +2 -2
  136. package/dist/utils/misc.js +25 -25
  137. package/dist/utils/misc.js.map +0 -0
  138. package/dist/utils/styles.d.ts +1 -1
  139. package/dist/utils/styles.js +12 -12
  140. package/dist/utils/styles.js.map +0 -0
  141. package/package.json +38 -40
  142. package/src/components/ActivityIndicator.tsx +46 -46
  143. package/src/components/Animated.tsx +34 -34
  144. package/src/components/Button.tsx +95 -95
  145. package/src/components/Checkbox/index.tsx +81 -81
  146. package/src/components/Checkbox/styles.ts +72 -72
  147. package/src/components/ContentView.tsx +58 -58
  148. package/src/components/FileInput.tsx +179 -179
  149. package/src/components/Icon.tsx +58 -58
  150. package/src/components/Image.tsx +61 -61
  151. package/src/components/List.tsx +109 -104
  152. package/src/components/Modal/index.tsx +161 -161
  153. package/src/components/Modal/styles.ts +133 -133
  154. package/src/components/Navigation/Navigation.tsx +58 -58
  155. package/src/components/Navigation/constants.ts +8 -8
  156. package/src/components/Navigation/index.tsx +3 -3
  157. package/src/components/Navigation/types.ts +35 -35
  158. package/src/components/Navigation/utils.tsx +59 -59
  159. package/src/components/Overlay.tsx +77 -77
  160. package/src/components/Pager/index.tsx +242 -240
  161. package/src/components/Pager/styles.ts +51 -51
  162. package/src/components/RadioInput/index.tsx +101 -101
  163. package/src/components/RadioInput/styles.ts +67 -67
  164. package/src/components/Scroll.tsx +104 -102
  165. package/src/components/Sections.tsx +101 -100
  166. package/src/components/Select/index.tsx +195 -184
  167. package/src/components/Select/styles.ts +81 -81
  168. package/src/components/Select/types.ts +45 -41
  169. package/src/components/Slider/Mark.tsx +46 -46
  170. package/src/components/Slider/Thumb.tsx +29 -29
  171. package/src/components/Slider/index.tsx +123 -123
  172. package/src/components/Slider/types.ts +25 -25
  173. package/src/components/Switch.tsx +81 -81
  174. package/src/components/Text.tsx +30 -30
  175. package/src/components/TextInput.tsx +216 -211
  176. package/src/components/Touchable.tsx +64 -64
  177. package/src/components/View.tsx +46 -46
  178. package/src/components/components.ts +26 -26
  179. package/src/index.ts +6 -6
  180. package/src/modules/documentPicker.ts +7 -7
  181. package/src/modules/fastImage.ts +2 -2
  182. package/src/modules/index.d.ts +496 -496
  183. package/src/modules/reactNavigation.ts +4 -4
  184. package/src/modules/types/documentPicker.d.ts +215 -215
  185. package/src/modules/types/fileTypes.ts +138 -138
  186. package/src/types/utility.ts +3 -3
  187. package/src/utils/OSAlert.ts +180 -180
  188. package/src/utils/misc.ts +24 -24
  189. package/src/utils/styles.ts +14 -14
  190. package/.eslintignore +0 -2
  191. package/.eslintrc.js +0 -3
  192. package/.vscode/settings.json +0 -11
@@ -1,104 +1,109 @@
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
- keyboardAware?: boolean
24
- }
25
-
26
- const KeyboardAwareFlatList =
27
- KBDView as unknown as React.ForwardRefExoticComponent<
28
- ViewProps & {
29
- refreshControl?: JSX.Element
30
- ref?: FlatList
31
- }
32
- >
33
-
34
- export const List = forwardRef<FlatList, FlatListProps>(
35
- (flatListProps, ref) => {
36
- const {
37
- variants = [],
38
- style,
39
- refreshTimeout = 3000,
40
- changeData,
41
- keyboardAware = true,
42
- ...props
43
- } = flatListProps
44
- const hasRefresh = !!props.onRefresh
45
- const [refreshing, setRefreshing] = useState(false)
46
-
47
- const timer = React.useRef(null)
48
- const previousData = usePrevious(changeData)
49
-
50
- const onRefresh = () => {
51
- if (timer.current) {
52
- clearTimeout(timer.current)
53
- }
54
-
55
- setRefreshing(true)
56
-
57
- props.onRefresh()
58
-
59
- timer.current = setTimeout(() => {
60
- setRefreshing(false)
61
- }, refreshTimeout)
62
- }
63
- onUpdate(() => {
64
- if (refreshing && !deepEqual(previousData, changeData)) {
65
- setRefreshing(false)
66
- if (timer.current) {
67
- clearTimeout(timer.current)
68
- }
69
- }
70
- }, [refreshing, changeData])
71
- const { Theme } = useCodeleapContext()
72
-
73
- const variantStyles = useDefaultComponentStyle('View', {
74
- variants,
75
- })
76
-
77
- const renderSeparator = () => {
78
- return (
79
- <View variants={['separator']}></View>
80
- )
81
- }
82
-
83
- const separatorProp = props.separators
84
- const isEmpty = !props.data || !props.data.length
85
- const separator = !isEmpty && separatorProp == true && renderSeparator
86
-
87
- const Component = keyboardAware ? KeyboardAwareFlatList : FlatList
88
-
89
- return (
90
- <Component
91
- style={[Theme.presets.full, style]}
92
- contentContainerStyle={[variantStyles.wrapper]}
93
- ref={ref as unknown as FlatList}
94
- ItemSeparatorComponent={separator}
95
- {...props}
96
- refreshControl={
97
- hasRefresh && (
98
- <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
99
- )
100
- }
101
- />
102
- )
103
- },
104
- )
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
+ keyboardAware?: boolean
27
+ }
28
+
29
+ const KeyboardAwareFlatList =
30
+ KBDView as unknown as React.ForwardRefExoticComponent<
31
+ ViewProps & {
32
+ refreshControl?: JSX.Element
33
+ ref?: FlatList
34
+ }
35
+ >
36
+
37
+ const ListCP = forwardRef<FlatList, FlatListProps>(
38
+ (flatListProps, ref) => {
39
+ const {
40
+ variants = [],
41
+ style,
42
+ refreshTimeout = 3000,
43
+ changeData,
44
+ keyboardAware = true,
45
+ ...props
46
+ } = flatListProps
47
+ const hasRefresh = !!props.onRefresh
48
+ const [refreshing, setRefreshing] = useState(false)
49
+
50
+ const timer = React.useRef(null)
51
+ const previousData = usePrevious(changeData)
52
+
53
+ const onRefresh = () => {
54
+ if (timer.current) {
55
+ clearTimeout(timer.current)
56
+ }
57
+
58
+ setRefreshing(true)
59
+
60
+ props.onRefresh()
61
+
62
+ timer.current = setTimeout(() => {
63
+ setRefreshing(false)
64
+ }, refreshTimeout)
65
+ }
66
+ onUpdate(() => {
67
+ if (refreshing && !deepEqual(previousData, changeData)) {
68
+ setRefreshing(false)
69
+ if (timer.current) {
70
+ clearTimeout(timer.current)
71
+ }
72
+ }
73
+ }, [refreshing, changeData])
74
+ const { Theme } = useCodeleapContext()
75
+
76
+ const variantStyles = useDefaultComponentStyle('View', {
77
+ variants,
78
+ })
79
+
80
+ const renderSeparator = () => {
81
+ return (
82
+ <View variants={['separator']}></View>
83
+ )
84
+ }
85
+
86
+ const separatorProp = props.separators
87
+ const isEmpty = !props.data || !props.data.length
88
+ const separator = !isEmpty && separatorProp == true && renderSeparator
89
+
90
+ const Component = keyboardAware ? KeyboardAwareFlatList : FlatList
91
+
92
+ return (
93
+ <Component
94
+ style={[Theme.presets.full, style]}
95
+ contentContainerStyle={[variantStyles.wrapper]}
96
+ ref={ref as unknown as FlatList}
97
+ ItemSeparatorComponent={separator}
98
+ {...props}
99
+ refreshControl={
100
+ hasRefresh && (
101
+ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
102
+ )
103
+ }
104
+ />
105
+ )
106
+ },
107
+ )
108
+
109
+ 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