import React, { useState } from "react";
import { View, Text, Button, Image } from "@tarojs/components";
import Taro, { useDidShow, useRouter } from "@tarojs/taro";
import dayjs from "dayjs";
import orderService, {
GameOrderRes,
OrderStatus,
} from "@/services/orderService";
import {
payOrder,
delay,
calculateDistance,
getCurrentLocation,
} from "@/utils";
import detailService, { GameData } from "@/services/detailService";
import { withAuth } from "@/components";
import img from "@/config/images";
import { DECLAIMER } from "./config";
import styles from "./index.module.scss";
dayjs.locale("zh-cn");
function GameInfo(props) {
const { detail, currentLocation, orderDetail } = props;
const { order_status } = orderDetail;
const { latitude, longitude, location, location_name, start_time, end_time } =
detail || {};
const openMap = () => {
Taro.openLocation({
latitude, // 纬度(必填)
longitude, // 经度(必填)
name: location_name, // 位置名(可选)
address: location, // 地址详情(可选)
scale: 15, // 地图缩放级别(1-28)
});
};
const [c_latitude, c_longitude] = currentLocation;
const distance =
c_latitude + c_longitude === 0
? 0
: calculateDistance(c_latitude, c_longitude, latitude, longitude) / 1000;
const startTime = dayjs(start_time);
const endTime = dayjs(end_time);
const game_length = endTime.diff(startTime, "minutes") / 60;
const startMonth = startTime.format("M");
const startDay = startTime.format("D");
const theDayOfWeek = startTime.format("dddd");
const startDate = `${startMonth}月${startDay}日 ${theDayOfWeek}`;
const gameRange = `${startTime.format("HH:mm")} - ${endTime.format("HH:mm")}`;
return (
{order_status !== OrderStatus.PENDING && (
<>
已支付 ¥ 90
球局暂未开始
球局开始前2小时,我们将通过短信通知你
>
)}
{/* Date and Weather */}
{/* Calendar and Date time */}
{/* Calendar */}
{startMonth}月
{startDay}
{/* Date time */}
{startDate}
{gameRange} ({game_length}小时)
{/* Place */}
{/* venue location message */}
{/* location icon */}
{/* location message */}
{/* venue name and distance */}
{location_name || "-"}
{distance ? (
<>
·
{distance.toFixed(1)}km
>
) : null}
{/* venue address */}
{location || "-"}
{/* Action bar */}
);
}
function OrderMsg(props) {
const { detail, checkOrderInfo } = props;
const {
start_time,
end_time,
location,
location_name,
wechat_contact,
price,
} = detail;
const { order_info: { registrant_nickname } = {} } = checkOrderInfo;
const startTime = dayjs(start_time);
const endTime = dayjs(end_time);
const startYear = startTime.format("YYYY");
const startMonth = startTime.format("M");
const startDay = startTime.format("D");
const startDate = `${startYear}年${startMonth}月${startDay}日`;
const gameRange = `${startTime.format("HH:mm")} - ${endTime.format("HH:mm")}`;
const summary = [
{
title: "时间",
content: `${startDate} ${gameRange}`,
},
{
title: "地址",
content: `${location} ${location_name}`,
},
{
title: "组织者昵称",
content: registrant_nickname,
},
{
title: "组织者电话",
content: wechat_contact,
},
{
title: "费用",
content: `${price} 元 / 人`,
},
];
return (
确认订单信息
{/* 订单信息摘要 */}
{summary.map((item, index) => (
{item.title}
{item.content}
))}
);
}
function RefundPolicy(props) {
const { checkOrderInfo } = props;
const { refund_policy = [] } = checkOrderInfo;
const policyList = [
{
time: "申请退款时间",
rule: "退款规则",
},
...refund_policy.map((item, index) => {
const [, theTime] = item.application_time.split("undefined ");
const theTimeObj = dayjs(theTime);
const year = theTimeObj.format("YYYY");
const month = theTimeObj.format("M");
const day = theTimeObj.format("D");
const time = theTimeObj.format("HH:MM");
return {
time: `${year}年${month}月${day}日${time}${index === 0 ? "前" : "后"}`,
rule: item.refund_rule,
};
}),
];
return (
退款政策
{/* 订单信息摘要 */}
{policyList.map((item, index) => (
{item.time}
{item.rule}
))}
);
}
function Disclaimer() {
return (
免责声明
{DECLAIMER}
);
}
const OrderCheck = () => {
const { params } = useRouter();
const { id: stringId, gameId: stringGameId } = params;
const [id, gameId] = [Number(stringId), Number(stringGameId)];
const [detail, setDetail] = useState({});
const [location, setLocation] = useState([0, 0]);
const [checkOrderInfo, setCheckOrderInfo] = useState({});
const [orderDetail, setOrderDetail] = useState({});
useDidShow(async () => {
let gameDetail = {};
if (id) {
const res = await orderService.getOrderDetail(id);
if (res.code === 0) {
setOrderDetail(res.data);
gameDetail = res.data.game_info;
}
} else if (gameId) {
const res = await detailService.getDetail(gameId);
if (res.code === 0) {
gameDetail = res.data;
}
}
if (gameDetail.id) {
setDetail(gameDetail);
onInit(gameDetail.id);
}
});
async function checkOrder(gid) {
const orderRes = await orderService.getCheckOrderInfo(gid);
setCheckOrderInfo(orderRes.data);
}
async function onInit(gid) {
checkOrder(gid);
const location = await getCurrentLocation();
setLocation([location.latitude, location.longitude]);
}
async function getPaymentParams() {
const unPaidRes = await orderService.getUnpaidOrder(detail.id);
if (unPaidRes.code === 0 && unPaidRes.data.has_unpaid_order) {
return unPaidRes.data.payment_params;
}
const createOrderRes = await orderService.createOrder(detail.id);
if (createOrderRes.code === 0) {
return createOrderRes.data.payment_params;
}
throw new Error("支付调用失败");
}
//TODO: get order msg from id
const handlePay = async () => {
Taro.showLoading({
title: "支付中...",
mask: true,
});
try {
const payment_params = await getPaymentParams();
await payOrder(payment_params);
Taro.hideLoading();
Taro.showToast({
title: "支付成功",
icon: "success",
});
await delay(1000);
Taro.navigateBack({
delta: 1,
});
} catch (error) {
Taro.hideLoading();
Taro.showToast({
title: error.message,
icon: "none",
});
}
};
if (!id && !gameId) {
return (
异常订单
);
}
return (
{/* Game Date and Address */}
{/* Order message */}
{/* Refund policy */}
{/* Disclaimer */}
{(!id || orderDetail.order_status === OrderStatus.PENDING) && (
)}
);
};
export default withAuth(OrderCheck);