Distance.js 8.5 KB
import React, {Component, createRef} from 'react';
import { withNavigation } from 'react-navigation';
import { DrawerActions } from 'react-navigation-drawer';
import {View,Text,Dimensions,TouchableOpacity} from 'react-native'
import AsyncStorage from '@react-native-community/async-storage'
import Modal from 'react-native-modal'
import Slider from "react-native-slider";
import Filter from '../assets/filter.svg'
import Arrow from '../assets/arrow_bottom.svg'

class Distance extends Component{
    state={
        visible:false,  
        pushData:[],
        not_checked:0,
        isModalVisible:false,
        value:0,
        distance:0,
        width:0,
        current:""
    }
    constructor(props) {
        super(props)
        this.calculateDistance = this.calculateDistance.bind(this)
        this.width = React.createRef()
    }
  componentDidMount() {
    AsyncStorage.getItem("current",(err,res) => {
        this.setState({current:JSON.parse(res)})
    })
    AsyncStorage.getItem("distance",(err,res) => {
        if(!res) {
            AsyncStorage.setItem("distance",JSON.stringify({value:0.5,distance:500}))
            this.setState({
                value:0.5,
                distance:500
            })
        }
        else {
            this.setState({
                value:JSON.parse(res).value,
                distance:JSON.parse(res).distance
            })
        }
    })
      AsyncStorage.getItem("distance",(err,res) => {
          if(res) {
              this.setState({
                  value:JSON.parse(res).value,
                  distance:JSON.parse(res).distance
                })
          }
      })
  }
  saveDistance=() => {
      if(this.state.value ===0) return alert("거리를 선택해주세요.")
      AsyncStorage.setItem("distance",JSON.stringify({value:this.state.value,distance:this.state.distance}))
      this.setState({
          isModalVisible:false
      })
  }
  calculateDistance =(v) => {
    if(v == 0) {
        this.setState({
            value:0,
            distance:0
        })
    }
    else if (v == 0.25) {
        this.setState({
            value:0.25,
            distance:100
        })
    }
    else if (v == 0.5) {
        this.setState({
            value:0.5,
            distance:500
        })
    }
    else if (v == 0.75) {
        this.setState({
            value:0.75,
            distance:3000
        })
    }
    else if (v == 1) {
        this.setState({
            value:1,
            distance:10000
        })
    }
  }

    render() {
    return (
        <View style={{flexDirection:"row"}}>
        <TouchableOpacity
        style={{
            flex:1,
            marginLeft:10,
            flexDirection:"row",
            justifyContent:"center"
        }} onPress={() => this.setState({isModalVisible:true})}>
            
        </TouchableOpacity>
            <Modal onBackButtonPress={() => this.setState({isModalVisible:false})} onBackdropPress={() => this.setState({isModalVisible:false})} isVisible={this.state.isModalVisible}>
            <View  style={{ width:"80%",backgroundColor:"white",alignSelf:"center"}}>
                <View style={{paddingTop:24,paddingLeft:16,paddingRight:16}}>
                <View style={{width:"100%",paddingLeft:16,paddingRight:16,paddingTop:9,paddingBottom:9,borderColor:'#FFD63A',borderWidth:1}}>
                    <Text numberOfLines={1}>
                        {this.state.current.name}
                    </Text>
                </View>
                <View>

                        <View style={{width:85,height:41,backgroundColor:"#FFD63A",justifyContent:"center",alignSelf:"center",marginTop:24}}>
                            <Text style={{fontSize:15,color:"black",textAlign:"center"}}>
                                {this.state.distance>=1000? this.state.distance/1000 + "k":this.state.distance}m
                            </Text>
                        </View>
                        <View style={{width:0,height:0,backgroundColor:"transparent",borderStyle:"solid",borderLeftWidth:0,
                        borderRightWidth:35,borderTopWidth:30,borderLeftColor:"transparent",
                        borderRightColor:"transparent",borderTopColor:"#FFD63A",borderBottomColor:"transparent",
                        alignSelf:"center",marginTop:-15,transform: [
                            {rotate: '10deg'}
                          ],zIndex:-1,marginLeft:"17%"
                        }}>

                        </View>
                    <View style={{marginTop:-10}}>
                        <View style={{position:"absolute",flexDirection:"row",justifyContent:"space-between",width:"100%",paddingLeft:8,paddingRight:8,top:9.5}}>
                            <View style={{height:21,width:2,borderRightColor:"#615F5F",borderRightWidth:2}}>

                            </View>
                            <View style={{height:21,width:2,borderRightColor:"#615F5F",borderRightWidth:2}}>

                            </View>
                            <View style={{height:21,width:2,borderRightColor:"#615F5F",borderRightWidth:2}}>

                            </View>
                            <View style={{height:21,width:2,borderRightColor:"#615F5F",borderRightWidth:2}}>

                            </View>
                            <View style={{height:21,width:2,borderRightColor:"#615F5F",borderRightWidth:2}}>

                            </View>
                        </View>
                        <Slider
                          value={this.state.value}
                          onValueChange={(v) => this.calculateDistance(v)}
                          style={{width: "100%",}}
                          minimumValue={0}
                          maximumValue={1}
                          minimumTrackTintColor="#FFD63A"
                          maximumTrackTintColor="#F1F1F1"
                          thumbTintColor="white"
                          step={0.25}
                          thumbStyle={{borderWidth:2,borderColor:"#615F5F"}}
                          trackStyle={{borderWidth:2,borderColor:"#615F5F",height:16,borderRadius:100}}
                        />
                        </View>
                        <View style={{flexDirection:"row",justifyContent:"space-between",paddingLeft:5,paddingRight:0,marginTop:-10,marginBottom:24}}>
                            <Text style={{color:"#615F5F",fontSize:11}}>
                                0
                            </Text>
                            <Text style={{color:"#615F5F",fontSize:11,marginLeft:15}}>
                                100m
                            </Text>
                            <Text style={{color:"#615F5F",fontSize:11}}>
                                500m
                            </Text>
                            <Text style={{color:"#615F5F",fontSize:11}}>
                                3km
                            </Text>
                            <Text style={{color:"#615F5F",fontSize:11}}>
                                10km
                            </Text>
                        </View>

                        
                    </View>
            </View>
                            <View onLayout={e => {
                                if(e.nativeEvent.layout.width>0) {
                                    
                                    this.setState({
                                        width:e.nativeEvent.layout.width
                                    })
                                }
                            }} style={{width:"100%",flexDirection:"row",}}>
                                <TouchableOpacity  onPress={() => this.saveDistance()}
                                style={{backgroundColor:"#f4cd37",paddingTop:12,paddingBottom:15,width:this.state.width/2}}>
                                    <Text style={{textAlign:"center",fontSize:14,color:"black"}}>
                                        저장
                                    </Text>
                                </TouchableOpacity>
                                <TouchableOpacity onPress={() => this.setState({isModalVisible:false})} 
                                    style={{backgroundColor:"white",paddingTop:12,paddingBottom:15,width:this.state.width/2}}>
                                    <Text style={{textAlign:"center",fontSize:14,color:"black"}}>
                                        취소
                                    </Text>
                                </TouchableOpacity>
                            </View>
            </View>
      </Modal>
        </View>
    )
    };
}

export default withNavigation(Distance);