-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathCardActions.tsx
More file actions
84 lines (72 loc) · 1.96 KB
/
CardActions.tsx
File metadata and controls
84 lines (72 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import * as React from 'react';
import { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';
import type { ThemeProp } from 'src/types';
import { useInternalTheme } from '@/core/theming';
import { CardActionChildProps } from './utils';
export type Props = React.ComponentPropsWithRef<typeof View> & {
/**
* Items inside the `CardActions`.
*/
children: React.ReactNode;
style?: StyleProp<ViewStyle>;
theme?: ThemeProp;
};
/**
* A component to show a list of actions inside a Card.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Card, Button } from 'react-native-paper';
*
* const MyComponent = () => (
* <Card>
* <Card.Actions>
* <Button>Cancel</Button>
* <Button>Ok</Button>
* </Card.Actions>
* </Card>
* );
*
* export default MyComponent;
* ```
*/
const CardActions = ({ theme, style, children, ...rest }: Props) => {
const { isV3 } = useInternalTheme(theme);
const justifyContent = (
isV3 ? 'flex-end' : 'flex-start'
) as ViewStyle['justifyContent'];
const containerStyle = [styles.container, { justifyContent }, style];
return (
<View {...rest} style={containerStyle}>
{React.Children.map(children, (child, index) => {
if (!React.isValidElement<CardActionChildProps>(child)) {
return child;
}
const compact = !isV3 && child.props.compact !== false;
const mode =
child.props.mode ??
(isV3 ? (index === 0 ? 'outlined' : 'contained') : undefined);
const childStyle = [isV3 && styles.button, child.props.style];
return React.cloneElement(child, {
...child.props,
compact,
mode,
style: childStyle,
});
})}
</View>
);
};
CardActions.displayName = 'Card.Actions';
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
},
button: {
marginLeft: 8,
},
});
export default CardActions;