@codeleap/mobile 1.9.24 → 1.9.27

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 (210) hide show
  1. package/CodeLeap-Mobile-Packages.code-workspace +7 -7
  2. package/dist/components/ActivityIndicator.d.ts +13 -13
  3. package/dist/components/ActivityIndicator.js +54 -54
  4. package/dist/components/ActivityIndicator.js.map +0 -0
  5. package/dist/components/Animated.d.ts +123 -15
  6. package/dist/components/Animated.js +58 -58
  7. package/dist/components/Animated.js.map +0 -0
  8. package/dist/components/Button.d.ts +132 -125
  9. package/dist/components/Button.js +93 -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 +79 -77
  13. package/dist/components/Checkbox/index.js.map +1 -1
  14. package/dist/components/Checkbox/styles.d.ts +55 -55
  15. package/dist/components/Checkbox/styles.js +51 -48
  16. package/dist/components/Checkbox/styles.js.map +1 -1
  17. package/dist/components/ContentView.d.ts +10 -10
  18. package/dist/components/ContentView.js +50 -50
  19. package/dist/components/ContentView.js.map +0 -0
  20. package/dist/components/EmptyPlaceholder.d.ts +12 -0
  21. package/dist/components/EmptyPlaceholder.js +54 -0
  22. package/dist/components/EmptyPlaceholder.js.map +1 -0
  23. package/dist/components/FileInput.d.ts +31 -28
  24. package/dist/components/FileInput.js +230 -195
  25. package/dist/components/FileInput.js.map +1 -1
  26. package/dist/components/Gap.d.ts +8 -0
  27. package/dist/components/Gap.js +60 -0
  28. package/dist/components/Gap.js.map +1 -0
  29. package/dist/components/Icon.d.ts +12 -12
  30. package/dist/components/Icon.js +70 -70
  31. package/dist/components/Icon.js.map +0 -0
  32. package/dist/components/Image.d.ts +18 -18
  33. package/dist/components/Image.js +59 -59
  34. package/dist/components/Image.js.map +0 -0
  35. package/dist/components/List.d.ts +14 -14
  36. package/dist/components/List.js +84 -83
  37. package/dist/components/List.js.map +1 -1
  38. package/dist/components/Modal/index.d.ts +27 -26
  39. package/dist/components/Modal/index.js +113 -112
  40. package/dist/components/Modal/index.js.map +1 -1
  41. package/dist/components/Modal/styles.d.ts +69 -69
  42. package/dist/components/Modal/styles.js +64 -64
  43. package/dist/components/Modal/styles.js.map +0 -0
  44. package/dist/components/Navigation/Navigation.d.ts +3 -3
  45. package/dist/components/Navigation/Navigation.js +87 -87
  46. package/dist/components/Navigation/Navigation.js.map +0 -0
  47. package/dist/components/Navigation/constants.d.ts +5 -5
  48. package/dist/components/Navigation/constants.js +10 -10
  49. package/dist/components/Navigation/constants.js.map +0 -0
  50. package/dist/components/Navigation/index.d.ts +3 -3
  51. package/dist/components/Navigation/index.js +19 -19
  52. package/dist/components/Navigation/index.js.map +0 -0
  53. package/dist/components/Navigation/types.d.ts +26 -26
  54. package/dist/components/Navigation/types.js +7 -7
  55. package/dist/components/Navigation/types.js.map +0 -0
  56. package/dist/components/Navigation/utils.d.ts +3 -3
  57. package/dist/components/Navigation/utils.js +69 -69
  58. package/dist/components/Navigation/utils.js.map +0 -0
  59. package/dist/components/NewPager/index.d.ts +26 -0
  60. package/dist/components/NewPager/index.js +92 -0
  61. package/dist/components/NewPager/index.js.map +1 -0
  62. package/dist/components/NewPager/styles.d.ts +87 -0
  63. package/dist/components/NewPager/styles.js +70 -0
  64. package/dist/components/NewPager/styles.js.map +1 -0
  65. package/dist/components/Overlay.d.ts +16 -16
  66. package/dist/components/Overlay.js +69 -69
  67. package/dist/components/Overlay.js.map +0 -0
  68. package/dist/components/Pager/index.d.ts +20 -20
  69. package/dist/components/Pager/index.js +167 -167
  70. package/dist/components/Pager/index.js.map +0 -0
  71. package/dist/components/Pager/styles.d.ts +54 -54
  72. package/dist/components/Pager/styles.js +43 -43
  73. package/dist/components/Pager/styles.js.map +0 -0
  74. package/dist/components/RadioInput/index.d.ts +26 -26
  75. package/dist/components/RadioInput/index.js +72 -72
  76. package/dist/components/RadioInput/index.js.map +0 -0
  77. package/dist/components/RadioInput/styles.d.ts +57 -57
  78. package/dist/components/RadioInput/styles.js +44 -44
  79. package/dist/components/RadioInput/styles.js.map +0 -0
  80. package/dist/components/Scroll.d.ts +13 -13
  81. package/dist/components/Scroll.js +81 -81
  82. package/dist/components/Scroll.js.map +0 -0
  83. package/dist/components/Sections.d.ts +11 -11
  84. package/dist/components/Sections.js +80 -80
  85. package/dist/components/Sections.js.map +0 -0
  86. package/dist/components/Select/index.d.ts +5 -5
  87. package/dist/components/Select/index.js +150 -150
  88. package/dist/components/Select/index.js.map +0 -0
  89. package/dist/components/Select/styles.d.ts +9 -9
  90. package/dist/components/Select/styles.js +56 -56
  91. package/dist/components/Select/styles.js.map +0 -0
  92. package/dist/components/Select/types.d.ts +40 -40
  93. package/dist/components/Select/types.js +2 -2
  94. package/dist/components/Select/types.js.map +0 -0
  95. package/dist/components/Slider/Mark.d.ts +3 -3
  96. package/dist/components/Slider/Mark.js +31 -31
  97. package/dist/components/Slider/Mark.js.map +0 -0
  98. package/dist/components/Slider/Thumb.d.ts +7 -7
  99. package/dist/components/Slider/Thumb.js +29 -29
  100. package/dist/components/Slider/Thumb.js.map +0 -0
  101. package/dist/components/Slider/index.d.ts +3 -3
  102. package/dist/components/Slider/index.js +97 -97
  103. package/dist/components/Slider/index.js.map +0 -0
  104. package/dist/components/Slider/types.d.ts +25 -25
  105. package/dist/components/Slider/types.js +2 -2
  106. package/dist/components/Slider/types.js.map +0 -0
  107. package/dist/components/Switch.d.ts +13 -13
  108. package/dist/components/Switch.js +75 -75
  109. package/dist/components/Switch.js.map +0 -0
  110. package/dist/components/Text.d.ts +12 -12
  111. package/dist/components/Text.js +52 -52
  112. package/dist/components/Text.js.map +0 -0
  113. package/dist/components/TextInput.d.ts +183 -183
  114. package/dist/components/TextInput.js +180 -178
  115. package/dist/components/TextInput.js.map +1 -1
  116. package/dist/components/Touchable.d.ts +14 -14
  117. package/dist/components/Touchable.js +75 -61
  118. package/dist/components/Touchable.js.map +1 -1
  119. package/dist/components/View.d.ts +123 -120
  120. package/dist/components/View.js +55 -54
  121. package/dist/components/View.js.map +1 -1
  122. package/dist/components/components.d.ts +27 -25
  123. package/dist/components/components.js +43 -41
  124. package/dist/components/components.js.map +1 -1
  125. package/dist/index.d.ts +5 -5
  126. package/dist/index.js +28 -28
  127. package/dist/index.js.map +0 -0
  128. package/dist/modules/documentPicker.d.ts +3 -3
  129. package/dist/modules/documentPicker.js +11 -11
  130. package/dist/modules/documentPicker.js.map +0 -0
  131. package/dist/modules/fastImage.d.ts +1 -1
  132. package/dist/modules/fastImage.js +9 -9
  133. package/dist/modules/fastImage.js.map +0 -0
  134. package/dist/modules/reactNavigation.d.ts +3 -3
  135. package/dist/modules/reactNavigation.js +10 -10
  136. package/dist/modules/reactNavigation.js.map +0 -0
  137. package/dist/modules/textInputMask.d.ts +9 -12
  138. package/dist/modules/textInputMask.js +7 -7
  139. package/dist/modules/types/fileTypes.d.ts +138 -138
  140. package/dist/modules/types/fileTypes.js +2 -2
  141. package/dist/modules/types/fileTypes.js.map +0 -0
  142. package/dist/modules/types/textInputMask.d.ts +7 -12
  143. package/dist/modules/types/textInputMask.js +2 -2
  144. package/dist/types/utility.d.ts +2 -2
  145. package/dist/types/utility.js +2 -2
  146. package/dist/types/utility.js.map +0 -0
  147. package/dist/utils/OSAlert.d.ts +31 -31
  148. package/dist/utils/OSAlert.js +141 -141
  149. package/dist/utils/OSAlert.js.map +0 -0
  150. package/dist/utils/misc.d.ts +2 -2
  151. package/dist/utils/misc.js +25 -25
  152. package/dist/utils/misc.js.map +0 -0
  153. package/dist/utils/styles.d.ts +1 -1
  154. package/dist/utils/styles.js +12 -12
  155. package/dist/utils/styles.js.map +0 -0
  156. package/package.json +42 -40
  157. package/src/components/ActivityIndicator.tsx +46 -46
  158. package/src/components/Animated.tsx +34 -34
  159. package/src/components/Button.tsx +117 -95
  160. package/src/components/Checkbox/index.tsx +85 -85
  161. package/src/components/Checkbox/styles.ts +76 -76
  162. package/src/components/ContentView.tsx +58 -58
  163. package/src/components/EmptyPlaceholder.tsx +53 -0
  164. package/src/components/FileInput.tsx +230 -230
  165. package/src/components/Gap.tsx +40 -0
  166. package/src/components/Icon.tsx +58 -58
  167. package/src/components/Image.tsx +61 -61
  168. package/src/components/List.tsx +116 -111
  169. package/src/components/Modal/index.tsx +164 -161
  170. package/src/components/Modal/styles.ts +133 -133
  171. package/src/components/Navigation/Navigation.tsx +58 -58
  172. package/src/components/Navigation/constants.ts +8 -8
  173. package/src/components/Navigation/index.tsx +3 -3
  174. package/src/components/Navigation/types.ts +35 -35
  175. package/src/components/Navigation/utils.tsx +59 -59
  176. package/src/components/NewPager/index.tsx +123 -0
  177. package/src/components/NewPager/styles.ts +76 -0
  178. package/src/components/Overlay.tsx +77 -77
  179. package/src/components/Pager/index.tsx +242 -242
  180. package/src/components/Pager/styles.ts +51 -51
  181. package/src/components/RadioInput/index.tsx +101 -101
  182. package/src/components/RadioInput/styles.ts +67 -67
  183. package/src/components/Scroll.tsx +106 -106
  184. package/src/components/Sections.tsx +101 -101
  185. package/src/components/Select/index.tsx +195 -195
  186. package/src/components/Select/styles.ts +81 -81
  187. package/src/components/Select/types.ts +46 -46
  188. package/src/components/Slider/Mark.tsx +46 -46
  189. package/src/components/Slider/Thumb.tsx +29 -29
  190. package/src/components/Slider/index.tsx +123 -123
  191. package/src/components/Slider/types.ts +25 -25
  192. package/src/components/Switch.tsx +81 -81
  193. package/src/components/Text.tsx +30 -30
  194. package/src/components/TextInput.tsx +247 -247
  195. package/src/components/Touchable.tsx +78 -66
  196. package/src/components/View.tsx +48 -46
  197. package/src/components/components.ts +28 -26
  198. package/src/index.ts +6 -6
  199. package/src/modules/documentPicker.ts +7 -7
  200. package/src/modules/fastImage.ts +2 -2
  201. package/src/modules/index.d.ts +496 -496
  202. package/src/modules/reactNavigation.ts +4 -4
  203. package/src/modules/textInputMask.ts +9 -9
  204. package/src/modules/types/documentPicker.d.ts +215 -215
  205. package/src/modules/types/fileTypes.ts +138 -138
  206. package/src/modules/types/textInputMask.ts +9 -13
  207. package/src/types/utility.ts +3 -3
  208. package/src/utils/OSAlert.ts +180 -180
  209. package/src/utils/misc.ts +24 -24
  210. package/src/utils/styles.ts +14 -14
