Merge remote-tracking branch 'origin/main' into version_1.1

This commit is contained in:
al 2024-12-26 20:13:47 +08:00
commit c4650da62e
8 changed files with 136 additions and 53 deletions

View File

@ -192,12 +192,6 @@ function Login({ handleLogin }) {
);
} catch (error) {
setIsLoading(false);
// alert("Error: " + error);
// Toast.show({
// icon: "fail",
// content: error,
// position: "top",
// });
// console.error(error);
}
};

View File

@ -7,6 +7,8 @@ import { faAngleLeft } from "@fortawesome/free-solid-svg-icons";
import { useRouter } from "next/navigation";
import { formatDeadline } from "@/utils/tools";
import requireAPI from "@/utils/requireAPI";
import { handleLogout } from "@/api/public";
export default function DeleteAccount() {
const [deadline, setDeadline] = useState();
const router = useRouter();
@ -49,6 +51,8 @@ export default function DeleteAccount() {
}
checkAccountStatus();
showMobal.current?.close();
await handleLogout();
router.replace("/login");
} catch (error) {
// console.error(error);
}
@ -73,7 +77,8 @@ export default function DeleteAccount() {
const handleShowDialog = () => {
showMobal.current = Dialog.show({
title: "您确认要注销此账号吗?",
content: "注销后无法恢复,请仔细阅读《注销必看须知》后确认。",
content:
"提交注销后我们将在7个自然日后完全清除您的账号信息在此期间若您再次登陆则视为放弃注销。请仔细阅读《注销必看须知》后确认。",
bodyStyle: {
maxHeight: "none",
width: "80vw",
@ -144,7 +149,7 @@ export default function DeleteAccount() {
</p>
<p className="text-white text-base font-medium mt-2">3注销时间</p>
<p className="text-[#FFFFFFB2] text-base">
您发起注销账户申请后我们将在7个自然日后完全清除您的账号信息在此期间您可以随时在本页面撤销该申请
您发起注销账户申请后我们将在7个自然日后完全清除您的账号信息在此期间若您再次登陆则视为放弃注销
</p>
<p className="text-white text-base font-medium mt-2">4其他</p>
<p className="text-[#FFFFFFB2] text-base">

View File

@ -2,31 +2,63 @@
import React, { useEffect, useState } from "react";
import { Divider, Toast } from "antd-mobile";
import { useRouter, useParams, useSearchParams } from "next/navigation";
import { useRouter, useParams } from "next/navigation";
import clipboard from "copy-to-clipboard";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
faAngleLeft,
faAngleRight,
faWallet,
faPrint,
faDollar,
} from "@fortawesome/free-solid-svg-icons";
import { faAngleLeft, faAngleRight } from "@fortawesome/free-solid-svg-icons";
import { getStreamerInfo } from "@/api/space";
export default function ShareSpace({ data }) {
import requireAPI from "@/utils/requireAPI";
export default function ShareSpace() {
const router = useRouter();
const { mid } = useParams();
const searchParams = useSearchParams();
const webUrl = process.env.NEXT_PUBLIC_WEB_URL;
const [streamerInfo, setStreamerInfo] = useState(null);
const [shareWebUrl, setShareWebUrl] = useState("https://tiefen.fun");
function generateRandomString(length = 10) {
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
for (let i = 0; i < length; i++) {
result += characters.charAt(
Math.floor(Math.random() * characters.length)
);
}
return result;
}
useEffect(() => {
getStreamerInfo(Number(mid)).then((res) => {
setStreamerInfo(res);
});
function getRandomUrl(urls) {
return urls[Math.floor(Math.random() * urls.length)];
}
const getShareWebUrl = async () => {
try {
const data = await requireAPI("POST", "/api/config/cold_config", {
body: {},
});
if (data.ret === -1) {
Toast.show({
content: data.msg,
});
return;
}
const randomUrl = getRandomUrl(data.data.share_redirect_urls);
setShareWebUrl(randomUrl);
} catch (error) {
console.error(error);
}
};
getShareWebUrl();
}, []);
//保存内容到剪贴板
const copy = (_data) => {
// console.log("_data",_data)
clipboard(_data);
Toast.show({
icon: "success",
@ -44,13 +76,13 @@ export default function ShareSpace({ data }) {
//复制邀请链接
const copyShareUrl = () => {
const shareCode = `${webUrl}/zone/${streamerInfo?.streamer_ext?.user_id}`;
// console.log("shareCode", shareCode);
const randomStr = generateRandomString();
const shareCode = `${shareWebUrl}/zone/${streamerInfo?.streamer_ext?.user_id}/${randomStr}`;
copy(shareCode);
};
return (
<div className="">
<div>
<div className="p-4 fixed top-0 z-10 w-full">
<div className="w-9 h-9 flex items-center justify-center bg-[#FFFFFF1A] rounded-full float-left absolute">
<FontAwesomeIcon

View File

@ -240,7 +240,7 @@ export default function PersonSpaceIntroduce() {
handler.current = Dialog.confirm({
header: "提醒",
content:
"本空间内容为达人创建并维护,属于虚拟服务,不可退款,且空间内存在部分内容需要另外付费,请再次确认是否付费加入",
"本空间内容为达人创建并维护,属于虚拟服务,不可退款,请再次确认是否付费加入",
bodyStyle: {
maxHeight: "none",
width: "80vw",

View File

@ -58,7 +58,8 @@ export default function CollaboratorSetting() {
const visitor_role = Number(searchParams.get("visitor_role"));
try {
setIsloading(true);
setSelfMid(zid);
const base = baseRequest();
setSelfMid(base.b_mid);
const body = {
zid,
visitor_role,
@ -190,16 +191,17 @@ export default function CollaboratorSetting() {
const selfData = data?.list?.filter(
(item) => item.collaborator_mid === selfMid
);
if (isloading) {
return (
<div className="bg-[#00000099] fixed top-0 w-full text-center flex items-center justify-center h-screen">
<SpinLoading />
</div>
);
}
return (
<div>
{isloading && (
<div
className="bg-[#00000099] fixed top-0 w-full text-center flex items-center justify-center h-screen"
// style={{ height: scrollHeight - 60 + "px" }}
>
<SpinLoading />
</div>
)}
{/* 头部标题 */}
<div className="p-4 fixed top-0 z-10 w-full bg-black">
<div className="w-9 h-9 flex items-center justify-center bg-[#FFFFFF1A] rounded-full absolute">
@ -216,19 +218,21 @@ export default function CollaboratorSetting() {
</div>
{/* 内容 */}
<div className="p-4 pt-20">
{searchParams.get("visitor_role") === 2 ? (
<div className="p-4 pt-20">
<div className="flex flex-col border-2 border-[#2c2b2f] rounded-2xl p-4 w-full mt-6">
<p>合伙人昵称{selfData[0]?.collaborator_account?.name}</p>
<p>ID{selfData[0]?.collaborator_account?.user_id}</p>
<p>
分成比例
{selfData[0]?.sharing_ratio
? (selfData[0]?.sharing_ratio * 100).toFixed()
: 0}
%
</p>
</div>
{searchParams.get("visitor_role") == 2 && selfData ? (
<div className="flex flex-col gap-2 border-2 border-[#2c2b2f] rounded-2xl p-4 w-full mt-6">
<p className="text-base font-medium whitespace-nowrap">
合伙人昵称{selfData[0]?.collaborator_account?.name}
</p>
<p className="text-base font-medium whitespace-nowrap">
ID{selfData[0]?.collaborator_account?.user_id}
</p>
<p className="text-base font-medium whitespace-nowrap">
分成比例
{selfData[0]?.sharing_ratio
? (selfData[0]?.sharing_ratio * 100).toFixed()
: 0}
%
</p>
</div>
) : (
<div className="flex flex-col items-center p-4">

View File

@ -10,14 +10,51 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAngleLeft } from "@fortawesome/free-solid-svg-icons";
import { saveDivImage } from "@/utils/tools/handleFuns";
import clipboard from "copy-to-clipboard";
export default function Share() {
//
const [data, setData] = useState({});
const [qrcodeUrl, setQrcodeUrl] = useState("");
const [shareWebUrl, setShareWebUrl] = useState("https://tiefen.fun");
const [isFetching, setIsFetching] = useState(true);
const router = useRouter();
const { user_id } = useParams();
function generateRandomString(length = 10) {
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
for (let i = 0; i < length; i++) {
result += characters.charAt(
Math.floor(Math.random() * characters.length)
);
}
return result;
}
useEffect(() => {
function getRandomUrl(urls) {
return urls[Math.floor(Math.random() * urls.length)];
}
const getShareWebUrl = async () => {
try {
const data = await requireAPI("POST", "/api/config/cold_config", {
body: {},
});
if (data.ret === -1) {
Toast.show({
content: data.msg,
});
return "https://tiefen.fun";
}
const randomUrl = getRandomUrl(data.data.share_redirect_urls);
return randomUrl;
} catch (error) {
return "https://tiefen.fun";
}
};
const getData = async () => {
try {
const data = await requireAPI(
@ -34,18 +71,25 @@ export default function Share() {
return;
}
setData(data.data.streamer_ext);
const _shareWebUrl = await getShareWebUrl();
setShareWebUrl(_shareWebUrl);
const randomStr = generateRandomString();
QRCode.toDataURL(
`https://tiefen.fun/zone/${user_id}`,
`${_shareWebUrl}/zone/${user_id}/${randomStr}`,
function (err, url) {
setQrcodeUrl(url);
}
);
setIsFetching(false);
} catch (error) {
// console.error(error);
console.error(error);
}
};
getData();
getShareWebUrl();
}, []);
//
@ -131,7 +175,8 @@ export default function Share() {
//
const copyUrl = () => {
clipboard(`https://tiefen.fun/zone/${user_id}`);
const randomStr = generateRandomString();
clipboard(`${shareWebUrl}/zone/${user_id}/${randomStr}`);
Toast.show({
icon: "success",
content: "已复制到剪贴板",

View File

@ -3,18 +3,16 @@ import { useRouter, usePathname, useSearchParams } from "next/navigation";
import { useEffect } from "react";
import { get } from "@/utils/storeInfo";
import { Dialog, Toast } from "antd-mobile";
import { save } from "@/utils/storeInfo";
import { removeUserInfo } from "@/utils/storeInfo";
import { openUrlWithBrowser } from "@/utils/tools";
export default function WithAuth(WrappedComponent) {
const router = useRouter();
const pathname = usePathname();
const searchParams = useSearchParams();
useEffect(() => {
var ua = navigator.userAgent.toLowerCase();
const ua = navigator.userAgent.toLowerCase();
if (
(ua.indexOf("quark") > -1 || ua.indexOf("mqqbrowser") > -1) &&
(ua.indexOf("mqqbrowser") > -1 || ua.indexOf("quark") > -1) &&
ua.indexOf("iphone") > -1
) {
// 夸克浏览器

View File

@ -6,16 +6,21 @@ export default function baseRequest() {
const account = accountCookie === undefined ? {} : accountCookie;
const mid = getCookie("mid");
const b_ts = new Date().getTime();
let b_dt = 0;
if (/(iPad|iPhone|iPod)/gi.test(navigator.userAgent)) {
b_dt = 1;
}
const baseRequest = {
b_mid: mid ? parseInt(mid, 10) : account?.mid,
b_ch: "h5",
b_ts: b_ts,
b_dt: b_dt,
b_token: token,
b_did:
typeof window !== "undefined" &&
typeof window.navigator !== "undefined" &&
navigator?.userAgent.slice(0, 32),
};
// console.log("baseRequest",baseRequest)
// console.log("baseRequest", baseRequest);
return baseRequest;
}