修改存在的问题

This commit is contained in:
al 2024-07-10 16:50:53 +08:00
parent 4cae50bd67
commit a73b804437
21 changed files with 463 additions and 158 deletions
api
app
bill
login
my
editUserProfile
editUserName
selectUserProfileItem
page.js
wallet
page.js
pay
share/[mid]
space
[id]
page.js
person_space_introduce/[mid]
components
PaySpacePost
Photos
PostItem
package-lock.jsonpackage.json
public/icons
utils

View File

@ -86,7 +86,7 @@ export const zoneThumbsUp = async (id, times = 1, callback) => {
console.error(error);
}
};
// 查看关系
export async function checkRelation(subMid, objMid, predicate) {
try {
const data =
@ -110,6 +110,7 @@ export async function checkRelation(subMid, objMid, predicate) {
console.error(error);
}
}
// 获取用户信息
export async function getUserInfo() {
try {
const data =
@ -127,3 +128,83 @@ export async function getUserInfo() {
console.error(error);
}
}
// 创建订单
export const createOrder = async (type = "alipay_h5") => {
if (!selectedPrice.id && !customCoin.selected) {
Toast.show({
content: "请选择充值档位",
});
return;
}
if (customCoin.selected && customCoin.num < 10) {
Toast.show({
content: "最低充值1元哦",
});
return;
}
const base = webviewBaseRequest();
const body = {
...base,
product_id: customCoin.selected ? "h5_custom_coin" : selectedPrice.id,
custom_coins: customCoin.selected ? customCoin.num : 0,
pay_type: type,
redirect_url: type === "yeepay_wxpay_h5" ? window.location.href : "",
from: "app",
};
//如果是微信jsapi支付直接跳转到中间页
if (type === "wxpay_jsapi") {
router.push(`/pay/${encodeURIComponent(JSON.stringify(body))}`);
return;
}
setIsLoading(true);
const signature = generateSignature(body);
try {
const response = await fetch(
`/api/vas/create_order?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
}
);
const data = await response.json();
if (data.ret === -1) {
Toast.show({
content: data.msg,
});
return;
}
switch (type) {
case "yeepay_alipay_h5":
router.push(`${data.data.yeepay_alipay_h5_param_str}`);
break;
case "yeepay_wxpay_h5":
router.push(`${data.data.yeepay_wxpay_h5_param_str}`);
break;
case "alipay_h5":
router.push(`${data.data.alipay_h5_param_str}`);
break;
case "wxpay_h5":
router.push(
`https://shop.tiefen.fun/pay/wxpay_h5/${encodeURIComponent(
data.data.wxpay_h5_param_str
)}`
);
break;
default:
router.push(`${data.data.alipay_h5_param_str}`);
break;
}
} catch (error) {
console.error(error);
} finally {
setIsLoading(false);
}
};

View File

@ -19,7 +19,7 @@ export default function Recharge() {
icon={faAngleLeft}
size="xl"
onClick={() => {
router.back();
router.push("/my/wallet");
}}
/>
</div>

View File

@ -247,20 +247,6 @@ function Login({ handleLogin }) {
/>
</div>
<Divider />
<div className="flex flex-row flex-nowrap items-center">
<p className="text-base text-white mr-4 whitespace-nowrap">
密码
</p>
<Input
clearable
placeholder="请输入密码"
onChange={(value) => setLoginInfo({ ...loginInfo, password: value})}
value={loginInfo.password}
type="password"
style={{ "--color": "#FFFFFF", "--font-size": "16px" }}
/>
</div>
<Divider />
<div className="flex flex-row flex-nowrap items-center">
<p className="text-base text-white mr-4 whitespace-nowrap">
验证码

View File

@ -1,13 +1,68 @@
"use client";
import React, { useState } from "react";
import { Input, Button } from "antd-mobile";
import React, { useState,useEffect } from "react";
import { Input, Button, Toast } from "antd-mobile";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAngleLeft, faAngleRight } from "@fortawesome/free-solid-svg-icons";
import { useRouter } from "next/navigation";
import {getUserInfo} from "@/api/public";
import {get,save} from "@/utils/storeInfo";
import require from "@/utils/require";
const account = get("account");
export default function EditUserName() {
const router = useRouter();
const [name, setName] = useState();
useEffect(() => {
const getName = async () => {
setName(account.name);
};
getName();
}, []);
const handleSubmit = async () => {
if (!name) {
Toast.show({
icon: "fail",
content: "昵称不得为空",
position: "top",
});
return;
} else if (name.length > 10) {
Toast.show({
icon: "fail",
content: "昵称不得超过10个字",
position: "top",
});
return;
} else if (name === account.name) {
router.back();
return;
}
try {
const data = await require("POST", "/api/account/update", {
body: {
name: name,
},
},true);
if (data.ret === -1) {
Toast.show({
icon: "fail",
content: data.msg,
position: "top",
});
return;
}
//向服务器请求新的账号信息并保存到本地
const account = await getUserInfo()
save("account", JSON.stringify(account));
} catch (error) {
console.error(error);
}
router.back();
};
return (
<div>
<div className="p-4 fixed top-0 z-10 w-full">
@ -29,7 +84,7 @@ export default function EditUserName() {
placeholder="请输入新昵称"
max={8}
onChange={(value) => setName(value)}
value={"铁粉空间"}
value={name}
style={{ "--placeholder-color": "#FFFFFF80" }}
/>
</div>
@ -39,7 +94,7 @@ export default function EditUserName() {
size="middle"
block
// onClick={handleSubmit}
onClick={handleSubmit}
style={{"--background-color": "#FF669E","color": "#FFFFFF"}}
>
确认

View File

@ -1,7 +1,7 @@
"use client";
import React, { useEffect, useState } from "react";
import { Avatar, Divider, Input } from "antd-mobile";
import { Avatar, Divider, Toast } from "antd-mobile";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAngleLeft, faAngleRight } from "@fortawesome/free-solid-svg-icons";
import { useRouter } from "next/navigation";
@ -18,23 +18,8 @@ export default function SelectUserProfileItem() {
setUserInfo(userInfo);
}
}, []);
const uploadImg = async (e) => {
console.log(e.target.files[0]);
const file = e.target.files[0];
var reader = new FileReader();
reader.readAsDataURL(file);
if (file) {
reader.onload = (e) => {
uploadHead();
};
}
// return {
// url: URL.createObjectURL(file),
// };
};
const uploadHead = async () => {
const avatarId = await uploadImage(userInfo?.avatar?.images[0]?.urls[0]);
const uploadHead = async (e) => {
const avatarId = await uploadImage(e.target.files[0]);
try {
const data = await require("POST", "/api/account/update", {
body: { avatar: { image_ids: [avatarId] } },
@ -97,7 +82,7 @@ export default function SelectUserProfileItem() {
style={{ display: "none" }}
accept="image/png, image/jpeg"
capture="camera"
onChange={uploadImg}
onChange={uploadHead}
/>
</div>
<Divider className="my-2" />

View File

@ -101,22 +101,22 @@ const My = () => {
className="text-center"
onClick={() => router.push("my/relationship?key=follow")}
>
<p className="text-2xl">{userInfo?.follow_count}</p>
<p className="text-2xl">{userInfo?.follow_count || 0}</p>
<p className="text-[#ffffff88]">关注</p>
</li>
<li
className="text-center"
onClick={() => router.push("my/relationship?key=fans")}
>
<p className="text-2xl">{userInfo?.is_followed_count}</p>
<p className="text-2xl">{userInfo?.is_followed_count || 0}</p>
<p className="text-[#ffffff88]">粉丝</p>
</li>
<li className="text-center" onClick={() => router.push("my/wallet")}>
<p className="text-2xl">{userInfo.gold_num}</p>
<p className="text-2xl">{userInfo.gold_num || 0}</p>
<p className="text-[#ffffff88]">金币</p>
</li>
<li className="text-center" onClick={() => router.push("my/wallet")}>
<p className="text-2xl">{userInfo.diamond_num}</p>
<p className="text-2xl">{userInfo.diamond_num || 0}</p>
<p className="text-[#ffffff88]">钻石</p>
</li>
</ul>

View File

@ -25,7 +25,7 @@ export default function Wallet() {
icon={faAngleLeft}
size="xl"
onClick={() => {
router.back();
router.push("/my");
}}
/>
</div>

View File

@ -144,6 +144,7 @@ const RecommPostList = forwardRef(({ scrollHeight }, ref) => {
// throw new Error("刷新失败");
const list = await getRecommPostList(1);
setCommenPostList(list);
setHasMore(true)
}
async function loadMore() {
const list = await getRecommPostList(0);

View File

@ -5,6 +5,7 @@ import { Mask, Divider } from "antd-mobile";
import { useRouter } from "next/navigation";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAngleLeft } from "@fortawesome/free-solid-svg-icons";
import {createOrder} from "@/api/public"
export default function Pay() {
const router = useRouter();
const [visible, setVisible] = useState(false);
@ -64,9 +65,7 @@ export default function Pay() {
{/* <Image/> */}
<div
className="flex items-center py-1 font-bold"
onClick={() => {
router.push("/pay");
}}
onClick={createOrder}
>
<span className="m-auto">支付宝支付</span>
</div>

113
app/share/[mid]/page.js Normal file
View File

@ -0,0 +1,113 @@
"use client";
import React, { useEffect, useState } from "react";
import { Divider, Toast } from "antd-mobile";
import { useRouter, useParams, useSearchParams } 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 { getStreamerInfo } from "@/api/space";
export default function ShareSpace({ data }) {
const router = useRouter();
const { mid } = useParams();
const searchParams = useSearchParams();
const webUrl = process.env.NEXT_PUBLIC_WEB_URL;
const [streamerInfo, setStreamerInfo] = useState(null);
useEffect(() => {
getStreamerInfo(Number(mid)).then((res) => {
setStreamerInfo(res);
});
}, []);
//保存内容到剪贴板
const copy = (_data) => {
console.log("_data",_data)
clipboard(_data);
Toast.show({
icon: "success",
content: "已复制到剪贴板",
position: "top",
});
};
//复制口令
const copyShareCode = () => {
const shareCode = `${streamerInfo?.streamer_ext?.name}】『ID${streamerInfo?.streamer_ext?.user_id}复制此条消息打开铁粉空间APP查看详情${webUrl}/zone/${streamerInfo?.streamer_ext?.user_id}`;
copy(shareCode);
};
//复制邀请链接
const copyShareUrl = () => {
const shareCode = `${webUrl}/zone/${streamerInfo?.streamer_ext?.user_id}`;
console.log("shareCode", shareCode);
copy(shareCode);
};
return (
<div className="">
<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">
<FontAwesomeIcon
icon={faAngleLeft}
size="xl"
onClick={() => {
router.back();
}}
/>
</div>
<p className="text-base text-center leading-9">分享空间</p>
</div>
<div className="w-full flex flex-col p-4 pt-16">
<div onClick={copyShareCode} className="flex justify-between pt-4 pb-2">
<span className="text-base text-white">复制口令</span>
<FontAwesomeIcon
icon={faAngleRight}
size="xl"
onClick={() => {
router.push("/my");
}}
/>
</div>
<Divider />
<div
onClick={copyShareUrl}
className="flex justify-between w-full pt-4 pb-2"
>
<span className="text-base text-white">复制邀请链接</span>
<FontAwesomeIcon
icon={faAngleRight}
size="xl"
onClick={() => {
router.push("/my");
}}
/>
</div>
<Divider />
<div
onClick={() => {
// router.push("WebWithoutHeader", {
// uri: webUrl + "/zone/share/" + data?.streamer_ext?.user_id,
// })
}}
className="flex justify-between pt-4 pb-2"
>
<span className="text-base text-white">生成分享卡片</span>
<FontAwesomeIcon
icon={faAngleRight}
size="xl"
onClick={() => {
router.push("/my");
}}
/>
</div>
<Divider />
</div>
</div>
);
}

View File

@ -27,11 +27,7 @@ const anchors = [
window.innerHeight - 280,
window.innerHeight - 60,
];
const tabItems = [
{ label: "全部", key: "all" },
{ label: "铁粉专享", key: "ironFan" },
{ label: "超粉专享", key: "chaofen" },
];
export default function PersonSpace() {
const router = useRouter();
const { id } = useParams();
@ -39,6 +35,7 @@ export default function PersonSpace() {
const [hasMore, setHasMore] = useState(true);
const [scrollHeight, setScrollHeight] = useState(0);
const [postList, setPostList] = useState([]);
const [tabItems, setTabItems] = useState([]);
const [offset, setOffset] = useState(0);
const [maskVisible, setMaskVisible] = useState({ visible: false, type: "" });
const [currentKey, setCurrentKey] = useState("all");
@ -62,6 +59,17 @@ export default function PersonSpace() {
// debugger
}
getStreamerInfo(Number(id)).then((res) => {
let tabitems = res.is_superfanship_enabled
? [
{ label: "全部", key: "all" },
{ label: "铁粉专享", key: "ironFan" },
{ label: "超粉专享", key: "chaofen" },
]
: [
{ label: "全部", key: "all" },
{ label: "铁粉专享", key: "ironFan" },
];
setTabItems(tabitems);
setStreamerInfo(res);
});
getCurrentTime();
@ -174,10 +182,9 @@ export default function PersonSpace() {
{/* 内容 */}
<div>
<div
className="bg-no-repeat bg-cover bg-fixed "
className="bg-no-repeat bg-cover bg-center"
style={{
backgroundImage:
streamerInfo?.streamer_ext?.cover?.images[0]?.urls[0],
backgroundImage: `url(${streamerInfo?.streamer_ext?.cover?.images[0]?.urls[0]})`,
}}
>
<div className="px-4 pt-24 pb-8 bg-[#181818a9]">
@ -220,7 +227,7 @@ export default function PersonSpace() {
</div>
<div
className="flex flex-col items-center"
// onClick={() => setMaskVisible(true)}
onClick={() => router.push("/share/"+streamerInfo?.streamer_ext?.mid)}
>
<p className="text-base px-3 py-1 rounded-full bg-primary">
分享
@ -270,29 +277,31 @@ export default function PersonSpace() {
10
)}/${parseInt(streamerInfo?.ironfanship_price / 100, 10)}`}</p>
</li>
<li
className="flex flex-col items-center mr-6"
onClick={() => {
streamerInfo?.is_superfanship_unlocked === 1
? setCurrentKey("chaofen")
: router.push("/pay");
}}
>
<div className="w-9 h-9 flex items-center justify-center bg-[#1d1d1d71] rounded-full mb-1">
<Image
src="/icons/chaofen.png"
width={22}
height={22}
className="w-4 h-full"
placeholder=""
/>
</div>
<p className="text-xs">
{streamerInfo?.is_superfanship_unlocked === 1
? "尊贵超粉"
: "成为超粉"}
</p>
</li>
{streamerInfo?.is_superfanship_enabled && (
<li
className="flex flex-col items-center mr-6"
onClick={() => {
streamerInfo?.is_superfanship_unlocked === 1
? setCurrentKey("chaofen")
: router.push("/pay");
}}
>
<div className="w-9 h-9 flex items-center justify-center bg-[#1d1d1d71] rounded-full mb-1">
<Image
src="/icons/chaofen.png"
width={22}
height={22}
className="w-4 h-full"
placeholder=""
/>
</div>
<p className="text-xs">
{streamerInfo?.is_superfanship_unlocked === 1
? "尊贵超粉"
: "成为超粉"}
</p>
</li>
)}
<li
className="flex flex-col items-center"
// onClick={() => setMaskVisible(true)}
@ -308,7 +317,7 @@ export default function PersonSpace() {
</div>
<p className="text-xs">举报</p>
</li>
{streamerInfo?.visitor_role === 3 && (
{/* {streamerInfo?.visitor_role === 3 && (
<li
onClick={() => router.push("VisibleToOneselfSpacePosts")}
className="flex flex-col items-center"
@ -322,7 +331,7 @@ export default function PersonSpace() {
/>
<p className="text-xs">审核未通过</p>
</li>
)}
)} */}
</ul>
</div>
</div>
@ -419,34 +428,35 @@ export default function PersonSpace() {
/>
</div>
<p className="text-xs">
{" "}
{streamerInfo?.is_ironfanship_unlocked === 1
? "已是铁粉"
: "成为铁粉"}
</p>
{/* <p className="text-[#ffffff54] text-[10px]">0/299</p> */}
</li>
<li
className="flex flex-col items-center"
onClick={() => {
setCurrentKey("chaofen");
}}
>
<div className="w-9 h-9 flex items-center justify-center bg-[#1d1d1d71] rounded-full mb-1">
<Image
src="/icons/chaofen.png"
width={22}
height={22}
className="w-4 h-full"
placeholder=""
/>
</div>
<p className="text-xs">
{streamerInfo?.is_superfanship_unlocked === 1
? "尊贵超粉"
: "成为超粉"}
</p>
</li>
{streamerInfo?.is_superfanship_enabled && (
<li
className="flex flex-col items-center"
onClick={() => {
setCurrentKey("chaofen");
}}
>
<div className="w-9 h-9 flex items-center justify-center bg-[#1d1d1d71] rounded-full mb-1">
<Image
src="/icons/chaofen.png"
width={22}
height={22}
className="w-4 h-full"
placeholder=""
/>
</div>
<p className="text-xs">
{streamerInfo?.is_superfanship_unlocked === 1
? "尊贵超粉"
: "成为超粉"}
</p>
</li>
)}
</ul>
{maskVisible.type == "weChat" && (
<AddWeChat

View File

@ -1,7 +1,7 @@
"use client";
import React, { useEffect, useRef, useState,useRef } from "react";
import { Tabs, Swiper, Toast, Image, List, InfiniteScroll } from "antd-mobile";
import React, { useEffect, useRef, useState, useRef } from "react";
import { Tabs, Swiper, Toast, Image, List, InfiniteScroll, SpinLoading } from "antd-mobile";
import PostItem from "@/components/PostItem";
import "./index.css";
import Link from "next/link";
@ -20,13 +20,14 @@ const tabItems = [
export default function Space() {
const swiperRef = useRef(null);
const [activeIndex, setActiveIndex] = useState(0);
const [dataList, setDataList] = useState([]);
const [dataList, setDataList] = useState(null);
// const [spacePost, setSpacePost] = useState([]);
const [hasMore, setHasMore] = useState(true);
const [scrollHeight, setScrollHeight] = useState(0);
const [offset, setOffset] = useState(0);
const [loading, setLoading] = useState(false);
const scrollRef = useRef(null);
const router = useRouter();
// 获取屏幕高度
// const scrollHeight = 600;
useEffect(() => {
@ -40,7 +41,7 @@ export default function Space() {
// };
}, []);
useEffect(() => {
firstRequest()
firstRequest();
}, [activeIndex]);
const firstRequest = () => {
resetOffset();
@ -52,7 +53,7 @@ export default function Space() {
setDataList(res);
});
}
}
};
const resetOffset = () => {
setOffset(0);
// setDataList([]);
@ -72,7 +73,7 @@ export default function Space() {
}
//在末尾添加元素以展示查看更多卡片
if (data.data.list.length !== 0) {
const finalData = [...data.data.list, { id: 999999, last: true }];
const finalData = [...data.data.list];
setDataList(finalData);
return;
}
@ -109,14 +110,16 @@ export default function Space() {
async function loadMore() {
if (!offset) return;
const append = await getSpacePosts(offset);
if(append){
if (append) {
setDataList((val) => [...val, ...append]);
setHasMore(append.length > 0);
}
}
return (
<div className="h-screen overflow-x-hidden" style={{ maxHeight: `${scrollHeight}px` }}>
<div
className="h-screen overflow-x-hidden"
style={{ maxHeight: `${scrollHeight}px` }}
>
<div className="flex justify-between items-center px-2 custom-tabs text-gray-400 sticky top-0 z-10 bg-deepBg">
<Tabs
activeKey={tabItems[activeIndex].key}
@ -153,17 +156,49 @@ export default function Space() {
>
<Swiper.Item>
{!activeIndex && (
<div
className="px-4 pb-8"
>
!loading ?<div className="px-4 pb-8">
<ul className="grid grid-cols-2 gap-2 overflow-y-auto">
{dataList.map((item) => (
{dataList?.map((item) => (
<li key={item.id}>
<VisitingCard data={item} />
</li>
))}
<li onClick={()=>router.push("/search")}>
<div
// onPress={() => navigation.navigate("Stream")}
// onClick={}
className="w-full h-52"
>
<div className="h-full flex flex-col rounded-lg overflow-hidden bg-[#FFFFFF1A]">
<div className="w-full z-0"></div>
<div
className="w-full z-0 h-[42px]"
></div>
<div className="flex flex-col absolute w-full h-full pl-[22px] pt-[30px]">
<p className="text-white font-medium text-lg">
发现更多
</p>
<p className="text-[#FFFFFF40] font-sm">
缘分就在不经意间
</p>
<Image
width={32}
height={32}
className="mt-4"
src="/icons/rightarrow_border.png"
/>
<Image
width={32}
height={32}
className="absolute bottom-0 right-0"
src="/icons/magnifier.png"
/>
</div>
</div>
</div>
</li>
</ul>
{!dataList.length && (
{!dataList?.length && (
<div
className={`flex flex-col items-center justify-center`}
style={{ height: `${scrollHeight}px` }}
@ -185,18 +220,13 @@ export default function Space() {
</div>
</div>
)}
</div>
</div> : <div className="w-full text-center flex items-center justify-center" style={{height:(scrollHeight-60)+"px"}}><SpinLoading /></div>
)}
</Swiper.Item>
<Swiper.Item>
{activeIndex &&
<div
className="px-4 pb-8"
ref={scrollRef}
>
<List
className="scrollbarBox_hidden"
>
{!!activeIndex && (
<div className="px-4 pb-8" ref={scrollRef}>
<List className="scrollbarBox_hidden">
{loading && (
<>
<PostItemSkeleton />
@ -206,10 +236,10 @@ export default function Space() {
</>
)}
{dataList.map((item, index) => (
<List.Item className="!p-0" key={item.id + "_" + index}>
<PostItem type="space" data={item} />
</List.Item>
))}
<List.Item className="!p-0" key={item.id + "_" + index}>
<PostItem type="space" data={item} />
</List.Item>
))}
<InfiniteScroll loadMore={loadMore} hasMore={hasMore} />
</List>
{!dataList.length && (
@ -221,22 +251,24 @@ export default function Space() {
</div>
)}
</div>
}
)}
</Swiper.Item>
</Swiper>
<div
className={`fixed bottom-[78px] right-4 z-[999] w-10 h-10 flex items-center justify-center bg-[#1d1d1d71] rounded-full text-white ${
(loading && !offset) ? "animate-spin" : ""
}`}
>
<FontAwesomeIcon
icon={faRefresh}
size="xl"
// onClick={firstRequest}
onClick={()=>{scrollRef.current?.scrollTo(0, 0); firstRequest();}}
/>
</div>
className={`fixed bottom-[78px] right-4 z-[999] w-10 h-10 flex items-center justify-center bg-[#1d1d1d71] rounded-full text-white ${
loading && !offset ? "animate-spin" : ""
}`}
>
<FontAwesomeIcon
icon={faRefresh}
size="xl"
// onClick={firstRequest}
onClick={() => {
scrollRef.current?.scrollTo(0, 0);
firstRequest();
}}
/>
</div>
</div>
);
}
@ -245,7 +277,7 @@ const VisitingCard = ({ data }) => {
const router = useRouter();
return (
<div
className="relative h-60"
className="relative h-52"
onClick={() => router.push("/space/" + data?.streamer_ext?.mid)}
>
{data?.is_unread_zone_moment_exist === 1 && (

View File

@ -92,9 +92,9 @@ export default function PersonSpaceIntroduce() {
{/* 内容 */}
<div>
<div
className="bg-no-repeat bg-cover bg-fixed "
className="bg-no-repeat bg-cover bg-center"
style={{
backgroundImage: "url('https://picsum.photos/seed/picsum/200/300')",
backgroundImage:`url(${data?.streamer_ext?.cover?.images[0]?.urls[0]})`,
}}
>
<div className="px-4 pt-24 pb-8 bg-[#181818a9]">

View File

@ -3,7 +3,11 @@
import React, { useRef, useState } from "react";
import { Image } from "antd-mobile";
export default function PaySpacePost({ type = "ironFan", status = 0,data={} }) {
export default function PaySpacePost({
type = "ironFan",
status = 0,
data = {},
}) {
return (
<div
className={`rounded-md ${
@ -31,12 +35,6 @@ export default function PaySpacePost({ type = "ironFan", status = 0,data={} }) {
</div>
<div className="flex items-center">
{!data.is_zone_moment_unlocked ? (
<span>
{status === 1
? "已付费解锁"
: `${type === "ironFan" ? "铁粉" : "超粉"}免费查看`}
</span>
) : (
<span>
{data.is_ironfan_visible === 1
? "铁粉免费查看"
@ -44,6 +42,21 @@ export default function PaySpacePost({ type = "ironFan", status = 0,data={} }) {
? "超粉免费查看"
: "付费解锁"}
</span>
) : (
<span>
{data.is_ironfanship_unlocked === 1 &&
data.is_ironfan_visible === 1 &&
"已使用铁粉特权解锁"}
{data.is_superfanship_unlocked === 1 &&
data.is_ironfan_visible === 0 &&
"已使用超粉特权解锁"}
{data.is_superfanship_unlocked === 0 &&
data.is_ironfan_visible === 0 &&
"已付费解锁"}
{data.is_ironfanship_unlocked === 0 &&
data.is_ironfan_visible === 1 &&
"已付费解锁"}
</span>
)}
<Image
height={14}

View File

@ -116,8 +116,8 @@ export default function Photos({ media }) {
placeholder={
<div className="w-full h-full bg-[#1d1d1d] rounded"></div>
}
width={"100%"}
height={"100%"}
width={currentPhotos.length>1 ? "25vw":"100%"}
height={currentPhotos.length>1 ? "25vw":"100%"}
className={`rounded max-w-full`}
fit="cover"
src={item.url}

View File

@ -30,7 +30,7 @@ export default function PostItem({
}, []);
const getDays = useMemo(() => {
const today = new Date();
const days = Math.floor((today - date) / (1000 * 60 * 60 * 24));
const days = Math.floor((today - data.ct) / (1000 * 60 * 60 * 24));
return days;
}, []);
return (
@ -73,7 +73,7 @@ export default function PostItem({
</div>
<div className="mr-8">
{data.media_component && <Photos media={data.media_component} />}
{type == "space" && !isCreator && !!data.c_type && (
{type == "space" && !isCreator && data.c_type && (
<PaySpacePost
type={data.is_ironfan_visible ? "ironFan" : "superFan"}
price={data.price / 100}
@ -153,7 +153,7 @@ export default function PostItem({
className="w-4 h-full"
placeholder=""
/>
<span className="text-xs">点赞</span>
<span className={`text-xs ${isThumbsUp == 1?"text-[#FF669E]":"text-[#FFFFFF80]"}`}>{isThumbsUp == 1 ? "已赞" : "点赞"}</span>
</div>
<span className="mr-2">···</span>
</div>

27
package-lock.json generated
View File

@ -14,6 +14,7 @@
"@reduxjs/toolkit": "^2.2.6",
"antd-mobile": "^5.36.1",
"cookies-next": "^4.0.0",
"copy-to-clipboard": "^3.3.3",
"crypto-js": "^4.2.0",
"jsencrypt": "^3.3.2",
"next": "14.0.2",
@ -887,6 +888,14 @@
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/copy-to-clipboard": {
"version": "3.3.3",
"resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
"integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
"dependencies": {
"toggle-selection": "^1.0.6"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -2559,6 +2568,11 @@
"node": ">=8.0"
}
},
"node_modules/toggle-selection": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz",
"integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
},
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
@ -3316,6 +3330,14 @@
"is-what": "^3.14.1"
}
},
"copy-to-clipboard": {
"version": "3.3.3",
"resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
"integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
"requires": {
"toggle-selection": "^1.0.6"
}
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -4452,6 +4474,11 @@
"is-number": "^7.0.0"
}
},
"toggle-selection": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz",
"integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
},
"ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",

View File

@ -15,6 +15,7 @@
"@reduxjs/toolkit": "^2.2.6",
"antd-mobile": "^5.36.1",
"cookies-next": "^4.0.0",
"copy-to-clipboard": "^3.3.3",
"crypto-js": "^4.2.0",
"jsencrypt": "^3.3.2",
"next": "14.0.2",

BIN
public/icons/magnifier.png Normal file

Binary file not shown.

After

(image error) Size: 1.7 KiB

Binary file not shown.

After

(image error) Size: 463 B

View File

@ -109,6 +109,8 @@ export async function uploadImage(asset) {
});
if (uploadResponse.status === 200) {
console.log(asset);
debugger
const info = await calculateFileMetadata(asset);
const item = {
src_id: auth.directory + "/" + auth.filename,