| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- /**
- * 地图底部充电站信息组件
- * @邠心vbe on 2022/12/23
- */
- import React, { useEffect, useState } from 'react';
- import { Pressable, StyleSheet, View, Text } from 'react-native';
- import { ElevationObject } from '../../../components/Button';
- import utils from '../../../utils/utils';
- import { ChargeStyle } from '../../charge/Charging';
- import { PageList } from '../../Router';
- import ConnectType, { ConnectTypeV2 } from '../../search/ConnectType';
- import app from '../../../../app.json';
- import TextView from '../../../components/TextView';
- import BottomModal from '../../../components/BottomModal';
- import SiteLabelView from '../../../components/SiteLabelView';
- export const BottomSiteCard = ({
- stationInfo = {},
- onFavorite,
- onClose
- }) => {
- const [visible, showDialog] = useState(false);
- useEffect(() => {
- if (stationInfo.id) {
- showDialog(true)
- } else {
- showDialog(false)
- }
- }, [stationInfo]);
- const getAvailable = (type) => {
- const all = stationInfo.allConnector;
- if (all) {
- if (type == 'box') {
- return all.boxAvailable + '/' + all.boxAll;
- } else {
- return all.available + '/' + all.all;
- }
- } else {
- return '0/0';
- }
- }
- const getOperatingHours = () => {
- if (stationInfo.endlessService) {
- return "24/7";
- } else if (stationInfo.operatingHours) {
- return stationInfo.operatingHours;
- } else {
- return $t('charging.toBeUpdated');
- }
- }
- const getParkingFee = () => {
- if (stationInfo.parkingFeeFree) {
- return $t('charging.free');
- } else if (stationInfo.parkingFee) {
- return stationInfo.parkingFee;
- } else {
- return $t('charging.toBeUpdated');
- }
- }
- const toChargePage = () => {
- if (stationInfo.upcoming) {
- toastShort($t("home.upcoming"))
- } else {
- utils.toChargeDetailPage(stationInfo.id, 'view', PageList.home);
- //startPage(PageList.chargeDetailPage, {stationInfo: stationInfo, action: 'view', from: PageList.home});
- }
- }
- return (
- <BottomModal
- visible={visible}
- onHide={() => {
- onClose()
- }}>
- <View style={styles.stationBarView}>
- <TextView
- ellipsizeMode='tail'
- numberOfLines={1}
- style={styles.stationTitle}>{stationInfo.name}</TextView>
- <View style={ui.flexc}>
- <TextView style={styles.siteTypes}>{stationInfo.siteType}</TextView>
- { (stationInfo.allConnector && stationInfo.allConnector.available > 0) &&
- <TextView style={styles.stationAvailable}>
- <MaterialCommunityIcons
- name="circle"
- size={10}
- color={colorAccent}/>
- <Text> </Text>
- {$t("charging.statusAvailable")}
- </TextView>
- }
- <ConnectTypeV2 {...stationInfo?.acConnector}/>
- <ConnectTypeV2 {...stationInfo?.dcConnector}/>
- </View>
- <TextView
- style={styles.stationAddress}
- ellipsizeMode='tail'
- numberOfLines={3}>{stationInfo.address}</TextView>
- <View style={ui.flexc}>
- { stationInfo.upcoming
- ? <View style={[ui.center, $margin(0, 8)]}>
- <MaterialIcons
- name="upcoming"
- size={42}
- color={colorAccent}
- style={styles.upcomingIcon} />
- <TextView style={styles.upcomingText}>{$t("home.upcoming")}</TextView>
- </View>
- : <>
- <Pressable
- style={styles.directIconView}
- onPress={() => {
- utils.directMaps(stationInfo.latitude, stationInfo.longitude, stationInfo.address);
- }}>
- <MaterialCommunityIcons
- name="directions"
- size={18}
- color={textPrimary}/>
- <TextView style={styles.directText}>Directions</TextView>
- </Pressable>
- { app.modules.bookmarks &&
- <Pressable
- style={[styles.directIconView, stationInfo.favorite ? styles.bookmarked : {}]}
- onPress={onFavorite}>
- <MaterialIcons
- name="star"
- size={18}
- color={stationInfo.favorite ? textLight : textPrimary}/>
- <TextView style={[styles.directText, stationInfo.favorite ? styles.bookmarked : {}]}>
- {stationInfo.favorite ? "Saved" : "Save"}
- </TextView>
- </Pressable>
- }
- {/* <Pressable
- style={styles.directIconView}
- onPress={() => {
- startPage(PageList.scanqr, {actionDetail: true});
- }}>
- <MaterialCommunityIcons
- name="qrcode-scan"
- size={12}
- color={textPrimary}
- style={$padding(3)}/>
- <TextView style={styles.directText}>Scan</TextView>
- </Pressable> */}
- <Pressable
- style={styles.directIconView}
- onPress={() => toChargePage()}>
- <MaterialCommunityIcons
- name="information-variant"
- size={17}
- color={textPrimary}/>
- <TextView style={styles.directText}>More Info</TextView>
- </Pressable>
- </> }
- </View>
- {/* stationInfo?.labels?.length > 0 &&
- <View style={styles.siteLabelsView}>
- <Image
- style={styles.labelIcon}
- source={require('../../../images/maps/ic_marker_additional.png')}/>
- { stationInfo.labels.map((item, index) =>
- <SiteLabelView key={index} {...item}/>
- )}
- </View>
- */}
- </View>
- </BottomModal>
- )
- }
- const styles = StyleSheet.create({
- stationBarView: {
- padding: 16
- },
- stationBarPresed: {
- backgroundColor: "#F6F6F6",
- ...ElevationObject(5)
- },
- stationInfo: {
- flex: 1,
- height: 45,
- paddingLeft: 4,
- paddingRight: 8,
- justifyContent: 'space-around'
- },
- stationTitle: {
- color: textPrimary,
- fontSize: 24,
- fontWeight: 'bold',
- paddingBottom: 4
- },
- stationAddress: {
- color: textSecondary,
- fontSize: 12,
- paddingTop: 4,
- paddingBottom: 6
- },
- siteTypes: {
- color: textLight,
- height: 20,
- fontSize: 8,
- marginRight: 6,
- borderRadius: 30,
- ...$padding(0, 10),
- backgroundColor: textPrimary
- },
- stationAvailable: {
- color: textPrimary,
- height: 20,
- fontSize: 8,
- marginRight: 6,
- borderRadius: 30,
- borderWidth: 1,
- borderColor: colorAccent,
- ...$padding(0, 8, 0, 4)
- },
- directView: {
- zIndex: 1,
- height: 45,
- marginLeft: 8,
- marginRight: 4,
- alignItems: 'center',
- justifyContent: 'space-between'
- },
- distanceText: {
- color: textPrimary,
- fontSize: 12,
- },
- directIconView: {
- zIndex: 1,
- marginRight: 10,
- borderWidth: 1,
- borderRadius: 30,
- borderColor: textPrimary,
- alignItems: 'center',
- flexDirection: 'row',
- justifyContent: 'center',
- ...$padding(2, 8, 2, 4)
- },
- bookmarked: {
- color: textLight,
- borderColor: colorAccent,
- backgroundColor: colorAccent
- },
- directText: {
- color: textPrimary,
- fontSize: 12,
- paddingLeft: 4
- },
- connectView: {
- flex: 1,
- paddingTop: 12,
- paddingBottom: 12,
- alignItems: 'center',
- flexDirection: 'row'
- },
- divideLine: {
- height: 1,
- backgroundColor: '#AEAEAE'
- },
- infoDetailsView: {
- flexDirection: 'row'
- },
- infoTitle: {
- color: '#000',
- fontSize: 12,
- fontWeight: 'bold',
- ...$padding(8, 0, 8)
- },
- infoView: {
- paddingBottom: 8
- },
- infoText: {
- color: '#444',
- fontSize: 10
- },
- closeIcon: {
- width: 30,
- height: 30,
- marginTop: -2,
- marginRight: -8,
- alignItems: 'center',
- justifyContent: 'center'
- },
- siteLabelsView: {
- marginBottom: 5,
- flexWrap: 'wrap',
- alignItems: 'center',
- flexDirection: 'row'
- },
- labelIcon: {
- width: 16,
- height: 16,
- marginRight: 6
- },
- upcomingIcon: {
- marginLeft: 8,
- opacity: .3
- },
- upcomingText: {
- color: colorAccent,
- fontSize: 10,
- opacity: .3,
- marginLeft: 8,
- marginTop: -3
- }
- })
|