|
@@ -3,10 +3,12 @@ import { View, Text, Swiper, SwiperItem, Image, Button, Picker } from '@tarojs/c
|
|
|
import { navigateTo } from '@tarojs/taro'
|
|
import { navigateTo } from '@tarojs/taro'
|
|
|
import { format } from 'date-fns'
|
|
import { format } from 'date-fns'
|
|
|
import { zhCN } from 'date-fns/locale'
|
|
import { zhCN } from 'date-fns/locale'
|
|
|
|
|
+import { useQuery } from '@tanstack/react-query'
|
|
|
import { TabBarLayout } from '@/layouts/tab-bar-layout'
|
|
import { TabBarLayout } from '@/layouts/tab-bar-layout'
|
|
|
import { AreaPicker } from '../../components/AreaPicker'
|
|
import { AreaPicker } from '../../components/AreaPicker'
|
|
|
import { Navbar } from '@/components/ui/navbar'
|
|
import { Navbar } from '@/components/ui/navbar'
|
|
|
import { showToast } from '@/utils/toast'
|
|
import { showToast } from '@/utils/toast'
|
|
|
|
|
+import { areaClient } from '@/api'
|
|
|
|
|
|
|
|
|
|
|
|
|
interface SearchParams {
|
|
interface SearchParams {
|
|
@@ -62,7 +64,7 @@ const HomePage: React.FC = () => {
|
|
|
Number(process.env.TARO_APP_DEFAULT_END_PROVINCE_ID),
|
|
Number(process.env.TARO_APP_DEFAULT_END_PROVINCE_ID),
|
|
|
Number(process.env.TARO_APP_DEFAULT_END_CITY_ID),
|
|
Number(process.env.TARO_APP_DEFAULT_END_CITY_ID),
|
|
|
Number(process.env.TARO_APP_DEFAULT_END_DISTRICT_ID)
|
|
Number(process.env.TARO_APP_DEFAULT_END_DISTRICT_ID)
|
|
|
- ].filter(id => id && !isNaN(id))
|
|
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const [searchParams, setSearchParams] = useState<SearchParams>(() => {
|
|
const [searchParams, setSearchParams] = useState<SearchParams>(() => {
|
|
@@ -88,6 +90,70 @@ const HomePage: React.FC = () => {
|
|
|
const [currentPickerType, setCurrentPickerType] = useState<'start' | 'end'>('start')
|
|
const [currentPickerType, setCurrentPickerType] = useState<'start' | 'end'>('start')
|
|
|
const [areaData, setAreaData] = useState<AreaInfo[]>([])
|
|
const [areaData, setAreaData] = useState<AreaInfo[]>([])
|
|
|
|
|
|
|
|
|
|
+ // 获取默认目的地的地区数据
|
|
|
|
|
+ const defaultEndIds = getValidDefaultEndIds()
|
|
|
|
|
+ const { data: defaultEndAreaData, isLoading: isLoadingDefaultEndAreas } = useQuery({
|
|
|
|
|
+ queryKey: ['default-end-areas', defaultEndIds],
|
|
|
|
|
+ queryFn: async () => {
|
|
|
|
|
+ if (!defaultEndIds || defaultEndIds.length !== 3) {
|
|
|
|
|
+ console.debug('没有有效的默认目的地配置,跳过地区数据加载')
|
|
|
|
|
+ return []
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const [provinceId, cityId, districtId] = defaultEndIds
|
|
|
|
|
+ console.debug('开始加载默认目的地地区数据:', { provinceId, cityId, districtId })
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 并行获取所有地区数据
|
|
|
|
|
+ const [provincesResponse, citiesResponse, districtsResponse] = await Promise.all([
|
|
|
|
|
+ areaClient.provinces.$get({ query: { page: 1, pageSize: 100 } }),
|
|
|
|
|
+ areaClient.cities.$get({ query: { provinceId, page: 1, pageSize: 100 } }),
|
|
|
|
|
+ areaClient.districts.$get({ query: { cityId, page: 1, pageSize: 100 } })
|
|
|
|
|
+ ])
|
|
|
|
|
+
|
|
|
|
|
+ if (provincesResponse.status !== 200 || citiesResponse.status !== 200 || districtsResponse.status !== 200) {
|
|
|
|
|
+ throw new Error('获取地区数据失败')
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const provinces = await provincesResponse.json()
|
|
|
|
|
+ const cities = await citiesResponse.json()
|
|
|
|
|
+ const districts = await districtsResponse.json()
|
|
|
|
|
+
|
|
|
|
|
+ console.debug('地区数据获取成功:', {
|
|
|
|
|
+ provinces: provinces.data?.provinces?.length,
|
|
|
|
|
+ cities: cities.data?.cities?.length,
|
|
|
|
|
+ districts: districts.data?.districts?.length
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ // 查找对应的地区信息
|
|
|
|
|
+ const province = provinces.data?.provinces?.find((p: any) => p.id === provinceId)
|
|
|
|
|
+ const city = cities.data?.cities?.find((c: any) => c.id === cityId)
|
|
|
|
|
+ const district = districts.data?.districts?.find((d: any) => d.id === districtId)
|
|
|
|
|
+
|
|
|
|
|
+ const areaInfos: AreaInfo[] = []
|
|
|
|
|
+
|
|
|
|
|
+ if (province) {
|
|
|
|
|
+ areaInfos.push({ id: province.id, name: province.name, type: 'province' })
|
|
|
|
|
+ }
|
|
|
|
|
+ if (city) {
|
|
|
|
|
+ areaInfos.push({ id: city.id, name: city.name, type: 'city' })
|
|
|
|
|
+ }
|
|
|
|
|
+ if (district) {
|
|
|
|
|
+ areaInfos.push({ id: district.id, name: district.name, type: 'district' })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ console.debug('构建的地区信息:', areaInfos)
|
|
|
|
|
+ return areaInfos
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('获取默认目的地地区数据失败:', error)
|
|
|
|
|
+ return []
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ enabled: !!defaultEndIds && defaultEndIds.length === 3,
|
|
|
|
|
+ staleTime: 5 * 60 * 1000, // 5分钟缓存
|
|
|
|
|
+ retry: 2
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
// 出行方式选项 - 组合查询映射
|
|
// 出行方式选项 - 组合查询映射
|
|
|
const travelOptions = [
|
|
const travelOptions = [
|
|
|
{
|
|
{
|
|
@@ -199,15 +265,27 @@ const HomePage: React.FC = () => {
|
|
|
return defaultText || '请选择地区'
|
|
return defaultText || '请选择地区'
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 根据areaIds获取地区名称
|
|
|
|
|
- const areaNames = areaIds.map(id => {
|
|
|
|
|
- const area = areaData.find(a => a.id === id)
|
|
|
|
|
- return area ? area.name : '未知地区'
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ // 检查是否是默认目的地,如果是则优先使用默认目的地地区数据
|
|
|
|
|
+ const isDefaultEnd = defaultEndIds && areaIds.length === defaultEndIds.length &&
|
|
|
|
|
+ areaIds.every((id, index) => id === defaultEndIds[index])
|
|
|
|
|
|
|
|
- const result = areaNames.join(' ') || (defaultText || '请选择地区')
|
|
|
|
|
- console.debug('getAreaDisplayText:', { areaIds, areaNames, result, areaData })
|
|
|
|
|
- return result
|
|
|
|
|
|
|
+ if (isDefaultEnd && defaultEndAreaData && defaultEndAreaData.length > 0) {
|
|
|
|
|
+ // 使用默认目的地地区数据
|
|
|
|
|
+ const areaNames = defaultEndAreaData.map(area => area.name)
|
|
|
|
|
+ const result = areaNames.join(' ') || (defaultText || '请选择地区')
|
|
|
|
|
+ console.debug('getAreaDisplayText (使用默认目的地数据):', { areaIds, areaNames, result, defaultEndAreaData })
|
|
|
|
|
+ return result
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 使用本地存储的地区数据
|
|
|
|
|
+ const areaNames = areaIds.map(id => {
|
|
|
|
|
+ const area = areaData.find(a => a.id === id)
|
|
|
|
|
+ return area ? area.name : '未知地区'
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ const result = areaNames.join(' ') || (defaultText || '请选择地区')
|
|
|
|
|
+ console.debug('getAreaDisplayText (使用本地数据):', { areaIds, areaNames, result, areaData })
|
|
|
|
|
+ return result
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 获取出行方式样式
|
|
// 获取出行方式样式
|
|
@@ -342,7 +420,11 @@ const HomePage: React.FC = () => {
|
|
|
>
|
|
>
|
|
|
<Text className="text-sm text-gray-600 block">目的地</Text>
|
|
<Text className="text-sm text-gray-600 block">目的地</Text>
|
|
|
<Text className="text-sm font-medium text-gray-800 block mt-1">
|
|
<Text className="text-sm font-medium text-gray-800 block mt-1">
|
|
|
- {getAreaDisplayText(searchParams.endAreaIds, '默认目的地')}
|
|
|
|
|
|
|
+ {isLoadingDefaultEndAreas && defaultEndIds ? (
|
|
|
|
|
+ '加载中...'
|
|
|
|
|
+ ) : (
|
|
|
|
|
+ getAreaDisplayText(searchParams.endAreaIds, '默认目的地')
|
|
|
|
|
+ )}
|
|
|
</Text>
|
|
</Text>
|
|
|
</Button>
|
|
</Button>
|
|
|
</View>
|
|
</View>
|