Merge branch 'master' into initial-frontend

This commit is contained in:
Keannu Christian Bernasol 2023-07-17 13:55:02 +08:00
commit 22d4aa4a29
21 changed files with 762 additions and 166 deletions

View file

@ -1,21 +1,35 @@
import * as React from "react";
import { View, Text } from "react-native";
import { View, Text, ScrollView } from "react-native";
import styles from "../../styles";
import { colors } from "../../styles";
import { MotiView } from "moti";
import { MotiView, MotiScrollView } from "moti";
export interface props {
children: React.ReactNode;
}
export default function AnimatedContainer(props: props) {
return (
<MotiView
style={styles.container}
from={{ opacity: 0, backgroundColor: colors.orange_1 }}
animate={{ opacity: 1, backgroundColor: colors.blue_2 }}
<MotiScrollView
contentContainerStyle={styles.container}
from={{
borderRadius: 0,
backgroundColor: colors.orange_2,
paddingTop: 4,
paddingBottom: 4,
marginHorizontal: "4%",
marginVertical: "5%",
}}
animate={{
borderRadius: 15,
backgroundColor: colors.blue_2,
paddingTop: 16,
paddingBottom: 16,
marginHorizontal: "4%",
marginVertical: "5%",
}}
transition={{ type: "timing", duration: 300 }}
>
{props.children}
</MotiView>
</MotiScrollView>
);
}

View file

@ -3,6 +3,7 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
import {
ActivationParams,
LoginParams,
OnboardingParams,
RegistrationParams,
} from "../../interfaces/Interfaces";
@ -51,7 +52,10 @@ export function UserRegister(register: RegistrationParams) {
return [true, response.status];
})
.catch((error) => {
return [false, error.response.status, error.response.data];
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
return [false, error_message];
});
}
@ -70,8 +74,10 @@ export function UserLogin(user: LoginParams) {
return [true];
})
.catch((error) => {
console.log("Login Failed:" + JSON.stringify(error.response.data));
return [false, error.response.data];
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
return [false, error_message];
});
}
@ -88,11 +94,14 @@ export async function TokenRefresh() {
"Token refresh success! New Access Token",
response.data.access
);*/
return [true];
return true;
})
.catch((error) => {
console.log("Refresh Failed: " + JSON.stringify(error.response.data));
return [false, error.response.data];
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
console.log("Token Refresh error:", error_message);
return false;
});
}
export async function UserInfo() {
@ -105,11 +114,13 @@ export async function UserInfo() {
})
.then((response) => {
// console.log(JSON.stringify(response.data));
return response.data;
return [true, response.data];
})
.catch((error) => {
console.log("User Info Error", error.response.data);
return [false, error.response.data];
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
return [false, error_message];
});
}
@ -125,3 +136,86 @@ export function UserActivate(activation: ActivationParams) {
}
// App APIs
export async function GetCourses() {
const accessToken = await getAccessToken();
return instance
.get("/api/v1/courses/", {
headers: {
Authorization: `Bearer ${accessToken}`,
},
})
.then((response) => {
// console.log(JSON.stringify(response.data));
return response.data;
})
.catch((error) => {
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
console.log("Error getting courses", error_message);
return false;
});
}
export async function GetSemesters() {
const accessToken = await getAccessToken();
return instance
.get("/api/v1/semesters/", {
headers: {
Authorization: `Bearer ${accessToken}`,
},
})
.then((response) => {
// console.log(JSON.stringify(response.data));
return response.data;
})
.catch((error) => {
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
console.log("Error getting semesters", error_message);
return false;
});
}
export async function GetYearLevels() {
const accessToken = await getAccessToken();
return instance
.get("/api/v1/year_levels/", {
headers: {
Authorization: `Bearer ${accessToken}`,
},
})
.then((response) => {
// console.log(JSON.stringify(response.data));
return response.data;
})
.catch((error) => {
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
console.log("Error getting year levels", error_message);
return false;
});
}
export async function OnboardingUpdateStudentInfo(info: OnboardingParams) {
const accessToken = await getAccessToken();
const headers = {
Authorization: `Bearer ${accessToken}`,
};
return instance
.patch("/api/v1/accounts/users/me/", info, { headers })
.then((response) => {
console.log(JSON.stringify(response.data));
return [true, response.data];
})
.catch((error) => {
let error_message = "";
if (error.response) error_message = error.response.data;
else error_message = "Unable to reach servers";
console.log("Error updating onboarding info", error_message);
return [false, error_message];
});
}

