| | |
| | | import Taro from "@tarojs/taro" |
| | | import { useEffect, useState } from 'react'; |
| | | import { View, Map, Text, Image } from '@tarojs/components'; |
| | | import { View, Map, Text, Image, ScrollView } from '@tarojs/components'; |
| | | import './index.less'; |
| | | |
| | | import CustomerServicePopup from '../../components/customer-service'; |
| | |
| | | const [polyline, setPolyline] = useState<any[]>([]); |
| | | const [userLongitude, setUserLongitude] = useState<number | null>(null); |
| | | const [userLatitude, setUserLatitude] = useState<number | null>(null); |
| | | const [outOfServiceRange, setOutOfServiceRange] = useState(false); |
| | | |
| | | const router = Taro.useRouter(); |
| | | |
| | | const getOutOfServiceRange = (inside: boolean, site: any) => { |
| | | const cachedStartSite = Taro.getStorageSync('startSite'); |
| | | const cachedEndSite = Taro.getStorageSync('endSite'); |
| | | const isCrossArea = (pageType === 'start' |
| | | ? (cachedEndSite?.electronicAreaId && site?.electronicAreaId && cachedEndSite.electronicAreaId !== site.electronicAreaId) |
| | | : (cachedStartSite?.electronicAreaId && site?.electronicAreaId && cachedStartSite.electronicAreaId !== site.electronicAreaId)); |
| | | return !inside || isCrossArea; |
| | | }; |
| | | |
| | | // 页面初始化 |
| | | useEffect(() => { |
| | |
| | | setLatitude(cachedSite.latitude); |
| | | setLongitude(cachedSite.longitude); |
| | | setSelectedSite(cachedSite); |
| | | updateMapData(cachedSite.latitude, cachedSite.longitude); |
| | | updateMapData(cachedSite.latitude, cachedSite.longitude).then(({ isInside }) => { |
| | | setOutOfServiceRange(getOutOfServiceRange(isInside, cachedSite)); |
| | | }); |
| | | } else { |
| | | getLocationInfo(); |
| | | } |
| | |
| | | return { isInside, newMarkers, sites }; |
| | | } |
| | | |
| | | useEffect(() => { |
| | | setOutOfServiceRange(getOutOfServiceRange(isOperatingArea, selectedSite)); |
| | | }, [isOperatingArea, pageType, selectedSite?.electronicAreaId]); |
| | | |
| | | // 获取用户位置信息 |
| | | const getLocationInfo = () => { |
| | | Taro.getLocation({ type: 'gcj02' }) |
| | | .then(res => { |
| | | setLatitude(res.latitude); |
| | | setLongitude(res.longitude); |
| | | updateMapData(res.latitude, res.longitude); |
| | | updateMapData(res.latitude, res.longitude).then(({ isInside }) => { |
| | | setOutOfServiceRange(getOutOfServiceRange(isInside, selectedSite)); |
| | | }); |
| | | }) |
| | | } |
| | | |
| | |
| | | success: async (res) => { |
| | | const { latitude: lat, longitude: lng } = res; |
| | | |
| | | const { newMarkers } = await updateMapData(lat, lng); |
| | | const { newMarkers, isInside } = await updateMapData(lat, lng); |
| | | |
| | | const { targetMarker, minDistance } = findNearestMarker(lat, lng, newMarkers); |
| | | |
| | |
| | | longitude: targetMarker.longitude, |
| | | }); |
| | | setSelectedSite(targetMarker); |
| | | setOutOfServiceRange(getOutOfServiceRange(isInside, targetMarker)); |
| | | setLatitude(targetMarker.latitude); |
| | | setLongitude(targetMarker.longitude); |
| | | setShowToolTip(true); |
| | | } else { |
| | | setSelectedSite({}); |
| | | setOutOfServiceRange(getOutOfServiceRange(isInside, {})); |
| | | setLatitude(lat); |
| | | setLongitude(lng); |
| | | setShowToolTip(true); |
| | | } |
| | | } |
| | | }); |
| | |
| | | </View> |
| | | {/* 指针 */} |
| | | <View className="pointer-box"> |
| | | {(showToolTip && selectedSite.name) && ( |
| | | {((showToolTip && selectedSite.name) || outOfServiceRange) && ( |
| | | <View className="toolTip"> |
| | | { |
| | | selectedSite.time && |
| | | {(outOfServiceRange || selectedSite.time) && ( |
| | | <View className="toolTip-bg"> |
| | | <Text className="toolTip-bg-text">限停{selectedSite.time}分钟</Text> |
| | | <Text className="toolTip-bg-text">{outOfServiceRange ? `超出${pageType == 'end' ? '下车' : '上车'}点服务范围` : `限停${selectedSite.time}分钟`}</Text> |
| | | </View> |
| | | } |
| | | )} |
| | | <View className="toolTip-txt"> |
| | | <View className="toolTip-txt-content">{selectedSite.name}</View> |
| | | <View className="toolTip-txt-content">{outOfServiceRange ? `请拖动至${pageType == 'end' ? '下车' : '上车'}点` : selectedSite.name}</View> |
| | | </View> |
| | | </View> |
| | | )} |
| | |
| | | nearbySites.length > 0 && |
| | | <View className="limit-tip">点击其他选项或紫色原点,可更改下/上车点</View> |
| | | } |
| | | <View className="site-list"> |
| | | <ScrollView className="site-list" scrollY> |
| | | { |
| | | nearbySites.map((item, index) => ( |
| | | <View onClick={() => changeChildrenSite(item)} key={index} className={`site-name ${selectedSite.name == item.name && 'site-active'}`}>{item.name}</View> |
| | | )) |
| | | } |
| | | </View> |
| | | </ScrollView> |
| | | <View onClick={confirmSite} className="site-confirm">{pageType === 'start' ? '确认上车站点' : '确认目的地站点'}</View> |
| | | </View> |
| | | } |