import { View, Text, ScrollView, Modal, TextInput, KeyboardAvoidingView, TouchableOpacity, Image as NativeImage, } from "react-native"; import React, { useState, useEffect, useCallback, useMemo } from "react"; import { useTailwind } from "tailwind-rn"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import Toast from "react-native-toast-message"; import { Image } from "expo-image"; import { Icon, Button } from "@rneui/themed"; import baseRequest from "../../../utils/baseRequest"; import { generateSignature } from "../../../utils/crypto"; import { get } from "../../../utils/storeInfo"; import { JSEncrypt } from "jsencrypt"; import Picker from "../../../components/Picker"; export default function AgencySetting({ navigation, route }) { const blurhash = "LcKUTa%gOYWBYRt6xuoJo~s8V@fk"; const tailwind = useTailwind(); const insets = useSafeAreaInsets(); //获取环境变量 const apiUrl = process.env.EXPO_PUBLIC_API_URL; //获取数据 const [data, setData] = useState(); useEffect(() => { const getData = async () => { try { const base = await baseRequest(); const body = { zid: route.params.data.id, ...base, }; const signature = await generateSignature(body); const _response = await fetch( `${apiUrl}/api/zone_third_partner/list?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; } setData(_data.data.zone_third_partner); } catch (error) { console.error(error); } }; getData(); }, []); //获取当前用户的手机号 const [regionCode, setRegionCode] = useState(""); const [mobilePhone, setMobilePhone] = useState(""); useEffect(() => { async function getMobilePhone() { setMobilePhone(await get("mobile_phone")); setRegionCode(await get("region_code")); } getMobilePhone(); }, []); //添加代运营Modal const [idAddAgencyModalVisible, setIsAddAgencyModalVisible] = useState(false); //搜索用户ID,以及是否选中用户 const [userId, setUserId] = useState(); const [agencyData, setAgencyData] = useState(); const [isSelected, setIsSelected] = useState(false); const handleSearch = async () => { if (!userId) { Toast.show({ type: "error", text1: "请先输入ID", topOffset: 60, }); return; } const base = await baseRequest(); const signature = await generateSignature({ ...base, user_id: parseInt(userId, 10), }); try { //获取账号基本信息 const _response = await fetch( `${apiUrl}/api/account/list_others_by_user_id?signature=${signature}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ ...base, user_id: parseInt(userId, 10), }), } ); const _data = await _response.json(); if (_data.ret === -1) { Toast.show({ type: "error", text1: _data.msg, topOffset: 60, }); return; } setAgencyData(_data.data.account); setIsSelected(false); } catch (error) { console.error(error); } }; //验证码 const [veriCode, setVeriCode] = useState(); //重新获取验证码的计时器 const [isCounting, setIsCounting] = useState(false); const [seconds, setSeconds] = useState(60); useEffect(() => { let interval; if (isCounting && seconds > 0) { interval = setInterval(() => { setSeconds(seconds - 1); }, 1000); } else { setIsCounting(false); setSeconds(60); clearInterval(interval); } return () => { clearInterval(interval); }; }, [isCounting, seconds]); //点击获取验证码 const handleVerification = async () => { if (!isSelected) { Toast.show({ type: "error", text1: "请先选中用户", topOffset: 60, }); return; } //开始倒计时 setIsCounting(true); //对手机号进行RSA加密 const encrypt = new JSEncrypt(); encrypt.setPublicKey(process.env.EXPO_PUBLIC_RSA_KEY); const mobile_phone = encrypt.encrypt(mobilePhone); //发送短信验证码 const base = await baseRequest(); const signature = await generateSignature({ mobile_phone: mobile_phone, region_code: regionCode, ...base, }); try { await fetch(`${apiUrl}/api/veri_code/send?signature=${signature}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ mobile_phone: mobile_phone, region_code: regionCode, ...base, }), }); } catch (error) { console.error(error); } }; //分成比例 const [rate, setRate] = useState(); //生成比例选项 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 rates = useMemo(() => generateItems(1, 50), []); //提交 const handleSubmit = async () => { if (!isSelected) { Toast.show({ type: "error", text1: "请先选中用户", topOffset: 60, }); return; } if (!veriCode) { Toast.show({ type: "error", text1: "请输入验证码", topOffset: 60, }); return; } if (!rate) { Toast.show({ type: "error", text1: "请选择分成比例", topOffset: 60, }); return; } try { const base = await baseRequest(); //对手机号进行RSA加密 const encrypt = new JSEncrypt(); encrypt.setPublicKey(process.env.EXPO_PUBLIC_RSA_KEY); const mobile_phone = encrypt.encrypt(mobilePhone); const body = { zid: route.params.data.id, third_partner_mid: agencyData.mid, region_code: regionCode, mobile_phone: mobile_phone, veri_code: veriCode, sharing_ratio: parseInt(rate, 10) / 100, ...base, }; const signature = await generateSignature(body); const _response = await fetch( `${apiUrl}/api/zone_third_partner/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; } navigation.goBack(); } catch (error) { console.error(error); } }; //关闭 const handleCancel = () => { setIsAddAgencyModalVisible(false); setIsSelected(false); setAgencyData(); setUserId(); setRate(); setVeriCode(); }; return ( {data ? ( ) : ( setIsAddAgencyModalVisible(true)} type="ionicon" name="add" size={40} color="white" containerStyle={tailwind( "border border-white rounded-full w-[4.6rem] h-[4.6rem] flex items-center justify-center" )} /> )} {data && ( 代运营昵称:{data.third_partner_account.name} ID:{data.third_partner_account.user_id} 分成比例:{(data.sharing_ratio * 100).toFixed()}% )} 注意事项: 1、一个空间仅可设置一个代运营,若您的代运营团队为多人,请设置代运营主账号后,让代运营主账号进入当前空间设置合伙人; 2、设置完成后无法再次修改人员和分成比例,请确认后再提交,后续如需修改请联系人工客服; 3、您获得的收益会按照您设置的分成比例直接转移至代运营及协作者账户,您将不会得到这部分的收益,如有疑问请咨询人工客服。 搜索用户: setUserId(value)} value={userId} style={tailwind( "flex-1 bg-[#FFFFFF1A] text-white rounded-2xl px-4 h-8 mx-2" )} /> 搜索 {agencyData && ( {agencyData?.name} {agencyData?.user_id} )} 手机号: {mobilePhone?.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2")} 验证码: setVeriCode(value)} value={veriCode} style={tailwind( "flex-1 bg-[#FFFFFF1A] text-white rounded-2xl px-4 h-8 mx-2" )} /> 分成比例: setRate(value)} /> 注意事项:分成比例不得超过50%且确认后无法修改 ); }