import {
View,
Text,
TextInput,
ScrollView,
Modal,
TouchableOpacity,
KeyboardAvoidingView,
ActivityIndicator,
Platform,
} from "react-native";
import React, { useState, useEffect } from "react";
import { useTailwind } from "tailwind-rn";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import MediaPicker from "../../components/MediaPicker";
import { Button, Switch } from "@rneui/themed";
import Toast from "react-native-toast-message";
import { multiUpload } from "../../utils/upload";
import baseRequest from "../../utils/baseRequest";
import { generateSignature } from "../../utils/crypto";
import MyModal from "../../components/MyModal";
export default function CreateVideoPost({ navigation, route }) {
const tailwind = useTailwind();
const insets = useSafeAreaInsets();
//文案
const [content, setContent] = useState();
//视频
const [videoAssets, setVideoAssets] = useState([]);
//付费设置弹窗是否展示
const [isModalVisible, setIsModalVisible] = useState(false);
//价格
const [price, setPrice] = useState();
//可预览文案行数
const [textVisibleRange, setTextVisibleRange] = useState("999");
//是否模糊封面
const [blurCover, setBlurCover] = useState(true);
//是否铁粉免费查看
const [isFreeForIronfan, setIsFreeForIronfan] = useState(false);
//是否添加付费文案
const [isCreatingPaidText, setIsCreatingPaidText] = useState(false);
//付费文案内容
const [paidText, setPaidText] = useState("");
//正在提交
const [isSubmitting, setIsSubmitting] = useState(false);
//是否正在拖动图片,用于禁用ScrollView的滚动
const [dragging, setDragging] = useState(false);
//保存付费设置
const handleSavePaymentSetting = () => {
if (parseFloat(price) < 0) {
Toast.show({
type: "error",
text1: "请输入正确区间的价格",
topOffset: 60,
});
return;
}
if (parseFloat(price) > 0 && parseInt(parseFloat(price) * 100, 10) < 100) {
Toast.show({
type: "error",
text1: "请输入正确区间的价格",
topOffset: 60,
});
return;
}
if (parseInt(parseFloat(price) * 100, 10) > 300000) {
Toast.show({
type: "error",
text1: "请输入正确区间的价格",
topOffset: 60,
});
return;
}
if (parseInt(textVisibleRange, 10) < 1) {
Toast.show({
type: "error",
text1: "请输入正确区间的可预览文案行数",
topOffset: 60,
});
return;
}
setIsModalVisible(false);
};
//发布内容
const handleSubmit = async () => {
if (!content) {
Toast.show({
type: "error",
text1: "动态内容不能为空",
topOffset: 60,
});
return;
}
if (videoAssets.length === 0) {
Toast.show({
type: "error",
text1: "请选择视频",
topOffset: 60,
});
return;
}
if (isCreatingPaidText && price > 0 && !paidText) {
Toast.show({
type: "error",
text1: "请填写付费文案",
topOffset: 60,
});
return;
}
//提交数据
if (isSubmitting) return;
setIsSubmitting(true);
const media = await multiUpload(videoAssets);
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
try {
const base = await baseRequest();
const body = {
...base,
c_type: parseFloat(price) ? 1 : 0,
is_ironfan_visible: isFreeForIronfan ? 1 : 0,
m_type: 2,
text: content,
media_component: media,
text_visible_range: textVisibleRange
? parseInt(textVisibleRange, 10)
: 999,
is_blurring_cover: blurCover ? 1 : 0,
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 signature = await generateSignature(body);
const response = await fetch(
`${apiUrl}/api/zone_moment/create?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
}
);
const data = await response.json();
if (data.ret === -1) {
Toast.show({
type: "error",
text1: data.msg,
topOffset: 60,
});
return;
}
//提交成功后显示Toast并返回上一页
Toast.show({
type: "success",
text1: "发布成功",
topOffset: 60,
});
navigation.goBack();
} catch (error) {
console.error(error);
} finally {
setIsSubmitting(false);
}
};
//发布按钮
useEffect(() => {
navigation.setOptions({
headerRight: () => (
{isSubmitting ? "" : "发布"}
{isSubmitting && }
),
});
}, [navigation, handleSubmit, isSubmitting]);
//查询已发布空间内免费帖数量、付费帖数量、发布付费帖剩余额度、审核未通过帖数量
const [postCount, setPostCount] = useState();
const [isBlockModalVisible, setIsBlockModalVisible] = useState(false);
useEffect(() => {
const getPostCountData = async () => {
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
try {
const base = await baseRequest();
const body = {
...base,
};
const signature = await generateSignature(body);
const _response = await fetch(
`${apiUrl}/api/zone_moment/list_statistics_by_creater_mid?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
}
);
const _data = await _response.json();
if (_data.ret === -1) {
Toast.show({
type: "error",
text1: _data.msg,
topOffset: 60,
});
return;
}
setPostCount(_data.data);
if (_data.data.rejected_count >= 5) setIsBlockModalVisible(true);
} catch (error) {
console.error(error);
}
};
getPostCountData();
}, []);
return (
{
setIsBlockModalVisible(false);
setTimeout(
() => navigation.replace("VisibleToOneselfSpacePosts"),
500
);
}}
customText="去修改"
/>
为了空间良性发展,请保持免费/付费比例为1/1
已发布免费动态:{postCount?.free_count}条
已发布付费动态:{postCount?.paid_count}条
可发布付费动态:
{postCount?.paid_limit}条
审核未通过动态:
{postCount?.rejected_count}条
动态内容
setContent(value)}
value={content}
style={tailwind(
"h-32 bg-[#FFFFFF1A] text-white rounded-2xl mt-2 mb-4 p-2"
)}
/>
{isCreatingPaidText && price > 0 && (
<>
付费文案
setPaidText(value)}
value={paidText}
style={tailwind(
"h-32 bg-[#FFFFFF1A] text-white rounded-2xl mt-2 mb-4 p-2"
)}
/>
>
)}
价格:¥
setPrice(value)}
value={price}
style={tailwind(
"flex-1 bg-[#FFFFFF1A] text-white rounded-2xl px-4 h-8 mx-2"
)}
/>
setPrice("0")}
style={tailwind("text-[#FF669E] text-base font-medium")}
>
免费
{parseFloat(price) > 0 && (
<>
添加付费文案:
setIsCreatingPaidText(value)
}
thumbColor="#ffffff"
trackColor={{ true: "#FF669E", false: "#FFFFFF1A" }}
/>
封面模糊:
setBlurCover(value)}
thumbColor="#ffffff"
trackColor={{ true: "#FF669E", false: "#FFFFFF1A" }}
/>
铁粉免费查看:
setIsFreeForIronfan(value)
}
thumbColor="#ffffff"
trackColor={{ true: "#FF669E", false: "#FFFFFF1A" }}
/>
>
)}
保存
);
}