UNPKG

react-native-interactable-with-android-link

Version:
147 lines (142 loc) 3.68 kB
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, }, });