"use client"; import React, { useState, useEffect } from "react"; import AuthBar from "@/components/AuthBar"; import { Toast } from "antd-mobile"; import { checkAuth } from "@/utils/auth"; import { useRouter } from "next/navigation"; import baseRequest from "@/utils/baseRequest"; import { generateSignature } from "@/utils/crypto"; import copy from "@/utils/copy"; export default function Purchased() { //如果没登录直接跳转下载页 const router = useRouter(); useEffect(() => { const prepare = async () => { const isLogined = await checkAuth(); if (!isLogined) { router.replace("/auth/login/phonenumlogin"); } }; prepare(); }, []); //获取订单数据 const [data, setData] = useState([]); useEffect(() => { const getData = async () => { try { const base = baseRequest(); const signature = generateSignature({ offset: 0, limit: 99, ...base, }); const detailResponse = await fetch( `/api/vas/h5_get_unlock_wechat_list?signature=${signature}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ offset: 0, limit: 99, ...base, }), } ); const detailData = await detailResponse.json(); if (detailData.ret === -1) { Toast.show({ content: detailData.msg, }); return; } setData(detailData.data.list); } catch (error) { console.error(error); } }; getData(); }, []); const [currentWechat, setCurrentWechat] = useState(""); const getWechat = async (streamerMid) => { // 获取微信 try { const base = baseRequest(); const signature = generateSignature({ uid: streamerMid, ...base, }); const detailResponse = await fetch( `/api/vas/query_wechat?signature=${signature}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ uid: streamerMid, ...base, }), } ); const detailData = await detailResponse.json(); if (detailData.ret === -1) { Toast.show({ content: detailData.msg, }); return; } setCurrentWechat(detailData.data.wechat_contact); } catch (error) { console.error(error); } }; const DirectGetWechatItem = ({ item }) => { //点击查看微信 const handleClick = async () => { await getWechat(item?.account.mid); setTimeout( () => document.getElementById("get_wechat_modal").showModal(), 100 ); }; //点击主播 const handleNavigation = () => { router.push(`../${item?.account.user_id}`); }; let orderLabel; switch (item.order_status) { case 3: orderLabel = item.lock_type === 1 ? `等待${item.account.name}添加您的微信` : "请查看并添加微信"; break; case 4: orderLabel = `${item.account.name}已确认完成添加`; break; case 5: orderLabel = `订单已完成`; break; case 6: orderLabel = `已退款`; break; default: orderLabel = ""; } return ( <div className="flex flex-row justify-between items-center py-2 border-b-2 border-neutral"> <div onClick={handleNavigation} className="flex flex-row items-center"> <img className="w-12 h-12 rounded-full" src={item.account?.avatar?.images[0].urls[0]} alt="" /> <div className="flex flex-col ml-2"> <p className="text-base text-white font-medium"> {item.account?.name} </p> <p className="text-sm text-secondary font-medium">{orderLabel}</p> </div> </div> {item.lock_type === 0 && item.order_status !== 6 && ( <button className="btn btn-sm btn-primary text-white rounded-full" onClick={handleClick} > 查看微信 </button> )} </div> ); }; const GetWechatModal = () => { const handleCopy = () => { copy(currentWechat); Toast.show({ content: "复制成功", }); }; return ( <dialog id="get_wechat_modal" className="modal"> <div className="modal-box bg-[#13121F]"> <p className="text-white text-base font-medium text-center mb-4"> Ta的微信号:<span>{currentWechat}</span> </p> <div className="flex flex-row"> <form method="dialog" className="flex flex-row flex-1 mx-2"> <button className="flex flex-row flex-1 mx-2 items-center justify-center bg-[#FF669E] rounded-lg py-2" onClick={handleCopy} > <p className="text-white text-base ml-1">复制</p> </button> <button className="flex flex-row flex-1 items-center justify-center border border-secondary rounded-lg py-2"> <p className="text-secondary text-base ml-1">取消</p> </button> </form> </div> </div> </dialog> ); }; const SubmitUserWechatItem = ({ item }) => { const [wechat, setWechat] = useState(""); const [remarks, setRemarks] = useState(""); const [status, setStatus] = useState("pending"); const handleSubmit = async (e) => { e.preventDefault(); if (!wechat) { Toast.show({ content: "请填写微信号", }); return; } //提交用户微信号 try { const base = baseRequest(); const signature = generateSignature({ order_id: item.order_id, wechat: wechat, note: remarks, ...base, }); const detailResponse = await fetch( `/api/vas/consumer_fill_contact?signature=${signature}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ order_id: item.order_id, wechat: wechat, note: remarks, ...base, }), } ); const detailData = await detailResponse.json(); if (detailData.ret === -1) { Toast.show({ content: detailData.msg, }); return; } //提交成功后隐藏form并显示toast setStatus("inprogress"); Toast.show({ content: "提交成功,请留意好友请求", }); } catch (error) { console.error(error); } }; return ( <div className="flex flex-col py-2 border-b-2 border-neutral"> <div className="flex flex-row items-center"> <img className="w-12 h-12 rounded-full" src={item.account?.avatar?.images[0].urls[0]} alt="" /> <div className="flex flex-col ml-2"> <p className="text-base text-white font-medium"> {item.account?.name} </p> <p className="text-sm text-secondary font-medium"> {status === "pending" ? "请填写您的微信等待Ta添加您" : "已提交您的微信,请留意好友请求"} </p> </div> </div> {status === "pending" && ( <form onSubmit={handleSubmit}> <p className="text-white text-base mt-2">您的微信:</p> <input type="text" name="wechat" placeholder="请输入微信号" value={wechat} onChange={(e) => setWechat(e.target.value)} className="input input-bordered input-md input-primary w-full max-w-sm" /> <p className="text-white text-base mt-2">备注:</p> <input type="text" name="remarks" placeholder="若需要填写验证信息,请备注答案" value={remarks} onChange={(e) => setRemarks(e.target.value)} className="input input-bordered input-md input-primary w-full max-w-sm" /> <p className="text-error text-xs mt-2"> 若超72小时仍未收到Ta的好友申请,请前往APP联系客服退款 </p> <button className="btn btn-sm btn-primary text-white rounded-full w-full max-w-sm mt-2"> 提交 </button> </form> )} </div> ); }; return ( <section className="flex flex-col container relative p-4"> <AuthBar /> <h1 className="text-2xl text-white font-medium mb-4">已购买</h1> {data.length === 0 && ( <div className="flex flex-col mt-4 w-full items-center"> <svg viewBox="0 0 1024 1024" width="120" height="120"> <path d="M102.4 896a409.6 51.2 0 1 0 819.2 0 409.6 51.2 0 1 0-819.2 0Z" fill="#4A68CC" opacity=".1" ></path> <path d="M116.736 376.832c0 8.704 6.656 15.36 15.36 15.36s15.36-6.656 15.36-15.36-6.656-15.36-15.36-15.36c-8.192 0-15.36 7.168-15.36 15.36zM926.72 832c-19.456 5.12-23.552 9.216-28.16 28.16-5.12-19.456-9.216-23.552-28.16-28.16 18.944-5.12 23.552-9.216 28.16-28.16 4.608 18.944 8.704 23.552 28.16 28.16zM202.24 323.072c-25.088 6.656-30.208 11.776-36.864 36.864-6.656-25.088-11.776-30.208-36.864-36.864 25.088-6.656 30.208-12.288 36.864-36.864 6.144 25.088 11.776 30.208 36.864 36.864zM816.64 235.008c-15.36 4.096-18.432 7.168-22.528 22.528-4.096-15.36-7.168-18.432-22.528-22.528 15.36-4.096 18.432-7.168 22.528-22.528 3.584 15.36 7.168 18.432 22.528 22.528zM882.688 156.16c-39.936 10.24-48.128 18.944-58.88 58.88-10.24-39.936-18.944-48.128-58.88-58.88 39.936-10.24 48.128-18.944 58.88-58.88 10.24 39.424 18.944 48.128 58.88 58.88z" fill="#4A68CC" opacity=".5" ></path> <path d="M419.84 713.216v4.096l33.792 31.232 129.536-62.976L465.92 760.832v36.864l18.944-18.432v-0.512 0.512l18.944 18.432 100.352-122.88v-4.096z" fill="#4A68CC" opacity=".2" ></path> <path d="M860.16 551.936v-1.024c0-1.024-0.512-1.536-0.512-2.56v-0.512l-110.08-287.232c-15.872-48.64-60.928-81.408-112.128-81.408H387.072c-51.2 0-96.256 32.768-112.128 81.408L164.864 547.84v0.512c-0.512 1.024-0.512 1.536-0.512 2.56V757.76c0 65.024 52.736 117.76 117.76 117.76h460.8c65.024 0 117.76-52.736 117.76-117.76v-204.8c-0.512-0.512-0.512-0.512-0.512-1.024zM303.616 271.36s0-0.512 0.512-0.512C315.392 233.984 349.184 209.92 387.072 209.92h249.856c37.888 0 71.68 24.064 83.456 60.416 0 0 0 0.512 0.512 0.512l101.888 266.24H588.8c-8.704 0-15.36 6.656-15.36 15.36 0 33.792-27.648 61.44-61.44 61.44s-61.44-27.648-61.44-61.44c0-8.704-6.656-15.36-15.36-15.36H201.728L303.616 271.36zM829.44 757.76c0 48.128-38.912 87.04-87.04 87.04H281.6c-48.128 0-87.04-38.912-87.04-87.04v-189.44h226.816c7.168 43.52 45.056 76.8 90.624 76.8s83.456-33.28 90.624-76.8H829.44v189.44z" fill="#4A68CC" opacity=".5" ></path> <path d="M512 578.56c-14.336 0-25.6-11.264-25.6-25.6V501.76H253.44l83.968-219.136 0.512-1.024c7.168-21.504 26.624-35.84 49.152-35.84h249.856c22.528 0 41.984 14.336 49.152 35.84l0.512 1.024L770.56 501.76H537.6v51.2c0 14.336-11.264 25.6-25.6 25.6z" fill="#4A68CC" opacity=".2" ></path> </svg> <p className="text-base mt-2 font-medium"> 若购买成功却未展示订单,请刷新页面 </p> </div> )} {data.map((item) => { if (item.order_status === 2) { return <SubmitUserWechatItem key={item.order_id} item={item} />; } else { return <DirectGetWechatItem key={item.order_id} item={item} />; } })} <GetWechatModal /> </section> ); }