tiefen_space_app/screeens/WechatWaitingToAdd/AlreadyAddWechat/index.jsx

302 lines
9.8 KiB
React
Raw Normal View History

import {
View,
Text,
FlatList,
RefreshControl,
Modal,
TouchableOpacity,
Image as NativeImage,
} from "react-native";
import { Image } from "expo-image";
import React, { useState, useEffect } from "react";
import { useTailwind } from "tailwind-rn";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Empty from "../../../components/Empty";
import { ListItem, Button } from "@rneui/themed";
import baseRequest from "../../../utils/baseRequest";
import Toast from "react-native-toast-message";
import * as Clipboard from "expo-clipboard";
import { generateSignature } from "../../../utils/crypto";
//todo:等待接口上线,完善样式,测试
export default function AlreadyAddWechat({}) {
const blurhash = "LcKUTa%gOYWBYRt6xuoJo~s8V@fk";
const tailwind = useTailwind();
const insets = useSafeAreaInsets();
//保存获取的订单列表
const [orderList, setOrderList] = useState([]);
const [offset, setOffset] = useState(0);
const [more, setMore] = useState(1);
//获取订单数据
const getOrderList = async (top = false) => {
if (!more && top === false) return;
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
try {
const base = await baseRequest();
const signature = await generateSignature({
tab: 2,
offset: top ? 0 : offset,
limit: 20,
...base,
});
const response = await fetch(
`${apiUrl}/api/vas/get_add_wechat_list?signature=${signature}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
tab: 1,
offset: top ? 0 : offset, //如果是下拉刷新则更新最新数据
limit: 20,
...base,
}),
}
);
const data = await response.json();
if (data.ret === -1) {
Toast.show({
type: "error",
text1: data.msg,
topOffset: 60,
});
return;
}
setOffset(data.data.offset);
setMore(data.data.more);
//如果是下拉刷新则更新最新数据
if (top) {
setOrderList(data.data.list);
return;
}
setOrderList([...orderList, ...data.data.list]);
} catch (error) {
console.error(error);
}
};
useEffect(() => {
getOrderList();
}, []);
//下拉刷新
const [refreshing, setRefreshing] = useState(false);
const handleRefresh = async () => {
setRefreshing(true);
await getOrderList(true);
setRefreshing(false);
};
//二次确认组件
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
const [currentOrder, setCurrentOrder] = useState({});
const ConfirmModal = () => {
//保存内容到剪贴板
const copy = async (data) => {
await Clipboard.setStringAsync(data);
Toast.show({
type: "success",
text1: "已复制到剪贴板",
topOffset: 60,
});
};
return (
<Modal
visible={isConfirmModalVisible}
transparent={true}
statusBarTranslucent
animationType="fade"
>
<TouchableOpacity
activeOpacity={1}
onPress={() => setIsConfirmModalVisible(false)}
style={{
backgroundColor: "#00000080",
...tailwind("flex-1 justify-center items-center"),
}}
>
<TouchableOpacity
activeOpacity={1}
style={tailwind("p-4 rounded-2xl bg-[#1E1C29] items-center w-3/4")}
>
{currentOrder.consumer_wechat ? (
<View style={tailwind("flex flex-col")}>
<View
style={tailwind("flex flex-row items-center justify-center")}
>
<Image
style={tailwind("w-10 h-10 rounded-full")}
source={currentOrder?.account?.avatar?.images[0]?.urls[0]}
placeholder={blurhash}
contentFit="cover"
transition={1000}
cachePolicy="disk"
/>
<Text style={tailwind("text-white text-lg ml-2 font-medium")}>
{currentOrder?.account?.name}
</Text>
</View>
<Text style={tailwind("text-white text-base font-medium")}>
Ta的微信号
</Text>
<View style={tailwind("flex flex-row")}>
<Text style={tailwind("text-white text-base font-medium")}>
{currentOrder?.consumer_wechat}
</Text>
<TouchableOpacity
onPress={() => copy(currentOrder?.consumer_wechat)}
style={tailwind("flex flex-row")}
>
<NativeImage
source={require("../../../assets/icon/24DP/copy.png")}
/>
<Text style={tailwind("text-white text-base font-medium")}>
复制
</Text>
</TouchableOpacity>
</View>
<Text style={tailwind("text-white text-base font-medium")}>
添加时请备注
</Text>
<View style={tailwind("flex flex-row")}>
<Text style={tailwind("text-white text-base font-medium")}>
{currentOrder?.consumer_note}
</Text>
<TouchableOpacity
onPress={() => copy(currentOrder?.consumer_note)}
style={tailwind("flex flex-row")}
>
<NativeImage
source={require("../../../assets/icon/24DP/copy.png")}
/>
<Text style={tailwind("text-white text-base font-medium")}>
复制
</Text>
</TouchableOpacity>
</View>
</View>
) : (
<View style={tailwind("flex flex-col")}>
<View
style={tailwind("flex flex-row items-center justify-center")}
>
<Image
style={tailwind("w-10 h-10 rounded-full")}
source={currentOrder.account?.avatar?.images[0]?.urls[0]}
placeholder={blurhash}
contentFit="cover"
transition={1000}
cachePolicy="disk"
/>
<Text style={tailwind("text-white text-lg ml-2 font-medium")}>
{currentOrder.account?.name}
</Text>
</View>
<Text
style={tailwind(
"text-white text-base text-center my-2 font-medium"
)}
>
请确认对方已主动添加您的微信并您已经通过好友申请
</Text>
</View>
)}
</TouchableOpacity>
</TouchableOpacity>
</Modal>
);
};
//订单项组件
const renderItem = ({ item }) => {
return (
<ListItem bottomDivider containerStyle={tailwind("p-0 bg-[#07050A]")}>
<View style={tailwind("flex-1")}>
<View style={tailwind("flex-row py-3 items-center")}>
<Image
style={tailwind("w-12 h-12 rounded-full")}
source={item?.account?.avatar?.images[0]?.urls[0]}
placeholder={blurhash}
contentFit="cover"
transition={1000}
cachePolicy="disk"
/>
<View style={tailwind("ml-2 justify-around flex-1")}>
<Text
style={tailwind("text-base text-white font-medium")}
numberOfLines={1}
ellipsizeMode="tail"
>
{item?.account?.name}
</Text>
<Text
style={tailwind("text-xs text-[#FFFFFF80]")}
numberOfLines={1}
ellipsizeMode="tail"
>
请于72小时内添加对方微信
</Text>
<Text
style={tailwind("text-xs text-[#FFFFFF80]")}
numberOfLines={1}
ellipsizeMode="tail"
>
付款时间:{new Date(item?.ct * 1000).toLocaleString()}
</Text>
</View>
<View style={tailwind("ml-2 justify-around items-center")}>
<Button
onPress={() => {
setCurrentOrder(item);
setIsConfirmModalVisible(!isConfirmModalVisible);
}}
titleStyle={tailwind("text-sm font-medium px-2")}
color="#FFFFFF1A"
radius="999"
size="md"
>
{item.order_status === 4 && "已处理"}
{item.order_status === 5 && "已完成"}
{item.order_status === 6 && "已退款"}
</Button>
</View>
</View>
</View>
</ListItem>
);
};
2023-12-29 00:27:44 +08:00
return (
<View
style={{
paddingBottom: insets.bottom,
paddingLeft: insets.left,
paddingRight: insets.right,
...tailwind("flex-1"),
}}
>
<View style={tailwind("px-4 flex-1")}>
<ConfirmModal />
<FlatList
data={orderList}
renderItem={renderItem}
initialNumToRender={20}
refreshControl={
<RefreshControl
colors={["#FF669E"]}
tintColor="white"
refreshing={refreshing}
onRefresh={() => handleRefresh()}
/>
}
onEndReached={() => getOrderList()}
ListEmptyComponent={<Empty type="nodata" />}
/>
</View>
2023-12-29 00:27:44 +08:00
</View>
);
}