| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- /**
- * 新版搜索页
- * @邠心vbe on 2023/02/03
- */
- import React, { Component } from 'react';
- import { View, Text, StyleSheet, TextInput, FlatList, Image } from 'react-native';
- import apiStation from '../../api/apiStation';
- import Dialog from '../../components/Dialog';
- import utils from '../../utils/utils';
- import { PageList } from '../Router';
- import ListViewV2 from './ListViewV2';
- export default class Search extends Component {
- constructor(props) {
- super(props);
- this.state = {
- isSearch: false,
- searchResult: [{id:0}],
- latlng: {
- lat: 0.00001,
- lng: 0.00001
- }
- };
- }
- componentDidMount() {
- this.getGeoLocation();
- }
- getGeoLocation() {
- navigator.geolocation.getCurrentPosition(location => {
- let latlng = {
- lat: location.coords.latitude,
- lng: location.coords.longitude
- }
- this.setState({
- latlng: latlng
- })
- this.searchStation(latlng);
- }, error => {
- console.info("[Search] getGeoLocation", error);
- this.searchStation(this.state.latlng);
- });
- }
- searchStation(latlng, time=1000) {
- 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,
- favorite: item.favorite,
- upcoming: item.upcoming,
- labels: item.labels,
- distance: utils.getDistance(item.distance),
- serviceProvider: item.serviceProvider
- });
- });
- setTimeout(() => {
- this.setState({
- isSearch: false,
- searchResult: list
- });
- }, time);
- }
- }).catch(err => {
- console.log('searchStation-err', err);
- this.setState({
- isSearch: false,
- searchResult: []
- });
- });
- }
- favoriteSite(index, info) {
- if (info?.id) {
- Dialog.showProgressDialog();
- apiStation.bookmarkSite(info.id).then(res => {
- if (index >= 0) {
- const list = [...this.state.searchResult];
- list[index].favorite = !info.favorite;
- this.setState({
- searchResult: list
- });
- }
- }).catch(err => {
- toastShort(err);
- }).finally(() => {
- Dialog.dismissLoading();
- })
- }
- }
- intoStation(info) {
- if (info.upcoming) {
- toastShort($t("home.upcoming"))
- } else {
- startPage(PageList.chargeDetailPage, {stationInfo: info, action: 'search', from: PageList.search});
- }
- }
- listItem = (props) => {
- return (
- <ListViewV2
- {...props}
- onPress={() => this.intoStation(props.item)}
- onFavorite={() => this.favoriteSite(props.index, 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();
- this.searchStation(this.state.latlng, 500);
- }}/>
- </View>
- { this.state.isSearch
- ? <View style={styles.searchingView}>
- <Image
- style={styles.seachingIcon}
- source={require('../../images/icon/search-loading.gif')}/>
- </View>
- : <FlatList
- style={styles.listView}
- data={this.state.searchResult}
- renderItem={this.listItem}
- keyExtractor={item => item.id}
- keyboardShouldPersistTaps="always"
- ListEmptyComponent={<Text style={styles.noResult}>{$t('home.noSearch')}</Text>}
- />
- }
- </View>
- );
- }
- }
- const styles = StyleSheet.create({
- container: {
- flex: 1,
- backgroundColor: pageBackground
- },
- 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,
- paddingRight: 16,
- alignItems: 'center'
- },
- distanceText: {
- color: textPrimary,
- fontSize: 12,
- paddingTop: 2
- }
- });
|