Merge remote-tracking branch 'origin/anln_refund_1.2' into anln_refund_1.4

This commit is contained in:
al 2025-01-15 12:04:51 +08:00
commit 177f5a0385
22 changed files with 191 additions and 69 deletions
app
login
my
page.js
refund
refundDetail/[id]
refundList/components/Reviewed
streamerVerification
joinGuild
joinStreamer
noticeDetail/components/NoticeItem
search/conponents
Banner
HostList
space
person_space_introduce/[mid]
setting/spaceRefund
components
BottomNav
InOtherApp
PostItem
VideoPlayer
Websocket
WithAuth
store
utils

View File

@ -52,7 +52,7 @@ function Login({ handleLogin }) {
const showMobal = useRef();
const [iframePageUrl, setIframePageUrl] = useState(null);
useEffect(() => {
const userAgent = navigator.userAgent;
const userAgent = window && window.navigator?.userAgent;
//区分设备类型
if (/Android/i.test(userAgent)) {
setDeviceType("Android");

View File

@ -5,7 +5,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAngleRight } from "@fortawesome/free-solid-svg-icons";
import { Avatar, Toast, Space } from "antd-mobile";
import { useRouter } from "next/navigation";
import { get } from "@/utils/storeInfo";
import { get, save } from "@/utils/storeInfo";
import requireAPI from "@/utils/requireAPI";
import OwnIcon from "@/components/OwnIcon";
import OwnImage from "@/components/OwnImage";
@ -65,6 +65,7 @@ const My = () => {
});
return;
}
save("account", account.data.account);
const statuses = await requireAPI(
"POST",
"/api/streamer_auth_approval/get_statuses",
@ -118,13 +119,13 @@ const My = () => {
subTitle:
account.data.account.role == 3 ? "创作者功能" : "完善资料后解锁",
},
// {
// url: `my/refund/refundList`,
// iconUrl: "/icons/32DP/wallet.png",
// title: "退款审核",
// subTitle:
// account.data.account.role == 3 ? "创作者功能" : "完善资料后解锁",
// },
{
url: `my/refund/refundList`,
iconUrl: "/icons/32DP/refund.png",
title: "退款审核",
subTitle:
account.data.account.role == 3 ? "创作者功能" : "完善资料后解锁",
},
// ...currentOld,
];
if (isInJoinProgress) {

View File

@ -142,7 +142,11 @@ export default function RefundDetail() {
<Radio.Group
className="flex flex-col"
onChange={setIndex}
value={data && data?.refunds_status === 4 ? 2 : selectedIndex}
value={
data && [2, 3, 4].includes(data?.refunds_status)
? 2
: selectedIndex
}
disabled={!checkAble}
>
<div className="flex flex-row items-start mt-4 pr-6">
@ -216,7 +220,9 @@ export default function RefundDetail() {
}}
>
{data && data?.refunds_status === 4
? "系统已自动提交"
? "超时自动提交"
: data && data?.refunds_status === 3
? "2小时无条件退款"
: !checkAble
? "您已提交"
: isLoading

View File

@ -66,7 +66,7 @@ export default function PendingReview({ currentIndex }) {
roundedFull
/>
<div className="ml-2 flex flex-col gap-1">
<div className="flex flex-row items-center flex-1 ">
<div className="flex flex-row flex-wrap items-center flex-1 ">
<div style={{ maxWidth: 100 }} className="truncate">
<span className="mr-2 text-base text-white font-medium whitespace-nowrap">
{item.account.name}
@ -99,9 +99,9 @@ export default function PendingReview({ currentIndex }) {
</div>
</div>
<div className="flex flex-col justify-center items-center">
<div className="flex flex-col justify-center items-start">
<div className="px-4 py-1 rounded-full bg-[#FFFFFF1A] flex-row items-center">
<span className="text-white text-sm">
<span className="text-white text-sm whitespace-nowrap">
{item?.refunds_status === 4
? "已自动退款"
: item?.refunds_status === -1

View File

@ -136,6 +136,7 @@ export default function JoinGuild() {
<div className="mt-2 px-4 py-3 h-12 rounded-[0.8rem] bg-[#FFFFFF1a] flex justify-between items-center">
<OwnInput
type="text"
maxLength={20}
placeholder="请输入联络人"
value={formData.contact_name}
onChange={(value) =>
@ -155,6 +156,7 @@ export default function JoinGuild() {
<div className="mt-2 px-4 py-3 h-12 rounded-[0.8rem] bg-[#FFFFFF1a] flex justify-between items-center">
<OwnInput
type="text"
maxLength={20}
placeholder="请输入您的联系方式"
value={formData.contact_way}
onChange={(value) =>

View File

@ -128,6 +128,7 @@ export default function JoinStreamer() {
<OwnInput
type="text"
placeholder="请输入可搜索到您的昵称"
maxLength={20}
value={formData.name}
onChange={(value) =>
setFormData((old) => ({ ...old, name: value }))
@ -168,6 +169,7 @@ export default function JoinStreamer() {
<OwnInput
type="text"
placeholder="请输入您的联系方式"
maxLength={20}
value={formData.contact}
onChange={(value) =>
setFormData((old) => ({ ...old, contact: value }))

View File

@ -63,7 +63,7 @@ export default function NoticeItem({ leftIcon, hasLink, data }) {
// }
if (links.length > 1) {
links[1]?.action === "app_router_path";
router.push(links[1]?.params);
router.push("/" + links[1]?.params);
} else {
links[0]?.action === "outward";
router.push(links[0]?.params);

View File

@ -0,0 +1,81 @@
import React, { useEffect, useState, useRef, useCallback } from "react";
import { Toast, Swiper, Image } from "antd-mobile";
import LoadingMask from "@/components/LoadingMask";
import { useRouter } from "next/navigation";
import requireAPI from "@/utils/requireAPI";
import OwnImage from "@/components/OwnImage";
import { goToPage } from "@/utils/tools";
export default function Banner() {
const [bannerList, setBannerList] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const router = useRouter();
const ref = useRef(null);
useEffect(() => {
const getBannerList = async () => {
setIsLoading(true);
try {
const _data = await requireAPI(
"POST",
"/api/activity_banner/list",
null,
true
);
if (_data.ret === -1) {
Toast.show({
icon: "fail",
content: _data.msg,
position: "top",
});
return;
}
setBannerList(_data.data.list);
} catch (error) {
console.error(error);
} finally {
setIsLoading(false);
}
};
getBannerList();
}, []);
const items = useCallback(
(item, index) => (
<Swiper.Item key={index}>
<div
className="w-full h-[200px]"
onClick={() => {
const links = item?.hyperlinks;
if (links.length > 1) {
router.push(
links.filter((it) => it.inward_action_type === "h5")[0]?.url
);
} else {
router.push(links[0]?.url);
}
}}
>
<OwnImage
className={"w-full h-full"}
outClassName={"w-full h-full"}
src={item.image.images[0].urls[0]}
fit="cover"
position="center"
/>
</div>
</Swiper.Item>
),
[]
);
return (
<div className="flex-1 mt-6">
<Swiper
allowTouchMove
ref={ref}
loop
autoplay
style={{ "--border-radius": "8px" }}
>
{bannerList.map((item, index) => items(item, index))}
</Swiper>
</div>
);
}

View File

@ -5,6 +5,7 @@ import { useRouter } from "next/navigation";
import requireAPI from "@/utils/requireAPI";
import OwnImage from "@/components/OwnImage";
import OwnIcon from "@/components/OwnIcon";
import Banner from "../Banner";
export default function HostList() {
const [hostList, setHostList] = useState([]);
const [isLoading, setIsLoading] = useState(false);
@ -38,6 +39,10 @@ export default function HostList() {
}, []);
return (
<div className="flex-1 mt-6">
{/* Banner预留位置 */}
<div className="my-4">
<Banner />
</div>
<div className="flex flex-row justify-between items-center">
<p className="text-xl font-medium">猜你想看</p>
{/* <div
@ -64,9 +69,16 @@ export default function HostList() {
style={{ "--padding-left": 0 }}
>
<div
onClick={() =>
router.push(`space/person_space_introduce/${item.mid}`)
}
onClick={() => {
const links = item?.hyperlinks;
if (links.length > 1) {
router.push(
links.filter((it) => it.inward_action_type === "h5")[0]?.url
);
} else {
router.push(links[0]?.url);
}
}}
className="grid grid-cols-[48px,calc(100vw-48px-2rem)]"
>
<div className="relative">
@ -90,34 +102,37 @@ export default function HostList() {
<span className="text-base text-white font-medium whitespace-nowrap truncate max-w-[30%]">
{item.title}
</span>
<div className="flex flex-row items-center py-0.5 px-2 ml-1 bg-[#FFFFFF1A] rounded-full">
{item?.gender === 1 ? (
<OwnIcon
src="/icons/info/female.png"
className="w-[14px] h-full"
outClassName="mr-1"
/>
) : (
<OwnIcon
src="/icons/info/male.png"
className="w-[14px] h-full"
outClassName="mr-1"
/>
)}
<span className="text-white text-xs font-medium ml-0.5">
{item.age}
</span>
</div>
<div className="flex flex-row items-center py-0.5 px-2 ml-1 bg-[#FFFFFF1A] rounded-full">
<OwnIcon
src="/icons/info/location.png"
className="w-[14px] h-full"
/>
<span className="text-white text-xs font-medium ml-0.5">
{item.city}
</span>
</div>
{item.age && (
<>
<div className="flex flex-row items-center py-0.5 px-2 ml-1 bg-[#FFFFFF1A] rounded-full">
{item?.gender === 1 ? (
<OwnIcon
src="/icons/info/female.png"
className="w-[14px] h-full"
outClassName="mr-1"
/>
) : (
<OwnIcon
src="/icons/info/male.png"
className="w-[14px] h-full"
outClassName="mr-1"
/>
)}
<span className="text-white text-xs font-medium ml-0.5">
{item.age}
</span>
</div>
<div className="flex flex-row items-center py-0.5 px-2 ml-1 bg-[#FFFFFF1A] rounded-full">
<OwnIcon
src="/icons/info/location.png"
className="w-[14px] h-full"
/>
<span className="text-white text-xs font-medium ml-0.5">
{item.city}
</span>
</div>
</>
)}
</div>
<p className="text-sm text-[#FFFFFF80] whitespace-nowrap truncate w-full">
{item.text}
@ -127,7 +142,6 @@ export default function HostList() {
</List.Item>
))}
</List>
{/* Banner预留位置 */}
</div>
);
}

View File

@ -175,6 +175,7 @@ export default function PersonSpaceIntroduce() {
<OwnImage
rounded="rounded"
className="h-full"
outClassName="h-full"
fit="cover"
src={data?.streamer_ext?.shorts?.videos[0]?.cover_urls[0]}
/>

View File

@ -59,7 +59,7 @@ export default function SpaceRefund() {
if (isSubmitting) return;
setIsSubmitting(true);
try {
const _data = await requireAPI("POST", "/api/zone/refund", {
const _data = await requireAPI("POST", "/api/zone/refund_v2", {
body: {
zid: Number(searchParams.get("id")),
contact_name: name,
@ -166,6 +166,7 @@ export default function SpaceRefund() {
联系方式
</p>
<Input
maxLength={20}
placeholder="请输入联系方式"
onChange={(value) => setContact(value)}
value={contact}
@ -184,6 +185,7 @@ export default function SpaceRefund() {
</p>
<div className="flex flex-row items-center">
<TextArea
maxLength={200}
placeholder="请输入退款原因"
onChange={(value) => setRemark(value)}
value={remark}
@ -202,7 +204,7 @@ export default function SpaceRefund() {
1当前退款内容为本空间的成员身份退款后您将无法再次加入本空间
</p>
<p>
2平台将在24小时内处理您的退款申请为了退款进程的顺利请您详细填写您的退款原因
2空间创建者将在一个工作日内处理您的退款申请为了退款进程的顺利请您详细填写您的退款原因
</p>
<p>
3一旦退款成功退款金额将原路返回您的支付账户请确保您的支付账户可正常接受款项

View File

@ -17,7 +17,7 @@ function BottomNav({ changeNoticeCount, changeInviter, noticeCount }) {
useEffect(() => {
const currentInviter = searchParams.get("inviter");
if (currentInviter) {
console.log("Current Inviter: " + currentInviter);
// console.log("Current Inviter: " + currentInviter);
changeInviter(currentInviter);
}
}, [pathname]);

View File

@ -6,7 +6,7 @@ export default function InOtherApp() {
//区分是否在微信/微博/qq/支付宝/钉钉内置浏览器中打开
const [isInOtherApp, setIsInOtherApp] = useState(false);
useEffect(() => {
const userAgent = navigator.userAgent.toLowerCase();
const userAgent = window && window.navigator?.userAgent.toLowerCase();
let temIsInOtherApp =
userAgent.match(/MicroMessenger/i) == "micromessenger" ||
userAgent.match(/WeiBo/i) == "weibo" ||

View File

@ -284,6 +284,7 @@ export default function PostItem({
{type == "post" ? (
<div
className="flex items-center"
style={{ display: !isOwn ? "flex" : "none" }}
onClick={() =>
router.push("/space/person_space_introduce/" + data.mid)
}
@ -324,8 +325,7 @@ export default function PostItem({
/>
</>
) : (
data?.streamer_ext?.zones?.length !== 0 &&
!isOwn && (
data?.streamer_ext?.zones?.length !== 0 && (
<div className="text-[#FFFFFFB2] font-medium text-xs flex items-center">
<span className="mr-1">查看TA的空间</span>
<FontAwesomeIcon

View File

@ -14,7 +14,7 @@ export default function VideoPlayer({ video }) {
const [showController, setShowController] = useState(false);
const [screenState, setScreenState] = useState(false);
const isSliding = useRef(null);
const userAgent = navigator.userAgent;
const userAgent = window && window.navigator?.userAgent;
// const currentTime = useMemo(()=>{
// const videoPlayer = document.getElementById("videoPlayer");
// if (videoPlayer) {

View File

@ -61,7 +61,7 @@ const WebSocketComponent = ({ getData, authInfo }) => {
// socket.send('Hello Server!');
retryInterval = 1000;
sendMessageQueue();
socketRef.current.send(JSON.stringify({ t: 1 }));
socketRef.current?.send(JSON.stringify({ t: 1 }));
};
//
socketRef.current.onmessage = (event) => {

View File

@ -1,3 +1,4 @@
"use client";
import { checkAuth } from "@/utils/auth";
import { useRouter, usePathname, useSearchParams } from "next/navigation";
import { useEffect } from "react";
@ -10,7 +11,7 @@ export default function WithAuth(WrappedComponent) {
const pathname = usePathname();
const searchParams = useSearchParams();
useEffect(() => {
const ua = navigator.userAgent.toLowerCase();
const ua = window && window.navigator?.userAgent.toLowerCase();
if (
(ua.indexOf("mqqbrowser") > -1 || ua.indexOf("quark") > -1) &&
ua.indexOf("iphone") > -1

View File

@ -22,7 +22,7 @@ const reducer = (state = initialState, action) => {
case "ChANGENOTICECOUNT":
return { ...state, noticeCount: action.data };
case "ChANGEINVITER":
console.log("ChANGEINVITER-------", action.data);
// console.log("ChANGEINVITER-------", action.data);
return { ...state, inviter: action.data };
default:
return state;

View File

@ -1,3 +1,4 @@
"use client";
import { getCookie } from "cookies-next";
import { get } from "./storeInfo";
export default function baseRequest() {
@ -7,7 +8,7 @@ export default function baseRequest() {
const mid = getCookie("mid");
const b_ts = new Date().getTime();
let b_dt = 0;
if (/(iPad|iPhone|iPod)/gi.test(navigator.userAgent)) {
if (/(iPad|iPhone|iPod)/gi.test(window && window.navigator?.userAgent)) {
b_dt = 1;
}
const baseRequest = {

View File

@ -1,3 +1,4 @@
"use client";
import { Toast } from "antd-mobile";
//格式化时间戳
export function formatDeadline(timestamp) {
@ -135,7 +136,7 @@ export function getVideoBase64(url) {
canvas.height = video.height;
// 判断是否为 iOS 系统
if (/(iPad|iPhone|iPod)/gi.test(navigator.userAgent)) {
if (/(iPad|iPhone|iPod)/gi.test(window && window.navigator?.userAgent)) {
// 在 iOS 系统中,需要手动触发视频加载,然后设置自动播放和静音属性
video.load();
// video.autoplay = true;
@ -182,17 +183,26 @@ export function getcountLines(str) {
}
// 跳转页面
// export function goToPage(link) {
// let linkArr = link.split("?");
// const params = linkArr[1]?.split("&");
// console.log("params", params);
// if (params == "") return "/my/" + linkArr[0];
// }
export function goToPage(link) {
let linkArr = link.split("?");
const params = linkArr[1]?.split("&");
if (!params) return linkArr[0];
// if (linkArr[0].includes("/")) {
// const path = linkArr[0].replace(/^\/+|\/+$/g, "");
// const pathNames = path.split("/").filter((it) => it != "");
// return [pathNames[0], { screen: pathNames[1] }];
// }
const query = params
.map((it) => ({ [it.split("=")[0]]: it.split("=")[1] }))
.reduce((acc, cur) => ({ ...acc, ...cur }), {});
return [linkArr[0], query];
}
// 尝试使用浏览器打开URL
export function openUrlWithBrowser(url) {
try {
const userAgent = navigator.userAgent;
const userAgent = window && window.navigator?.userAgent;
//区分设备类型
if (/Android/i.test(userAgent)) {
var intentUrl =

View File

@ -226,7 +226,7 @@ export const toggleFullScreen = (videoEleId, controllerId, getState) => {
// IE/Edge
video.msRequestFullscreen();
}
console.log("toggleFullScreen", video);
// console.log("toggleFullScreen", video);
if (!video || !controller) return;
// video.style.transform =
// "translateX(50vw) translateY(-24.4vh) rotate(90deg) !important";
@ -260,7 +260,7 @@ export const toggleFullScreen = (videoEleId, controllerId, getState) => {
getState((old) => !old);
} else {
console.log("toggleFullScreen", video);
// console.log("toggleFullScreen", video);
if (!video || !controller) return;
// video.style.transform =
// "translateX(50vw) translateY(-24.4vh) rotate(90deg) !important";

View File

@ -1,3 +1,4 @@
"use client";
import { getCookies } from "cookies-next";
export default function webviewBaseRequest() {
@ -5,7 +6,7 @@ export default function webviewBaseRequest() {
const b_ts = new Date().getTime();
const baseRequest = {
b_mid: parseInt(cookies.b_mid),
b_did: window && window.navigator?.userAgent.slice(0,65),
b_did: window && window.navigator?.userAgent.slice(0, 65),
b_ver: cookies.b_ver,
b_dt: parseInt(cookies.b_dt),
b_model: cookies.b_model,