|
@@ -0,0 +1,240 @@
|
|
|
|
|
+/**
|
|
|
|
|
+ * 搜索页
|
|
|
|
|
+ * @邠心vbe on 2021/04/12
|
|
|
|
|
+ */
|
|
|
|
|
+import React, { Component } from 'react';
|
|
|
|
|
+import { View, Text, StyleSheet, TextInput, FlatList, Image } from 'react-native';
|
|
|
|
|
+import apiStation from '../../api/apiStation';
|
|
|
|
|
+import utils from '../../utils/utils';
|
|
|
|
|
+import { PageList } from '../Router';
|
|
|
|
|
+import ListView from './ListView';
|
|
|
|
|
+
|
|
|
|
|
+export default class Search extends Component {
|
|
|
|
|
+ constructor(props) {
|
|
|
|
|
+ super(props);
|
|
|
|
|
+ this.state = {
|
|
|
|
|
+ isSearch: false,
|
|
|
|
|
+ searchResult: [{id:0}]
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ componentDidMount() {
|
|
|
|
|
+ this.getGeoLocation();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ getGeoLocation() {
|
|
|
|
|
+ navigator.geolocation.getCurrentPosition(location => {
|
|
|
|
|
+ let latlng = {
|
|
|
|
|
+ lat: location.coords.latitude,
|
|
|
|
|
+ lng: location.coords.longitude
|
|
|
|
|
+ }
|
|
|
|
|
+ this.searchStation(latlng);
|
|
|
|
|
+ }, error => {
|
|
|
|
|
+ console.info("[Search] getGeoLocation", error);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ searchStation(latlng) {
|
|
|
|
|
+ this.setState({
|
|
|
|
|
+ isSearch: true
|
|
|
|
|
+ });
|
|
|
|
|
+ latlng.siteName = this.searchWorld
|
|
|
|
|
+ apiStation.searchStation(latlng).then(res => {
|
|
|
|
|
+ if (res.data.sites) {
|
|
|
|
|
+ const list = [];
|
|
|
|
|
+ res.data.sites.forEach(item => {
|
|
|
|
|
+ list.push({
|
|
|
|
|
+ id: item.sitePk,
|
|
|
|
|
+ name: item.siteName,
|
|
|
|
|
+ address: item.siteAddress,
|
|
|
|
|
+ latitude: item.locationLatitude,
|
|
|
|
|
+ longitude: item.locationLongitude,
|
|
|
|
|
+ acConnector: item.acConnector,
|
|
|
|
|
+ allConnector: item.allConnector,
|
|
|
|
|
+ dcConnector: item.dcConnector,
|
|
|
|
|
+ siteType: item.siteType,
|
|
|
|
|
+ distance: utils.getDistance(item.distance),
|
|
|
|
|
+ serviceProvider: item.serviceProvider
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ this.setState({
|
|
|
|
|
+ isSearch: false,
|
|
|
|
|
+ searchResult: list
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }).catch(err => {
|
|
|
|
|
+ console.log('searchStation-err', err);
|
|
|
|
|
+ this.setState({
|
|
|
|
|
+ isSearch: false,
|
|
|
|
|
+ searchResult: []
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ intoStation(info) {
|
|
|
|
|
+ utils.toChargeDetailPage(info.id, 'search', PageList.search);
|
|
|
|
|
+ //startPage(PageList.chargeDetail, {stationInfo: info, action: 'search'});
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ listItem = (props) => {
|
|
|
|
|
+ return <ListView {...props} onPress={() => this.intoStation(props.item)}/>
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ render() {
|
|
|
|
|
+ return (
|
|
|
|
|
+ <View style={styles.container}>
|
|
|
|
|
+ <View style={styles.searchView}>
|
|
|
|
|
+ <Feather
|
|
|
|
|
+ name={'search'}
|
|
|
|
|
+ size={20}
|
|
|
|
|
+ color={'#999'}/>
|
|
|
|
|
+ <TextInput
|
|
|
|
|
+ style={styles.searchInput}
|
|
|
|
|
+ autoFocus={true}
|
|
|
|
|
+ maxLength={50}
|
|
|
|
|
+ numberOfLines={1}
|
|
|
|
|
+ returnKeyType={'search'}
|
|
|
|
|
+ clearButtonMode={'while-editing'}
|
|
|
|
|
+ placeholder={$t('home.searchHint')}
|
|
|
|
|
+ placeholderTextColor={textPlacehoder}
|
|
|
|
|
+ onChangeText={text => {
|
|
|
|
|
+ this.searchWorld = text;
|
|
|
|
|
+ }}
|
|
|
|
|
+ onSubmitEditing={() => {
|
|
|
|
|
+ this.getGeoLocation();
|
|
|
|
|
+ }}/>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ { this.state.isSearch
|
|
|
|
|
+ ? <View style={styles.searchingView}>
|
|
|
|
|
+ <Image
|
|
|
|
|
+ style={styles.seachingIcon}
|
|
|
|
|
+ source={require('../../images/icon/loading.gif')}/>
|
|
|
|
|
+ </View>
|
|
|
|
|
+ : <FlatList
|
|
|
|
|
+ style={styles.listView}
|
|
|
|
|
+ data={this.state.searchResult}
|
|
|
|
|
+ renderItem={this.listItem}
|
|
|
|
|
+ keyExtractor={item => item.id}
|
|
|
|
|
+ ListEmptyComponent={<Text style={styles.noResult}>{$t('home.noSearch')}</Text>}
|
|
|
|
|
+ />
|
|
|
|
|
+ }
|
|
|
|
|
+ </View>
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const styles = StyleSheet.create({
|
|
|
|
|
+ container: {
|
|
|
|
|
+ flex: 1,
|
|
|
|
|
+ backgroundColor: colorLight
|
|
|
|
|
+ },
|
|
|
|
|
+ searchView: {
|
|
|
|
|
+ marginTop: 16,
|
|
|
|
|
+ marginLeft: 16,
|
|
|
|
|
+ marginRight: 16,
|
|
|
|
|
+ marginBottom: 8,
|
|
|
|
|
+ paddingLeft: 16,
|
|
|
|
|
+ paddingRight: 16,
|
|
|
|
|
+ borderRadius: 60,
|
|
|
|
|
+ borderWidth: 1,
|
|
|
|
|
+ borderColor: '#E5E5E5',
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ flexDirection: 'row',
|
|
|
|
|
+ backgroundColor: '#F5F5F5'
|
|
|
|
|
+ },
|
|
|
|
|
+ searchInput: {
|
|
|
|
|
+ flex: 1,
|
|
|
|
|
+ color: textPrimary,
|
|
|
|
|
+ ...$padding(6, 8),
|
|
|
|
|
+ fontSize: 15,
|
|
|
|
|
+ marginLeft: 4,
|
|
|
|
|
+ lineHeight: 20
|
|
|
|
|
+ },
|
|
|
|
|
+ searchingView: {
|
|
|
|
|
+ padding: 16,
|
|
|
|
|
+ alignItems: 'center'
|
|
|
|
|
+ },
|
|
|
|
|
+ seachingIcon: {
|
|
|
|
|
+ width: 60,
|
|
|
|
|
+ height: 60
|
|
|
|
|
+ },
|
|
|
|
|
+ noResult: {
|
|
|
|
|
+ color: '#999',
|
|
|
|
|
+ fontSize: 14,
|
|
|
|
|
+ padding: 20,
|
|
|
|
|
+ textAlign: 'center',
|
|
|
|
|
+ },
|
|
|
|
|
+ listView: {
|
|
|
|
|
+ flex: 1
|
|
|
|
|
+ },
|
|
|
|
|
+ itemView: {
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ flexDirection: 'row',
|
|
|
|
|
+ borderBottomWidth: 1,
|
|
|
|
|
+ borderBottomColor: '#eee'
|
|
|
|
|
+ },
|
|
|
|
|
+ stationInfo: {
|
|
|
|
|
+ flex: 1,
|
|
|
|
|
+ padding: 16
|
|
|
|
|
+ },
|
|
|
|
|
+ nameView: {
|
|
|
|
|
+ paddingTop: 3,
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ flexDirection: 'row'
|
|
|
|
|
+ },
|
|
|
|
|
+ stationName: {
|
|
|
|
|
+ color: textPrimary,
|
|
|
|
|
+ fontSize: 18,
|
|
|
|
|
+ fontWeight: 'bold'
|
|
|
|
|
+ },
|
|
|
|
|
+ stationAddress: {
|
|
|
|
|
+ color: '#666',
|
|
|
|
|
+ fontSize: 14,
|
|
|
|
|
+ paddingBottom: 8
|
|
|
|
|
+ },
|
|
|
|
|
+ infoStatus: {
|
|
|
|
|
+ fontSize: 10,
|
|
|
|
|
+ paddingTop: 3,
|
|
|
|
|
+ paddingLeft: 8,
|
|
|
|
|
+ paddingRight: 8,
|
|
|
|
|
+ paddingBottom: 3,
|
|
|
|
|
+ borderRadius: 5,
|
|
|
|
|
+ marginLeft: 12,
|
|
|
|
|
+ },
|
|
|
|
|
+ selected: {
|
|
|
|
|
+ color: textPrimary,
|
|
|
|
|
+ backgroundColor: colorAccent
|
|
|
|
|
+ },
|
|
|
|
|
+ available: {
|
|
|
|
|
+ color: textLight,
|
|
|
|
|
+ backgroundColor: '#90DB0A'
|
|
|
|
|
+ },
|
|
|
|
|
+ unavailable: {
|
|
|
|
|
+ color: '#999',
|
|
|
|
|
+ fontSize: 10.5,
|
|
|
|
|
+ paddingTop: 7,
|
|
|
|
|
+ paddingLeft: 9,
|
|
|
|
|
+ paddingRight: 9,
|
|
|
|
|
+ paddingBottom: 7,
|
|
|
|
|
+ backgroundColor: '#CCC'
|
|
|
|
|
+ },
|
|
|
|
|
+ connectView: {
|
|
|
|
|
+ paddingTop: 4,
|
|
|
|
|
+ paddingBottom: 4,
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ flexDirection: 'row'
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ directView: {
|
|
|
|
|
+ zIndex: 1,
|
|
|
|
|
+ paddingTop: 4,
|
|
|
|
|
+ paddingRight: 16,
|
|
|
|
|
+ alignItems: 'center'
|
|
|
|
|
+ },
|
|
|
|
|
+ distanceText: {
|
|
|
|
|
+ color: textPrimary,
|
|
|
|
|
+ fontSize: 12,
|
|
|
|
|
+ paddingTop: 2
|
|
|
|
|
+ },
|
|
|
|
|
+});
|