Merge remote-tracking branch 'origin/main' into anln

This commit is contained in:
al 2024-08-01 19:27:08 +08:00
commit ad365d0ddb
9 changed files with 227 additions and 121 deletions

View File

@ -5,7 +5,7 @@ import React, { useState } from "react";
import { useRouter } from "next/navigation";
import baseRequest from "@/utils/baseRequest";
import { generateSignature } from "@/utils/crypto";
import { Toast } from "antd-mobile";
import { Toast, Modal } from "antd-mobile";
import { checkAuth } from "@/utils/auth";
export default function WechatBar({
@ -111,7 +111,29 @@ export default function WechatBar({
>
<div
className="flex flex-row cursor-pointer items-center justify-center py-4"
onClick={() => document.getElementById("comfirm_modal").showModal()}
onClick={() =>
Modal.alert({
showCloseButton: true,
confirmText: "立即购买",
onConfirm: () => handlePurchase("alipay_h5"),
content: (
<div className="p-2">
<p className="text-white text-base font-medium">
购买成功后请到"账号"-"已购"添加Ta的微信若超72小时未添加成功请联系客服
</p>
<p className="text-secondary text-sm font-medium mt-4 text-center mb-1">
确认购买即视为同意
<Link
className="link text-primary"
href="/doc/rechargeagreement"
>
用户充值协议
</Link>
</p>
</div>
),
})
}
>
<img
src={
@ -151,32 +173,6 @@ export default function WechatBar({
</pre>
</div>
</div>
<dialog id="comfirm_modal" className="modal">
<div className="modal-box bg-[#17161A]">
<p className="text-white text-base font-medium">
购买成功后请到"账号"-"已购"添加Ta的微信若超72小时未添加成功请联系客服
</p>
<p className="text-secondary text-sm font-medium mt-4 text-center mb-1">
确认购买即视为同意
<Link className="link text-primary" href="/doc/rechargeagreement">
用户充值协议
</Link>
</p>
<div className="flex flex-row">
<button
className="flex flex-row flex-1 mx-2 items-center justify-center bg-[#FF669E] rounded-lg py-2"
onClick={() => handlePurchase("alipay_h5")}
>
<p className="text-white text-base ml-1">立即购买</p>
</button>
<form method="dialog" className="flex flex-row flex-1 mx-2">
<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>
</div>
);
}

View File

@ -6,6 +6,7 @@ import baseRequest from "@/utils/baseRequest";
import { generateSignature } from "@/utils/crypto";
import { Toast } from "antd-mobile";
import copy from "@/utils/copy";
import IosInstallStepModal from "@/components/IosInstallStepModal/page";
export default function Download({ params }) {
const [deviceType, setDeviceType] = useState("");
@ -66,6 +67,10 @@ export default function Download({ params }) {
getData();
}, []);
//iosModal
const [isIosInstallStepModalVisible, setIsIosInstallStepModalVisible] =
useState(false);
return (
<section className="flex flex-col container">
<InOtherApp />
@ -120,7 +125,7 @@ export default function Download({ params }) {
{deviceType === "pc" && (
<div className="flex flex-row gap-20">
<a
href="https://filecdn01.tiefen.fun/appdownload/ironfans1.4.6.apk"
href="https://filecdn01.tiefen.fun/appdownload/ironfans1.4.8.apk"
className="group relative cursor-pointer w-20 h-20 rounded-full bg-[#FFFFFF1A]"
>
<p className="group-hover:opacity-100 opacity-0 transition-all duration-300 absolute flex w-full h-full items-center justify-center text-white text-xs">
@ -168,21 +173,29 @@ export default function Download({ params }) {
</div>
<div className="flex flex-col items-center">
{deviceType !== "pc" && (
<>
<a
onClick={copyInviter}
className="btn bg-gradient-to-r from-[#FF668B] to-[#FF66F0] rounded-full text-white text-lg font-medium w-64 h-14"
href={
<div
className="btn bg-gradient-to-r from-[#FF668B] to-[#FF66F0] rounded-full text-white text-lg font-medium w-64 h-14"
onClick={() => {
copyInviter();
if (deviceType === "ios") setIsIosInstallStepModalVisible(true);
const url =
deviceType === "ios"
? "itms-services://?action=download-manifest&url=https://filecdn01.tiefen.fun/appdownload/ironfans.plist"
: "https://filecdn01.tiefen.fun/appdownload/ironfans1.4.6.apk"
: "https://filecdn01.tiefen.fun/appdownload/ironfans1.4.8.apk";
window.location.href = url;
if (deviceType === "ios") {
setIsIosInstallStepModalVisible(true);
}
>
安装
</a>
</>
}}
>
安装
</div>
)}
</div>
<IosInstallStepModal
isVisible={isIosInstallStepModalVisible}
setIsVisible={setIsIosInstallStepModalVisible}
/>
<div className="flex flex-row items-center bg-[#13121F] w-full fixed bottom-0 left-0 rounded-t-2xl p-4">
<div className="w-12 h-12 rounded-full overflow-hidden">
<img

View File

@ -31,7 +31,10 @@ export default function RootLayout({ children }) {
className="bg-[#07050A]"
data-prefers-color-scheme="dark"
>
<body className="box-border min-h-screen flex flex-col">
<body
className="box-border min-h-screen flex flex-col"
style={{ "--adm-color-primary": "#FF669E" }}
>
<div className="flex flex-1 justify-center">{children}</div>
</body>
</html>

View File

@ -4,6 +4,7 @@ import React, { useState, useEffect } from "react";
import InOtherApp from "@/components/InOtherApp";
import Footer from "@/components/Footer";
import Link from "next/link";
import IosInstallStepModal from "@/components/IosInstallStepModal/page";
export default function Home() {
const [deviceType, setDeviceType] = useState("");
@ -18,6 +19,11 @@ export default function Home() {
setDeviceType("pc");
}
}, []);
//iosModal
const [isIosInstallStepModalVisible, setIsIosInstallStepModalVisible] =
useState(false);
return (
<section className="flex flex-col container">
<InOtherApp />
@ -99,7 +105,7 @@ export default function Home() {
{deviceType === "pc" && (
<div className="flex flex-row gap-20">
<a
href="https://filecdn01.tiefen.fun/appdownload/ironfans1.4.6.apk"
href="https://filecdn01.tiefen.fun/appdownload/ironfans1.4.8.apk"
className="group relative cursor-pointer w-20 h-20 rounded-full bg-[#FFFFFF1A]"
>
<p className="group-hover:opacity-100 opacity-0 transition-all duration-300 absolute flex w-full h-full items-center justify-center text-white text-xs">
@ -153,11 +159,15 @@ export default function Home() {
<div
className="btn bg-gradient-to-r from-[#FF668B] to-[#FF66F0] rounded-full text-white text-lg font-medium w-64 h-14"
onClick={() => {
if (deviceType === "ios") setIsIosInstallStepModalVisible(true);
const url =
deviceType === "ios"
? "itms-services://?action=download-manifest&url=https://filecdn01.tiefen.fun/appdownload/ironfans.plist"
: "https://filecdn01.tiefen.fun/appdownload/ironfans1.4.6.apk";
: "https://filecdn01.tiefen.fun/appdownload/ironfans1.4.8.apk";
window.location.href = url;
if (deviceType === "ios") {
setIsIosInstallStepModalVisible(true);
}
}}
>
安装
@ -176,6 +186,10 @@ export default function Home() {
)}
</div>
</div>
<IosInstallStepModal
isVisible={isIosInstallStepModalVisible}
setIsVisible={setIsIosInstallStepModalVisible}
/>
<Footer />
</section>
);

View File

@ -41,7 +41,7 @@ export default function Info() {
如您未在使用中国大陆地区的网络支付结果可能会延迟发送请您耐心等候如超过一分钟您仍未收到支付完成的消息提示请尝试联系人工客服
</p>
<p className="text-white text-base font-medium mt-4">
如仍有其他支付问题请返回充值页面点击右下角人工充值工作日9:00-21:00
如仍有其他支付问题请返回我的页面联系客服进行充值每日10:00-24:00
</p>
</div>
</div>

View File

@ -1,7 +1,7 @@
"use client";
import React, { useState, useEffect } from "react";
import AuthBar from "@/components/AuthBar";
import { Toast } from "antd-mobile";
import { Toast, Modal } from "antd-mobile";
import { checkAuth } from "@/utils/auth";
import { useRouter } from "next/navigation";
import baseRequest from "@/utils/baseRequest";
@ -65,7 +65,6 @@ export default function Purchased() {
getData();
}, []);
const [currentWechat, setCurrentWechat] = useState("");
const getWechat = async (streamerMid) => {
//
try {
@ -94,7 +93,7 @@ export default function Purchased() {
});
return;
}
setCurrentWechat(detailData.data.wechat_contact);
return detailData.data.wechat_contact;
} catch (error) {
console.error(error);
}
@ -103,11 +102,24 @@ export default function Purchased() {
const DirectGetWechatItem = ({ item }) => {
//
const handleClick = async () => {
await getWechat(item?.account.mid);
setTimeout(
() => document.getElementById("get_wechat_modal").showModal(),
100
);
const wechat = await getWechat(item?.account.mid);
Modal.alert({
showCloseButton: true,
confirmText: "复制",
onConfirm: () => {
copy(wechat);
Toast.show({
content: "复制成功",
});
},
content: (
<div className="p-2">
<p className="text-white text-base font-medium text-center mb-4">
Ta的微信号<span>{wechat}</span>
</p>
</div>
),
});
};
//
@ -162,37 +174,6 @@ export default function Purchased() {
);
};
const GetWechatModal = () => {
const handleCopy = () => {
copy(currentWechat);
Toast.show({
content: "复制成功",
});
};
return (
<dialog id="get_wechat_modal" className="modal">
<div className="modal-box bg-[#17161A]">
<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("");
@ -341,7 +322,6 @@ export default function Purchased() {
return <DirectGetWechatItem key={item.order_id} item={item} />;
}
})}
<GetWechatModal />
</section>
);
}

View File

@ -82,8 +82,13 @@ export default function Vip() {
//
const [isLoading, setIsLoading] = useState(false);
const createOrder = async (type = "alipay_h5") => {
const webviewBase = webviewBaseRequest();
let base = getBase(webviewBase)
const base = webviewBaseRequest();
if (base?.b_dt === 1) {
Toast.show({
content: "ios暂时无法开通会员请等待版本更新",
});
return;
}
const body = {
...base,
product_id: "membership",

View File

@ -1,15 +1,16 @@
"use client";
import React, { useState, useEffect } from "react";
import { Toast } from "antd-mobile";
import { Toast, Modal } from "antd-mobile";
import baseRequest from "@/utils/baseRequest";
import { generateSignature } from "@/utils/crypto";
import copy from "@/utils/copy";
import { setCookie } from "cookies-next";
import Link from "next/link";
import InOtherApp from "@/components/InOtherApp";
import { useRouter } from "next/navigation";
export default function Zone({ params }) {
const router = useRouter();
//
const [data, setData] = useState({});
useEffect(() => {
@ -46,12 +47,24 @@ export default function Zone({ params }) {
getData();
}, []);
//cookie
const copyAndSetCookieInviter = () => {
//cookiemodal
const showModal = () => {
setCookie("inviter", data?.streamer_ext?.user_id);
copy(
`${data?.streamer_ext?.name}】『ID${data?.streamer_ext?.user_id}复制此条消息打开铁粉空间APP查看详情https://tiefen.fun/zone/${data?.streamer_ext?.user_id}`
);
Modal.alert({
showCloseButton: true,
confirmText: "前往下载",
onConfirm: () => router.push("/"),
content: (
<div className="p-2">
<p className="text-white text-base font-medium">
{`请打开或下载【铁粉空间】APP根据APP内弹窗指引加入空间。如未弹出请在APP搜索ID${data?.streamer_ext?.user_id},加入空间。`}
</p>
</div>
),
});
};
return (
@ -143,10 +156,7 @@ export default function Zone({ params }) {
<div className="flex flex-row justify-around px-6 pt-6 z-10">
<div
className="flex flex-row items-center gap-1 cursor-pointer"
onClick={() => {
copyAndSetCookieInviter();
document.getElementById("comfirm_modal").showModal();
}}
onClick={showModal}
>
<img
src={process.env.NEXT_PUBLIC_CDN_URL + "/public/images/tiefen.png"}
@ -157,10 +167,7 @@ export default function Zone({ params }) {
</div>
<div
className="flex flex-row items-center gap-1 cursor-pointer"
onClick={() => {
copyAndSetCookieInviter();
document.getElementById("comfirm_modal").showModal();
}}
onClick={showModal}
>
<img
src={process.env.NEXT_PUBLIC_CDN_URL + "/public/images/wechat.png"}
@ -173,10 +180,7 @@ export default function Zone({ params }) {
<div className="px-6 pt-6">
<div
className="btn bg-gradient-to-r from-[#FF668B] to-[#FF66F0] rounded-full text-white text-lg font-medium w-full"
onClick={() => {
copyAndSetCookieInviter();
document.getElementById("comfirm_modal").showModal();
}}
onClick={showModal}
>
立即加入
</div>
@ -206,26 +210,6 @@ export default function Zone({ params }) {
3本平台不提供违法及色情内容如您发现空间内存在以上内容请联系人工客服举报处理
</p>
</div>
<dialog id="comfirm_modal" className="modal">
<div className="modal-box bg-[#17161A]">
<p className="text-white text-base font-medium">
{`请打开或下载【铁粉空间】APP根据APP内弹窗指引加入空间。如未弹出请在APP搜索ID${data?.streamer_ext?.user_id},加入空间。`}
</p>
<div className="flex flex-row mt-4">
<Link
className="flex flex-row flex-1 mx-2 items-center justify-center bg-[#FF669E] rounded-lg py-2"
href="/"
>
<p className="text-white text-base ml-1">确认</p>
</Link>
<form method="dialog" className="flex flex-row flex-1 mx-2">
<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>
</section>
);
}

View File

@ -0,0 +1,111 @@
"use client";
import React, { useEffect, useState } from "react";
import { Mask } from "antd-mobile";
import Link from "next/link";
export default function IosInstallStepModal({ isVisible, setIsVisible }) {
const [stepIndex, setStepIndex] = useState(1);
useEffect(() => {
if (!isVisible) {
setStepIndex(1);
return;
}
const timeoutId = setTimeout(
() =>
setStepIndex((prev) => {
if (prev === 6) return 1;
return prev + 1;
}),
3000
);
return () => {
clearTimeout(timeoutId);
};
}, [isVisible, stepIndex]);
return (
<Mask
visible={isVisible}
onMaskClick={() => setIsVisible(false)}
opacity="thick"
>
<div className="w-full h-screen flex justify-center items-center">
<div className="flex flex-col relative items-center py-8 px-4 bg-[#17161A] rounded-2xl w-4/5">
<svg
onClick={() => setIsVisible(!isVisible)}
className="absolute right-4 top-4"
viewBox="0 0 1024 1024"
width="20"
height="20"
>
<path
d="M155.00305177 868.99694823c-21.96904297-21.96904297-21.96904297-60.41486817 0-82.38391112l631.60998534-631.60998534c21.96904297-21.96904297 60.41486817-21.96904297 82.38391112 0s21.96904297 60.41486817 0 82.38391112l-631.60998534 631.60998534c-21.96904297 21.96904297-60.41486817 21.96904297-82.38391112 0z"
fill="#ffffff"
></path>
<path
d="M155.00305177 155.00305177c21.96904297-21.96904297 60.41486817-21.96904297 82.38391112 0l631.60998534 631.60998534c21.96904297 21.96904297 21.96904297 60.41486817 0 82.38391112s-60.41486817 21.96904297-82.38391112 0l-631.60998534-631.60998534c-21.96904297-21.96904297-21.96904297-60.41486817 0-82.38391112z"
fill="#ffffff"
></path>
</svg>
<div className="flex flex-col gap-1 mb-4">
<p className="text-white text-center font-medium text-sm">
请等待安装完成然后开始设置
</p>
<p className="text-white text-center font-medium text-sm">
若安装后无法正常使用请删除旧版APP
</p>
<p className="text-white text-center font-medium text-sm">
请务必按以下步骤进行设置详细
<Link
className="link text-primary cursor-pointer"
href="/doc/ioshowtoinstall"
>
安装教程
</Link>
</p>
</div>
<img
src={
process.env.NEXT_PUBLIC_CDN_URL +
`/public/images/iosinstall_${stepIndex}.png`
}
alt=""
/>
<div className="mt-4 flex w-full h-12 rounded-full items-center justify-center bg-primary">
{stepIndex === 1 && (
<p className="text-base font-medium text-white">
第1步打开设置
</p>
)}
{stepIndex === 2 && (
<p className="text-base font-medium text-white">
第2步点击通用
</p>
)}
{stepIndex === 3 && (
<p className="text-base font-medium text-white">
第3步点击VPN与设备管理
</p>
)}
{stepIndex === 4 && (
<p className="text-base font-medium text-white">
第4步点击证书
</p>
)}
{stepIndex === 5 && (
<p className="text-base font-medium text-white">
第5步点击信任证书
</p>
)}
{stepIndex === 6 && (
<p className="text-base font-medium text-white">
第6步在弹出页点击信任
</p>
)}
</div>
</div>
</div>
</Mask>
);
}