@codeleap/mobile 1.9.1 → 1.9.4

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 +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 +15 -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 +27 -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 +14 -13
  30. package/dist/components/List.js +79 -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 +13 -12
  69. package/dist/components/Scroll.js +77 -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 +40 -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 +183 -183
  102. package/dist/components/TextInput.js +174 -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 +25 -25
  111. package/dist/components/components.js +37 -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/textInputMask.d.ts +7 -7
  126. package/dist/modules/textInputMask.js +9 -9
  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 +9 -9
  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 +1 -1
  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 +39 -39
  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 +83 -83
  149. package/src/components/Checkbox/styles.ts +72 -72
  150. package/src/components/ContentView.tsx +58 -58
  151. package/src/components/FileInput.tsx +181 -181
  152. package/src/components/Icon.tsx +58 -58
  153. package/src/components/Image.tsx +61 -61
  154. package/src/components/List.tsx +112 -109
  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 +107 -104
  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 -45
  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 +246 -246
  179. package/src/components/Touchable.tsx +64 -64
  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 +7 -7
  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 +9 -9
  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,109 +1,112 @@
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
+ 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
+ refreshing,
47
+ ...props
48
+ } = flatListProps
49
+ const hasRefresh = !!props.onRefresh
50
+ const [refreshingState, setRefreshing] = useState(false)
51
+ const refreshingDisplay = refreshing || refreshingState
52
+
53
+ const timer = React.useRef(null)
54
+ const previousData = usePrevious(changeData)
55
+
56
+ const onRefresh = () => {
57
+ if (timer.current) {
58
+ clearTimeout(timer.current)
59
+ }
60
+
61
+ setRefreshing(true)
62
+
63
+ props.onRefresh()
64
+
65
+ timer.current = setTimeout(() => {
66
+ setRefreshing(false)
67
+ }, refreshTimeout)
68
+ }
69
+ onUpdate(() => {
70
+ if (refreshingDisplay && !deepEqual(previousData, changeData)) {
71
+ setRefreshing(false)
72
+ if (timer.current) {
73
+ clearTimeout(timer.current)
74
+ }
75
+ }
76
+ }, [refreshingDisplay, changeData])
77
+ const { Theme } = useCodeleapContext()
78
+
79
+ const variantStyles = useDefaultComponentStyle('View', {
80
+ variants,
81
+ })
82
+
83
+ const renderSeparator = () => {
84
+ return (
85
+ <View variants={['separator']}></View>
86
+ )
87
+ }
88
+
89
+ const separatorProp = props.separators
90
+ const isEmpty = !props.data || !props.data.length
91
+ const separator = !isEmpty && separatorProp == true && renderSeparator
92
+
93
+ const Component = keyboardAware ? KeyboardAwareFlatList : FlatList
94
+
95
+ return (
96
+ <Component
97
+ style={[Theme.presets.full, style]}
98
+ contentContainerStyle={[variantStyles.wrapper]}
99
+ ref={ref as unknown as FlatList}
100
+ ItemSeparatorComponent={separator}
101
+ refreshControl={
102
+ hasRefresh && (
103
+ <RefreshControl refreshing={refreshingDisplay} onRefresh={onRefresh} />
104
+ )
105
+ }
106
+ {...props}
107
+ />
108
+ )
109
+ },
110
+ )
111
+
112
+ 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