@codeleap/mobile 2.3.0 → 2.3.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 (126) hide show
  1. package/dist/components/Button/index.d.ts +0 -1
  2. package/dist/components/Button/index.js +5 -12
  3. package/dist/components/Button/index.js.map +1 -1
  4. package/dist/components/List/styles.js +1 -1
  5. package/dist/components/List/styles.js.map +1 -1
  6. package/dist/components/Touchable/index.js +11 -9
  7. package/dist/components/Touchable/index.js.map +1 -1
  8. package/dist/utils/theme.d.ts +1 -0
  9. package/dist/utils/theme.js +7 -2
  10. package/dist/utils/theme.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/components/ActionIcon/index.tsx +32 -0
  13. package/src/components/ActionIcon/styles.ts +97 -0
  14. package/src/components/ActivityIndicator/index.tsx +50 -0
  15. package/src/components/ActivityIndicator/styles.ts +68 -0
  16. package/src/components/Animated.tsx +34 -0
  17. package/src/components/AutoComplete/index.tsx +163 -0
  18. package/src/components/AutoComplete/styles.ts +44 -0
  19. package/src/components/Backdrop/index.tsx +48 -0
  20. package/src/components/Backdrop/styles.ts +33 -0
  21. package/src/components/Button/index.tsx +154 -0
  22. package/src/components/Button/styles.ts +129 -0
  23. package/src/components/Calendar/index.tsx +65 -0
  24. package/src/components/Calendar/style.ts +35 -0
  25. package/src/components/Calendar/types.ts +102 -0
  26. package/src/components/Checkbox/index.tsx +91 -0
  27. package/src/components/Checkbox/styles.ts +81 -0
  28. package/src/components/ContentView/index.tsx +63 -0
  29. package/src/components/ContentView/styles.ts +24 -0
  30. package/src/components/Drawer/index.tsx +33 -0
  31. package/src/components/Drawer/styles.ts +43 -0
  32. package/src/components/EmptyPlaceholder/index.tsx +88 -0
  33. package/src/components/EmptyPlaceholder/styles.ts +58 -0
  34. package/src/components/FileInput/index.tsx +181 -0
  35. package/src/components/FileInput/styles.ts +15 -0
  36. package/src/components/Grid/index.tsx +117 -0
  37. package/src/components/Grid/styles.ts +11 -0
  38. package/src/components/Icon/index.tsx +69 -0
  39. package/src/components/Icon/styles.ts +57 -0
  40. package/src/components/Image/index.tsx +91 -0
  41. package/src/components/Image/styles.ts +20 -0
  42. package/src/components/ImageView/Spotlight.tsx +157 -0
  43. package/src/components/ImageView/component.tsx +38 -0
  44. package/src/components/ImageView/index.ts +2 -0
  45. package/src/components/InputLabel/index.tsx +38 -0
  46. package/src/components/InputLabel/styles.ts +19 -0
  47. package/src/components/List/PaginationIndicator.tsx +71 -0
  48. package/src/components/List/index.tsx +114 -0
  49. package/src/components/List/styles.ts +19 -0
  50. package/src/components/Modal/index.tsx +218 -0
  51. package/src/components/Modal/styles.ts +153 -0
  52. package/src/components/MultiSelect/index.tsx +138 -0
  53. package/src/components/MultiSelect/styles.ts +18 -0
  54. package/src/components/MultiSelect/types.ts +42 -0
  55. package/src/components/Navigation/Navigation.tsx +54 -0
  56. package/src/components/Navigation/constants.ts +8 -0
  57. package/src/components/Navigation/index.tsx +3 -0
  58. package/src/components/Navigation/types.ts +35 -0
  59. package/src/components/Navigation/utils.tsx +57 -0
  60. package/src/components/Pager/index.tsx +121 -0
  61. package/src/components/Pager/styles.ts +81 -0
  62. package/src/components/RadioInput/index.tsx +106 -0
  63. package/src/components/RadioInput/styles.ts +67 -0
  64. package/src/components/Scroll/index.tsx +124 -0
  65. package/src/components/Scroll/styles.ts +18 -0
  66. package/src/components/Sections/index.tsx +91 -0
  67. package/src/components/SegmentedControl/index.tsx +204 -0
  68. package/src/components/SegmentedControl/styles.ts +89 -0
  69. package/src/components/Select/index.tsx +167 -0
  70. package/src/components/Select/styles.ts +62 -0
  71. package/src/components/Select/types.ts +43 -0
  72. package/src/components/Slider/Mark.tsx +46 -0
  73. package/src/components/Slider/Thumb.tsx +29 -0
  74. package/src/components/Slider/index.tsx +130 -0
  75. package/src/components/Slider/styles.ts +76 -0
  76. package/src/components/Slider/types.ts +30 -0
  77. package/src/components/Switch/index.tsx +91 -0
  78. package/src/components/Switch/styles.ts +38 -0
  79. package/src/components/Text/index.tsx +97 -0
  80. package/src/components/Text/styles.ts +50 -0
  81. package/src/components/TextInput/index.tsx +319 -0
  82. package/src/components/TextInput/styles.ts +127 -0
  83. package/src/components/Touchable/index.tsx +174 -0
  84. package/src/components/Touchable/styles.ts +28 -0
  85. package/src/components/View/index.tsx +103 -0
  86. package/src/components/View/styles.ts +24 -0
  87. package/src/components/components.ts +42 -0
  88. package/src/components/defaultStyles.ts +62 -0
  89. package/src/components/legacy/Modal/index.tsx +163 -0
  90. package/src/components/legacy/Modal/styles.ts +125 -0
  91. package/src/components/legacy/Pager/index.tsx +242 -0
  92. package/src/components/legacy/Pager/styles.ts +51 -0
  93. package/src/components/legacy/index.ts +2 -0
  94. package/src/modules/documentPicker.ts +7 -0
  95. package/src/modules/fastImage.ts +2 -0
  96. package/src/modules/imageCropPicker.d.ts +497 -0
  97. package/src/modules/index.d.ts +682 -0
  98. package/src/modules/reactNavigation.ts +15 -0
  99. package/src/modules/textInputMask.ts +11 -0
  100. package/src/modules/types/documentPicker.d.ts +215 -0
  101. package/src/modules/types/fileTypes.ts +138 -0
  102. package/src/modules/types/textInputMask.ts +9 -0
  103. package/src/types/index.ts +1 -0
  104. package/src/types/utility.ts +9 -0
  105. package/src/utils/KeyboardAware/context.tsx +75 -0
  106. package/src/utils/KeyboardAware/index.ts +17 -0
  107. package/src/utils/KeyboardAware/keyboardHooks.ts +124 -0
  108. package/src/utils/KeyboardAware/lib/KeyboardAwareFlatList.ts +4 -0
  109. package/src/utils/KeyboardAware/lib/KeyboardAwareHOC.tsx +618 -0
  110. package/src/utils/KeyboardAware/lib/KeyboardAwareInterface.ts +13 -0
  111. package/src/utils/KeyboardAware/lib/KeyboardAwareScrollView.ts +6 -0
  112. package/src/utils/KeyboardAware/lib/KeyboardAwareSectionList.ts +6 -0
  113. package/src/utils/KeyboardAware/types.ts +159 -0
  114. package/src/utils/ModalManager/components.tsx +112 -0
  115. package/src/utils/ModalManager/context.tsx +260 -0
  116. package/src/utils/ModalManager/index.ts +16 -0
  117. package/src/utils/OSAlert.ts +180 -0
  118. package/src/utils/PermissionManager/context.tsx +302 -0
  119. package/src/utils/PermissionManager/index.ts +20 -0
  120. package/src/utils/PermissionManager/types.ts +24 -0
  121. package/src/utils/hooks.ts +163 -0
  122. package/src/utils/index.ts +11 -0
  123. package/src/utils/input.ts +51 -0
  124. package/src/utils/misc.ts +83 -0
  125. package/src/utils/notifications.ts +206 -0
  126. package/src/utils/theme.ts +58 -0
