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);