@codeleap/mobile 1.9.1 → 1.9.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 (196) 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 +50 -54
  4. package/dist/components/ActivityIndicator.js.map +1 -1
  5. package/dist/components/Animated.d.ts +15 -15
  6. package/dist/components/Animated.js +54 -58
  7. package/dist/components/Animated.js.map +1 -1
  8. package/dist/components/Button.d.ts +125 -125
  9. package/dist/components/Button.js +78 -82
  10. package/dist/components/Button.js.map +1 -1
  11. package/dist/components/Checkbox/index.d.ts +14 -15
  12. package/dist/components/Checkbox/index.js +73 -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 +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 -27
  21. package/dist/components/FileInput.js +174 -178
  22. package/dist/components/FileInput.js.map +1 -1
  23. package/dist/components/Icon.d.ts +12 -12
  24. package/dist/components/Icon.js +66 -70
  25. package/dist/components/Icon.js.map +1 -1
  26. package/dist/components/Image.d.ts +18 -18
  27. package/dist/components/Image.js +55 -59
  28. package/dist/components/Image.js.map +1 -1
  29. package/dist/components/List.d.ts +13 -13
  30. package/dist/components/List.js +78 -82
  31. package/dist/components/List.js.map +1 -1
  32. package/dist/components/Modal/index.d.ts +26 -26
  33. package/dist/components/Modal/index.js +108 -112
  34. package/dist/components/Modal/index.js.map +1 -1
  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 +83 -87
  40. package/dist/components/Navigation/Navigation.js.map +1 -1
  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 +15 -19
  46. package/dist/components/Navigation/index.js.map +1 -1
  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 +65 -69
  55. package/dist/components/Overlay.js.map +1 -1
  56. package/dist/components/Pager/index.d.ts +20 -20
  57. package/dist/components/Pager/index.js +163 -167
  58. package/dist/components/Pager/index.js.map +1 -1
  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 +68 -72
  64. package/dist/components/RadioInput/index.js.map +1 -1
  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 +12 -12
  69. package/dist/components/Scroll.js +76 -80
  70. package/dist/components/Scroll.js.map +1 -1
  71. package/dist/components/Sections.d.ts +11 -11
  72. package/dist/components/Sections.js +76 -80
  73. package/dist/components/Sections.js.map +1 -1
  74. package/dist/components/Select/index.d.ts +5 -5
  75. package/dist/components/Select/index.js +146 -150
  76. package/dist/components/Select/index.js.map +1 -1
  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 +39 -39
  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 +93 -97
  91. package/dist/components/Slider/index.js.map +1 -1
  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 +71 -75
  97. package/dist/components/Switch.js.map +1 -1
  98. package/dist/components/Text.d.ts +12 -12
  99. package/dist/components/Text.js +48 -52
  100. package/dist/components/Text.js.map +1 -1
  101. package/dist/components/TextInput.d.ts +171 -183
  102. package/dist/components/TextInput.js +157 -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 +57 -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 +50 -54
  109. package/dist/components/View.js.map +1 -1
  110. package/dist/components/components.d.ts +24 -25
  111. package/dist/components/components.js +36 -41
  112. package/dist/components/components.js.map +1 -1
  113. package/dist/index.d.ts +5 -5
  114. package/dist/index.js +24 -28
  115. package/dist/index.js.map +1 -1
  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/types/fileTypes.d.ts +138 -138
  126. package/dist/modules/types/fileTypes.js +2 -2
  127. package/dist/modules/types/fileTypes.js.map +0 -0
  128. package/dist/types/utility.d.ts +2 -2
  129. package/dist/types/utility.js +2 -2
  130. package/dist/types/utility.js.map +0 -0
  131. package/dist/utils/OSAlert.d.ts +31 -31
  132. package/dist/utils/OSAlert.js +141 -141
  133. package/dist/utils/OSAlert.js.map +1 -1
  134. package/dist/utils/misc.d.ts +2 -2
  135. package/dist/utils/misc.js +25 -25
  136. package/dist/utils/misc.js.map +0 -0
  137. package/dist/utils/styles.d.ts +1 -1
  138. package/dist/utils/styles.js +12 -12
  139. package/dist/utils/styles.js.map +0 -0
  140. package/package.json +39 -39
  141. package/src/components/ActivityIndicator.tsx +46 -46
  142. package/src/components/Animated.tsx +34 -34
  143. package/src/components/Button.tsx +95 -95
  144. package/src/components/Checkbox/index.tsx +83 -83
  145. package/src/components/Checkbox/styles.ts +72 -72
  146. package/src/components/ContentView.tsx +58 -58
  147. package/src/components/FileInput.tsx +181 -181
  148. package/src/components/Icon.tsx +58 -58
  149. package/src/components/Image.tsx +61 -61
  150. package/src/components/List.tsx +109 -109
  151. package/src/components/Modal/index.tsx +161 -161
  152. package/src/components/Modal/styles.ts +133 -133
  153. package/src/components/Navigation/Navigation.tsx +58 -58
  154. package/src/components/Navigation/constants.ts +8 -8
  155. package/src/components/Navigation/index.tsx +3 -3
  156. package/src/components/Navigation/types.ts +35 -35
  157. package/src/components/Navigation/utils.tsx +59 -59
  158. package/src/components/Overlay.tsx +77 -77
  159. package/src/components/Pager/index.tsx +242 -242
  160. package/src/components/Pager/styles.ts +51 -51
  161. package/src/components/RadioInput/index.tsx +101 -101
  162. package/src/components/RadioInput/styles.ts +67 -67
  163. package/src/components/Scroll.tsx +104 -104
  164. package/src/components/Sections.tsx +101 -101
  165. package/src/components/Select/index.tsx +195 -195
  166. package/src/components/Select/styles.ts +81 -81
  167. package/src/components/Select/types.ts +45 -45
  168. package/src/components/Slider/Mark.tsx +46 -46
  169. package/src/components/Slider/Thumb.tsx +29 -29
  170. package/src/components/Slider/index.tsx +123 -123
  171. package/src/components/Slider/types.ts +25 -25
  172. package/src/components/Switch.tsx +81 -81
  173. package/src/components/Text.tsx +30 -30
  174. package/src/components/TextInput.tsx +246 -246
  175. package/src/components/Touchable.tsx +64 -64
  176. package/src/components/View.tsx +46 -46
  177. package/src/components/components.ts +26 -26
  178. package/src/index.ts +6 -6
  179. package/src/modules/documentPicker.ts +7 -7
  180. package/src/modules/fastImage.ts +2 -2
  181. package/src/modules/index.d.ts +496 -496
  182. package/src/modules/reactNavigation.ts +4 -4
  183. package/src/modules/textInputMask.ts +7 -7
  184. package/src/modules/types/documentPicker.d.ts +215 -215
  185. package/src/modules/types/fileTypes.ts +138 -138
  186. package/src/modules/types/textInputMask.ts +9 -9
  187. package/src/types/utility.ts +3 -3
  188. package/src/utils/OSAlert.ts +180 -180
  189. package/src/utils/misc.ts +24 -24
  190. package/src/utils/styles.ts +14 -14
  191. package/dist/modules/textInputMask.d.ts +0 -7
  192. package/dist/modules/textInputMask.js +0 -10
  193. package/dist/modules/textInputMask.js.map +0 -1
  194. package/dist/modules/types/textInputMask.d.ts +0 -9
  195. package/dist/modules/types/textInputMask.js +0 -3
  196. package/dist/modules/types/textInputMask.js.map +0 -1
@@ -1,109 +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
-
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
+ 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
+ refreshControl={
99
+ hasRefresh && (
100
+ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
101
+ )
102
+ }
103
+ {...props}
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