tiefen_space_app/screeens/EditStreamerPost/index.jsx

246 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
View,
Text,
TextInput,
ScrollView,
ActivityIndicator,
KeyboardAvoidingView,
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 Toast from "react-native-toast-message";
import { multiUpload } from "../../utils/upload";
import MediaGrid from "../../components/MediaGrid";
import requireAPI from "../../utils/requireAPI";
export default function EditStreamerPost({ navigation, route }) {
const tailwind = useTailwind();
const insets = useSafeAreaInsets();
const [isSubmitting, setIsSubmitting] = useState(false);
const [oldMediaAssets, setOldMediaAssets] = useState([]);
const [mediaAssets, setMediaAssets] = useState([]);
const [mType, setMType] = useState(1);
const [initalData, setInitalData] = useState({});
//价格
const [formData, setFormData] = useState({
content: "",
});
useEffect(() => {
getData();
}, []);
const getData = async () => {
const ids = [parseInt(route.params.id, 10)];
try {
const body = {
ids,
};
const _data = await requireAPI(
"POST",
"/api/moment/list_by_ids_from_creater",
{
body,
},
true
);
if (_data.ret === -1) {
Toast.show({
icon: "fail",
content: _data.msg,
position: "top",
});
return;
}
setInitalData(_data.data.list[0]);
const { text, media_component } = _data.data.list[0];
setFormData({
content: text,
});
setMType(media_component.images.length > 0 ? 1 : 2);
setOldMediaAssets(
media_component.images.length > 0
? media_component.images
: media_component.videos
);
} catch (error) {
console.error(error);
} finally {
setIsSubmitting(false);
}
};
//发布按钮
useEffect(() => {
navigation.setOptions({
headerRight: () => (
<Text
onPress={handleSubmit}
style={tailwind("text-[#FF669E] text-base font-medium")}
>
{isSubmitting ? "" : "发布"}
{isSubmitting && <ActivityIndicator size="small" color="white" />}
</Text>
),
});
}, [isSubmitting, handleSubmit, formData, mediaAssets, oldMediaAssets]);
//是否正在拖动图片用于禁用ScrollView的滚动
const [dragging, setDragging] = useState(false);
const handleSubmit = async () => {
if (formData.content == "") {
Toast.show({
type: "error",
text1: "动态内容不能为空",
topOffset: 60,
});
return;
}
if (oldMediaAssets.length === 0 && mediaAssets.length === 0) {
Toast.show({
type: "error",
text1: "请上传图片或视频",
topOffset: 60,
});
return;
}
//提交数据
if (isSubmitting) return;
setIsSubmitting(true);
const { content } = formData;
const newMedia = await multiUpload(mediaAssets);
const oldMedia = oldMediaAssets.map((item) => item.id);
const media =
mType === 1
? {
...newMedia,
image_ids: [...oldMedia, ...newMedia.image_ids],
}
: {
...newMedia,
video_ids: [...oldMedia, ...newMedia.video_ids],
};
try {
const body = {
id: parseInt(route.params.id, 10),
text: content,
media_component: media,
status: 2,
};
const data = await requireAPI(
"POST",
"/api/moment/update",
{
body,
},
true,
100000
);
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);
}
};
return (
<KeyboardAvoidingView
behavior={Platform.OS == "ios" ? "padding" : "height"}
keyboardVerticalOffset={insets.bottom + 60}
style={{
paddingLeft: insets.left,
paddingRight: insets.right,
...tailwind("flex-1"),
}}
>
{/* 内容 */}
<ScrollView scrollEnabled={!dragging}>
<View style={tailwind("p-4")}>
{initalData?.status === 6 && (
<View style={tailwind("mb-4")}>
<Text
style={tailwind("text-base font-medium text-[#F53030] mb-2")}
>
违规详情
</Text>
<View style={tailwind("p-4 rounded-2xl bg-[#FFFFFF1A]")}>
{initalData.text_audit_opinion && (
<Text style={tailwind("text-sm font-medium text-white")}>
<Text style={tailwind("text-[#F53030]")}>
文案违规原因
</Text>
{initalData.text_audit_opinion}
</Text>
)}
{initalData.image_audit_opinion && (
<Text style={tailwind("text-sm font-medium text-white")}>
<Text style={tailwind("text-[#F53030]")}>
图片/视频违规原因
</Text>
{initalData.image_audit_opinion}
</Text>
)}
{initalData.manually_review_opinion && (
<Text style={tailwind("text-sm font-medium text-white")}>
<Text style={tailwind("text-[#F53030]")}>运营追加</Text>
{initalData.manually_review_opinion}
</Text>
)}
</View>
</View>
)}
<Text style={tailwind("text-base font-medium text-white")}>
动态内容
</Text>
<TextInput
placeholder="请遵守平台准则,严禁发布违规内容"
placeholderTextColor="#FFFFFF80"
underlineColorAndroid="transparent"
multiline
textAlignVertical="top"
name="content"
value={formData.content}
onChange={(e) => setFormData({ content: e.nativeEvent.text })}
style={tailwind(
"h-32 bg-[#FFFFFF1A] text-white rounded-2xl mt-2 mb-4 p-2"
)}
/>
<View>
{oldMediaAssets.length > 0 && (
<MediaGrid
setDragging={setDragging}
assets={oldMediaAssets}
setAssets={setOldMediaAssets}
/>
)}
<MediaPicker
setDragging={setDragging}
maxCount={
mType === 1
? 9 - oldMediaAssets.length
: 1 - oldMediaAssets.length
}
type={mType === 1 ? "image" : "video"}
setAssets={setMediaAssets}
/>
</View>
</View>
</ScrollView>
</KeyboardAvoidingView>
);
}