Невозможно скопировать данные * fire sh в массив при реагировании - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь получить данные из коллекции пожарного магазина в массив в собственном приложении, чтобы я мог использовать эти данные для поиска ближайших врачей, я не знаю, что не так, но выдает ошибку:

TypeError: undefined не является объектом (оценивает 'item.location')

Похоже, он не распознает поля. План состоит в том, чтобы показать ближайших врачей на карте, у меня есть зарегистрированные врачи в моем пожарном магазине Коллекции врачей

 state = {
    toggled: false,
    counter: null,
    data: [],
    nearby: [],
    distance: null,
    coordinate: {
        latitude: 0,
        longitude: 0,
        longitudeDelta: 0,
        latitudeDelta: 0,
    }
}
async componentDidMount() {
    await navigator.geolocation.getCurrentPosition(pos => {
        let coordinate = { latitude: pos.coords.latitude, longitude: pos.coords.longitude, latitudeDelta: 0.015, longitudeDelta: 0.0121, }
        this.setState({ coordinate })
        this.getNearby()

        console.log(this.state.data);
    })
}
getNearby() {
    const { coordinate } = this.state
    var firebaseRef = firebase.database().ref('Doctors');
    var geoFire = new GeoFire(firebaseRef);
    var geoQuery = geoFire.query({
        center: [coordinate.latitude, coordinate.longitude],
        radius: 2
    })
    let nearby = []
    geoQuery.on("key_entered", (key, location, distance) => {
        nearby.push(key)
        this.setState({ nearby, distance: distance * 1000 })
    })
    geoQuery.on('ready', () => {
        if (nearby.length != 0) {
            this.getData()

        }
    })
}
getData() {
    const db = firebase.firestore().collection("Doctors")
    let refs = []
    this.state.nearby.map(item => {
        refs.push(db.doc(item).get())
    })
    const data = Promise.all(refs)
    data.then(res => {
        let data = []
        res.map(snap => {
            data.push(snap.data());

        })
        this.setState({ data });

    })
}
handleCall(item) {
    Linking.openURL(`tel:${item}`)
}
handleBook(item) {
    this.props.navigation.navigate('BookAppointmentScreen', {
        doctor: item,
    })
}
renderDoctorsSm() {
    return <TouchableWithoutFeedback onPress={() => this.setState({ toggled: !this.state.toggled })}>
        <View style={{ position: 'absolute', height: 50, width: '100%', backgroundColor: '#2A2E43', bottom: -5, borderRadius: 8 }}>
            <View style={{ flex: 1, flexDirection: 'row' }}>
                <View style={{ paddingLeft: 30, paddingTop: 10, flexDirection: 'row' }}>
                    <Ionicons name='ios-arrow-up' size={20} color='white' />
                    <Text style={{ color: 'white', fontSize: 16, fontWeight: '400', paddingLeft: 10 }}>Nearby Doctors</Text>
                </View>
                <Text style={{ color: 'white', fontSize: 32, paddingLeft: '45%', fontWeight: '100', opacity: 0.5 }}>{this.state.nearby.length}</Text>
            </View>
        </View>
    </TouchableWithoutFeedback>
}
renderDoctorsLg() {
    return <View style={{ position: 'absolute', height: 300, width: '100%', backgroundColor: '#2A2E43', bottom: -5, borderRadius: 8 }}>
        <View>
            <View style={{ paddingLeft: 30, paddingTop: 10, flexDirection: 'row' }}>
                <Text style={{ color: 'white', fontSize: 18, fontWeight: '400' }}>{this.state.distance.toFixed(0)}m away</Text>
            </View>
            <ScrollView style={{ paddingLeft: 40, paddingTop: 10, height: 200, marginBottom: 10 }}>
                {this.state.data.length != 0 ? this.state.data.map((item, i) => {
                    return <View key={i} style={{ flexDirection: 'row', margin: 10 }}>
                        <Thumbnail square source={{ uri: item.thumbnail }} style={{ borderRadius: 10, height: 40, width: 40, marginRight: 10 }} />
                        <View style={{ width: 100 }}>
                            <Text style={{ color: 'white', fontSize: 16, fontWeight: '600' }}>{item.email}</Text>
                            <Text style={{ color: item.state ? '#3497FD' : '#78849E', fontSize: 12, fontWeight: '100' }}>{item.state ? 'online' : 'offline'}</Text>
                        </View>
                        <View style={{ flexDirection: 'row', paddingLeft: 40, marginTop: 2 }}>
                            <TouchableOpacity style={{ height: 40, width: 40, justifyContent: 'center', alignItems: 'center', backgroundColor: '#353A50', borderRadius: 10 }} onPress={() => this.handleCall(item.phone)}>
                                <Ionicons name='ios-call' color='#78849E' size={20} />
                            </TouchableOpacity>
                            <TouchableOpacity style={{ height: 40, width: 40, justifyContent: 'center', alignItems: 'center', backgroundColor: '#353A50', borderRadius: 10, marginLeft: 10 }} onPress={() => this.handleBook(item)}>
                                <Ionicons name='ios-document' color='#78849E' size={20} />
                            </TouchableOpacity>
                        </View>
                    </View>
                }) : <Spinner color='gray' style={{ alignSelf: 'center' }} />}
            </ScrollView>
            <Button block style={{ backgroundColor: '#454F63', width: '50%', alignSelf: 'center', borderRadius: 8, bottom: 0 }} onPress={() => this.setState({ toggled: !this.state.toggled })}>
                <Text style={{ color: 'white' }}>Cancel</Text>
            </Button>
        </View>
    </View>
}

render() {
  const { data } = this.state
    return (
      <View style={CommonStyles.normalPage}>

      <GradientNavigationBar
      navigation={this.props.navigation}
      titleText='Find Doctor'

    />
        <Container style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <View style={{ flex: 1, width: '100%', height: '100%', position: 'absolute', zIndex: 0 }}>

                <MapView
                    style={{ flex: 1, width: '100%', height: '100%' }}
                    region={this.state.coordinate}
                    customMapStyle={mapStyle}
                >
                    <MapView.Marker coordinate={this.state.coordinate} tracksViewChanges={false}>
                    </MapView.Marker>
                    {data.length != 0 ? data.map((item, i) => {
                        return <MapView.Marker key={i} coordinate={item.location} >
                            <Ionicons name='ios-radio-button-on' size={20} color={item.state ? '#3497FD' : '#78849E'} tracksViewChanges={false} />
                        </MapView.Marker>
                    }) : null}
                </MapView>
            </View>
            {this.state.toggled ? this.renderDoctorsLg() : this.renderDoctorsSm()}
        </Container>
        </View>
    )
}

снимок экрана с ошибкой

...