react-native-ios-context-menu/example/src/examples/ContextMenuViewTest07.tsx
Dominic Go 6344ffdeba 💫 Example - Updated Example/Test Components
Summary: Updated components from `example/src/examples` to use the new API's.
2021-12-25 18:06:21 +08:00

297 lines
8.4 KiB
TypeScript

import * as React from 'react';
import { StyleSheet, View, Text, Switch, findNodeHandle } from 'react-native';
import { ContextMenuView, MenuPreviewConfig } from 'react-native-ios-context-menu';
import type { ContextMenuExampleProps } from './SharedExampleTypes';
import { ContextMenuCard } from '../components/ContextMenuCard';
export function ContextMenuViewTest07(props: ContextMenuExampleProps) {
const [counter, setCounter] = React.useState(0);
const [targetViewNode, setTargetViewNode] = React.useState(null);
const [isResizeAnimated, setIsResizeAnimated] = React.useState(false);
const [togglePreviewType, setTogglePreviewType] = React.useState(false);
const [togglePreviewSize, setTogglePreviewSize] = React.useState(false);
const [toggleBgTransparent, setToggleBgTransparent] = React.useState(false);
const [toggleTargetViewNode, setToggleTargetViewNode] = React.useState(false);
const [togglePreferredCommitStyle, setTogglePreferredCommitStyle] = React.useState(false);
const intervalRef = React.useRef<NodeJS.Timer | undefined>();
React.useEffect(() => {
return () => {
if(!intervalRef.current) return;
clearInterval(intervalRef.current);
};
}, []);
const previewConfig: MenuPreviewConfig = {
previewType:
(togglePreviewType? 'CUSTOM' : 'DEFAULT'),
previewSize:
(togglePreviewSize? 'STRETCH' : 'INHERIT'),
preferredCommitStyle:
(togglePreferredCommitStyle? 'pop' : 'dismiss'),
backgroundColor:
(toggleBgTransparent ? 'white' : 'rgba(255,255,255,0.5)'),
isResizeAnimated,
...(toggleTargetViewNode && {
targetViewNode
}),
};
return (
<ContextMenuView
style={props.style}
menuConfig={{
menuTitle: 'ContextMenuViewTest07',
menuItems: [{
actionKey : 'add',
actionTitle: `Add 100`,
discoverabilityTitle: `Current counter: ${counter}`,
icon: {
type: 'IMAGE_SYSTEM',
imageValue: {
systemName: 'plus',
},
}
},
(counter > 0) && {
actionKey : 'reset',
actionTitle : `Reset Counter`,
menuAttributes: ['destructive'],
icon: {
type: 'IMAGE_SYSTEM',
imageValue: {
systemName: 'trash',
},
}
}],
}}
previewConfig={previewConfig}
renderPreview={() => (
<View style={[styles.previewContainer]}>
<Text style={styles.previewTitleText}>
{'Hello World'}
</Text>
{(counter % 2 === 0) && (
<Text style={styles.previewCounterText}>
{`Counter: ${counter}`}
</Text>
)}
</View>
)}
onMenuWillShow={() => {
intervalRef.current = setInterval(() => {
setCounter((prevValue) => (prevValue + 1));
}, 1000);
}}
onMenuWillHide={() => {
if(!intervalRef.current) return;
clearInterval(intervalRef.current);
}}
onPressMenuItem={({nativeEvent}) => {
switch (nativeEvent.actionKey) {
case 'add':
setCounter((prevValue) => (prevValue + 100));
break;
case 'reset':
setCounter(0);
break;
};
}}
>
<ContextMenuCard
index={props.index}
title={'ContextMenuViewTest07'}
subtitle={'Custom Preview'}
description={[
`Test for the different possible custom menu preview config`
]}
>
{toggleTargetViewNode && (
<View
style={styles.targetViewContainer}
ref={ref => {
setTargetViewNode(
findNodeHandle(ref)
);
}}
>
<Text style={styles.targetViewText}>
{'Target View'}
</Text>
</View>
)}
<View style={styles.rowContainer}>
<View style={styles.textRowContainer}>
<Text style={styles.textRowTitle}>
{'previewType'}
</Text>
<Text style={styles.textRowSubtitle}>
<Text style={styles.textRowSubtitleLabel}>
{'Value: '}
</Text>
{previewConfig.previewType}
</Text>
</View>
<Switch
value={togglePreviewType}
onValueChange={(flag) => {
setTogglePreviewType(flag);
}}
/>
</View>
<View style={styles.rowContainer}>
<View style={styles.textRowContainer}>
<Text style={styles.textRowTitle}>
{'previewSize'}
</Text>
<Text style={styles.textRowSubtitle}>
<Text style={styles.textRowSubtitleLabel}>
{'Value: '}
</Text>
{previewConfig.previewSize}
</Text>
</View>
<Switch
value={togglePreviewSize}
onValueChange={(flag) => {
setTogglePreviewSize(flag);
}}
/>
</View>
<View style={styles.rowContainer}>
<View style={styles.textRowContainer}>
<Text style={styles.textRowTitle}>
{'backgroundColor'}
</Text>
<Text style={styles.textRowSubtitle}>
<Text style={styles.textRowSubtitleLabel}>
{'Value: '}
</Text>
{previewConfig.backgroundColor}
</Text>
</View>
<Switch
value={toggleBgTransparent}
onValueChange={(flag) => {
setToggleBgTransparent(flag);
}}
/>
</View>
<View style={styles.rowContainer}>
<View style={styles.textRowContainer}>
<Text style={styles.textRowTitle}>
{'isResizeAnimated'}
</Text>
<Text style={styles.textRowSubtitle}>
<Text style={styles.textRowSubtitleLabel}>
{'Value: '}
</Text>
{previewConfig.isResizeAnimated? 'true' : 'false'}
</Text>
</View>
<Switch
value={isResizeAnimated}
onValueChange={(flag) => {
setIsResizeAnimated(flag);
}}
/>
</View>
<View style={styles.rowContainer}>
<View style={styles.textRowContainer}>
<Text style={styles.textRowTitle}>
{'preferredCommitStyle'}
</Text>
<Text style={styles.textRowSubtitle}>
<Text style={styles.textRowSubtitleLabel}>
{'Value: '}
</Text>
{previewConfig.preferredCommitStyle}
</Text>
</View>
<Switch
value={togglePreferredCommitStyle}
onValueChange={(flag) => {
setTogglePreferredCommitStyle(flag)
}}
/>
</View>
<View style={styles.rowContainer}>
<View style={styles.textRowContainer}>
<Text style={styles.textRowTitle}>
{'targetViewNode'}
</Text>
<Text style={styles.textRowSubtitle}>
<Text style={styles.textRowSubtitleLabel}>
{'Value: '}
</Text>
{previewConfig.targetViewNode}
</Text>
</View>
<Switch
value={toggleTargetViewNode}
onValueChange={(flag) => {
setToggleTargetViewNode(flag);
}}
/>
</View>
</ContextMenuCard>
</ContextMenuView>
);
};
const styles = StyleSheet.create({
rowContainer: {
flexDirection: 'row',
marginVertical: 10,
alignItems: 'center',
},
textRowContainer: {
flex: 1,
},
textRowTitle: {
fontSize: 16,
fontWeight: '400'
},
textRowSubtitle: {
color: 'rgba(0,0,0,0.6)'
},
textRowSubtitleLabel: {
fontWeight: 'bold'
},
targetViewContainer: {
padding: 15,
backgroundColor: 'rgba(255,255,255,0.5)',
borderRadius: 10,
marginVertical: 10,
alignItems: 'center',
},
targetViewText: {
fontSize: 16,
fontWeight: '400',
},
previewContainer: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
padding: 20
},
previewTitleText: {
fontWeight: '700',
fontSize: 32
},
previewCounterText: {
fontWeight: '700',
fontSize: 32,
marginTop: 10
},
});