import React, { useState, useRef, useEffect } from 'react' import { View, Text, Input, ScrollView, Image } from '@tarojs/components' import Taro from '@tarojs/taro' import { Loading } from '@nutui/nutui-react-taro' import StadiumDetail, { StadiumDetailRef } from './StadiumDetail' import { CommonPopup, CustomPopup } from '../../../../components' import { getLocation } from '@/utils/locationUtils' import PublishService from '@/services/publishService' import images from '@/config/images' import './SelectStadium.scss' export interface Stadium { id?: string name: string address?: string distance_km?: number | null | undefined longitude?: number latitude?: number } interface SelectStadiumProps { visible: boolean onClose: () => void onConfirm: (stadium: Stadium | null) => void } const SelectStadium: React.FC = ({ visible, onClose, onConfirm }) => { const [searchValue, setSearchValue] = useState('') const [selectedStadium, setSelectedStadium] = useState(null) const [showDetail, setShowDetail] = useState(false) const stadiumDetailRef = useRef(null) const [stadiumList, setStadiumList] = useState([]) const [loading, setLoading] = useState(false) // const [keyboardVisible, setKeyboardVisible] = useState(false); const initData = async () => { setLoading(true) try { const location = await getLocation() if (location.latitude && location.longitude) { const res = await PublishService.getStadiumList({ seachOption: { latitude: location.latitude, longitude: location.longitude } }) if (res.code === 0 && res.data) { setStadiumList(res.data.rows || []) } } } catch (error) { console.error('获取场馆列表失败:', error) } finally { setLoading(false) } } useEffect(() => { if (visible) { initData() } }, [visible]) if (!visible) return null // 过滤场馆列表 const filteredStadiums = stadiumList.filter(stadium => stadium.name.toLowerCase().includes(searchValue.toLowerCase()) ) // 处理场馆选择 const handleStadiumSelect = (stadium: Stadium) => { setSelectedStadium(stadium) setShowDetail(true) } const calculateDistance = (stadium: Stadium) => { const distance_km = stadium.distance_km if (!distance_km) return '' if (distance_km && distance_km > 1) { return distance_km.toFixed(1) + 'km' } return (distance_km * 1000).toFixed(0) + 'm' } // 处理搜索框输入 const handleSearchInput = (e: any) => { setSearchValue(e.detail.value) } // 处理地图选择位置 const handleMapLocation = () => { Taro.chooseLocation({ success: (res) => { setSelectedStadium({ name: res.name, address: res.address, longitude: res.longitude, latitude: res.latitude }) setShowDetail(true) }, fail: (err: { errMsg: string }) => { console.error('选择位置失败:', err) const { errMsg } = err || {}; if (!errMsg.includes('fail cancel')) { Taro.showToast({ title: errMsg, icon: "none", }); } } }) } // 处理确认 const handleConfirm = () => { if (stadiumDetailRef.current) { const formData = stadiumDetailRef.current.getFormData() console.log('获取球馆表单数据:', formData) const { description, ...rest } = formData const { description: descriptionInfo} = description; if (descriptionInfo.length > 200 ) { Taro.showToast({ title: `场地信息补充最多可输入200个字`, icon: "none", }); return; }; onConfirm({ ...rest, ...description }) setSelectedStadium(null) setSearchValue('') } } // 处理取消 const handleCancel = () => { onClose() setShowDetail(false) setSelectedStadium(null) setSearchValue('') } const handleDetailCancel = () => { setShowDetail(false) setSelectedStadium(null) setSearchValue('') } const handleItemLocation = (stadium: Stadium) => { if (stadium.latitude && stadium.longitude) { Taro.openLocation({ latitude: stadium.latitude * 1, longitude: stadium.longitude * 1, name: stadium.name, address: stadium.address, success: (res) => { console.log(res, 'resres') } }) } } const markSearchText = (text: string) => { if (!searchValue) return text return text.replace( new RegExp(searchValue, 'gi'), `${searchValue}` ) } // const handleAnyInput = (value) => { // setKeyboardVisible(value) // } // 如果显示详情页面 if (showDetail && selectedStadium) { return ( {/* 内容区域 */} ) } // 显示球馆列表 return ( {/* 搜索框 */} {searchValue && ( setSearchValue('')}> )} { !searchValue && ( 地图 ) } {/* 热门球场标题 */} 热门球场 预定球场 敬请期待 { loading ? ( 加载中 ) : ( {filteredStadiums.map((stadium) => ( handleStadiumSelect(stadium)} > { e.stopPropagation() handleItemLocation(stadium) }} > {calculateDistance(stadium)} · { e.stopPropagation() handleItemLocation(stadium) }} > {stadium.address} ))} {searchValue && ( 没有找到球场?去地图定位 腾讯地图 )} ) } {/* 场馆列表 */} ) } export default SelectStadium