View file

@ -6,15 +6,24 @@ export interface props {
children: React.ReactNode;
onPress: (event: GestureResponderEvent) => void;
color: string;
disabled?: boolean;
}
export default function Button(props: props) {
export default function Button({ disabled = false, ...props }: props) {
const rgb = props.color.match(/\d+/g);
return (
<Pressable
disabled={disabled}
onPress={props.onPress}
style={{
...styles.button_template,
...{ backgroundColor: props.color, width: "50%" },
...{
backgroundColor: disabled
? rgb
? `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, 0.3)`
: "rgba(0, 0, 0, 0)"
: props.color,
},
}}
>
{props.children}

View file

@ -14,17 +14,41 @@ import DrawerButton from "../Button/DrawerButton";
import { useDispatch, useSelector } from "react-redux";
import { RootState } from "../../features/redux/Store/Store";
import LogoutIcon from "../../icons/LogoutIcon/LogoutIcon";
import { clear } from "../../features/redux/slices/AuthSlice/AuthSlice";
import { logout } from "../../features/redux/slices/StatusSlice/StatusSlice";
import AsyncStorage from "@react-native-async-storage/async-storage";
import UserIcon from "../../icons/UserIcon/UserIcon";
export default function CustomDrawerContent(props: {}) {
const navigation = useNavigation<RootDrawerParamList>();
const logged_in = useSelector(
(state: RootState) => state.auth.creds.logged_in
);
const status = useSelector((state: RootState) => state.status);
const dispatch = useDispatch();
if (logged_in) {
if (status.logged_in && status.onboarding) {
return (
<DrawerContentScrollView {...props}>
<View
style={{
...styles.flex_row,
...{ justifyContent: "center" },
}}
>
<AppIcon size={32} />
<Text style={styles.text_white_medium}>Stud-E</Text>
</View>
<DrawerButton
color={colors.blue_2}
onPress={async () => {
dispatch(logout());
await AsyncStorage.clear();
navigation.navigate("Login");
}}
>
<LogoutIcon size={32} />
<Text style={styles.text_white_medium}>Logout</Text>
</DrawerButton>
</DrawerContentScrollView>
);
} else if (status.logged_in) {
return (
<DrawerContentScrollView {...props}>
<View
@ -57,7 +81,7 @@ export default function CustomDrawerContent(props: {}) {
<DrawerButton
color={colors.blue_2}
onPress={async () => {
dispatch(await clear());
dispatch(logout());
await AsyncStorage.clear();
navigation.navigate("Login");
}}
@ -79,15 +103,6 @@ export default function CustomDrawerContent(props: {}) {
<AppIcon size={32} />
<Text style={styles.text_white_medium}>Stud-E</Text>
</View>
<DrawerButton
color={colors.blue_2}
onPress={() => {
navigation.navigate("Home");
}}
>
<HomeIcon size={32} />
<Text style={styles.text_white_medium}>Home</Text>
</DrawerButton>
<DrawerButton
color={colors.blue_2}
onPress={() => {
@ -100,7 +115,6 @@ export default function CustomDrawerContent(props: {}) {
<DrawerButton
color={colors.blue_2}
onPress={() => {
dispatch(clear());
navigation.navigate("Register");
}}
>

View file

@ -0,0 +1,23 @@
export default function GetDistance(
lat1: number,
lon1: number,
lat2: number,
lon2: number
) {
var R = 6371; // km
var dLat = toRad(lat2 - lat1);
var dLon = toRad(lon2 - lon1);
var lat1 = toRad(lat1);
var lat2 = toRad(lat2);
var a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var distance = R * c;
return distance;
}
export function toRad(value: number) {
return (value * Math.PI) / 180;
}

View file

@ -0,0 +1,3 @@
export default function isStringEmpty(str: string) {
return str === "" || str === null || str === undefined;
}