@@ -1,77 +1,77 @@
1
- import * as React from 'react'
2
- import {
3
- ComponentVariants,
4
- IconPlaceholder,
5
- OverlayComposition,
6
- OverlayStyles,
7
- useDefaultComponentStyle,
8
- } from '@codeleap/common'
9
- import { ReactNode } from 'react'
10
- import { InputLabel } from './TextInput'
11
- import { Button } from './Button'
12
-
13
- import { View } from './View'
14
- import { StylesOf } from '../types/utility'
15
- import { StyleSheet, ViewProps } from 'react-native'
16
- import { AnimatedTouchable } from './Touchable'
17
-
18
- export type OverlayProps = ViewProps & {
19
- title?: ReactNode
20
- visible?: boolean
21
- showClose?: boolean
22
- variants?: ComponentVariants<typeof OverlayStyles>
23
- styles?: StylesOf<OverlayComposition>
24
- style?: any
25
- onPress?: () => void
26
- } & React.ComponentPropsWithoutRef<typeof AnimatedTouchable>
27
-
28
- export const Overlay: React.FC<OverlayProps> = (overlayProps) => {
29
- const {
30
- showClose,
31
- title,
32
- children,
33
- visible,
34
- styles = {},
35
- style,
36
- variants,
37
- ...props
38
- } = overlayProps
39
-
40
- const variantStyles = useDefaultComponentStyle('Overlay', {
41
- styles,
42
- transform: StyleSheet.flatten,
43
- variants: variants as any,
44
- }) as StylesOf<OverlayComposition>
45
-
46
- const touchableStyle = [
47
- variantStyles.wrapper,
48
- styles.wrapper,
49
- visible && variantStyles['wrapper:visible'],
50
- visible && styles['wrapper:visible'],
51
- ]
52
-
53
- return (
54
- <AnimatedTouchable
55
- // @ts-ignore
56
- transition={'opacity'}
57
- style={touchableStyle}
58
- {...props}
59
- >
60
- <View>
61
- {(title || showClose) && (
62
- <View style={variantStyles.header}>
63
- <InputLabel style={variantStyles.title} label={title} />
64
- {showClose && (
65
- <Button
66
- variants={['icon']}
67
- icon={'close' as IconPlaceholder}
68
- style={variantStyles.closeButton}
69
- debugName={'Close icon'}
70
- />
71
- )}
72
- </View>
73
- )}
74
- </View>
75
- </AnimatedTouchable>
76
- )
77
- }
1
+ import * as React from 'react'
2
+ import {
3
+ ComponentVariants,
4
+ IconPlaceholder,
5
+ OverlayComposition,
6
+ OverlayStyles,
7
+ useDefaultComponentStyle,
8
+ } from '@codeleap/common'
9
+ import { ReactNode } from 'react'
10
+ import { InputLabel } from './TextInput'
11
+ import { Button } from './Button'
12
+
13
+ import { View } from './View'
14
+ import { StylesOf } from '../types/utility'
15
+ import { StyleSheet, ViewProps } from 'react-native'
16
+ import { AnimatedTouchable } from './Touchable'
17
+
18
+ export type OverlayProps = ViewProps & {
19
+ title?: ReactNode
20
+ visible?: boolean
21
+ showClose?: boolean
22
+ variants?: ComponentVariants<typeof OverlayStyles>
23
+ styles?: StylesOf<OverlayComposition>
24
+ style?: any
25
+ onPress?: () => void
26
+ } & React.ComponentPropsWithoutRef<typeof AnimatedTouchable>
27
+
28
+ export const Overlay: React.FC<OverlayProps> = (overlayProps) => {
29
+ const {
30
+ showClose,
31
+ title,
32
+ children,
33
+ visible,
34
+ styles = {},
35
+ style,
36
+ variants,
37
+ ...props
38
+ } = overlayProps
39
+
40
+ const variantStyles = useDefaultComponentStyle('Overlay', {
41
+ styles,
42
+ transform: StyleSheet.flatten,
43
+ variants: variants as any,
44
+ }) as StylesOf<OverlayComposition>
45
+
46
+ const touchableStyle = [
47
+ variantStyles.wrapper,
48
+ styles.wrapper,
49
+ visible && variantStyles['wrapper:visible'],
50
+ visible && styles['wrapper:visible'],
51
+ ]
52
+
53
+ return (
54
+ <AnimatedTouchable
55
+ // @ts-ignore
56
+ transition={'opacity'}
57
+ style={touchableStyle}
58
+ {...props}
59
+ >
60
+ <View>
61
+ {(title || showClose) && (
62
+ <View style={variantStyles.header}>
63
+ <InputLabel style={variantStyles.title} label={title} />
64
+ {showClose && (
65
+ <Button
66
+ variants={['icon']}
67
+ icon={'close' as IconPlaceholder}
68
+ style={variantStyles.closeButton}
69
+ debugName={'Close icon'}
70
+ />
71
+ )}
72
+ </View>
73
+ )}
74
+ </View>
75
+ </AnimatedTouchable>
76
+ )
77
+ }
@@ -1,242 +1,242 @@
1
- import {
2
- ComponentVariants,
3
- onUpdate,
4
- useDefaultComponentStyle,
5
- useDebounce,
6
- useCodeleapContext,
7
- } from '@codeleap/common'
8
- import React, {
9
- forwardRef,
10
- ReactNode,
11
- useImperativeHandle,
12
- useMemo,
13
- useRef,
14
- useState,
15
- } from 'react'
16
- import { StyleSheet } from 'react-native'
17
- import { StylesOf } from '../../types/utility'
18
- import { Animated } from '../Animated'
19
- import { Button } from '../Button'
20
- import { View } from '../View'
21
- import { Text } from '../Text'
22
- import { MobilePagerStyles, PagerComposition } from './styles'
23
-
24
- export * from './styles'
25
-
26
- export type PagerProps = {
27
- variants?: ComponentVariants<typeof MobilePagerStyles>['variants']
28
- styles?: StylesOf<PagerComposition>
29
- page?: number
30
- loop?: boolean
31
- debug?: boolean
32
- children?: ReactNode
33
- onPageChange?: (page: number) => void
34
- }
35
-
36
- export type PagerRef = {
37
- forward(by?: number): void
38
- back(by?: number): void
39
- to(index?: number): void
40
- }
41
-
42
- export const Pager = forwardRef<PagerRef, PagerProps>((pagerProps, ref) => {
43
- const {
44
- children,
45
- styles,
46
- variants,
47
- page: propPage,
48
- debug,
49
- loop,
50
- onPageChange,
51
- } = pagerProps
52
-
53
- const [page, setPage] = useState(() => propPage ?? 0)
54
-
55
- const variantStyles = useDefaultComponentStyle<'u:Pager', typeof MobilePagerStyles>(
56
- 'u:Pager',
57
- {
58
- styles,
59
- transform: StyleSheet.flatten,
60
- variants,
61
- },
62
- )
63
- const { logger } = useCodeleapContext()
64
- const nChildren = React.Children.count(children)
65
-
66
- const lastPage = nChildren - 1
67
-
68
- const pagerRef = useRef<PagerRef>({
69
- forward: (by = 1) => {
70
- setPage((currentPage) => {
71
- if (currentPage < lastPage) {
72
- return currentPage + by
73
- } else if (loop) {
74
- return by - 1
75
- }
76
- return currentPage
77
- })
78
- },
79
- back: (by = 1) => {
80
- setPage((currentPage) => {
81
- if (currentPage > 0) {
82
- return currentPage - by
83
- } else if (loop) {
84
- return nChildren - by
85
- }
86
- return currentPage
87
- })
88
- },
89
- to: (n: number) => {
90
- if (n >= 0 && n <= lastPage) {
91
- setPage(n)
92
- } else {
93
- logger.warn(
94
- 'Attempted to go to a page which falls outside range',
95
- { currentPage: page, attemptedToGoTo: n, pageRange: [0, lastPage] },
96
- 'Component',
97
- )
98
- }
99
- },
100
- })
101
-
102
- onUpdate(() => {
103
- onPageChange?.(page)
104
- }, [page])
105
-
106
- onUpdate(() => {
107
- if (typeof propPage === 'number') {
108
- setPage(propPage)
109
- }
110
- }, [propPage])
111
-
112
- useImperativeHandle(ref, () => pagerRef.current)
113
-
114
- const pagePoses = useMemo(() => {
115
- return {
116
- current: variantStyles['page:pose:current'],
117
- next: variantStyles['page:pose:next'],
118
- previous: variantStyles['page:pose:previous'],
119
- }
120
- }, [variantStyles])
121
-
122
- return (
123
- <View style={variantStyles.wrapper}>
124
- {React.Children.map(children, (child, idx) => (
125
- <Page
126
- {...pagerProps}
127
- idx={idx}
128
- lastPage={lastPage}
129
- pagePoses={pagePoses}
130
- style={[variantStyles.page]}
131
- page={page}
132
- >
133
- {child}
134
- </Page>
135
- ))}
136
-
137
- {debug && (
138
- <View
139
- variants={['absolute']}
140
- style={{ bottom: 0, left: 0, right: 0 }}
141
- >
142
- <Button text='previous' debugName='Previous Pager' onPress={pagerRef.current.back} />
143
- <Text text={page.toString()} />
144
- <Button text='next' debugName='Next Pager' onPress={pagerRef.current.forward} />
145
- </View>
146
- )}
147
- </View>
148
-
149
- )
150
- })
151
- type PageProps = PagerProps & {
152
- idx: number
153
- lastPage: number
154
- page: number
155
- pagePoses: any
156
- style: any
157
- }
158
- const Page: React.FC<PageProps> = (pageProps) => {
159
- const {
160
- children: child,
161
- idx,
162
- loop,
163
- lastPage,
164
- page,
165
- style,
166
- pagePoses,
167
- } = pageProps
168
-
169
- if (!React.isValidElement(child)) return null
170
-
171
- // const isLast = idx === lastPage
172
- // const isFirst = idx === 0
173
-
174
- // const isLoopNext = (loop && isFirst && page === lastPage)
175
- // const isLoopPrevious = (loop && isLast && page === 0)
176
-
177
- // const isCurrent = idx === page
178
- // const isSequenceNext = idx === page + 1
179
- // const isSequencePrevious = idx === page - 1
180
-
181
- // const isNext = isSequenceNext || isLoopNext
182
-
183
- // const isPrevious = isSequencePrevious || isLoopPrevious
184
-
185
- // const isCurrentOrAdjacent = [
186
- // isCurrent,
187
- // isNext,
188
- // isPrevious
189
- // ].includes(true)
190
-
191
- // if(isCurrentOrAdjacent){
192
- // return <Animated
193
- // key={idx}
194
- // component='View'
195
- // config={pagePoses}
196
- // pose={isCurrent ? 'current' : (isNext ? 'next' : 'previous')}
197
- // style={[{
198
- // position: 'absolute',
199
- // top: 0,
200
-
201
- // },style]}
202
- // >
203
- // {child}
204
- // </Animated>
205
- // }
206
- const isCurrent = idx === page
207
- const isNext = idx > page
208
- const [_opacity, setOpacity] = useState(isCurrent ? 1 : 0)
209
-
210
- const [opacity, resetDebounceTimer] = useDebounce(_opacity, 800)
211
-
212
- onUpdate(() => {
213
- if (isCurrent) {
214
- setOpacity(1)
215
- } else {
216
- setOpacity(0)
217
- }
218
-
219
- return resetDebounceTimer
220
- }, [idx, page])
221
-
222
- return (
223
- <Animated
224
- key={idx}
225
- component='View'
226
- config={pagePoses}
227
- pose={isCurrent ? 'current' : isNext ? 'next' : 'previous'}
228
- style={[
229
- {
230
- position: 'absolute',
231
- top: 0,
232
- opacity: isCurrent ? _opacity : opacity,
233
- },
234
- style,
235
- ]}
236
- >
237
- {child}
238
- </Animated>
239
- )
240
-
241
- // return <View style={{display:'none'}} key={idx}>{child}</View>
242
- }
1
+ import {
2
+ ComponentVariants,
3
+ onUpdate,
4
+ useDefaultComponentStyle,
5
+ useDebounce,
6
+ useCodeleapContext,
7
+ } from '@codeleap/common'
8
+ import React, {
9
+ forwardRef,
10
+ ReactNode,
11
+ useImperativeHandle,
12
+ useMemo,
13
+ useRef,
14
+ useState,
15
+ } from 'react'
16
+ import { StyleSheet } from 'react-native'
17
+ import { StylesOf } from '../../types/utility'
18
+ import { Animated } from '../Animated'
19
+ import { Button } from '../Button'
20
+ import { View } from '../View'
21
+ import { Text } from '../Text'
22
+ import { MobilePagerStyles, PagerComposition } from './styles'
23
+
24
+ export * from './styles'
25
+
26
+ export type PagerProps = {
27
+ variants?: ComponentVariants<typeof MobilePagerStyles>['variants']
28
+ styles?: StylesOf<PagerComposition>
29
+ page?: number
30
+ loop?: boolean
31
+ debug?: boolean
32
+ children?: ReactNode
33
+ onPageChange?: (page: number) => void
34
+ }
35
+
36
+ export type PagerRef = {
37
+ forward(by?: number): void
38
+ back(by?: number): void
39
+ to(index?: number): void
40
+ }
41
+
42
+ export const Pager = forwardRef<PagerRef, PagerProps>((pagerProps, ref) => {
43
+ const {
44
+ children,
45
+ styles,
46
+ variants,
47
+ page: propPage,
48
+ debug,
49
+ loop,
50
+ onPageChange,
51
+ } = pagerProps
52
+
53
+ const [page, setPage] = useState(() => propPage ?? 0)
54
+
55
+ const variantStyles = useDefaultComponentStyle<'u:Pager', typeof MobilePagerStyles>(
56
+ 'u:Pager',
57
+ {
58
+ styles,
59
+ transform: StyleSheet.flatten,
60
+ variants,
61
+ },
62
+ )
63
+ const { logger } = useCodeleapContext()
64
+ const nChildren = React.Children.count(children)
65
+
66
+ const lastPage = nChildren - 1
67
+
68
+ const pagerRef = useRef<PagerRef>({
69
+ forward: (by = 1) => {
70
+ setPage((currentPage) => {
71
+ if (currentPage < lastPage) {
72
+ return currentPage + by
73
+ } else if (loop) {
74
+ return by - 1
75
+ }
76
+ return currentPage
77
+ })
78
+ },
79
+ back: (by = 1) => {
80
+ setPage((currentPage) => {
81
+ if (currentPage > 0) {
82
+ return currentPage - by
83
+ } else if (loop) {
84
+ return nChildren - by
85
+ }
86
+ return currentPage
87
+ })
88
+ },
89
+ to: (n: number) => {
90
+ if (n >= 0 && n <= lastPage) {
91
+ setPage(n)
92
+ } else {
93
+ logger.warn(
94
+ 'Attempted to go to a page which falls outside range',
95
+ { currentPage: page, attemptedToGoTo: n, pageRange: [0, lastPage] },
96
+ 'Component',
97
+ )
98
+ }
99
+ },
100
+ })
101
+
102
+ onUpdate(() => {
103
+ onPageChange?.(page)
104
+ }, [page])
105
+
106
+ onUpdate(() => {
107
+ if (typeof propPage === 'number') {
108
+ setPage(propPage)
109
+ }
110
+ }, [propPage])
111
+
112
+ useImperativeHandle(ref, () => pagerRef.current)
113
+
114
+ const pagePoses = useMemo(() => {
115
+ return {
116
+ current: variantStyles['page:pose:current'],
117
+ next: variantStyles['page:pose:next'],
118
+ previous: variantStyles['page:pose:previous'],
119
+ }
120
+ }, [variantStyles])
121
+
122
+ return (
123
+ <View style={variantStyles.wrapper}>
124
+ {React.Children.map(children, (child, idx) => (
125
+ <Page
126
+ {...pagerProps}
127
+ idx={idx}
128
+ lastPage={lastPage}
129
+ pagePoses={pagePoses}
130
+ style={[variantStyles.page]}
131
+ page={page}
132
+ >
133
+ {child}
134
+ </Page>
135
+ ))}
136
+
137
+ {debug && (
138
+ <View
139
+ variants={['absolute']}
140
+ style={{ bottom: 0, left: 0, right: 0 }}
141
+ >
142
+ <Button text='previous' debugName='Previous Pager' onPress={pagerRef.current.back} />
143
+ <Text text={page.toString()} />
144
+ <Button text='next' debugName='Next Pager' onPress={pagerRef.current.forward} />
145
+ </View>
146
+ )}
147
+ </View>
148
+
149
+ )
150
+ })
151
+ type PageProps = PagerProps & {
152
+ idx: number
153
+ lastPage: number
154
+ page: number
155
+ pagePoses: any
156
+ style: any
157
+ }
158
+ const Page: React.FC<PageProps> = (pageProps) => {
159
+ const {
160
+ children: child,
161
+ idx,
162
+ loop,
163
+ lastPage,
164
+ page,
165
+ style,
166
+ pagePoses,
167
+ } = pageProps
168
+
169
+ if (!React.isValidElement(child)) return null
170
+
171
+ // const isLast = idx === lastPage
172
+ // const isFirst = idx === 0
173
+
174
+ // const isLoopNext = (loop && isFirst && page === lastPage)
175
+ // const isLoopPrevious = (loop && isLast && page === 0)
176
+
177
+ // const isCurrent = idx === page
178
+ // const isSequenceNext = idx === page + 1
179
+ // const isSequencePrevious = idx === page - 1
180
+
181
+ // const isNext = isSequenceNext || isLoopNext
182
+
183
+ // const isPrevious = isSequencePrevious || isLoopPrevious
184
+
185
+ // const isCurrentOrAdjacent = [
186
+ // isCurrent,
187
+ // isNext,
188
+ // isPrevious
189
+ // ].includes(true)
190
+
191
+ // if(isCurrentOrAdjacent){
192
+ // return <Animated
193
+ // key={idx}
194
+ // component='View'
195
+ // config={pagePoses}
196
+ // pose={isCurrent ? 'current' : (isNext ? 'next' : 'previous')}
197
+ // style={[{
198
+ // position: 'absolute',
199
+ // top: 0,
200
+
201
+ // },style]}
202
+ // >
203
+ // {child}
204
+ // </Animated>
205
+ // }
206
+ const isCurrent = idx === page
207
+ const isNext = idx > page
208
+ const [_opacity, setOpacity] = useState(isCurrent ? 1 : 0)
209
+
210
+ const [opacity, resetDebounceTimer] = useDebounce(_opacity, 800)
211
+
212
+ onUpdate(() => {
213
+ if (isCurrent) {
214
+ setOpacity(1)
215
+ } else {
216
+ setOpacity(0)
217
+ }
218
+
219
+ return resetDebounceTimer
220
+ }, [idx, page])
221
+
222
+ return (
223
+ <Animated
224
+ key={idx}
225
+ component='View'
226
+ config={pagePoses}
227
+ pose={isCurrent ? 'current' : isNext ? 'next' : 'previous'}
228
+ style={[
229
+ {
230
+ position: 'absolute',
231
+ top: 0,
232
+ opacity: isCurrent ? _opacity : opacity,
233
+ },
234
+ style,
235
+ ]}
236
+ >
237
+ {child}
238
+ </Animated>
239
+ )
240
+
241
+ // return <View style={{display:'none'}} key={idx}>{child}</View>
242
+ }