2024-10-22 17:24:02 +08:00
|
|
|
|
"use client";
|
|
|
|
|
import React, { useState, useEffect } from "react";
|
|
|
|
|
import { DotLoading, Popup, Toast, TextArea, Switch } from "antd-mobile";
|
|
|
|
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
|
|
|
import { faAngleLeft } from "@fortawesome/free-solid-svg-icons";
|
|
|
|
|
import requireAPI from "@/utils/requireAPI";
|
|
|
|
|
import { useRouter } from "next/navigation";
|
|
|
|
|
import { multiUploadImage } from "@/utils/upload";
|
|
|
|
|
import UploadImgs from "@/components/UploadImgs";
|
|
|
|
|
import OwnInput from "@/components/OwnInput";
|
|
|
|
|
import DefaultMask from "@/components/DefaultMask";
|
|
|
|
|
export default function CreateImagePost() {
|
|
|
|
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
|
|
|
const [priceEdit, setPriceEdit] = useState(false);
|
|
|
|
|
const [postCount, setPostCount] = useState(null);
|
|
|
|
|
const [isBlockModalVisible, setIsBlockModalVisible] = useState(false);
|
2024-10-29 18:55:18 +08:00
|
|
|
|
const [oldPhotos, setOldPhotos] = useState([]);
|
2024-10-22 17:24:02 +08:00
|
|
|
|
//价格
|
|
|
|
|
const [formData, setFormData] = useState({
|
2024-10-29 18:55:18 +08:00
|
|
|
|
price: "",
|
2024-10-22 17:24:02 +08:00
|
|
|
|
content: "",
|
|
|
|
|
paidText: "",
|
|
|
|
|
imageAssets: [],
|
|
|
|
|
imageVisibleRange: 0,
|
|
|
|
|
isCreatingPaidText: false,
|
|
|
|
|
isFreeForIronfan: false,
|
|
|
|
|
});
|
|
|
|
|
const [priceEditData, setPriceEditData] = useState({
|
2024-10-29 18:55:18 +08:00
|
|
|
|
price: "",
|
2024-10-22 17:24:02 +08:00
|
|
|
|
imageVisibleRange: 1,
|
|
|
|
|
isCreatingPaidText: false,
|
|
|
|
|
isFreeForIronfan: false,
|
|
|
|
|
});
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
getPostCountData();
|
|
|
|
|
}, []);
|
|
|
|
|
const getPostCountData = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const _data = await requireAPI(
|
|
|
|
|
"POST",
|
|
|
|
|
"/api/zone_moment/list_statistics_by_creater_mid"
|
|
|
|
|
);
|
|
|
|
|
if (_data.ret === -1) {
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "fail",
|
|
|
|
|
content: _data.msg,
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-10-29 18:55:18 +08:00
|
|
|
|
const ttt = _data.data.streamer.album.images.map((item) => ({
|
|
|
|
|
url: item.urls[0],
|
|
|
|
|
id: item.id,
|
|
|
|
|
}));
|
|
|
|
|
setOldPhotos(ttt);
|
2024-10-22 17:24:02 +08:00
|
|
|
|
setPostCount(_data.data);
|
|
|
|
|
if (_data.data.rejected_count >= 5) setIsBlockModalVisible(true);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
//发布内容
|
|
|
|
|
const handleSubmit = async () => {
|
|
|
|
|
if (formData.content == "") {
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "fail",
|
|
|
|
|
content: "动态内容不能为空",
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (formData.imageAssets.length === 0) {
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "fail",
|
|
|
|
|
content: "请上传至少一张图片",
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (
|
|
|
|
|
parseFloat(formData.price) &&
|
|
|
|
|
formData.imageAssets.length <= parseInt(formData.imageVisibleRange, 10)
|
|
|
|
|
) {
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "fail",
|
|
|
|
|
content: "预览图片数不得大于等于上传图片数",
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (
|
|
|
|
|
formData.isCreatingPaidText &&
|
|
|
|
|
formData.price > 0 &&
|
|
|
|
|
formData.paidText == ""
|
|
|
|
|
) {
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "fail",
|
|
|
|
|
content: "请填写付费文案",
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//提交数据
|
|
|
|
|
if (isSubmitting) return;
|
|
|
|
|
setIsSubmitting(true);
|
|
|
|
|
const {
|
|
|
|
|
price,
|
|
|
|
|
isFreeForIronfan,
|
|
|
|
|
content,
|
|
|
|
|
imageAssets,
|
|
|
|
|
textVisibleRange,
|
|
|
|
|
imageVisibleRange,
|
|
|
|
|
isCreatingPaidText,
|
|
|
|
|
paidText,
|
|
|
|
|
} = formData;
|
|
|
|
|
const newMedia = imageAssets.filter((it) => it.id == undefined);
|
|
|
|
|
const media = await multiUploadImage(newMedia, 1);
|
|
|
|
|
// const media = await multiUploadImage(imageAssets);
|
|
|
|
|
media.image_ids = [
|
|
|
|
|
...imageAssets.filter((it) => it.id != undefined).map((it) => it.id),
|
|
|
|
|
...media.image_ids,
|
|
|
|
|
];
|
|
|
|
|
try {
|
|
|
|
|
const body = {
|
|
|
|
|
c_type: parseInt(price) ? 1 : 0,
|
|
|
|
|
is_ironfan_visible: isFreeForIronfan ? 1 : 0,
|
|
|
|
|
m_type: 1,
|
|
|
|
|
text: content,
|
|
|
|
|
media_component: media,
|
|
|
|
|
text_visible_range: textVisibleRange
|
|
|
|
|
? parseInt(textVisibleRange, 10)
|
|
|
|
|
: 999,
|
|
|
|
|
media_visible_range: imageVisibleRange
|
|
|
|
|
? parseInt(imageVisibleRange, 10)
|
|
|
|
|
: 1,
|
|
|
|
|
price: parseFloat(price) ? parseInt(parseFloat(price) * 100, 10) : null,
|
|
|
|
|
is_creating_paid_text: isCreatingPaidText && price > 0 ? 1 : 0,
|
|
|
|
|
paid_text: isCreatingPaidText && price > 0 ? paidText : null,
|
|
|
|
|
};
|
|
|
|
|
const data = await requireAPI("POST", "/api/zone_moment/create", {
|
|
|
|
|
body,
|
|
|
|
|
});
|
|
|
|
|
if (data.ret === -1) {
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "fail",
|
|
|
|
|
content: data.msg,
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//提交成功后显示Toast并返回上一页
|
|
|
|
|
Toast.show({
|
|
|
|
|
icon: "success",
|
|
|
|
|
content: "发布成功",
|
|
|
|
|
position: "top",
|
|
|
|
|
});
|
|
|
|
|
router.back();
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
} finally {
|
|
|
|
|
setIsSubmitting(false);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
return (
|
|
|
|
|
<div className="flex-1">
|
|
|
|
|
{/* 头部标题 */}
|
|
|
|
|
<div className="p-4 fixed top-0 z-10 w-full flex justify-between items-center bg-black">
|
|
|
|
|
<div className="w-9 h-9 flex items-center justify-center bg-[#FFFFFF1A] rounded-full">
|
|
|
|
|
<FontAwesomeIcon
|
|
|
|
|
icon={faAngleLeft}
|
|
|
|
|
style={{ maxWidth: "12px" }}
|
|
|
|
|
size="xl"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
router.back();
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<p className="text-base text-center leading-9">图文动态(空间内)</p>
|
|
|
|
|
{isSubmitting ? (
|
|
|
|
|
<DotLoading />
|
|
|
|
|
) : (
|
|
|
|
|
<span className="text-primary text-lg" onClick={handleSubmit}>
|
|
|
|
|
发布
|
|
|
|
|
</span>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
{/* 内容 */}
|
|
|
|
|
<div className="pt-16 p-4">
|
|
|
|
|
<DefaultMask
|
|
|
|
|
visible={isBlockModalVisible}
|
|
|
|
|
closeMask={setIsBlockModalVisible}
|
|
|
|
|
title="当前无法发帖"
|
|
|
|
|
content="您当前审核未通过动态过多,请修改后再试"
|
|
|
|
|
handleClick={() => {
|
|
|
|
|
setIsBlockModalVisible(false);
|
|
|
|
|
setTimeout(() => router.back(), 500);
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
<div>
|
|
|
|
|
<p className="text-sm font-medium text-[#27F5B7] mb-2">
|
|
|
|
|
为了空间良性发展,请保持免费/付费比例为1/1
|
|
|
|
|
</p>
|
|
|
|
|
<div className="flex flex-row flex-wrap justify-between p-4 rounded-2xl bg-[#FFFFFF1A]">
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<p className="text-xs font-medium basis-1/2">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
已发布免费动态:{postCount?.free_count || 0}条
|
|
|
|
|
</p>
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<p className="text-xs font-medium basis-1/2">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
已发布付费动态:{postCount?.paid_count || 0}条
|
|
|
|
|
</p>
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<p className="text-xs font-medium basis-1/2 mt-1">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
<span className="text-[#27F5B7]">可发布付费动态:</span>
|
|
|
|
|
{postCount?.paid_limit || 0}条
|
|
|
|
|
</p>
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<p className="text-xs font-medium basis-1/2 mt-1">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
<span className="text-[#F53030]">审核未通过动态:</span>
|
|
|
|
|
{postCount?.rejected_count || 0}条
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="mt-2">
|
|
|
|
|
<p className="text-base font-medium text-white">动态内容</p>
|
2024-10-29 18:55:18 +08:00
|
|
|
|
<div className="h-32">
|
|
|
|
|
<TextArea
|
|
|
|
|
placeholder="请遵守平台准则,严禁发布违规内容"
|
|
|
|
|
value={formData.content}
|
|
|
|
|
autoSize={{ minRows: 6, maxRows: 15 }}
|
|
|
|
|
onChange={(value) =>
|
|
|
|
|
setFormData((old) => ({ ...old, content: value }))
|
|
|
|
|
}
|
|
|
|
|
style={{ "--font-size": "14px" }}
|
|
|
|
|
className="h-full bg-[#FFFFFF1A] rounded-2xl mt-2 mb-4 p-2"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2024-10-22 17:24:02 +08:00
|
|
|
|
{formData.isCreatingPaidText && formData.price > 0 && (
|
2024-10-29 18:55:18 +08:00
|
|
|
|
<div className="mt-2">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
<span className="text-base font-medium text-white">付费文案</span>
|
2024-10-29 18:55:18 +08:00
|
|
|
|
<div className="h-32">
|
|
|
|
|
<TextArea
|
|
|
|
|
placeholder="仅在用户解锁后展示,请勿发布违规内容"
|
|
|
|
|
onChange={(value) =>
|
|
|
|
|
setFormData((old) => ({ ...old, paidText: value }))
|
|
|
|
|
}
|
|
|
|
|
autoSize={{ minRows: 6, maxRows: 15 }}
|
|
|
|
|
value={formData.paidText}
|
|
|
|
|
style={{ "--font-size": "14px" }}
|
|
|
|
|
className="h-full bg-[#FFFFFF1A] rounded-2xl mt-2 mb-4 p-2"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2024-10-22 17:24:02 +08:00
|
|
|
|
)}
|
|
|
|
|
</div>
|
2024-10-29 18:55:18 +08:00
|
|
|
|
<div className="mt-4">
|
|
|
|
|
<UploadImgs
|
|
|
|
|
type={1}
|
|
|
|
|
existImages={oldPhotos}
|
|
|
|
|
assets={formData.imageAssets}
|
|
|
|
|
getImgs={(imgs) => {
|
|
|
|
|
setFormData((old) => ({ ...old, imageAssets: imgs }));
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2024-10-22 17:24:02 +08:00
|
|
|
|
<div
|
|
|
|
|
color="#FF669E"
|
|
|
|
|
radius="999"
|
|
|
|
|
size="md"
|
|
|
|
|
className="mt-4 w-28 bg-primary rounded-full text-center text-base py-2"
|
|
|
|
|
onClick={() => setPriceEdit(true)}
|
|
|
|
|
>
|
|
|
|
|
付费设置
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<Popup
|
|
|
|
|
visible={priceEdit}
|
|
|
|
|
onMaskClick={() => {
|
|
|
|
|
setPriceEdit(false);
|
|
|
|
|
}}
|
|
|
|
|
className="p-4"
|
|
|
|
|
bodyStyle={{
|
|
|
|
|
borderRadius: "16px",
|
|
|
|
|
width: "calc(100% - 48px)",
|
|
|
|
|
margin: "24px",
|
|
|
|
|
padding: "14px",
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
gap: 8,
|
|
|
|
|
}}
|
|
|
|
|
className="flex flex-col py-2"
|
|
|
|
|
>
|
|
|
|
|
<div className="flex flex-row items-center">
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<span className="text-base font-medium whitespace-nowrap">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
价格:¥
|
|
|
|
|
</span>
|
2024-10-24 21:28:49 +08:00
|
|
|
|
<div className="px-2 mx-1 rounded-full bg-[#ffffff1A]">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
<OwnInput
|
|
|
|
|
placeholder="¥1~3000"
|
|
|
|
|
placeholderTextColor="#FFFFFF80"
|
|
|
|
|
keyboardType="numeric"
|
|
|
|
|
underlineColorAndroid="transparent"
|
|
|
|
|
onChange={(value) =>
|
|
|
|
|
setPriceEditData((old) => ({ ...old, price: value }))
|
|
|
|
|
}
|
|
|
|
|
value={priceEditData.price}
|
2024-10-25 19:19:41 +08:00
|
|
|
|
className="flex-1 bg-transparent rounded-2xl h-8 mx-2"
|
2024-10-22 17:24:02 +08:00
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<span
|
|
|
|
|
onClick={() =>
|
|
|
|
|
setPriceEditData((old) => ({ ...old, price: "0" }))
|
|
|
|
|
}
|
|
|
|
|
className="text-[#FF669E] text-base font-medium whitespace-nowrap"
|
|
|
|
|
>
|
|
|
|
|
免费
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
{Math.floor(priceEditData.price) > 0 && (
|
|
|
|
|
<>
|
|
|
|
|
<div className="flex justify-between items-center my-1">
|
|
|
|
|
<div className="flex items-center">
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<span className="text-base font-medium mr-2 whitespace-nowrap">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
可预览图片:
|
|
|
|
|
</span>
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<span className="text-base font-medium">前</span>
|
2024-10-24 21:28:49 +08:00
|
|
|
|
<div className="px-2 mx-1 rounded-full max-w-[60px] bg-[#ffffff1A]">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
<OwnInput
|
|
|
|
|
placeholder="0~3"
|
|
|
|
|
placeholderTextColor="#FFFFFF80"
|
|
|
|
|
onChange={(value) =>
|
|
|
|
|
setPriceEditData((old) => ({
|
|
|
|
|
...old,
|
|
|
|
|
imageVisibleRange: value,
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
value={priceEditData.imageVisibleRange}
|
2024-10-25 19:19:41 +08:00
|
|
|
|
// className="bg-transparent rounded-2xl px-4 mx-2 h-8"
|
2024-10-22 17:24:02 +08:00
|
|
|
|
/>
|
|
|
|
|
</div>
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<span className="text-base font-medium">张</span>
|
2024-10-22 17:24:02 +08:00
|
|
|
|
</div>
|
|
|
|
|
<span
|
|
|
|
|
onClick={() =>
|
|
|
|
|
setPriceEditData((old) => ({
|
|
|
|
|
...old,
|
|
|
|
|
imageVisibleRange: "0",
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
className="text-[#FF669E] text-base font-medium ml-auto whitespace-nowrap"
|
|
|
|
|
>
|
|
|
|
|
不可预览
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="flex items-center my-1">
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<span className="text-base font-medium mr-2">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
添加付费文案:
|
|
|
|
|
</span>
|
|
|
|
|
<Switch
|
|
|
|
|
checked={priceEditData.isCreatingPaidText}
|
|
|
|
|
onChange={(value) => {
|
|
|
|
|
setPriceEditData((old) => ({
|
|
|
|
|
...old,
|
|
|
|
|
isCreatingPaidText: value,
|
|
|
|
|
}));
|
|
|
|
|
}}
|
2024-10-23 13:52:52 +08:00
|
|
|
|
style={{
|
|
|
|
|
"--checked-color": "#FF669E",
|
|
|
|
|
}}
|
2024-10-22 17:24:02 +08:00
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="flex items-center my-1">
|
2024-10-25 19:19:41 +08:00
|
|
|
|
<span className="text-base font-medium mr-2">
|
2024-10-22 17:24:02 +08:00
|
|
|
|
铁粉免费查看:
|
|
|
|
|
</span>
|
|
|
|
|
<Switch
|
|
|
|
|
checked={priceEditData.isFreeForIronfan}
|
|
|
|
|
onChange={(value) =>
|
|
|
|
|
setPriceEditData((old) => ({
|
|
|
|
|
...old,
|
|
|
|
|
isFreeForIronfan: value,
|
|
|
|
|
}))
|
|
|
|
|
}
|
2024-10-23 13:52:52 +08:00
|
|
|
|
style={{
|
|
|
|
|
"--checked-color": "#FF669E",
|
|
|
|
|
}}
|
2024-10-22 17:24:02 +08:00
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
<p
|
|
|
|
|
className="pt-4 text-center border-t border-[#ffffff40]"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
setPriceEdit(false);
|
|
|
|
|
setFormData((old) => ({ ...old, ...priceEditData }));
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
保存
|
|
|
|
|
</p>
|
|
|
|
|
</Popup>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|