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