200 lines
5.2 KiB
React
200 lines
5.2 KiB
React
|
import React, { useRef, useState } from "react";
|
||
|
import {
|
||
|
Animated,
|
||
|
Dimensions,
|
||
|
LayoutAnimation,
|
||
|
Platform,
|
||
|
ScrollView,
|
||
|
StyleSheet,
|
||
|
Text,
|
||
|
TouchableOpacity,
|
||
|
View,
|
||
|
} from "react-native";
|
||
|
import BottomNav from "../../components/main/BottomNav";
|
||
|
import Header from "../../components/main/Header";
|
||
|
import Cart from "./Cart";
|
||
|
import Chat from "./Chat";
|
||
|
import Home from "./Home";
|
||
|
import Notification from "./Notification";
|
||
|
import Profile from "./Profile";
|
||
|
const height = Dimensions.get("window").height;
|
||
|
|
||
|
const Main = ({ cartList }) => {
|
||
|
const [tabActive, settabActive] = useState("home");
|
||
|
// const [switchTab, setswitch] = useState("prod");
|
||
|
const [switchTab, setSwitchTab] = useState("prod");
|
||
|
const animatedValue = useRef(new Animated.Value(0)).current;
|
||
|
|
||
|
const handleTabPress = (tab) => {
|
||
|
// Determine the target value based on the selected tab
|
||
|
const targetValue = tab === 'prod' ? 0 : 1;
|
||
|
|
||
|
// Create a spring animation
|
||
|
Animated.spring(animatedValue, {
|
||
|
toValue: targetValue,
|
||
|
friction: 5, // Adjust the friction to control the bounce effect
|
||
|
tension: 10, // Adjust the tension to control the bounce effect
|
||
|
useNativeDriver: true,
|
||
|
}).start();
|
||
|
|
||
|
// Update the selected tab
|
||
|
setSwitchTab(tab);
|
||
|
};
|
||
|
|
||
|
// Interpolate the animated value to determine background color
|
||
|
const backgroundColor = animatedValue.interpolate({
|
||
|
inputRange: [0, 1],
|
||
|
outputRange: ['#ffaa00', '#ffaa00'], // Adjust colors as needed
|
||
|
});
|
||
|
return (
|
||
|
<View style={styles.container}>
|
||
|
<ScrollView style={styles.wrapper}>
|
||
|
{tabActive === "home" ? (
|
||
|
<Home tab={switchTab} />
|
||
|
) : tabActive === "notif" ? (
|
||
|
<Notification />
|
||
|
) : tabActive === "message" ? (
|
||
|
<Chat />
|
||
|
) : tabActive === "cart" ? (
|
||
|
<Cart cartList={cartList} />
|
||
|
) : tabActive === "profile" ? (
|
||
|
<Profile />
|
||
|
) : (
|
||
|
<Home />
|
||
|
)}
|
||
|
</ScrollView>
|
||
|
<View style={styles.footer}>
|
||
|
{tabActive === "home" ? (
|
||
|
<View style={styles.tabsCon}>
|
||
|
<View style={styles.tabs}>
|
||
|
<TouchableOpacity
|
||
|
style={[
|
||
|
switchTab === 'ven'? styles.tab:styles.tabActive ,
|
||
|
|
||
|
{
|
||
|
backgroundColor: switchTab === 'prod' ? backgroundColor : 'transparent',
|
||
|
transform: [
|
||
|
{
|
||
|
translateX: animatedValue.interpolate({
|
||
|
inputRange: [0, 1],
|
||
|
outputRange: [-5, 5], // Adjust the bounce distance
|
||
|
}),
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]}
|
||
|
onPress={() => handleTabPress('prod')}
|
||
|
activeOpacity={0.8}
|
||
|
>
|
||
|
<Text
|
||
|
style={[
|
||
|
styles.tabText,
|
||
|
{
|
||
|
color: switchTab === 'prod' ? '#fff' : '#000',
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
Products
|
||
|
</Text>
|
||
|
</TouchableOpacity>
|
||
|
<TouchableOpacity
|
||
|
style={[
|
||
|
switchTab === 'prod'? styles.tab:styles.tabActive ,
|
||
|
{
|
||
|
backgroundColor: switchTab === 'ven' ? backgroundColor : 'transparent',
|
||
|
transform: [
|
||
|
{
|
||
|
translateX: animatedValue.interpolate({
|
||
|
inputRange: [0, 1],
|
||
|
outputRange: [-5, 5], // Adjust the bounce distance
|
||
|
}),
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]}
|
||
|
onPress={() => handleTabPress('ven')}
|
||
|
activeOpacity={0.8}
|
||
|
>
|
||
|
<Text
|
||
|
style={[
|
||
|
styles.tabText,
|
||
|
{
|
||
|
color: switchTab === 'ven' ? '#fff' : '#000',
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
Vendor
|
||
|
</Text>
|
||
|
</TouchableOpacity>
|
||
|
</View>
|
||
|
</View>
|
||
|
) : null}
|
||
|
<BottomNav settabActive={settabActive} activeTab={tabActive} />
|
||
|
</View>
|
||
|
</View>
|
||
|
);
|
||
|
};
|
||
|
const styles = StyleSheet.create({
|
||
|
container: {
|
||
|
backgroundColor: "#fff",
|
||
|
height: "100%",
|
||
|
width: "100%",
|
||
|
justifyContent: "center",
|
||
|
alignItems: "center",
|
||
|
},
|
||
|
header: {
|
||
|
position: "fixed",
|
||
|
width: "100%",
|
||
|
top: 0,
|
||
|
},
|
||
|
footer: {
|
||
|
// position: "absolute",
|
||
|
bottom: 0,
|
||
|
width: "100%",
|
||
|
},
|
||
|
wrapper: {
|
||
|
height: "100%",
|
||
|
},
|
||
|
tabsCon: {
|
||
|
height: 80,
|
||
|
width: "100%",
|
||
|
position: "absolute",
|
||
|
justifyContent: "center",
|
||
|
alignItems: "center",
|
||
|
bottom: 50,
|
||
|
},
|
||
|
tabs: {
|
||
|
// height: 30,
|
||
|
margin: "auto",
|
||
|
flexDirection: "row",
|
||
|
backgroundColor: "#fff",
|
||
|
borderRadius: 15,
|
||
|
overflow: "hidden",
|
||
|
borderWidth: 1,
|
||
|
borderColor: "#ddd",
|
||
|
// padding:10
|
||
|
},
|
||
|
tab: {
|
||
|
paddingVertical: 15,
|
||
|
paddingHorizontal: 25,
|
||
|
},
|
||
|
tabActive: {
|
||
|
backgroundColor: "#ffaa00",
|
||
|
paddingVertical: 15,
|
||
|
paddingHorizontal: 25,
|
||
|
borderRadius: 15,
|
||
|
},
|
||
|
tabText: {
|
||
|
textTransform: "uppercase",
|
||
|
color: "#383838",
|
||
|
fontWeight: "600",
|
||
|
},
|
||
|
tabTextActive: {
|
||
|
textTransform: "uppercase",
|
||
|
color: "#fff",
|
||
|
fontWeight: "600",
|
||
|
},
|
||
|
});
|
||
|
|
||
|
export default Main;
|