@@ -0,0 +1,153 @@
1
+ import {
2
+ assignTextStyle,
3
+ ButtonComposition,
4
+ createDefaultVariantFactory,
5
+ includePresets,
6
+ } from '@codeleap/common'
7
+
8
+ export type AnimatableParts = 'box' | 'backdrop'
9
+
10
+ export type ModalParts =
11
+ | AnimatableParts
12
+ | 'wrapper'
13
+ | 'innerWrapper'
14
+
15
+ | 'scrollContent'
16
+ | 'scroll'
17
+ | 'body'
18
+ | 'footer'
19
+ | 'header'
20
+ | 'backdropTouchable'
21
+ | 'title'
22
+ | `closeButton${Capitalize<ButtonComposition>}`
23
+
24
+ export type ModalComposition =
25
+ | ModalParts
26
+ | `${AnimatableParts}:visible`
27
+ | `${AnimatableParts}:hidden`
28
+ | `${AnimatableParts}:transition`
29
+
30
+ const createModalStyle = createDefaultVariantFactory<ModalComposition>()
31
+
32
+ const presets = includePresets((style) => createModalStyle(() => ({ body: style })))
33
+
34
+ export const ModalStyles = {
35
+
36
+ ...presets,
37
+ default: createModalStyle((theme) => {
38
+ const fullSize = {
39
+ ...theme.presets.whole,
40
+ position: 'absolute',
41
+ width: theme.values.width,
42
+ height: theme.values.height,
43
+ maxHeight: theme.values.height,
44
+ }
45
+
46
+ return {
47
+ wrapper: {
48
+ zIndex: 1,
49
+ height: theme.values.height,
50
+ width: theme.values.width,
51
+ ...theme.presets.whole,
52
+ position: 'absolute',
53
+ ...theme.presets.safeAreaTop(),
54
+ paddingBottom: theme.values.bottomNavHeight,
55
+ },
56
+ 'box:transition': {
57
+ scale: {
58
+ duration: theme.values.transitions.modal.duration,
59
+ type: 'timing',
60
+ },
61
+ opacity: {
62
+ duration: theme.values.transitions.modal.duration,
63
+ type: 'timing',
64
+ },
65
+ },
66
+ 'backdrop:transition': {
67
+ opacity: {
68
+ duration: theme.values.transitions.modal.duration,
69
+ type: 'timing',
70
+ },
71
+ },
72
+ backdrop: {
73
+
74
+ backgroundColor: theme.colors.black,
75
+ ...fullSize,
76
+ },
77
+ backdropTouchable: {
78
+ ...fullSize,
79
+ },
80
+ 'backdrop:visible': {
81
+ opacity: 0.5,
82
+ },
83
+ 'backdrop:hidden': {
84
+ opacity: 0,
85
+ },
86
+ innerWrapper: {
87
+ ...theme.presets.alignCenter,
88
+ ...theme.presets.justifyCenter,
89
+ width: theme.values.width,
90
+ flex: 1,
91
+ },
92
+ scroll: {
93
+ width: theme.values.width,
94
+ height: theme.values.window.height,
95
+ maxHeight: theme.values.window.height,
96
+ },
97
+ scrollContent: {
98
+ ...theme.presets.alignCenter,
99
+ ...theme.presets.justifyCenter,
100
+ ...theme.spacing.paddingVertical(2),
101
+ ...theme.presets.fullWidth,
102
+ flex: 1,
103
+ },
104
+ box: {
105
+ width: '80%',
106
+ backgroundColor: theme.colors.background,
107
+ borderRadius: theme.borderRadius.medium,
108
+ ...theme.spacing.padding(2),
109
+ },
110
+
111
+ 'box:hidden': {
112
+ opacity: 0,
113
+ scale: 0.8,
114
+
115
+ },
116
+ 'box:visible': {
117
+ opacity: 1,
118
+ scale: 1,
119
+ },
120
+ header: {
121
+ flexDirection: 'row',
122
+ ...theme.presets.justifySpaceBetween,
123
+ ...theme.presets.alignCenter,
124
+ },
125
+ closeButtonWrapper: {
126
+ alignSelf: 'center',
127
+ ...theme.spacing.marginLeft('auto'),
128
+ },
129
+ title: {
130
+ ...theme.presets.textCenter,
131
+ ...assignTextStyle('h3')(theme).text,
132
+ ...theme.spacing.paddingBottom(1),
133
+ flex: 1,
134
+ },
135
+ }
136
+ }),
137
+ popup: createModalStyle(() => ({})),
138
+ fullscreen: createModalStyle((theme) => ({
139
+ overlay: {
140
+ backgroundColor: theme.colors.background,
141
+ },
142
+ 'overlay:visible': {
143
+ opacity: 1,
144
+ },
145
+ box: {
146
+ flex: 1,
147
+ borderRadius: 0,
148
+ width: theme.values.width,
149
+ height: theme.values.window.height,
150
+ ...theme.presets.center,
151
+ },
152
+ })),
153
+ }
@@ -0,0 +1,138 @@
1
+ import { IconPlaceholder,
2
+ getNestedStylesByKey,
3
+ useDefaultComponentStyle,
4
+ TypeGuards } from '@codeleap/common'
5
+ import React, { useMemo } from 'react'
6
+ import { StyleSheet } from 'react-native'
7
+ import { List } from '../List'
8
+ import { TextInput } from '../TextInput'
9
+ import { MultiSelectProps } from './types'
10
+ import { ModalManager } from '../../utils'
11
+ import { MultiSelectStyles } from './styles'
12
+ import { SelectItem } from '../Select'
13
+
14
+ export * from './styles'
15
+ export const MultiSelect = <T extends string|number = string>(selectProps:MultiSelectProps<T>) => {
16
+ const {
17
+ value,
18
+ onValueChange,
19
+ label,
20
+ styles = {},
21
+ options,
22
+ style,
23
+ variants,
24
+ hideInput = false,
25
+ renderItem,
26
+ listProps,
27
+ placeholder = 'Select',
28
+ arrowIconName = 'selectArrow',
29
+ selectedIcon = 'multiSelectMarker',
30
+ inputProps = {},
31
+ clearable = false,
32
+ clearIconName = 'close',
33
+ validate = null,
34
+ ...drawerProps
35
+ } = selectProps
36
+
37
+ const variantStyles = useDefaultComponentStyle<'u:MultiSelect', typeof MultiSelectStyles>('u:MultiSelect', {
38
+ transform: StyleSheet.flatten,
39
+ rootElement: 'inputWrapper',
40
+ styles,
41
+ variants,
42
+ })
43
+
44
+ const inputStyles = useMemo(
45
+ () => getNestedStylesByKey('input', variantStyles),
46
+ [variantStyles],
47
+ )
48
+
49
+ const close = () => drawerProps?.toggle?.()
50
+
51
+ const select = (itemValue) => {
52
+ const newVal = [...value]
53
+
54
+ if (newVal.includes(itemValue)) {
55
+ newVal.splice(newVal.indexOf(itemValue), 1)
56
+ } else {
57
+ newVal.push(itemValue)
58
+ }
59
+ onValueChange(newVal)
60
+
61
+ }
62
+
63
+ const selectedLabel:string = useMemo(() => {
64
+ const current = options.filter(o => value.includes(o.value)).map(o => o.label)
65
+
66
+ const display = current?.join(', ') ?? placeholder
67
+
68
+ return TypeGuards.isString(display) ? display : ''
69
+ }, [value, placeholder, options])
70
+
71
+ const Item = renderItem || SelectItem
72
+
73
+ const renderListItem = ({ item }) => {
74
+ return <Item
75
+ isSelected={value.includes(item.value)}
76
+ item={item}
77
+ onPress={() => select(item.value)}
78
+ styles={variantStyles}
79
+ icon={selectedIcon as IconPlaceholder}
80
+ />
81
+ }
82
+
83
+ const isEmpty = value.length === 0
84
+ const showClearIcon = !isEmpty && clearable
85
+ const inputIcon = showClearIcon ? clearIconName : arrowIconName
86
+
87
+ const onPressInputIcon = () => {
88
+ if (showClearIcon) {
89
+ onValueChange([])
90
+ } else {
91
+ close?.()
92
+ }
93
+
94
+ }
95
+ return <>
96
+ {
97
+ !hideInput && (
98
+ <TextInput
99
+ caretHidden
100
+ value={selectedLabel}
101
+ rightIcon={{
102
+ icon: inputIcon as IconPlaceholder,
103
+ onPress: onPressInputIcon,
104
+ }}
105
+ editable={false}
106
+ touchableWrapper
107
+ wrapperProps={{
108
+ debugName: 'Select',
109
+ onPress: close,
110
+ }}
111
+ pointerEvents={'none'}
112
+ label={label}
113
+ debugName={'Select input'}
114
+ styles={inputStyles}
115
+ style={style}
116
+ validate={validate}
117
+ {...inputProps}
118
+ />
119
+ )
120
+ }
121
+
122
+ <ModalManager.Drawer scroll={false} title={label} {...drawerProps} styles={variantStyles}>
123
+ <List<MultiSelectProps<any>['options']>
124
+ data={options}
125
+ style={variantStyles.list}
126
+ contentContainerStyle={variantStyles.listContent}
127
+ keyExtractor={(i) => i.value}
128
+ renderItem={renderListItem}
129
+ {...listProps}
130
+ />
131
+ </ModalManager.Drawer>
132
+
133
+ </>
134
+ }
135
+
136
+ export * from './styles'
137
+ export * from './types'
138
+
@@ -0,0 +1,18 @@
1
+ import { createDefaultVariantFactory } from '@codeleap/common'
2
+ import { SelectComposition, SelectStyles } from '../Select'
3
+ type ItemStates = '' | ':selected'
4
+ export type MultiSelectComposition =
5
+ SelectComposition | `itemIcon${ItemStates}`
6
+
7
+ const createMultiSelectStyle = createDefaultVariantFactory<MultiSelectComposition>()
8
+
9
+ export const MultiSelectStyles = {
10
+ ...SelectStyles,
11
+ default: createMultiSelectStyle((theme) => {
12
+ const defaultStyle = SelectStyles.default(theme)
13
+ return {
14
+ ...defaultStyle,
15
+
16
+ }
17
+ }),
18
+ }
@@ -0,0 +1,42 @@
1
+ import {
2
+ ComponentVariants,
3
+ FormTypes,
4
+ IconPlaceholder,
5
+ } from '@codeleap/common'
6
+ import { StylesOf } from '../../types/utility'
7
+ import { DrawerProps } from '../Drawer'
8
+ import { FlatListProps } from '../List'
9
+ import { TextInputProps } from '../TextInput'
10
+ import { MultiSelectComposition, MultiSelectStyles } from './styles'
11
+
12
+ export type MultiSelectRenderFNProps<T> = {
13
+ styles: StylesOf<MultiSelectComposition>
14
+ onPress: () => void
15
+ isSelected?: boolean
16
+ item: FormTypes.Options<T>[number]
17
+ icon?: IconPlaceholder
18
+ }
19
+
20
+ export type MultiSelectRenderFN<T> = (props: MultiSelectRenderFNProps<T>) => JSX.Element
21
+
22
+ type MultiSelectDrawerProps = Omit<DrawerProps, 'variants' | 'styles'>
23
+
24
+ export type MultiSelectProps<T> = MultiSelectDrawerProps & {
25
+ value: T[]
26
+ placeholder?: FormTypes.Label
27
+ label?: FormTypes.Label
28
+ options?: FormTypes.Options<T>
29
+ onValueChange?: (value: T[]) => void
30
+ renderItem?: MultiSelectRenderFN<T>
31
+ styles?: StylesOf<MultiSelectComposition>
32
+ style?: any
33
+ arrowIconName?: IconPlaceholder
34
+ inputProps?: Partial<TextInputProps>
35
+ selectedIcon?: IconPlaceholder
36
+ hideInput?: boolean
37
+ listProps?: Partial<FlatListProps>
38
+ clearable?: boolean
39
+ clearIconName?: IconPlaceholder
40
+ validate?: TextInputProps['validate']
41
+ } & ComponentVariants<typeof MultiSelectStyles>
42
+
@@ -0,0 +1,54 @@
1
+ // @ts-nocheck
2
+ import * as React from 'react'
3
+ import {
4
+ TypeGuards,
5
+ } from '@codeleap/common'
6
+ import { Icon } from '../Icon'
7
+ import { NavigationProps, NavigatorType, PropTypes, TNavigators } from './types'
8
+ import { Navigators } from './constants'
9
+
10
+ export const Navigation = <T extends NavigatorType>({ type, scenes, ...props }: NavigationProps<T>) => {
11
+ const NavigationComponent = Navigators[type] as TNavigators[T]
12
+
13
+ // console.log('render Navigation', { type, scenes, props, defaultProps })
14
+
15
+ return <NavigationComponent.Navigator {...props}>
16
+ {
17
+ Object.entries(scenes).map(([name, content], idx) => {
18
+ const isFunction = TypeGuards.isFunction(content)
19
+
20
+ let screenProps = {
21
+ name,
22
+ } as PropTypes[T]['Screen']
23
+
24
+ if (isFunction) {
25
+ screenProps.component = content
26
+ // console.log('Render NavigationScreen', { scenes, screenProps, content, isFunction }, 'PACKAGES')
27
+ } else {
28
+ screenProps.component = content?.component?.default || content?.component || content?.default
29
+ const nameParts = name.split('.')
30
+ const title = content?.title || nameParts[nameParts.length - 1] || name.replace('.', '')
31
+
32
+ screenProps = {
33
+ ...screenProps,
34
+ options: (optionProps) => ({
35
+ title,
36
+ tabBarIcon: (style) => <Icon name={content?.icon} style={style}/>,
37
+ tabBarIconFocused: content?.iconFocused ? (style) => <Icon name={content?.iconFocused} style={style}/> : null,
38
+ ...(TypeGuards.isFunction(content.options) ? content.options(optionProps) : content.options),
39
+ }),
40
+ }
41
+ // console.log('Render NavigationScreen loop', { scenes, screenProps, content, title, isFunction, props }, 'PACKAGES')
42
+ }
43
+
44
+ return (
45
+ // @ts-ignore
46
+ <NavigationComponent.Screen
47
+ key={idx}
48
+ {...screenProps}
49
+ />
50
+ )
51
+ })
52
+ }
53
+ </NavigationComponent.Navigator>
54
+ }
@@ -0,0 +1,8 @@
1
+ // @ts-nocheck
2
+ import { createBottomTabNavigator, createDrawerNavigator, createStackNavigator } from '../../modules/reactNavigation'
3
+
4
+ export const Navigators = {
5
+ Drawer: createDrawerNavigator(),
6
+ Stack: createStackNavigator(),
7
+ Tab: createBottomTabNavigator(),
8
+ }
@@ -0,0 +1,3 @@
1
+ export * from './Navigation'
2
+ export * from './types'
3
+ export * from './utils'
@@ -0,0 +1,35 @@
1
+ import { IconPlaceholder } from '@codeleap/common'
2
+ import { Navigators } from './constants'
3
+
4
+ export type TNavigators = typeof Navigators
5
+ export type NavigatorType = keyof TNavigators
6
+
7
+ export type PropTypes = {
8
+ [P in NavigatorType] : {
9
+ Screen: Omit<React.ComponentPropsWithRef<TNavigators[P]['Screen']>, 'children'|'name'>
10
+ Navigator: Omit<React.ComponentPropsWithRef<TNavigators[P]['Navigator']>, 'children'|'name'>
11
+ Group: Omit<React.ComponentPropsWithRef<TNavigators[P]['Group']>, 'children'|'name'>
12
+ }
13
+ }
14
+ export type SceneComponent<K extends NavigatorType> = PropTypes[K]['Screen']
15
+ export type SceneOptions<K extends NavigatorType> =
16
+ { icon?: IconPlaceholder; default?:SceneComponent<K> } & PropTypes[K]['Screen']
17
+ export type Scene<K extends NavigatorType> = SceneComponent<K> | SceneOptions<K>
18
+
19
+ export type Scenes<K extends NavigatorType> = {
20
+ [x:string] : Scene<K>
21
+ }
22
+
23
+ export type SceneProps = any
24
+
25
+ export type NavigationProps<T extends NavigatorType> = {
26
+ type: T
27
+ scenes: Scenes<T>
28
+ } & PropTypes[T]['Navigator']
29
+
30
+ // export type NavigationStructure = {
31
+ // [module:string] : {
32
+ // scenes: Scenes,
33
+
34
+ // }
35
+ // }
@@ -0,0 +1,57 @@
1
+ import React from 'react'
2
+ import { Navigation } from './Navigation'
3
+
4
+ export function createAppNavigation(Scenes:any) {
5
+
6
+ const AllScenes = Object.entries<any>(Scenes).reduce((allScenes, [moduleName, content]) => {
7
+
8
+ const subScenes = []
9
+
10
+ for (const [name, sceneContent] of Object.entries(content.scenes)) {
11
+ subScenes.push(
12
+ [`${moduleName}.${name}`, sceneContent],
13
+ )
14
+ }
15
+
16
+ return [
17
+ ...allScenes,
18
+ ...subScenes,
19
+ ]
20
+ }, [])
21
+
22
+ const AppScenes = Object.fromEntries(AllScenes)
23
+
24
+ const SCENES_RESULT = Object.fromEntries(
25
+ Object.entries<any>(Scenes)
26
+ .map(([S, { _ig_scenes, exclude, type, navigationProps, ...otherProps }]) => {
27
+ let filterScenes = null
28
+
29
+ if (exclude) {
30
+ filterScenes = Object.fromEntries(
31
+ AllScenes.filter(([path]) => !exclude.some(param => path.startsWith(param))),
32
+ )
33
+ }
34
+
35
+ const Component = () => <Navigation
36
+ type={type || 'Stack'}
37
+ scenes={filterScenes || AppScenes}
38
+ screenOptions={{
39
+ headerShown: false,
40
+ ...navigationProps?.screenOptions,
41
+ }}
42
+ {...navigationProps}
43
+ />
44
+ // console.log('SCENES_RESULT create', { _ig_scenes, exclude, type, navigationProps, otherProps })
45
+
46
+ return [S, {
47
+ ...otherProps,
48
+ component: Component,
49
+ }]
50
+ }),
51
+ )
52
+
53
+ // console.log('SCENES_RESULT', SCENES_RESULT)
54
+
55
+ return SCENES_RESULT
56
+ }
57
+
@@ -0,0 +1,121 @@
1
+ import {
2
+ ComponentVariants,
3
+ useDefaultComponentStyle,
4
+ } from '@codeleap/common'
5
+ import React, {
6
+ ReactNode,
7
+ } from 'react'
8
+ import { StyleSheet } from 'react-native'
9
+ import { StylesOf } from '../../types/utility'
10
+ import { View } from '../View'
11
+ import { PagerStyles, PagerComposition } from './styles'
12
+ export * from './styles'
13
+
14
+ export type PageProps = {
15
+ isLast: boolean
16
+ isFirst: boolean
17
+ isActive: boolean
18
+ isNext: boolean
19
+ page: number
20
+ index: number
21
+ isPrevious: boolean
22
+ }
23
+
24
+ export type PagerProps = {
25
+ variants?: ComponentVariants<typeof PagerStyles>['variants']
26
+ styles?: StylesOf<PagerComposition>
27
+ children?: (((pageData: PageProps) => ReactNode) | ReactNode)[]
28
+ page?: number
29
+ style?: any
30
+ setPage?: (page: number) => void
31
+ returnEarly?: boolean
32
+ renderPageWrapper?:React.FC<PageProps>
33
+ pageWrapperProps?: any
34
+ }
35
+
36
+ export const Pager:React.FC<PagerProps> = (pagerProps) => {
37
+ const {
38
+
39
+ styles,
40
+ variants,
41
+ page,
42
+ style = {},
43
+ returnEarly = true,
44
+ renderPageWrapper,
45
+ pageWrapperProps = {},
46
+ children,
47
+ } = pagerProps
48
+
49
+ let variantStyles = useDefaultComponentStyle<'u:Pager', typeof PagerStyles>(
50
+ 'u:Pager',
51
+ {
52
+ styles,
53
+ transform: StyleSheet.flatten,
54
+ variants,
55
+ },
56
+ )
57
+ const nChildren = React.Children.count(children)
58
+
59
+ const lastPage = nChildren - 1
60
+
61
+ const childArr = React.Children.toArray(children)
62
+
63
+ const WrapperComponent = renderPageWrapper || View
64
+
65
+ // Reamimated seems to glitch if this is not done
66
+ variantStyles = JSON.parse(JSON.stringify(variantStyles))
67
+
68
+ return (
69
+ <View style={[variantStyles.wrapper, style]} >
70
+ {
71
+ childArr.map((child:PagerProps['children'][number], index) => {
72
+ const isActive = index === page
73
+ const isLast = index === lastPage
74
+ const isFirst = index === 0
75
+ const isNext = index === page + 1
76
+ const isPrevious = index === page - 1
77
+ const shouldRender = isActive || isNext || isPrevious
78
+
79
+ if (!shouldRender && returnEarly) return null
80
+ let pos = 0
81
+
82
+ if (isActive) {
83
+ pos = 1
84
+ } else if (index > page) {
85
+ pos = 2
86
+ } else {
87
+ pos = 0
88
+ }
89
+
90
+ const pageProps = {
91
+ isLast,
92
+ isActive,
93
+ isFirst,
94
+ isNext,
95
+ isPrevious,
96
+ index,
97
+ page,
98
+ }
99
+
100
+ const content = typeof child === 'function' ? child(pageProps) : child
101
+
102
+ const wrapperProps = {
103
+ key: index,
104
+ style: variantStyles.page,
105
+ animated: true,
106
+ transition: variantStyles['page:transition'],
107
+ animate: [variantStyles['page:previous'], variantStyles['page:current'], variantStyles['page:next']][pos],
108
+ ...pageWrapperProps,
109
+ }
110
+
111
+ return (
112
+ <WrapperComponent {...wrapperProps}>
113
+ {content}
114
+ </WrapperComponent>
115
+ )
116
+
117
+ })
118
+ }
119
+ </View>
120
+ )
121
+ }