Obanana_test/app/pages/home/main.jsx

776 lines
28 KiB
JavaScript

import React, { useEffect, 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 { get_all_vendors } from "../../services/api/controllers/vendor";
import Cart from "./Cart";
import Chat from "./Chat";
import Home from "./Home";
import Notification from "./Notification";
import Profile from "./Profile";
import { get_all_products } from "../../services/api/controllers/product";
import { createMaterialBottomTabNavigator } from "@react-navigation/material-bottom-tabs";
import { FontAwesomeIcon } from "@fortawesome/react-native-fontawesome";
import FontAwesome, {
SolidIcons,
RegularIcons,
BrandIcons,
} from "react-native-fontawesome";
import {
faCartShopping,
faComments,
faStore,
faUserCircle,
} from "@fortawesome/free-solid-svg-icons";
import Icon from "react-native-vector-icons/FontAwesome5";
import { BottomNavigation, useTheme } from "react-native-paper";
import { FontAwesome5 } from "@expo/vector-icons";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { useIsFocused, useNavigation } from "@react-navigation/native";
import { get_orders_by_customer } from "../../services/api/controllers/order";
import { user } from "../../constants/user";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { get_customer_login_id } from "../../services/api/controllers/customers";
import {
get_user_token,
user_login,
} from "../../services/api/controllers/auth";
import seedrandom from "seedrandom";
// import { user_login } from "../../services/obananapayApi/user_api";
const BottomTab = createBottomTabNavigator();
const height = Dimensions.get("window").height;
const BottomTab1 = createMaterialBottomTabNavigator();
const Main = ({ cartList, route }) => {
const [tabActive, settabActive] = useState("home");
// const [switchTab, setswitch] = useState("prod");
const [switchTab, setSwitchTab] = useState("prod");
const animatedValue = useRef(new Animated.Value(0)).current;
const [vendors, setVendors] = useState([]);
const [product, setproduct] = useState([]);
const [cart, setcart] = useState([]);
const [refreshing, setRefreshing] = useState(false);
const [index, setIndex] = useState(0);
const { colors } = useTheme();
const [error, setError] = useState([]);
const [isLoading, setIsLoading] = useState(true); // Add a loading state
const [prodIsLoading, setprodIsLoading] = useState(true); // Add a loading state
const navigation = useNavigation();
const [loggedIn, setloggedIn] = useState(false);
const [emailSaved, setemailSaved] = useState("");
const [pass, setpass] = useState("");
const [errors, seterror] = useState("");
const { userLoggedin } = route.params ?? "";
const [refresh, setrefresh] = useState(false);
const [scrollTop, setscrollTop] = useState(false);
const [isLoadingLayout, setIsLoadingLayout] = useState(true); // Add a loading
const scrollViewRef = useRef(null);
useEffect(() => {
// Simulate a delay of 300 milliseconds
const timer = setInterval(() => {
setrefresh(true);
AsyncStorage.getItem("something")
.then((pass) => {
if (pass) {
// console.log("I am here sw well");
// let emailSaved = "";
// let pass = "";
AsyncStorage.getItem("something")
.then((passs) => {
// pass = passs;
setpass(passs);
console.log(passs);
AsyncStorage.getItem("email")
.then((emails) => {
setemailSaved(emails);
console.log(emails);
if (emailSaved && pass) {
user_login({
username: emailSaved.replace(/\s/g, "").toLowerCase(),
password: pass,
})
.then((result) => {
if (result.status == 200) {
// setuserEmail(result.data.user.email);
// settoken(result.data.token);
// setuid(result.data.user._id);
// send_email();
// settoken(result.data.token);
// settokenHere(result.data.token);
console.log("I am here.... logged in");
AsyncStorage.setItem(
"AccessToken",
result.data.token
);
AsyncStorage.setItem(
"email",
emailSaved.replace(/\s/g, "").toLowerCase()
);
AsyncStorage.setItem("something", pass);
get_user_token({
token: result.data.token,
})
.then((results) => {
if (results.status == 200) {
// setuid(results.data.profile.userId);
AsyncStorage.setItem(
"userId",
results.data.profile.userId
);
// AsyncStorage.setItem(
// "AccessToken",
// result.data.profile.token
// );
console.log("I am here....");
get_customer_login_id({
id: results.data.profile.userId,
})
.then((result1) => {
// console.log(result1.data);
if (result1.error) {
// seterror(result1.error);
} else {
AsyncStorage.setItem(
"userData",
JSON.stringify(result1.data)
);
AsyncStorage.getItem("userData")
.then((userData) => {
// setuser([userData]);
const userDataArray =
JSON.parse(userData);
console.log(userDataArray);
})
.catch((error) => {
console.log(error + "1weeewwww");
});
console.log(
"I am here as well we have userrrrrr" +
emailSaved +
pass
);
// console.log(result1.data);
navigation.navigate("Home");
}
})
.catch((error) => {
// setError(error.message);
console.log(error.message);
})
.finally(() => {
// setprodIsLoading(false); // Set loading to false when done loading
});
} else {
// seterror(results.message);
console.log("login error" + results);
}
})
.catch((err) => {
// seterror(err);
console.log(err);
console.log(err + "failed to login");
});
// setauth(true);
console.log("login success " + result.data.token);
} else {
// seterror(result.message);
console.log("login error" + result);
}
})
.catch((err) => {
seterror(err);
console.log(err);
console.log(err + "failed to login");
});
}
})
.catch((error) => {
console.log(error + "weeewwww");
});
})
.catch((error) => {
console.log(error + "weeewwww");
});
}
})
.catch((error) => {
console.log(error + "weeewwww");
});
setrefresh(!refresh);
}, 0.97 * 60 * 60 * 1000);
// Cleanup the timer if the component unmounts
return () => clearInterval(timer);
}, []);
useEffect(() => {
/* ---------------Check for the user saved email--------------- */
setrefresh(true);
AsyncStorage.getItem("something")
.then((pass) => {
if (pass) {
// console.log("I am here sw well");
// let emailSaved = "";
// let pass = "";
AsyncStorage.getItem("something")
.then((passs) => {
// pass = passs;
setpass(passs);
console.log(passs);
AsyncStorage.getItem("email")
.then((emails) => {
setemailSaved(emails);
console.log(emails);
if (emailSaved && pass) {
user_login({
username: emailSaved.replace(/\s/g, "").toLowerCase(),
password: pass,
})
.then((result) => {
if (result.status == 200) {
// setuserEmail(result.data.user.email);
// settoken(result.data.token);
// setuid(result.data.user._id);
// send_email();
// settoken(result.data.token);
// settokenHere(result.data.token);
console.log("I am here.... logged in");
AsyncStorage.setItem(
"AccessToken",
result.data.token
);
AsyncStorage.setItem(
"email",
emailSaved.replace(/\s/g, "").toLowerCase()
);
AsyncStorage.setItem("something", pass);
get_user_token({
token: result.data.token,
})
.then((results) => {
if (results.status == 200) {
// setuid(results.data.profile.userId);
AsyncStorage.setItem(
"userId",
results.data.profile.userId
);
// AsyncStorage.setItem(
// "AccessToken",
// result.data.profile.token
// );
console.log("I am here....");
get_customer_login_id({
id: results.data.profile.userId,
})
.then((result1) => {
// console.log(result1.data);
if (result1.error) {
// seterror(result1.error);
} else {
AsyncStorage.setItem(
"userData",
JSON.stringify(result1.data)
);
AsyncStorage.getItem("userData")
.then((userData) => {
// setuser([userData]);
const userDataArray =
JSON.parse(userData);
console.log(userDataArray);
})
.catch((error) => {
console.log(error + "1weeewwww");
});
console.log(
"I am here as well we have userrrrrr" +
emailSaved +
pass
);
// console.log(result1.data);
navigation.navigate("Home");
}
})
.catch((error) => {
// setError(error.message);
console.log(error.message);
})
.finally(() => {
// setprodIsLoading(false); // Set loading to false when done loading
});
} else {
// seterror(results.message);
console.log("login error" + results);
}
})
.catch((err) => {
// seterror(err);
console.log(err);
console.log(err + "failed to login");
});
// setauth(true);
console.log("login success " + result.data.token);
} else {
// seterror(result.message);
console.log("login error" + result);
}
})
.catch((err) => {
seterror(err);
console.log(err);
console.log(err + "failed to login");
});
}
})
.catch((error) => {
console.log(error + "weeewwww");
});
})
.catch((error) => {
console.log(error + "weeewwww");
});
}
})
.catch((error) => {
console.log(error + "weeewwww");
});
setrefresh(!refresh);
}, []);
// console.log("vendor" + vendors[1]?._id);
// function shuffleArray(array) {
// const shuffledArray = [...array];
// for (let i = shuffledArray.length - 1; i > 0; i--) {
// const j = Math.floor(Math.random() * (i + 1));
// [shuffledArray[i], shuffledArray[j]] = [
// shuffledArray[j],
// shuffledArray[i],
// ];
// }
// return shuffledArray;
// }
function shuffleArray(array, seed) {
const shuffledArray = [...array];
const rng = seedrandom(seed); // Seed the random number generator
for (let i = shuffledArray.length - 1; i > 0; i--) {
const j = Math.floor(rng() * (i + 1)); // Use the seeded random number generator
[shuffledArray[i], shuffledArray[j]] = [
shuffledArray[j],
shuffledArray[i],
];
}
return shuffledArray;
}
useEffect(() => {
// Simulate a delay of 300 milliseconds
const timer = setTimeout(() => {
setIsLoadingLayout(false); // Set isLoadingLayout to false after 300ms
}, 300);
// Cleanup the timer if the component unmounts
return () => clearTimeout(timer);
}, []);
useEffect(() => {
// Fetch vendors and update the state
get_all_products()
.then((result) => {
// console.log("result" + result);
if (result.error) {
setError(result.error);
} else {
const filtered = result.data.filter(
(item) =>
item.product_type !== "variation" &&
item.product_image !== "" &&
item.product_image !== null
);
setproduct(shuffleArray(filtered));
}
})
.catch((error) => {
setError(error.message);
})
.finally(() => {
setprodIsLoading(false); // Set loading to false when done loading
});
get_all_vendors()
.then((result) => {
// console.log("result" + result);
if (result.error) {
setError(result.error);
} else {
setVendors(shuffleArray(result.data));
}
})
.catch((error) => {
setError(error.message);
})
.finally(() => {
setIsLoading(false); // Set loading to false when done loading
});
get_orders_by_customer({
id: user[0]._id,
})
.then((result) => {
// console.log("result" + result);
if (result.error) {
setError(result.error);
} else {
setcart(result.data);
}
})
.catch((error) => {
setError(error.message);
})
.finally(() => {
// setprodIsLoading(false); // Set loading to false when done loading
});
}, []);
useEffect(() => {
if (refreshing === true) {
console.log("isssssss");
const shufP = shuffleArray(product);
setproduct(shufP);
setRefreshing(false);
// Fetch vendors and update the state
}
}, [refreshing]);
return (
<View style={styles.container} ref={scrollViewRef}>
{/* <View style={styles.wrapper}>
{tabActive === "home" ? (
<Home prodIsLoading={prodIsLoading} product={product} tab={switchTab} />
) : tabActive === "notif" ? (
<Notification />
) : tabActive === "message" ? (
<Chat />
) : tabActive === "cart" ? (
<Cart cartList={cartList} />
) : tabActive === "profile" ? (
<Profile />
) : (
<Home />
)}
</View>
<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.5}
>
<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.5}
>
<Text
style={[
styles.tabText,
{
color: switchTab === "ven" ? "#fff" : "#000",
},
]}
>
Vendor
</Text>
</TouchableOpacity>
</View>
</View>
) : null}
<BottomNav settabActive={settabActive} activeTab={tabActive} />
</View> */}
<BottomTab.Navigator
initialRouteName="Home"
activeColor="#ffaa00"
inactiveColor="#b4b4b4"
sceneAnimationType="shifting"
style={{
padding: 0,
height: 10,
}}
screenOptions={{
tabBarStyle: {
backgroundColor: "#fff",
margin: 0,
padding: 0,
paddingVertical: 10,
borderWidth: 1,
borderColor: "#e7e7e7",
height: 60,
// paddingBottom:-25
},
}}
// shifting={true}
// labeled={false}
>
<BottomTab.Screen
name="Discover"
// component={()=><Home prodIsLoading={prodIsLoading} product={product} tab={switchTab} />}
options={{
tabBarButton: (props) => {
const isFocused = useIsFocused();
return (
<TouchableOpacity {...props} style={styles.botTab}>
{/* <TouchableOpacity
onPress={() => {
if (isFocused) {
console.log("scroll to top");
setscrollTop(true);
}
}}
> */}
<FontAwesomeIcon
icon={faStore}
color={isFocused ? "#ffaa00" : "#9c9c9c"}
size={25}
style={{
paddingHorizontal: 33,
}}
/>
<Text style={{ color: isFocused ? "#ffaa00" : "#9c9c9c" }}>
Home
</Text>
{/* </TouchableOpacity> */}
</TouchableOpacity>
);
},
headerShown: false,
// tabBarColor:"#fff",
}}
>
{(props) => (
<Home
{...props}
prodIsLoading={prodIsLoading}
product={product ?? []}
vendors={vendors ?? []}
tab={switchTab}
setRefreshing={setRefreshing}
refreshing={refreshing}
/>
)}
</BottomTab.Screen>
<BottomTab.Screen
name="Chat"
// component={()=><Chat prodIsLoading={prodIsLoading} product={product} tab={switchTab} />}
options={{
headerShown: false,
tabBarButton: (props) => {
const isFocused = useIsFocused();
return (
<TouchableOpacity {...props} style={styles.botTab}>
<FontAwesomeIcon
icon={faComments}
color={isFocused ? "#ffaa00" : "#9c9c9c"}
size={25}
style={{
paddingHorizontal: 33,
}}
/>
<Text style={{ color: isFocused ? "#ffaa00" : "#9c9c9c" }}>
Chat
</Text>
</TouchableOpacity>
);
},
}}
>
{(props) => <Chat {...props} />}
</BottomTab.Screen>
<BottomTab.Screen
name="Cart"
// component={()=><Cart prodIsLoading={prodIsLoading} product={product} tab={switchTab} />}
options={{
headerShown: false,
tabBarButton: (props) => {
const isFocused = useIsFocused();
return (
<TouchableOpacity {...props} style={styles.botTab}>
<FontAwesomeIcon
icon={faCartShopping}
color={isFocused ? "#ffaa00" : "#9c9c9c"}
size={25}
style={{
paddingHorizontal: 33,
}}
/>
<Text style={{ color: isFocused ? "#ffaa00" : "#9c9c9c" }}>
Cart
</Text>
</TouchableOpacity>
);
},
}}
>
{(props) => <Cart {...props} refresh={refresh} cartList={cart} />}
</BottomTab.Screen>
<BottomTab.Screen
name="Profile"
// component={()=><Profile prodIsLoading={prodIsLoading} product={product} tab={switchTab} />}
options={{
headerShown: false,
tabBarButton: (props) => {
const isFocused = useIsFocused();
return (
<TouchableOpacity {...props} style={styles.botTab}>
<FontAwesomeIcon
icon={faUserCircle}
color={isFocused ? "#ffaa00" : "#9c9c9c"}
size={25}
style={{
paddingHorizontal: 33,
}}
/>
<Text style={{ color: isFocused ? "#ffaa00" : "#9c9c9c" }}>
Profile
</Text>
</TouchableOpacity>
);
},
}}
>
{(props) => <Profile userLoggedin={userLoggedin} {...props} />}
</BottomTab.Screen>
</BottomTab.Navigator>
</View>
);
};
const styles = StyleSheet.create({
container: {
backgroundColor: "#ffffff",
// height: height * 0.4,
width: "100%",
// justifyContent: "center",
// alignItems: "center",
flex: 1,
},
header: {
position: "fixed",
width: "100%",
top: 0,
},
footer: {
// position: "absolute",
bottom: 0,
width: "100%",
},
wrapper: {
height: "93%",
},
tabsCon: {
height: 80,
width: "100%",
position: "absolute",
justifyContent: "center",
alignItems: "center",
bottom: 15,
},
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",
},
botTab: {
justifyContent: "center",
alignItems: "center",
width: "25%",
},
});
export default Main;