162 lines
4.8 KiB
JavaScript
162 lines
4.8 KiB
JavaScript
import React, { Component } from 'react';
|
|
import { StyleSheet, Text, View, ScrollView } from 'react-native';
|
|
import Menu, {
|
|
MenuProvider,
|
|
MenuTrigger,
|
|
MenuOptions,
|
|
MenuOption,
|
|
renderers,
|
|
} from 'react-native-popup-menu';
|
|
|
|
let unique = 0;
|
|
const { SlideInMenu } = renderers;
|
|
|
|
export default class Example extends Component {
|
|
|
|
constructor(props, ctx) {
|
|
super(props, ctx);
|
|
this.state = { log: [] };
|
|
}
|
|
|
|
selectNumber(value) {
|
|
this.addLog(`selecting number: ${value}`);
|
|
}
|
|
|
|
selectOptionType(value) {
|
|
const v = typeof value === 'object' ? JSON.stringify(value) : value;
|
|
this.addLog(`selecting type: ${v}`);
|
|
return value !== 'Do not close';
|
|
}
|
|
|
|
addLog(value) {
|
|
this.setState({
|
|
log: [...this.state.log, {
|
|
value,
|
|
id: ++unique,
|
|
}],
|
|
});
|
|
}
|
|
|
|
toggleHighlight(id) {
|
|
const log = this.state.log.map(l => {
|
|
if (l.id === id) {
|
|
return Object.assign({}, l, {highlighted: !l.highlighted});
|
|
}
|
|
return l;
|
|
})
|
|
this.setState({ log });
|
|
}
|
|
|
|
deleteLogItem(id) {
|
|
const log = this.state.log.filter(l => l.id !== id);
|
|
this.setState({ log });
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<MenuProvider style={{flex: 1}}>
|
|
<View style={styles.container}>
|
|
|
|
<View style={styles.topbar}>
|
|
<Menu name="numbers" renderer={SlideInMenu} onSelect={value => this.selectNumber(value)}>
|
|
<MenuTrigger style={styles.trigger}>
|
|
<Text style={[styles.text, styles.triggerText]}>Slide-in menu...</Text>
|
|
</MenuTrigger>
|
|
<MenuOptions customStyles={{ optionText: [styles.text, styles.slideInOption] }}>
|
|
<MenuOption value={1} text='Option one' />
|
|
<MenuOption value={2} text='Option two' />
|
|
<MenuOption value={3} text='Option three' />
|
|
<MenuOption value={4} text='Option four' />
|
|
{ null /* conditional not rendered option */ }
|
|
<MenuOption value={5} text='Option five' />
|
|
</MenuOptions>
|
|
</Menu>
|
|
<View style={{flex:1}}></View>
|
|
<Menu name="types" onSelect={value => this.selectOptionType(value)}
|
|
onBackdropPress={() => this.addLog('menu will be closed by backdrop')}
|
|
onOpen={() => this.addLog('menu is opening')}
|
|
onClose={() => this.addLog('menu is closing')}
|
|
>
|
|
<MenuTrigger style={styles.trigger}>
|
|
<Text style={[styles.text, styles.triggerText]}>Context menu...</Text>
|
|
</MenuTrigger>
|
|
<MenuOptions customStyles={{ optionText: styles.text }}>
|
|
<MenuOption value="Normal" text='Normal' />
|
|
<MenuOption value="N/A" disabled={true} text='Disabled' />
|
|
<MenuOption value="N/A" disableTouchable={true} text='Non-selectable' />
|
|
<MenuOption value="Do not close" text='Do not close' />
|
|
<View style={styles.divider}/>
|
|
<MenuOption value={{ text: 'Hello world!' }} text='Object as value' />
|
|
</MenuOptions>
|
|
</Menu>
|
|
</View>
|
|
|
|
<ScrollView style={styles.logView}>
|
|
{this.state.log.map((l, i) => {
|
|
const wrapperStyle = {backgroundColor: i % 2 ? 'white' : 'whitesmoke'};
|
|
const textStyle = {color: l.highlighted ? 'red' : 'gray'};
|
|
return (
|
|
<View style={[styles.logItem, wrapperStyle]} key={l.id}>
|
|
<Text style={[styles.text, textStyle]}>{l.value}</Text>
|
|
<View style={{flex:1}}></View>
|
|
<Menu>
|
|
<MenuTrigger text='edit' customStyles={{ triggerText: styles.text }} />
|
|
<MenuOptions customStyles={{ optionText: styles.text }}>
|
|
<MenuOption onSelect={() => this.toggleHighlight(l.id)} text={l.highlighted ? 'Unhighlight' : 'Highlight'} />
|
|
<MenuOption onSelect={() => this.deleteLogItem(l.id)} text='Delete' />
|
|
</MenuOptions>
|
|
</Menu>
|
|
</View>
|
|
);
|
|
})}
|
|
</ScrollView>
|
|
|
|
</View>
|
|
</MenuProvider>
|
|
);
|
|
}
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
flexDirection: 'column',
|
|
backgroundColor: 'lightgray',
|
|
},
|
|
topbar: {
|
|
flexDirection: 'row',
|
|
backgroundColor: 'dimgray',
|
|
paddingTop : 15,
|
|
},
|
|
trigger: {
|
|
padding: 5,
|
|
margin: 5,
|
|
},
|
|
triggerText: {
|
|
color: 'white',
|
|
},
|
|
disabled: {
|
|
color: '#ccc',
|
|
},
|
|
divider: {
|
|
marginVertical: 5,
|
|
marginHorizontal: 2,
|
|
borderBottomWidth: 1,
|
|
borderColor: '#ccc',
|
|
},
|
|
logView: {
|
|
flex: 1,
|
|
flexDirection: 'column',
|
|
},
|
|
logItem: {
|
|
flexDirection: 'row',
|
|
padding: 8,
|
|
},
|
|
slideInOption: {
|
|
padding: 5,
|
|
},
|
|
text: {
|
|
fontSize: 18,
|
|
},
|
|
});
|