tiefen_space_app/screeens/StreamerVerification/CompleteStreamerInformation/index.jsx

993 lines
37 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,
ScrollView,
TouchableOpacity,
TextInput,
KeyboardAvoidingView,
Platform,
ActivityIndicator,
} from "react-native";
import React, { useState, useMemo, useCallback, useEffect } from "react";
import { useTailwind } from "tailwind-rn";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { Divider, Icon, Button, CheckBox } from "@rneui/themed";
import { Image } from "expo-image";
import { Formik } from "formik";
import Picker from "../../../components/Picker";
import MediaPicker from "../../../components/MediaPicker";
import Toast from "react-native-toast-message";
import { get } from "../../../utils/storeInfo";
import { multiUpload } from "../../../utils/upload";
import baseRequest from "../../../utils/baseRequest";
import { generateSignature } from "../../../utils/crypto";
import MediaGrid from "../../../components/MediaGrid";
import * as ImagePicker from "expo-image-picker";
import * as VideoThumbnails from "expo-video-thumbnails";
const blurhash = "LcKUTa%gOYWBYRt6xuoJo~s8V@fk";
export default function CompleteStreamerInformation({ navigation, route }) {
const tailwind = useTailwind();
const insets = useSafeAreaInsets();
//保存封面图以及控制上传封面图Modal出现
const [displayImage, setDisplayImage] = useState([]);
//选择封面图
const pickDisPlayImage = async () => {
let result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Images,
quality: 1,
});
if (!result.canceled) {
setDisplayImage(result.assets);
}
};
//保存展示视频
const [displayVideo, setDisplayVideo] = useState([]);
//为视频生成封面
const generateThumbnail = useCallback(async (uri) => {
try {
const videoCover = await VideoThumbnails.getThumbnailAsync(uri);
return videoCover;
} catch (e) {
console.warn(e);
}
}, []);
//选择视频
const pickDisPlayVideo = async () => {
let result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Videos,
quality: 1,
});
if (!result.canceled) {
for (let i = 0; i < result.assets.length; i++) {
if (result.assets[i].duration > 0) {
const videoCover = await generateThumbnail(result.assets[i].uri);
result.assets[i].cover = videoCover.uri;
}
}
setDisplayVideo(result.assets);
}
};
const [wechatInputShow, setWechatInputShow] = useState(1);
//保存新添加的相册图片
const [photos, setPhotos] = useState([]);
//展示旧相册图片组件
const [oldPhotos, setOldPhotos] = useState([]);
//保存主播标签
const [tags, setTags] = useState([]);
//点击标签
const handlePressTag = (tag, isChecked) => {
if (isChecked) {
setTags(tags.filter((item) => item !== tag));
} else {
if (tags.length >= 3) {
Toast.show({
type: "error",
text1: "最多只能选择3个标签",
topOffset: 60,
});
return;
}
setTags([...tags, tag]);
}
};
//标签组件
const TagItem = ({ tag, label }) => {
const isChecked = tags.includes(tag);
return (
<TouchableOpacity
activeOpacity={1}
onPress={() => handlePressTag(tag, isChecked)}
style={
isChecked
? tailwind("border border-[#FF669E] rounded-full px-2 py-1 m-1")
: tailwind("border border-gray-400 rounded-full px-2 py-1 m-1")
}
>
<Text
style={
isChecked
? tailwind("text-[#FF669E] text-sm font-medium")
: tailwind("text-[#FFFFFF80] text-sm font-medium")
}
>
{label}
</Text>
</TouchableOpacity>
);
};
//生成年龄、身高、体重、胸围、腰围、臀围、星座、省份数组
const generateItems = useCallback((min, max) => {
const items = [];
for (let i = min; i <= max; i++) {
items.push({ label: i.toString(), value: i.toString() });
}
return items;
}, []);
const ages = useMemo(() => generateItems(18, 60), []);
const heights = useMemo(() => generateItems(140, 200), []);
const weights = useMemo(() => generateItems(35, 100), []);
const constellations = [
{ label: "白羊座", value: "白羊座" },
{ label: "金牛座", value: "金牛座" },
{ label: "双子座", value: "双子座" },
{ label: "巨蟹座", value: "巨蟹座" },
{ label: "狮子座", value: "狮子座" },
{ label: "处女座", value: "处女座" },
{ label: "天秤座", value: "天秤座" },
{ label: "天蝎座", value: "天蝎座" },
{ label: "射手座", value: "射手座" },
{ label: "摩羯座", value: "摩羯座" },
{ label: "水瓶座", value: "水瓶座" },
{ label: "双鱼座", value: "双鱼座" },
];
const provinces = [
{ label: "北京市", value: "北京市" },
{ label: "天津市", value: "天津市" },
{ label: "河北省", value: "河北省" },
{ label: "山西省", value: "山西省" },
{ label: "内蒙古自治区", value: "内蒙古自治区" },
{ label: "辽宁省", value: "辽宁省" },
{ label: "吉林省", value: "吉林省" },
{ label: "黑龙江省", value: "黑龙江省" },
{ label: "上海市", value: "上海市" },
{ label: "江苏省", value: "江苏省" },
{ label: "浙江省", value: "浙江省" },
{ label: "安徽省", value: "安徽省" },
{ label: "福建省", value: "福建省" },
{ label: "江西省", value: "江西省" },
{ label: "山东省", value: "山东省" },
{ label: "河南省", value: "河南省" },
{ label: "湖北省", value: "湖北省" },
{ label: "湖南省", value: "湖南省" },
{ label: "广东省", value: "广东省" },
{ label: "广西壮族自治区", value: "广西壮族自治区" },
{ label: "海南省", value: "海南省" },
{ label: "重庆市", value: "重庆市" },
{ label: "四川省", value: "四川省" },
{ label: "贵州省", value: "贵州省" },
{ label: "云南省", value: "云南省" },
{ label: "西藏自治区", value: "西藏自治区" },
{ label: "陕西省", value: "陕西省" },
{ label: "甘肃省", value: "甘肃省" },
{ label: "青海省", value: "青海省" },
{ label: "宁夏回族自治区", value: "宁夏回族自治区" },
{ label: "新疆维吾尔自治区", value: "新疆维吾尔自治区" },
{ label: "台湾省", value: "台湾省" },
{ label: "香港特别行政区", value: "香港特别行政区" },
{ label: "澳门特别行政区", value: "澳门特别行政区" },
];
//基本资料
const [data, setData] = useState();
const [allTag, setAllTag] = useState({});
//正在加载数据
const [isLoading, setIsloading] = useState(true);
const [isWaitingReview, setIsWaitingReview] = useState(false);
useEffect(() => {
const getData = async () => {
const account = await get("account");
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
const base = await baseRequest();
try {
//获取当前审批状态
const body = {
...base,
};
const signature = await generateSignature(body);
const statusResponse = await fetch(
`${apiUrl}/api/streamer_auth_approval/get_statuses?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
}
);
const statusData = await statusResponse.json();
if (statusData.ret === -1) {
Toast.show({
type: "error",
text1: statusData.msg,
topOffset: 60,
});
return;
}
if (statusData?.data?.details_status === 0) setIsWaitingReview(true);
if (statusData?.data?.details_status !== 2) {
setData({ ...account, streamer: {} });
return;
}
//获取已填信息
const body2 = {
approve_status: 2,
...base,
};
const signature2 = await generateSignature(body2);
const _response = await fetch(
`${apiUrl}/api/streamer_auth_approval_his/list_details?signature=${signature2}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body2),
}
);
const _data = await _response.json();
if (_data.ret === -1) {
Toast.show({
type: "error",
text1: _data.msg,
topOffset: 60,
});
return;
}
setData({ ...account, streamer: _data.data.list[0] });
setWechatInputShow(_data.data.list[0].wechat_lock_type);
setTags(_data.data.list[0].tag);
if (_data.data.list[0])
setDisplayImage([
{
notChanged: true,
id: { image_ids: _data.data.list[0].cover.image_ids },
uri: _data.data.list[0].cover.images[0].urls[0],
},
]);
setDisplayVideo([
{
notChanged: true,
id: { video_ids: _data.data.list[0].shorts?.video_ids },
cover: _data.data.list[0].shorts?.videos[0]?.cover_urls[0],
},
]);
setOldPhotos(_data.data.list[0].album.images);
} catch (error) {
console.error(error);
} finally {
setIsloading(false);
}
};
const getAllTag = async () => {
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
const base = await baseRequest();
try {
//获取所有的标签
const signature = await generateSignature({
...base,
});
const _response = await fetch(
`${apiUrl}/api/streamer_tag/list?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
...base,
}),
}
);
const tagData = await _response.json();
if (tagData.ret === -1) {
Toast.show({
type: "error",
text1: tagData.msg,
topOffset: 60,
});
return;
}
setAllTag(tagData.data);
} catch (error) {
console.error(error);
}
};
getData();
getAllTag();
}, []);
//正在提交状态
const [isSubmitting, setIsSubmitting] = useState(false);
//是否正在拖动图片用于禁用ScrollView的滚动
const [dragging, setDragging] = useState(false);
//loading时展示加载中
if (isLoading) {
return (
<ActivityIndicator style={tailwind("mt-32")} size="large" color="white" />
);
}
//审核中的情况
if (isWaitingReview) {
return (
<ScrollView
style={{
paddingLeft: insets.left,
paddingRight: insets.right,
...tailwind("flex-1"),
}}
>
<View style={tailwind("flex flex-col items-center p-4")}>
<Icon
name="information-circle"
type="ionicon"
color="#27F5B7"
size={100}
/>
<Text style={tailwind("text-2xl text-white font-medium")}>
正在审核中请耐心等待
</Text>
</View>
</ScrollView>
);
}
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} style={tailwind("px-4 py-4")}>
{data.streamer?.remarks && (
<View style={tailwind("mb-4")}>
<View style={tailwind("p-4 rounded-2xl bg-[#FFFFFF1A]")}>
<Text style={tailwind("text-sm font-medium text-white")}>
<Text style={tailwind("text-[#F53030]")}>驳回原因</Text>
{data.streamer?.remarks}
</Text>
</View>
</View>
)}
<Formik
initialValues={{
fans: data?.streamer?.fans?.toString(),
gender: data?.streamer?.gender?.toString(),
wechat_add_way: data?.streamer?.wechat_lock_type?.toString(),
wechat: data?.streamer?.wechat_contact?.toString(),
price:
data?.streamer?.wechat_coin_price === undefined
? ""
: (data?.streamer?.wechat_coin_price / 10)?.toString(),
info: data?.streamer?.bio?.toString(),
age: data?.streamer?.age?.toString(),
height: data?.streamer?.height?.toString(),
weight: data?.streamer?.weight?.toString(),
constellation: data?.streamer?.constellation?.toString(),
location: data?.streamer?.city?.toString(),
auto_response_message:
data?.streamer?.auto_response_message?.toString(),
}}
enableReinitialize
onSubmit={async (values) => {
if (
!values.fans ||
!values.gender ||
!values.wechat_add_way ||
!values.price ||
!values.info ||
displayImage.length === 0 ||
displayVideo.length === 0 ||
!values.age ||
!values.height ||
!values.weight ||
!values.constellation ||
!values.location ||
!values.auto_response_message ||
tags.length === 0
) {
Toast.show({
type: "error",
text1: "请完善信息后提交",
topOffset: 60,
});
return;
}
const fans = parseInt(values.fans, 10);
if (isNaN(fans) || fans < 1) {
Toast.show({
type: "error",
text1: "请输入有效的全网粉丝量大于等于1的整数",
topOffset: 60,
});
return;
}
const price = parseInt(values.price, 10);
if (isNaN(price) || price < 1) {
Toast.show({
type: "error",
text1: "请输入有效的微信价格大于等于1的整数",
topOffset: 60,
});
return;
}
if (values.wechat_add_way === "0" && !values.wechat) {
Toast.show({
type: "error",
text1: "请填写微信号",
topOffset: 60,
});
return;
}
//相册不得低于2张
if (oldPhotos.length + photos.length < 2) {
Toast.show({
type: "error",
text1: "相册至少需要上传2张照片哦",
topOffset: 60,
});
return;
}
//相册不得超过9张
if (oldPhotos.length + photos.length > 9) {
Toast.show({
type: "error",
text1: "相册最多只能上传9张照片哦",
topOffset: 60,
});
return;
}
setIsSubmitting(true);
const cover = displayImage[0].notChanged
? displayImage[0].id
: await multiUpload(displayImage);
const shorts = displayVideo[0].notChanged
? displayVideo[0].id
: await multiUpload(displayVideo);
const newPhotosIds = await multiUpload(photos);
const oldPhotosIds = oldPhotos.map((item) => item.id);
const album = {
image_ids: [...oldPhotosIds, ...newPhotosIds?.image_ids],
};
if (
!cover.image_ids.length ||
!shorts.video_ids.length ||
!album.image_ids.length
) {
Toast.show({
type: "error",
text1: "上传失败,请联系客服进行上传",
topOffset: 60,
});
setIsSubmitting(false);
return;
}
//获取环境变量
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
//上传表单
const base = await baseRequest();
const body = {
gender: parseInt(values.gender, 10),
wechat_contact: values.wechat,
bio: values.info,
cover: cover,
shorts: shorts,
album: album,
age: parseInt(values.age, 10),
height: parseInt(values.height, 10),
weight: parseInt(values.weight, 10),
constellation: values.constellation,
city: values.location,
tag: tags,
wechat_lock_type: parseInt(values.wechat_add_way, 10),
fans: parseInt(values.fans, 10),
wechat_coin_price: parseInt(values.price, 10) * 10,
auto_response_message: values.auto_response_message,
...base,
};
const signature = await generateSignature(body);
try {
const response = await fetch(
`${apiUrl}/api/streamer_auth_approval/create_details?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
}
);
const streamerData = await response.json();
if (streamerData.ret === -1) {
Toast.show({
type: "error",
text1: streamerData.msg,
topOffset: 60,
});
return;
}
//提交成功后toast提示并返回“我的”页面
Toast.show({
type: "success",
text1: "提交成功",
topOffset: 60,
});
navigation.goBack();
} catch (error) {
console.error(error);
} finally {
setIsSubmitting(false);
}
}}
>
{({ handleChange, handleSubmit, values, setFieldValue }) => (
<>
<View style={tailwind("my-2 bg-[#FFFFFF1A] p-2 rounded-2xl")}>
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
头像(需在我的修改)
</Text>
<Image
style={tailwind("w-12 h-12 rounded-full")}
source={data?.avatar?.images[0]?.urls[0]}
placeholder={blurhash}
contentFit="cover"
transition={1000}
cachePolicy="disk"
/>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
昵称(需在我的修改)
</Text>
<Text style={tailwind("text-base text-white font-medium")}>
{data?.name}
</Text>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
全网粉丝量
</Text>
<View
style={tailwind("flex-row flex-1 justify-end items-center")}
>
<TextInput
placeholder="请输入真实有效数据"
placeholderTextColor="#FFFFFF80"
keyboardType="numeric"
style={tailwind("text-white flex-1")}
underlineColorAndroid="transparent"
textAlign="right"
onChangeText={handleChange("fans")}
value={values.fans}
/>
<Text
style={tailwind("text-base text-white font-medium ml-1")}
>
</Text>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
性别
</Text>
<View style={tailwind("w-1/2")}>
<Picker
items={[
{
label: "女",
value: "1",
},
{ label: "男", value: "0" },
]}
value={values.gender}
onChange={handleChange("gender")}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-col justify-between")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
添加标签
</Text>
<View style={tailwind("flex-row flex-wrap")}>
{Object.entries(allTag).map(([tag, label]) => {
return <TagItem key={tag} tag={label} label={label} />;
})}
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-col justify-between")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
添加微信方式
</Text>
<View
style={tailwind("flex-row items-center justify-around")}
>
<TouchableOpacity
activeOpacity={1}
onPress={() => {
setWechatInputShow(1);
setFieldValue("wechat_add_way", "1");
}}
style={tailwind("flex-row items-center")}
>
<CheckBox
checked={values.wechat_add_way === "1"}
onPress={() => {
setWechatInputShow(1);
setFieldValue("wechat_add_way", "1");
}}
iconType="material-community"
checkedIcon="checkbox-marked"
uncheckedIcon="checkbox-blank-outline"
checkedColor="#FF669E"
containerStyle={tailwind("p-0 m-0 bg-transparent")}
size={18}
/>
<Text
style={tailwind("text-base text-white font-medium")}
>
主动添加对方
</Text>
</TouchableOpacity>
<TouchableOpacity
activeOpacity={1}
onPress={() => {
setWechatInputShow(0);
setFieldValue("wechat_add_way", "0");
}}
style={tailwind("flex-row items-center")}
>
<CheckBox
checked={values.wechat_add_way === "0"}
onPress={() => {
setWechatInputShow(0);
setFieldValue("wechat_add_way", "0");
}}
iconType="material-community"
checkedIcon="checkbox-marked"
uncheckedIcon="checkbox-blank-outline"
checkedColor="#FF669E"
containerStyle={tailwind("p-0 m-0 bg-transparent")}
size={18}
/>
<Text
style={tailwind("text-base text-white font-medium")}
>
向对方展示微信
</Text>
</TouchableOpacity>
</View>
</View>
<Divider style={tailwind("my-2")} />
{wechatInputShow === 0 && (
<>
<View
style={tailwind("flex-row justify-between items-center")}
>
<Text
style={tailwind("text-base text-white font-medium")}
>
<Text style={tailwind("text-[#F53030]")}>*</Text>
微信号
</Text>
<View
style={tailwind(
"flex-row flex-1 justify-end items-center"
)}
>
<TextInput
placeholder="对方付费购买后展示"
placeholderTextColor="#FFFFFF80"
style={tailwind("text-white flex-1")}
underlineColorAndroid="transparent"
textAlign="right"
maxLength={20}
onChangeText={handleChange("wechat")}
value={values.wechat}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
</>
)}
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
加微信价格
</Text>
<View
style={tailwind("flex-row flex-1 justify-end items-center")}
>
<TextInput
placeholder="请输入心仪价格"
placeholderTextColor="#FFFFFF80"
keyboardType="numeric"
style={tailwind("text-white flex-1")}
underlineColorAndroid="transparent"
textAlign="right"
onChangeText={handleChange("price")}
value={values.price}
/>
<Text
style={tailwind("text-base text-white font-medium ml-1")}
>
</Text>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-col")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
个性签名
</Text>
<View style={tailwind("flex-row items-center")}>
<TextInput
multiline
scrollEnabled={false}
placeholder="点此输入,文案将在“主页”展示"
placeholderTextColor="#FFFFFF80"
style={tailwind("text-white")}
underlineColorAndroid="transparent"
textAlign="top"
onChangeText={handleChange("info")}
value={values.info}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
封面图
</Text>
<TouchableOpacity
onPress={() => pickDisPlayImage()}
style={tailwind("flex-row items-center")}
>
{displayImage.length !== 0 ? (
<Image
style={tailwind("w-12 h-12 rounded-lg")}
source={displayImage[0].uri}
placeholder={blurhash}
contentFit="cover"
transition={1000}
cachePolicy="disk"
/>
) : (
<Text
style={tailwind("text-xs text-[#FFFFFF80] font-medium")}
>
将在发现主页展示
</Text>
)}
<Icon
name="chevron-forward-outline"
type="ionicon"
color="white"
/>
</TouchableOpacity>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
展示视频
</Text>
<TouchableOpacity
onPress={() => pickDisPlayVideo()}
style={tailwind("flex-row items-center")}
>
{displayVideo.length !== 0 ? (
<Image
style={tailwind("w-12 h-16 rounded-lg")}
source={displayVideo[0].cover}
placeholder={blurhash}
contentFit="cover"
transition={1000}
cachePolicy="disk"
/>
) : (
<Text
style={tailwind("text-xs text-[#FFFFFF80] font-medium")}
>
将在发现主页展示
</Text>
)}
<Icon
name="chevron-forward-outline"
type="ionicon"
color="white"
/>
</TouchableOpacity>
</View>
<Divider style={tailwind("my-2")} />
<View>
<View
style={tailwind("flex-row justify-between items-center")}
>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
相册
</Text>
<Text
style={tailwind("text-xs text-[#FFFFFF80] font-medium")}
>
将在主页展示29
</Text>
</View>
<MediaGrid
setDragging={setDragging}
assets={oldPhotos}
setAssets={setOldPhotos}
/>
<MediaPicker
setDragging={setDragging}
maxCount={9}
type="image"
setAssets={setPhotos}
/>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
年龄
</Text>
<View style={tailwind("w-1/2")}>
<Picker
items={ages}
value={values.age}
onChange={handleChange("age")}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
身高cm
</Text>
<View style={tailwind("w-1/2")}>
<Picker
items={heights}
value={values.height}
onChange={handleChange("height")}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
体重kg
</Text>
<View style={tailwind("w-1/2")}>
<Picker
items={weights}
value={values.weight}
onChange={handleChange("weight")}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
</Text>
<View style={tailwind("w-1/2")}>
<Picker
items={constellations}
value={values.constellation}
onChange={handleChange("constellation")}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-row justify-between items-center")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
</Text>
<View style={tailwind("w-1/2")}>
<Picker
items={provinces}
value={values.location}
onChange={handleChange("location")}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
<View style={tailwind("flex-col")}>
<Text style={tailwind("text-base text-white font-medium")}>
<Text style={tailwind("text-[#F53030]")}>*</Text>
私信自动回复
</Text>
<View style={tailwind("flex-row items-center")}>
<TextInput
multiline
scrollEnabled={false}
placeholder="文案将自动发送给点开私信的用户"
placeholderTextColor="#FFFFFF80"
style={tailwind("text-white")}
underlineColorAndroid="transparent"
textAlign="top"
onChangeText={handleChange("auto_response_message")}
value={values.auto_response_message}
/>
</View>
</View>
<Divider style={tailwind("my-2")} />
</View>
<Button
color="#FF669E"
radius="999"
size="md"
disabled={isSubmitting}
disabledStyle={tailwind("bg-[#FFFFFF80]")}
disabledTitleStyle={tailwind("text-white")}
onPress={(e) => {
handleSubmit(e);
}}
titleStyle={tailwind("text-base")}
containerStyle={{
marginBottom: insets.bottom + 60,
...tailwind("mt-4"),
}}
>
{isSubmitting && (
<ActivityIndicator size="small" color="white" />
)}
{isSubmitting ? "正在提交..." : "提交"}
</Button>
</>
)}
</Formik>
</ScrollView>
</KeyboardAvoidingView>
);
}