react-native-interactable-with-android-link
Version:
Upgrade for react-native-interactable
147 lines (142 loc) • 3.68 kB
JavaScript
import React, { Component } from 'react';
import {
StyleSheet,
View,
Dimensions,
Image,
Text,
TouchableOpacity,
} from 'react-native';
import Animated from 'react-native-reanimated';
import Interactable from 'react-native-interactable-reanimated';
const Screen = {
width: Dimensions.get('window').width,
height: Dimensions.get('window').height - 75,
};
export default class MapPanel extends Component {
constructor(props) {
super(props);
this._deltaY = new Animated.Value(Screen.height - 100);
}
render() {
return (
<View style={styles.container}>
<Image style={styles.map} source={require('../assets/map-bg.jpg')} />
<View style={styles.panelContainer} pointerEvents={'box-none'}>
<Animated.View
pointerEvents={'box-none'}
style={[
styles.panelContainer,
{
backgroundColor: 'black',
opacity: this._deltaY.interpolate({
inputRange: [0, Screen.height - 100],
outputRange: [0.5, 0],
extrapolateRight: 'clamp',
}),
},
]}
/>
<Interactable.View
verticalOnly={true}
snapPoints={[
{ y: 40 },
{ y: Screen.height - 300 },
{ y: Screen.height - 100 },
]}
boundaries={{ top: -300 }}
initialPosition={{ y: Screen.height - 100 }}
animatedValueY={this._deltaY}
>
<View style={styles.panel}>
<View style={styles.panelHeader}>
<View style={styles.panelHandle} />
</View>
<Text style={styles.panelTitle}>San Francisco Airport</Text>
<Text style={styles.panelSubtitle}>
International Airport - 40 miles away
</Text>
<View style={styles.panelButton}>
<Text style={styles.panelButtonTitle}>Directions</Text>
</View>
<View style={styles.panelButton}>
<Text style={styles.panelButtonTitle}>Search Nearby</Text>
</View>
<Image
style={styles.photo}
source={require('../assets/airport-photo.jpg')}
/>
</View>
</Interactable.View>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#efefef',
},
panelContainer: {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
},
panel: {
height: Screen.height + 300,
padding: 20,
backgroundColor: '#f7f5eee8',
borderTopLeftRadius: 20,
borderTopRightRadius: 20,
shadowColor: '#000000',
shadowOffset: { width: 0, height: 0 },
shadowRadius: 5,
shadowOpacity: 0.4,
},
panelHeader: {
alignItems: 'center',
},
panelHandle: {
width: 40,
height: 8,
borderRadius: 4,
backgroundColor: '#00000040',
marginBottom: 10,
},
panelTitle: {
fontSize: 27,
height: 35,
},
panelSubtitle: {
fontSize: 14,
color: 'gray',
height: 30,
marginBottom: 10,
},
panelButton: {
padding: 20,
borderRadius: 10,
backgroundColor: '#318bfb',
alignItems: 'center',
marginVertical: 10,
},
panelButtonTitle: {
fontSize: 17,
fontWeight: 'bold',
color: 'white',
},
photo: {
width: Screen.width - 40,
height: 225,
marginTop: 30,
},
map: {
height: Screen.height,
width: Screen.width,
},
});