258 lines
7.5 KiB
JavaScript
258 lines
7.5 KiB
JavaScript
import React, { useState, useEffect, useCallback } from "react";
|
|
import { Image, TouchableOpacity, View, Modal, Text } from "react-native";
|
|
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
|
|
import { useTailwind } from "tailwind-rn";
|
|
import Stream from "../Stream";
|
|
import My from "../My";
|
|
import Posts from "../Posts";
|
|
import { get } from "../../utils/storeInfo";
|
|
import { Icon } from "@rneui/themed";
|
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
|
|
const Tab = createBottomTabNavigator();
|
|
|
|
export default function HomeTab({ navigation, route }) {
|
|
const tailwind = useTailwind();
|
|
const insets = useSafeAreaInsets();
|
|
|
|
const [isCreatePostTabVisible, setIsCreatePostTabVisible] = useState(false);
|
|
useEffect(() => {
|
|
const checkRole = async () => {
|
|
const account = await get("account");
|
|
if (account.role === 3) setIsCreatePostTabVisible(true);
|
|
};
|
|
checkRole();
|
|
}, []);
|
|
|
|
const CustomTabBarButton = useCallback(({ children }) => {
|
|
const [visible, setVisible] = useState(false);
|
|
return (
|
|
<TouchableOpacity
|
|
style={{
|
|
top: -10,
|
|
justifyContent: "center",
|
|
alignItems: "center",
|
|
}}
|
|
onPress={() => setVisible(!visible)}
|
|
>
|
|
<View
|
|
style={{
|
|
width: 70,
|
|
height: 70,
|
|
borderRadius: 35,
|
|
}}
|
|
>
|
|
{children}
|
|
</View>
|
|
<Modal
|
|
visible={visible}
|
|
transparent={true}
|
|
statusBarTranslucent
|
|
animationType="slide"
|
|
>
|
|
<TouchableOpacity
|
|
activeOpacity={1}
|
|
style={tailwind("flex flex-1")}
|
|
onPress={() => setVisible(false)}
|
|
>
|
|
<TouchableOpacity
|
|
activeOpacity={1}
|
|
style={{
|
|
paddingBottom: insets.bottom,
|
|
paddingLeft: insets.left,
|
|
paddingRight: insets.right,
|
|
...tailwind(
|
|
"absolute bottom-0 left-0 h-48 w-full bg-[#13121F] rounded-t-2xl"
|
|
),
|
|
}}
|
|
>
|
|
<View style={tailwind("flex flex-1 flex-col")}>
|
|
<View
|
|
style={tailwind(
|
|
"flex flex-1 flex-row justify-between items-center"
|
|
)}
|
|
>
|
|
<TouchableOpacity
|
|
style={tailwind("flex flex-col items-center basis-1/3")}
|
|
>
|
|
<Icon type="ionicon" name="image" size={30} color="white" />
|
|
<Text
|
|
style={tailwind("text-base text-[#FFFFFF80] font-medium")}
|
|
>
|
|
发图片
|
|
</Text>
|
|
</TouchableOpacity>
|
|
<TouchableOpacity
|
|
style={tailwind("flex flex-col items-center basis-1/3")}
|
|
>
|
|
<Icon
|
|
type="ionicon"
|
|
name="videocam"
|
|
size={30}
|
|
color="white"
|
|
/>
|
|
<Text
|
|
style={tailwind("text-base text-[#FFFFFF80] font-medium")}
|
|
>
|
|
发视频
|
|
</Text>
|
|
</TouchableOpacity>
|
|
<TouchableOpacity
|
|
onPress={() => {
|
|
navigation.navigate("CreatePost");
|
|
setVisible(false);
|
|
}}
|
|
style={tailwind("flex flex-col items-center basis-1/3")}
|
|
>
|
|
<Icon
|
|
type="ionicon"
|
|
name="aperture"
|
|
size={30}
|
|
color="white"
|
|
/>
|
|
<Text
|
|
style={tailwind("text-base text-[#FFFFFF80] font-medium")}
|
|
>
|
|
广场动态
|
|
</Text>
|
|
</TouchableOpacity>
|
|
</View>
|
|
<Icon
|
|
style={tailwind("mb-2")}
|
|
onPress={() => setVisible(false)}
|
|
type="ionicon"
|
|
name="close-outline"
|
|
size={30}
|
|
color="#FFFFFF80"
|
|
/>
|
|
</View>
|
|
</TouchableOpacity>
|
|
</TouchableOpacity>
|
|
</Modal>
|
|
</TouchableOpacity>
|
|
);
|
|
}, []);
|
|
|
|
return (
|
|
<Tab.Navigator
|
|
screenOptions={() => ({
|
|
tabBarActiveTintColor: "#FF669E",
|
|
tabBarInactiveTintColor: "gray",
|
|
tabBarStyle: {
|
|
backgroundColor: "#07050A",
|
|
borderTopColor: "#FFFFFF26",
|
|
},
|
|
})}
|
|
>
|
|
<Tab.Screen
|
|
name="Posts"
|
|
component={Posts}
|
|
options={{
|
|
title: "动态",
|
|
headerShown: false,
|
|
tabBarIcon: ({ focused, color, size }) => {
|
|
if (focused) {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/postfocus.png")}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/postblur.png")}
|
|
/>
|
|
);
|
|
}
|
|
},
|
|
}}
|
|
/>
|
|
<Tab.Screen
|
|
name="Space"
|
|
component={My}
|
|
options={{
|
|
title: "空间",
|
|
headerShown: false,
|
|
tabBarIcon: ({ focused, color, size }) => {
|
|
if (focused) {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/myfocus.png")}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/myblur.png")}
|
|
/>
|
|
);
|
|
}
|
|
},
|
|
}}
|
|
/>
|
|
{isCreatePostTabVisible && (
|
|
<Tab.Screen
|
|
name="CreatePost"
|
|
component={Stream}
|
|
options={{
|
|
title: "",
|
|
headerShown: false,
|
|
tabBarIcon: ({ focused, color, size }) => (
|
|
<Image
|
|
source={require("../../assets/icon/others/createpost.png")}
|
|
/>
|
|
),
|
|
tabBarButton: (props) => <CustomTabBarButton {...props} />,
|
|
}}
|
|
/>
|
|
)}
|
|
<Tab.Screen
|
|
name="Stream"
|
|
component={Stream}
|
|
options={{
|
|
title: "发现",
|
|
headerShown: false,
|
|
tabBarIcon: ({ focused, color, size }) => {
|
|
if (focused) {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/streamfocus.png")}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/streamblur.png")}
|
|
/>
|
|
);
|
|
}
|
|
},
|
|
}}
|
|
/>
|
|
<Tab.Screen
|
|
name="My"
|
|
component={My}
|
|
options={{
|
|
title: "我的",
|
|
headerShown: false,
|
|
tabBarIcon: ({ focused, color, size }) => {
|
|
if (focused) {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/myfocus.png")}
|
|
/>
|
|
);
|
|
} else {
|
|
return (
|
|
<Image
|
|
source={require("../../assets/icon/others/myblur.png")}
|
|
/>
|
|
);
|
|
}
|
|
},
|
|
}}
|
|
/>
|
|
</Tab.Navigator>
|
|
);
|
|
}
|