@codeleap/mobile 3.25.0 → 3.25.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.
- package/package.json +4 -6
- package/src/components/ActionIcon/index.tsx +37 -55
- package/src/components/ActionIcon/styles.ts +4 -2
- package/src/components/ActivityIndicator/index.tsx +64 -42
- package/src/components/ActivityIndicator/styles.ts +10 -1
- package/src/components/Autocomplete/index.tsx +54 -46
- package/src/components/Autocomplete/styles.ts +5 -2
- package/src/components/Autocomplete/types.ts +23 -13
- package/src/components/Avatar/index.tsx +71 -59
- package/src/components/Avatar/styles.ts +9 -1
- package/src/components/AvatarGroup/index.tsx +44 -30
- package/src/components/AvatarGroup/styles.ts +6 -0
- package/src/components/Backdrop/index.tsx +34 -51
- package/src/components/Backdrop/styles.ts +10 -5
- package/src/components/Badge/index.tsx +62 -36
- package/src/components/Badge/styles.ts +11 -3
- package/src/components/Button/index.tsx +82 -55
- package/src/components/Button/styles.ts +14 -13
- package/src/components/Calendar/index.tsx +29 -35
- package/src/components/Calendar/style.ts +6 -0
- package/src/components/Checkbox/index.tsx +64 -43
- package/src/components/Checkbox/styles.ts +6 -1
- package/src/components/ContentView/index.tsx +63 -0
- package/src/components/ContentView/styles.ts +8 -0
- package/src/components/DatePickerModal/index.tsx +65 -50
- package/src/components/DatePickerModal/styles.ts +10 -9
- package/src/components/DatePickerModal/types.ts +54 -36
- package/src/components/Drawer/index.tsx +28 -0
- package/src/components/Drawer/styles.ts +8 -0
- package/src/components/EmptyPlaceholder/index.tsx +63 -40
- package/src/components/EmptyPlaceholder/styles.ts +5 -0
- package/src/components/FileInput/index.tsx +49 -11
- package/src/components/FileInput/styles.ts +8 -0
- package/src/components/Grid/index.tsx +116 -84
- package/src/components/Grid/styles.ts +5 -0
- package/src/components/Icon/index.tsx +79 -44
- package/src/components/Icon/styles.ts +6 -0
- package/src/components/Image/index.tsx +78 -58
- package/src/components/Image/styles.ts +6 -1
- package/src/components/ImageView/Spotlight.tsx +4 -1
- package/src/components/ImageView/component.tsx +2 -1
- package/src/components/InputBase/index.tsx +24 -33
- package/src/components/InputBase/styles.ts +75 -66
- package/src/components/InputBase/types.ts +4 -3
- package/src/components/InputBase/utils.ts +4 -6
- package/src/components/InputLabel/index.tsx +38 -0
- package/src/components/InputLabel/styles.ts +7 -0
- package/src/components/List/PaginationIndicator.tsx +54 -0
- package/src/components/List/index.tsx +151 -99
- package/src/components/List/styles.ts +6 -0
- package/src/components/LoadingOverlay/index.tsx +29 -42
- package/src/components/LoadingOverlay/styles.ts +7 -7
- package/src/components/Modal/index.tsx +127 -80
- package/src/components/Modal/styles.ts +8 -0
- package/src/components/Navigation/Navigation.tsx +0 -1
- package/src/components/Navigation/types.ts +9 -2
- package/src/components/NumberIncrement/index.tsx +60 -50
- package/src/components/NumberIncrement/styles.ts +5 -0
- package/src/components/NumberIncrement/types.ts +39 -32
- package/src/components/Pager/index.tsx +94 -42
- package/src/components/Pager/styles.ts +13 -1
- package/src/components/RadioInput/index.tsx +57 -32
- package/src/components/RadioInput/styles.ts +7 -5
- package/src/components/RefreshControl/index.tsx +19 -39
- package/src/components/RefreshControl/styles.ts +6 -1
- package/src/components/Scroll/index.tsx +105 -89
- package/src/components/Scroll/styles.ts +5 -0
- package/src/components/Sections/index.tsx +161 -111
- package/src/components/Sections/styles.ts +5 -0
- package/src/components/SegmentedControl/Option.tsx +31 -46
- package/src/components/SegmentedControl/index.tsx +121 -86
- package/src/components/SegmentedControl/styles.ts +22 -15
- package/src/components/Select/index.tsx +82 -71
- package/src/components/Select/styles.ts +5 -3
- package/src/components/Select/types.ts +25 -20
- package/src/components/Slider/index.tsx +43 -58
- package/src/components/Slider/styles.ts +6 -15
- package/src/components/Slider/types.ts +14 -9
- package/src/components/Switch/index.tsx +56 -43
- package/src/components/Switch/styles.ts +7 -1
- package/src/components/Text/index.tsx +52 -56
- package/src/components/Text/styles.ts +7 -1
- package/src/components/TextInput/index.tsx +162 -49
- package/src/components/TextInput/styles.ts +8 -2
- package/src/components/Touchable/index.tsx +87 -44
- package/src/components/Touchable/styles.ts +9 -0
- package/src/components/View/index.tsx +92 -23
- package/src/components/View/styles.ts +6 -0
- package/src/components/components.ts +6 -2
- package/src/components/defaultStyles.ts +77 -0
- package/src/index.ts +0 -2
- package/src/modules/PressableRipple/type.ts +0 -1
- package/src/utils/KeyboardAware/context.tsx +2 -0
- package/src/utils/KeyboardAware/keyboardHooks.ts +2 -1
- package/src/utils/ModalManager/components.tsx +30 -1
- package/src/utils/ModalManager/context.tsx +4 -4
- package/src/utils/ModalManager/index.ts +4 -1
- package/src/utils/hooks.ts +1 -12
- package/src/Registry.ts +0 -52
- package/src/components/ActionIcon/types.ts +0 -15
- package/src/components/ActivityIndicator/types.ts +0 -9
- package/src/components/Avatar/types.ts +0 -23
- package/src/components/AvatarGroup/types.ts +0 -10
- package/src/components/Backdrop/types.ts +0 -14
- package/src/components/Badge/types.ts +0 -27
- package/src/components/Button/types.ts +0 -20
- package/src/components/Checkbox/types.ts +0 -13
- package/src/components/EmptyPlaceholder/types.ts +0 -21
- package/src/components/FileInput/types.ts +0 -27
- package/src/components/Grid/types.ts +0 -20
- package/src/components/Icon/types.ts +0 -15
- package/src/components/Image/types.ts +0 -18
- package/src/components/List/types.ts +0 -41
- package/src/components/LoadingOverlay/types.ts +0 -9
- package/src/components/Modal/types.ts +0 -41
- package/src/components/Pager/types.ts +0 -37
- package/src/components/PaginationIndicator/index.tsx +0 -51
- package/src/components/PaginationIndicator/styles.ts +0 -3
- package/src/components/PaginationIndicator/types.ts +0 -10
- package/src/components/RadioInput/types.ts +0 -31
- package/src/components/RefreshControl/types.ts +0 -9
- package/src/components/Scroll/types.ts +0 -21
- package/src/components/SearchInput/index.tsx +0 -90
- package/src/components/Sections/types.ts +0 -39
- package/src/components/SegmentedControl/types.ts +0 -31
- package/src/components/Switch/types.ts +0 -12
- package/src/components/Text/types.ts +0 -18
- package/src/components/TextInput/types.ts +0 -23
- package/src/components/Touchable/types.ts +0 -27
- package/src/components/View/types.ts +0 -13
- package/src/hooks/index.ts +0 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeleap/mobile",
|
|
3
|
-
"version": "3.25.
|
|
3
|
+
"version": "3.25.2",
|
|
4
4
|
"main": "src/index.ts",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
20
|
"@codeleap/common": "*",
|
|
21
|
-
"@codeleap/styles": "*",
|
|
22
21
|
"@react-native-community/async-storage": "1.12.1",
|
|
23
22
|
"@react-native-firebase/messaging": "14.4.0",
|
|
24
23
|
"@react-navigation/bottom-tabs": "6.5.3",
|
|
@@ -29,7 +28,7 @@
|
|
|
29
28
|
"react": "18.1.0",
|
|
30
29
|
"react-native": "0.73.8",
|
|
31
30
|
"react-native-calendars": "1.1293.0",
|
|
32
|
-
"react-native-date-picker": "4.2.13",
|
|
31
|
+
"react-native-date-picker": "^4.2.13",
|
|
33
32
|
"react-native-device-info": "10.3.0",
|
|
34
33
|
"react-native-fast-image": "8.6.3",
|
|
35
34
|
"react-native-gesture-handler": "2.9.0",
|
|
@@ -38,13 +37,12 @@
|
|
|
38
37
|
"react-native-image-viewing": "0.2.2",
|
|
39
38
|
"react-native-keyboard-aware-scroll-view": "0.9.5",
|
|
40
39
|
"typescript": "5.0.4",
|
|
41
|
-
"react-native-avoid-softinput": "3.1.5"
|
|
42
|
-
"react-native-mmkv": "2.12.2"
|
|
40
|
+
"react-native-avoid-softinput": "^3.1.5"
|
|
43
41
|
},
|
|
44
42
|
"dependencies": {
|
|
45
43
|
"@gorhom/portal": "1.0.14",
|
|
46
44
|
"@miblanchard/react-native-slider": "2.3.1",
|
|
47
|
-
"date-fns": "2.29.3",
|
|
45
|
+
"date-fns": "^2.29.3",
|
|
48
46
|
"react-native-masked-text": "1.13.0",
|
|
49
47
|
"react-native-uuid": "2.0.1"
|
|
50
48
|
}
|
|
@@ -1,63 +1,45 @@
|
|
|
1
|
+
import { ComponentVariants, getNestedStylesByKey, useDefaultComponentStyle } from '@codeleap/common'
|
|
1
2
|
import React from 'react'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Badge } from '../Badge'
|
|
5
|
-
import { Icon } from '../Icon'
|
|
6
|
-
import { Touchable } from '../Touchable'
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export
|
|
11
|
-
|
|
3
|
+
import { StyleSheet } from 'react-native'
|
|
4
|
+
import { StylesOf } from '../../types'
|
|
5
|
+
import { Badge, BadgeComponentProps } from '../Badge'
|
|
6
|
+
import { Icon, IconProps } from '../Icon'
|
|
7
|
+
import { Touchable, TouchableProps } from '../Touchable'
|
|
8
|
+
import { ActionIconComposition, ActionIconPresets } from './styles'
|
|
9
|
+
|
|
10
|
+
/** * IconButton */
|
|
11
|
+
export type ActionIconProps= {
|
|
12
|
+
iconProps?: Partial<IconProps>
|
|
13
|
+
/** prop */
|
|
14
|
+
icon?: IconProps['name']
|
|
15
|
+
/** prop */
|
|
16
|
+
name?: IconProps['name']
|
|
17
|
+
styles?: StylesOf<ActionIconComposition> | StylesOf<ActionIconComposition>[]
|
|
18
|
+
} & Omit<TouchableProps, 'styles' | 'variants'> & ComponentVariants<typeof ActionIconPresets> & BadgeComponentProps
|
|
12
19
|
|
|
13
20
|
export const ActionIcon = (props: ActionIconProps) => {
|
|
14
|
-
const {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<Touchable {...touchableProps} style={compositionStyles?.touchable}>
|
|
34
|
-
<Icon
|
|
35
|
-
name={icon ?? name}
|
|
36
|
-
{...iconProps}
|
|
37
|
-
style={[
|
|
38
|
-
styles.icon,
|
|
39
|
-
touchableProps?.disabled && styles['icon:disabled'],
|
|
40
|
-
]}
|
|
41
|
-
/>
|
|
42
|
-
|
|
43
|
-
{children}
|
|
44
|
-
|
|
45
|
-
<Badge badge={badge} {...badgeProps} style={compositionStyles?.badge} />
|
|
46
|
-
</Touchable>
|
|
47
|
-
)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
ActionIcon.styleRegistryName = 'ActionIcon'
|
|
51
|
-
ActionIcon.elements = ['icon', 'touchable', 'badge']
|
|
52
|
-
ActionIcon.rootElement = 'touchableWrapper'
|
|
53
|
-
|
|
54
|
-
ActionIcon.withVariantTypes = <S extends AnyRecord>(styles: S) => {
|
|
55
|
-
return ActionIcon as (props: StyledComponentProps<ActionIconProps, typeof styles>) => IJSX
|
|
21
|
+
const { name, icon, iconProps, variants, styles, children, badge = false, badgeProps = {}, ...touchableProps } = props
|
|
22
|
+
const variantStyles = useDefaultComponentStyle<'u:ActionIcon', typeof ActionIconPresets>('u:ActionIcon', {
|
|
23
|
+
variants, styles, transform: StyleSheet.flatten,
|
|
24
|
+
})
|
|
25
|
+
const touchableStyles = getNestedStylesByKey('touchable', variantStyles)
|
|
26
|
+
|
|
27
|
+
const badgeStyles = getNestedStylesByKey('badge', variantStyles)
|
|
28
|
+
|
|
29
|
+
return <Touchable styles={touchableStyles} {...touchableProps}>
|
|
30
|
+
<Icon name={icon ?? name} style={
|
|
31
|
+
[
|
|
32
|
+
variantStyles.icon,
|
|
33
|
+
touchableProps?.disabled && variantStyles['icon:disabled'],
|
|
34
|
+
]} {...iconProps}/>
|
|
35
|
+
{children}
|
|
36
|
+
|
|
37
|
+
<Badge badge={badge} style={badgeStyles} {...badgeProps} />
|
|
38
|
+
</Touchable>
|
|
56
39
|
}
|
|
57
40
|
|
|
58
41
|
ActionIcon.defaultProps = {
|
|
59
42
|
hitSlop: 10,
|
|
60
|
-
|
|
61
|
-
} as Partial<ActionIconProps>
|
|
43
|
+
}
|
|
62
44
|
|
|
63
|
-
|
|
45
|
+
export * from './styles'
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { createDefaultVariantFactory, includePresets } from '@codeleap/common'
|
|
1
2
|
import { BadgeComposition } from '../Badge'
|
|
2
3
|
import { TouchableComposition } from '../Touchable'
|
|
3
4
|
|
|
4
5
|
export type ActionIconParts = 'icon' | `touchable${Capitalize<TouchableComposition>}` | `badge${Capitalize<BadgeComposition>}`
|
|
5
|
-
|
|
6
6
|
export type ActionIconStates = ':disabled' | ''
|
|
7
|
-
|
|
8
7
|
export type ActionIconComposition = `${ActionIconParts}${ActionIconStates}`
|
|
8
|
+
const createActionIconStyle = createDefaultVariantFactory<ActionIconComposition>()
|
|
9
|
+
|
|
10
|
+
export const ActionIconPresets = includePresets((style) => createActionIconStyle(() => ({ touchableWrapper: style })))
|
|
@@ -1,48 +1,70 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { ActivityIndicatorProps } from '
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { forwardRef } from 'react'
|
|
3
|
+
import { ActivityIndicator as Indicator, ActivityIndicatorProps as IndicatorProps, StyleSheet } from 'react-native'
|
|
4
|
+
import {
|
|
5
|
+
|
|
6
|
+
useDefaultComponentStyle,
|
|
7
|
+
ComponentVariants,
|
|
8
|
+
useCodeleapContext,
|
|
9
|
+
} from '@codeleap/common'
|
|
10
|
+
import { ComponentWithDefaultProps, StylesOf } from '../../types'
|
|
11
|
+
import {
|
|
12
|
+
ActivityIndicatorComposition,
|
|
13
|
+
ActivityIndicatorPresets,
|
|
14
|
+
} from './styles'
|
|
8
15
|
|
|
9
16
|
export * from './styles'
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
...rest
|
|
17
|
-
} = {
|
|
18
|
-
...ActivityIndicator.defaultProps,
|
|
19
|
-
...props,
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const styles = useStylesFor(ActivityIndicator.styleRegistryName, style)
|
|
23
|
-
|
|
24
|
-
const wrapperStyle = styles?.wrapper as CSSProperties
|
|
25
|
-
|
|
26
|
-
const color = wrapperStyle?.color || '#000'
|
|
27
|
-
const size = (wrapperStyle?.height || wrapperStyle?.width || 'large') as number
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<Component
|
|
31
|
-
size={size}
|
|
32
|
-
color={color}
|
|
33
|
-
{...rest}
|
|
34
|
-
style={styles?.wrapper}
|
|
35
|
-
/>
|
|
36
|
-
)
|
|
17
|
+
export type ActivityIndicatorProps =
|
|
18
|
+
IndicatorProps
|
|
19
|
+
& {
|
|
20
|
+
variants?: ComponentVariants<typeof ActivityIndicatorPresets>['variants']
|
|
21
|
+
styles?: StylesOf<ActivityIndicatorComposition>
|
|
22
|
+
component?: (props: Omit<ActivityIndicatorProps & {ref?: React.Ref<Indicator>}, 'component'>) => JSX.Element
|
|
37
23
|
}
|
|
38
24
|
|
|
39
|
-
|
|
40
|
-
ActivityIndicator.elements = ['wrapper']
|
|
41
|
-
ActivityIndicator.rootElement = 'wrapper'
|
|
42
|
-
ActivityIndicator.defaultProps = {} as Partial<ActionIconProps>
|
|
25
|
+
type TActivityIndicator = ComponentWithDefaultProps<ActivityIndicatorProps>
|
|
43
26
|
|
|
44
|
-
ActivityIndicator
|
|
45
|
-
|
|
46
|
-
|
|
27
|
+
export const ActivityIndicator = forwardRef<Indicator, ActivityIndicatorProps>(
|
|
28
|
+
(activityIndicatorProps, ref) => {
|
|
29
|
+
const {
|
|
30
|
+
variants = [],
|
|
31
|
+
style = {},
|
|
32
|
+
styles: propStyles = {},
|
|
33
|
+
component = Indicator,
|
|
34
|
+
...props
|
|
35
|
+
} = {
|
|
36
|
+
...ActivityIndicator.defaultProps,
|
|
37
|
+
...activityIndicatorProps,
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const variantStyles = useDefaultComponentStyle('ActivityIndicator', {
|
|
42
|
+
variants,
|
|
43
|
+
transform: StyleSheet.flatten,
|
|
44
|
+
styles: propStyles,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const { Theme } = useCodeleapContext()
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
const styles = StyleSheet.flatten([variantStyles.wrapper, style])
|
|
50
|
+
const color = styles?.color || Theme.colors.gray
|
|
51
|
+
const size = styles?.height || styles?.width || 'large'
|
|
52
|
+
|
|
53
|
+
const Component = component
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<Component
|
|
57
|
+
size={size}
|
|
58
|
+
ref={ref}
|
|
59
|
+
color={color}
|
|
60
|
+
style={styles}
|
|
61
|
+
styles={styles}
|
|
62
|
+
{...props}
|
|
63
|
+
/>
|
|
64
|
+
)
|
|
65
|
+
},
|
|
66
|
+
) as TActivityIndicator
|
|
67
|
+
|
|
68
|
+
ActivityIndicator.defaultProps = {
|
|
69
|
+
component: forwardRef(({ size, color, style }, ref) => <Indicator size={size} color={color} style={style} ref={ref}/>),
|
|
70
|
+
}
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
+
import { createDefaultVariantFactory, includePresets } from '@codeleap/common'
|
|
1
2
|
|
|
2
|
-
export type ActivityIndicatorComposition =
|
|
3
|
+
export type ActivityIndicatorComposition =
|
|
4
|
+
| 'wrapper'
|
|
5
|
+
| 'backCircle'
|
|
6
|
+
| 'frontCircle'
|
|
7
|
+
| 'circle'
|
|
8
|
+
|
|
9
|
+
const createActivityIndicatorStyle = createDefaultVariantFactory<ActivityIndicatorComposition>()
|
|
10
|
+
|
|
11
|
+
export const ActivityIndicatorPresets = includePresets((styles) => createActivityIndicatorStyle(() => ({ wrapper: styles })))
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useDefaultComponentStyle,
|
|
3
|
+
TypeGuards,
|
|
4
|
+
useNestedStylesByKey,
|
|
5
|
+
FormTypes,
|
|
6
|
+
onMount,
|
|
7
|
+
useSearch,
|
|
8
|
+
} from '@codeleap/common'
|
|
1
9
|
import React, { useCallback } from 'react'
|
|
2
|
-
import {
|
|
10
|
+
import { StyleSheet } from 'react-native'
|
|
3
11
|
import { List } from '../List'
|
|
4
|
-
import { SearchInput } from '../
|
|
12
|
+
import { SearchInput } from '../TextInput'
|
|
13
|
+
import { AutocompletePresets } from './styles'
|
|
5
14
|
import { AutocompleteProps } from './types'
|
|
6
15
|
import { Button } from '../Button'
|
|
7
16
|
import { View } from '../View'
|
|
8
|
-
import { AnyRecord, AppIcon, IJSX, StyledComponentProps, useCompositionStyles } from '@codeleap/styles'
|
|
9
|
-
import { MobileStyleRegistry } from '../../Registry'
|
|
10
|
-
import { useStylesFor } from '../../hooks'
|
|
11
|
-
|
|
12
17
|
export * from './styles'
|
|
13
|
-
export * from './types'
|
|
14
18
|
|
|
15
19
|
const defaultFilterFunction = (search: string, options: FormTypes.Options<any>) => {
|
|
16
20
|
return options.filter((option) => {
|
|
@@ -22,40 +26,51 @@ const defaultFilterFunction = (search: string, options: FormTypes.Options<any>)
|
|
|
22
26
|
})
|
|
23
27
|
}
|
|
24
28
|
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
if (option.length === 0) return null
|
|
29
|
+
const defaultProps: Partial<AutocompleteProps<any, boolean>> = {
|
|
30
|
+
getLabel(option) {
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
if (TypeGuards.isArray(option)) {
|
|
33
|
+
|
|
34
|
+
if (option.length === 0) return null
|
|
35
|
+
|
|
36
|
+
return option.map(o => o.label).join(', ')
|
|
37
|
+
|
|
38
|
+
} else {
|
|
39
|
+
if (!option) return null
|
|
40
|
+
return option?.label
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
searchInputProps: {},
|
|
44
|
+
selectedIcon: 'check' as any,
|
|
45
|
+
searchComponent: SearchInput,
|
|
34
46
|
}
|
|
35
47
|
|
|
36
48
|
export const Autocomplete = <T extends string | number = string, Multi extends boolean = false>(autocomplete: AutocompleteProps<T, Multi>) => {
|
|
37
49
|
const allProps = {
|
|
38
|
-
...
|
|
50
|
+
...defaultProps,
|
|
39
51
|
...autocomplete,
|
|
40
52
|
}
|
|
41
53
|
|
|
42
54
|
const {
|
|
43
55
|
value,
|
|
44
56
|
onValueChange,
|
|
57
|
+
styles = {},
|
|
45
58
|
options = [],
|
|
59
|
+
variants,
|
|
46
60
|
renderItem,
|
|
61
|
+
|
|
47
62
|
debugName,
|
|
48
|
-
placeholder,
|
|
63
|
+
placeholder = 'Select',
|
|
49
64
|
itemProps = {},
|
|
50
|
-
searchable,
|
|
65
|
+
searchable = true,
|
|
51
66
|
loadOptions,
|
|
52
|
-
multiple,
|
|
67
|
+
multiple = false,
|
|
53
68
|
limit = null,
|
|
54
69
|
defaultOptions = options,
|
|
55
70
|
onLoadOptionsError,
|
|
56
71
|
selectedIcon,
|
|
57
72
|
loadOptionsOnMount = defaultOptions.length === 0,
|
|
58
|
-
selectable,
|
|
73
|
+
selectable = false,
|
|
59
74
|
searchComponent,
|
|
60
75
|
filterItems = defaultFilterFunction,
|
|
61
76
|
searchInputProps: searchProps = {},
|
|
@@ -93,13 +108,21 @@ export const Autocomplete = <T extends string | number = string, Multi extends b
|
|
|
93
108
|
}
|
|
94
109
|
})
|
|
95
110
|
|
|
96
|
-
const
|
|
111
|
+
const variantStyles = useDefaultComponentStyle<'u:Autocomplete', typeof AutocompletePresets>('u:Autocomplete', {
|
|
112
|
+
transform: StyleSheet.flatten,
|
|
113
|
+
rootElement: 'inputWrapper',
|
|
114
|
+
styles,
|
|
115
|
+
variants,
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
const itemStyles = useNestedStylesByKey('item', variantStyles)
|
|
97
119
|
|
|
98
|
-
const
|
|
120
|
+
const listStyles = useNestedStylesByKey('list', variantStyles)
|
|
99
121
|
|
|
100
122
|
const currentOptions = searchable ? filteredOptions : defaultOptions
|
|
101
123
|
|
|
102
124
|
const select = (selectedValue) => {
|
|
125
|
+
|
|
103
126
|
let newValue = null
|
|
104
127
|
|
|
105
128
|
let newOption = null
|
|
@@ -140,11 +163,13 @@ export const Autocomplete = <T extends string | number = string, Multi extends b
|
|
|
140
163
|
} else {
|
|
141
164
|
setLabelOptions([newOption])
|
|
142
165
|
}
|
|
166
|
+
|
|
143
167
|
}
|
|
144
168
|
|
|
145
169
|
const Item = renderItem || Button
|
|
146
170
|
|
|
147
171
|
const renderListItem = useCallback(({ item }) => {
|
|
172
|
+
|
|
148
173
|
let selected = false
|
|
149
174
|
|
|
150
175
|
if (multiple && isValueArray) {
|
|
@@ -168,7 +193,7 @@ export const Autocomplete = <T extends string | number = string, Multi extends b
|
|
|
168
193
|
rightIcon={selectedIcon}
|
|
169
194
|
// @ts-ignore
|
|
170
195
|
icon={selectedIcon}
|
|
171
|
-
|
|
196
|
+
styles={itemStyles}
|
|
172
197
|
{...itemProps}
|
|
173
198
|
/>
|
|
174
199
|
}, [value, select, multiple, selectable, isValueArray])
|
|
@@ -177,7 +202,7 @@ export const Autocomplete = <T extends string | number = string, Multi extends b
|
|
|
177
202
|
|
|
178
203
|
const showLoading = TypeGuards.isFunction(loadingProp) ? loadingProp(loading) : (loadingProp || loading)
|
|
179
204
|
|
|
180
|
-
return <View style={
|
|
205
|
+
return <View style={[variantStyles.wrapper, style]}>
|
|
181
206
|
<Search
|
|
182
207
|
placeholder={placeholder}
|
|
183
208
|
debugName={debugName}
|
|
@@ -190,14 +215,13 @@ export const Autocomplete = <T extends string | number = string, Multi extends b
|
|
|
190
215
|
onSearchChange={onChangeSearch}
|
|
191
216
|
hideErrorMessage
|
|
192
217
|
{...searchProps}
|
|
193
|
-
style={compositionStyles?.searchInput}
|
|
194
218
|
/>
|
|
195
219
|
|
|
196
|
-
<List
|
|
220
|
+
<List<any>
|
|
197
221
|
data={searchable ? filteredOptions : options}
|
|
198
222
|
scrollEnabled={false}
|
|
199
223
|
showsHorizontalScrollIndicator={false}
|
|
200
|
-
|
|
224
|
+
styles={listStyles}
|
|
201
225
|
// @ts-ignore
|
|
202
226
|
keyExtractor={(i) => i.value}
|
|
203
227
|
renderItem={renderListItem}
|
|
@@ -209,23 +233,7 @@ export const Autocomplete = <T extends string | number = string, Multi extends b
|
|
|
209
233
|
</View>
|
|
210
234
|
}
|
|
211
235
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
Autocomplete.rootElement = 'wrapper'
|
|
215
|
-
|
|
216
|
-
Autocomplete.withVariantTypes = <S extends AnyRecord>(styles: S) => {
|
|
217
|
-
return Autocomplete as (<T extends string | number = string, Multi extends boolean = false>(props: StyledComponentProps<AutocompleteProps<T, Multi>, typeof styles>) => IJSX)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
Autocomplete.defaultProps = {
|
|
221
|
-
getLabel: defaultGetLabel,
|
|
222
|
-
searchInputProps: {},
|
|
223
|
-
selectedIcon: 'check' as AppIcon,
|
|
224
|
-
searchComponent: SearchInput,
|
|
225
|
-
placeholder: 'Select',
|
|
226
|
-
searchable: true,
|
|
227
|
-
multiple: false,
|
|
228
|
-
selectable: false,
|
|
229
|
-
} as Partial<AutocompleteProps<any, boolean>>
|
|
236
|
+
export * from './styles'
|
|
237
|
+
export * from './types'
|
|
230
238
|
|
|
231
|
-
|
|
239
|
+
Autocomplete.defaultProps = defaultProps
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { ButtonComposition } from '
|
|
1
|
+
import { ButtonComposition, createDefaultVariantFactory, includePresets, TextInputComposition } from '@codeleap/common'
|
|
2
2
|
import { ListComposition } from '../List'
|
|
3
|
-
import { TextInputComposition } from '../TextInput'
|
|
4
3
|
|
|
5
4
|
type ItemStates = '' | ':selected'
|
|
6
5
|
|
|
@@ -13,3 +12,7 @@ export type AutocompleteComposition =
|
|
|
13
12
|
`list${Capitalize<ListComposition>}` |
|
|
14
13
|
`item${Capitalize<ItemComposition>}` |
|
|
15
14
|
`searchInput${Capitalize<TextInputComposition>}`
|
|
15
|
+
|
|
16
|
+
const createSelectStyle = createDefaultVariantFactory<AutocompleteComposition>()
|
|
17
|
+
|
|
18
|
+
export const AutocompletePresets = includePresets((style) => createSelectStyle(() => ({ wrapper: style })))
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ComponentVariants,
|
|
3
|
+
FormTypes,
|
|
4
|
+
IconPlaceholder,
|
|
5
|
+
PropsOf,
|
|
6
|
+
} from '@codeleap/common'
|
|
7
|
+
import { AutocompletePresets } from '.'
|
|
2
8
|
import { StylesOf } from '../../types/utility'
|
|
3
9
|
import { GetKeyboardAwarePropsOptions } from '../../utils'
|
|
4
10
|
import { Icon } from '../Icon'
|
|
5
11
|
import { FlatListProps } from '../List'
|
|
6
12
|
import { Text } from '../Text'
|
|
7
|
-
import { SearchInputProps } from '../
|
|
13
|
+
import { SearchInputProps, TextInputProps } from '../TextInput'
|
|
8
14
|
import { Touchable } from '../Touchable'
|
|
9
|
-
import { EmptyPlaceholderProps } from '../EmptyPlaceholder'
|
|
10
|
-
import { AppIcon, StyledProp } from '@codeleap/styles'
|
|
11
15
|
import { AutocompleteComposition } from './styles'
|
|
16
|
+
import { EmptyPlaceholderProps } from '../EmptyPlaceholder'
|
|
12
17
|
|
|
13
18
|
export type AutocompleteRenderFNProps<T> = {
|
|
14
|
-
|
|
19
|
+
styles: StylesOf<AutocompleteComposition>
|
|
15
20
|
onPress: () => void
|
|
16
21
|
isSelected?: boolean
|
|
17
22
|
item: FormTypes.Options<T>[number]
|
|
@@ -43,20 +48,21 @@ export type ReplaceAutocompleteProps<Props, T, Multi extends boolean = false> =
|
|
|
43
48
|
keyof ValueBoundAutocompleteProps<T, Multi>
|
|
44
49
|
> & ValueBoundAutocompleteProps<T, Multi>
|
|
45
50
|
|
|
46
|
-
export type AutocompleteProps<T = any, Multi extends boolean = false> =
|
|
47
|
-
Omit<FlatListProps<T>, 'renderItem' | 'style'> &
|
|
48
|
-
ValueBoundAutocompleteProps<T, Multi> &
|
|
49
|
-
{
|
|
51
|
+
export type AutocompleteProps<T = any, Multi extends boolean = false> = {
|
|
50
52
|
placeholder?: string
|
|
51
53
|
label?: FormTypes.Label
|
|
54
|
+
styles?: StylesOf<AutocompleteComposition>
|
|
55
|
+
style?: TextInputProps['style']
|
|
52
56
|
closeOnSelect?: boolean
|
|
53
|
-
|
|
57
|
+
|
|
54
58
|
keyboardAware?: GetKeyboardAwarePropsOptions
|
|
55
59
|
multiple?: Multi
|
|
56
|
-
itemProps?: Partial<
|
|
60
|
+
itemProps?: Partial<
|
|
61
|
+
Pick<AutocompleteRenderFNProps<any>, 'iconProps'|'textProps'|'touchableProps'
|
|
62
|
+
>>
|
|
57
63
|
searchable?: boolean
|
|
58
64
|
limit?: number
|
|
59
|
-
selectedIcon?:
|
|
65
|
+
selectedIcon?: IconPlaceholder
|
|
60
66
|
loadOptionsOnMount?: boolean
|
|
61
67
|
loadOptionsOnOpen?: boolean
|
|
62
68
|
selectable?: boolean
|
|
@@ -64,6 +70,10 @@ export type AutocompleteProps<T = any, Multi extends boolean = false> =
|
|
|
64
70
|
debugName: string
|
|
65
71
|
searchComponent?: React.ComponentType<SearchInputProps>
|
|
66
72
|
listPlaceholder?: Partial<EmptyPlaceholderProps>
|
|
67
|
-
listProps?: Partial<Omit<FlatListProps<T>, 'renderItem'
|
|
73
|
+
listProps?: Partial<Omit<FlatListProps<T>, 'renderItem'|'styles'|'style'>>
|
|
68
74
|
loading: boolean | ((isLoading: boolean) => boolean)
|
|
69
75
|
}
|
|
76
|
+
& Omit<FlatListProps<T>, 'renderItem'|'styles'|'style'>
|
|
77
|
+
& ComponentVariants<typeof AutocompletePresets>
|
|
78
|
+
& ValueBoundAutocompleteProps<T, Multi>
|
|
79
|
+
|