Files
mini-programs/src/game_pages/detail/components/GameInfo/index.tsx
2026-03-25 06:03:07 +08:00

209 lines
6.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import Taro from "@tarojs/taro";
import dayjs, { Dayjs } from "dayjs";
import "dayjs/locale/zh-cn";
import { calculateDistance, genGameLength } from "@/utils";
import { View, Image, Text, Map } from "@tarojs/components";
import img from "@/config/images";
import styles from "./index.module.scss";
dayjs.locale("zh-cn");
function genGameRange(startTime: Dayjs, endTime: Dayjs) {
if (!startTime || !endTime) {
return "";
}
// 如果跨天(自然日)
if (!startTime.isSame(endTime, "day")) {
return `${startTime.format("HH:mm")} - ${endTime.format("MM月DD日 HH:mm")}`;
}
return `${startTime.format("HH:mm")} - ${endTime.format("HH:mm")}`;
}
// 球局信息
export default function GameInfo(props) {
const { detail, currentLocation } = props;
const {
latitude,
longitude,
location,
location_name,
start_time,
end_time,
weather,
} = detail || {};
const [{ iconDay, tempMax, tempMin }] = weather || [{}];
const openMap = () => {
Taro.openLocation({
latitude, // 纬度(必填)
longitude, // 经度(必填)
name: location_name, // 位置名(可选)
address: location, // 地址详情(可选)
scale: 15, // 地图缩放级别1-28
});
};
const [c_latitude, c_longitude] = currentLocation;
// 判断当前位置是否有效(不是初始值 [0, 0]
const is_current_location_valid = c_latitude !== 0 && c_longitude !== 0;
const distance =
latitude && longitude && is_current_location_valid
? calculateDistance(c_latitude, c_longitude, latitude, longitude) / 1000
: 0;
const startTime = dayjs(start_time);
const endTime = dayjs(end_time);
const game_length = genGameLength(startTime, endTime);
const startMonth = startTime.format("M");
const startDay = startTime.format("D");
const theDayOfWeek = startTime.format("dddd");
const startDate = `${startMonth}${startDay}${theDayOfWeek}`;
const gameRange = genGameRange(startTime, endTime);
return (
<View className={styles["detail-page-content-game-info"]}>
{/* Date and Weather */}
<View className={styles["detail-page-content-game-info-date-weather"]}>
{/* Calendar and Date time */}
<View
className={
styles["detail-page-content-game-info-date-weather-calendar-date"]
}
>
{/* Calendar */}
<View
className={
styles[
"detail-page-content-game-info-date-weather-calendar-date-calendar"
]
}
>
<View className={styles.month}>{startMonth}</View>
<View className={styles.day}>{startDay}</View>
</View>
{/* Date time */}
<View
className={
styles[
"detail-page-content-game-info-date-weather-calendar-date-date"
]
}
>
<View className={styles.date}>{startDate}</View>
<View className={styles["venue-time"]}>
{gameRange} ({game_length})
</View>
</View>
</View>
{/* Weather */}
<View
className={
styles["detail-page-content-game-info-date-weather-weather"]
}
>
{/* Weather icon */}
<View
className={
styles["detail-page-content-game-info-date-weather-weather-icon"]
}
>
{/*<Image className="weather-icon" src={img.ICON_WEATHER_SUN} />*/}
<i className={`qi-${iconDay}`}></i>
</View>
{/* Weather text and temperature */}
<View
className={
styles[
"detail-page-content-game-info-date-weather-weather-text-temperature"
]
}
>
{tempMin && tempMax && (
<Text>
{tempMin} - {tempMax}
</Text>
)}
</View>
</View>
</View>
{/* Place */}
<View className={styles["detail-page-content-game-info-place"]}>
{/* venue location message */}
<View className={styles["location-message"]}>
{/* location icon */}
<View className={styles["location-message-icon"]}>
<Image
className={styles["location-message-icon-image"]}
src={img.ICON_DETAIL_MAP}
/>
</View>
{/* location message */}
<View className={styles["location-message-text"]}>
{/* venue name and distance */}
{distance ? (
<View
className={styles["location-message-text-name-distance"]}
onClick={openMap}
>
<Text>{location_name || "-"}</Text>
<Text>·</Text>
<Text>{distance.toFixed(1)}km</Text>
<Image
className={
styles["location-message-text-name-distance-arrow"]
}
src={img.ICON_DETAIL_ARROW_RIGHT}
/>
</View>
) : (
""
)}
{/* venue address */}
<View className={styles["location-message-text-address"]}>
<Text>{location || "-"}</Text>
</View>
</View>
</View>
{/* venue map */}
<View className={styles["location-map"]}>
{longitude && latitude && (
<Map
className={styles["location-map-map"]}
longitude={longitude}
latitude={latitude}
markers={[
{
id: 1,
latitude,
longitude,
iconPath: require("@/static/detail/icon-stark.svg"),
width: 16,
height: 16,
},
]}
includePoints={
is_current_location_valid
? [
{ latitude, longitude },
{ latitude: c_latitude, longitude: c_longitude },
]
: [{ latitude, longitude }]
}
includePadding={{ left: 50, right: 50, top: 50, bottom: 50 }}
onError={() => {}}
// hide business msg
showLocation
theme="dark"
enableScroll={false}
enableZoom={false}
onTap={openMap}
/>
)}
</View>
</View>
</View>
);
}