diff --git a/App.tsx b/App.tsx
index 715051f..25bc1c6 100644
--- a/App.tsx
+++ b/App.tsx
@@ -1,4 +1,5 @@
import "react-native-gesture-handler";
+import styles from "./src/styles";
import { NavigationContainer } from "@react-navigation/native";
import { createDrawerNavigator } from "@react-navigation/drawer";
import { Provider } from "react-redux";
@@ -22,6 +23,11 @@ import { StatusBar } from "expo-status-bar";
import UserInfoPage from "./src/routes/UserInfoPage/UserInfoPage";
import SubjectsPage from "./src/routes/SubjectsPage/SubjectsPage";
import ConversationPage from "./src/routes/ConversationPage/ConversationPage";
+import Loading from "./src/routes/Loading/Loading";
+import StartStudying from "./src/routes/StartStudying/StartStudying";
+import { ToastProvider } from "react-native-toast-notifications";
+import InfoIcon from "./src/icons/InfoIcon/InfoIcon";
+import CreateGroup from "./src/routes/CreateGroup/CreateGroup";
const Drawer = createDrawerNavigator();
@@ -29,7 +35,7 @@ const linking = {
prefixes: [Linking.makeUrl("/")],
config: {
screens: {
- Home: "home",
+ Home: "",
Login: "login",
Register: "register",
Onboarding: "onboarding",
@@ -56,28 +62,36 @@ export default function App() {
}
}, [initialRoute]);
return (
-
-
-
+ }
+ textStyle={{ ...styles.text_white_tiny_bold }}
+ >
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ }>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/app.json b/app.json
index 893a6ba..2456397 100644
--- a/app.json
+++ b/app.json
@@ -42,9 +42,15 @@
[
"expo-location",
{
- "locationAlwaysAndWhenInUsePermission": "Allow Stud-E to use your location."
+ "locationAlwaysAndWhenInUsePermission": "Allow StudE to use your location."
}
- ]
+ ],
+ [
+ "expo-image-picker",
+ {
+ "photosPermission": "Allow StudE to take and send photos for sharing in-app"
+ }
+ ]
],
"extra": {
"eas": {
diff --git a/package-lock.json b/package-lock.json
index 2c02127..e918be3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,8 @@
"@tanstack/react-query": "^4.29.25",
"axios": "^1.4.0",
"expo": "~48.0.18",
+ "expo-file-system": "~15.2.2",
+ "expo-image-picker": "~14.1.1",
"expo-intent-launcher": "~10.5.2",
"expo-linking": "~4.0.1",
"expo-location": "~15.1.1",
@@ -34,6 +36,7 @@
"react-native-screens": "~3.20.0",
"react-native-select-dropdown": "^3.3.4",
"react-native-svg": "13.4.0",
+ "react-native-toast-notifications": "^3.3.1",
"react-query": "^3.39.3",
"react-redux": "^8.1.1",
"redux": "^4.2.1"
@@ -41,6 +44,7 @@
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/react": "~18.0.14",
+ "@types/react-native-fetch-blob": "^0.10.7",
"typescript": "^4.9.4"
}
},
@@ -5311,6 +5315,12 @@
"csstype": "^3.0.2"
}
},
+ "node_modules/@types/react-native-fetch-blob": {
+ "version": "0.10.7",
+ "resolved": "https://registry.npmjs.org/@types/react-native-fetch-blob/-/react-native-fetch-blob-0.10.7.tgz",
+ "integrity": "sha512-9UTvmUvArimShiENeR3xnRO71NcZjpTi7AcFAIbhdTIfqQOO2OK/I/DpUPXcZF/erffLxOoRkoXrZOxyBBWKRQ==",
+ "dev": true
+ },
"node_modules/@types/scheduler": {
"version": "0.16.3",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
@@ -7458,6 +7468,25 @@
"expo": "*"
}
},
+ "node_modules/expo-image-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-4.1.1.tgz",
+ "integrity": "sha512-ciEHVokU0f6w0eTxdRxLCio6tskMsjxWIoV92+/ZD37qePUJYMfEphPhu1sruyvMBNR8/j5iyOvPFVGTfO8oxA==",
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/expo-image-picker": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-14.1.1.tgz",
+ "integrity": "sha512-SvWtnkLW7jp5Ntvk3lVcRQmhFYja8psmiR7O6P/+7S6f4llt3vaFwb4I3+pUXqJxxpi7BHc2+95qOLf0SFOIag==",
+ "dependencies": {
+ "expo-image-loader": "~4.1.0"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
"node_modules/expo-intent-launcher": {
"version": "10.5.2",
"resolved": "https://registry.npmjs.org/expo-intent-launcher/-/expo-intent-launcher-10.5.2.tgz",
@@ -12425,6 +12454,15 @@
"react-native": "*"
}
},
+ "node_modules/react-native-toast-notifications": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/react-native-toast-notifications/-/react-native-toast-notifications-3.3.1.tgz",
+ "integrity": "sha512-yc1Q2nOdIYvAf0GAIlmg8q42hiwpEHnLxkxJ6P+tN6jpcKZ1qzMXlgnmNdyF9cm9VOyHQexEP8952IKNAv1Olw==",
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native/node_modules/promise": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
diff --git a/package.json b/package.json
index 5d4609b..df97e93 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,8 @@
"@tanstack/react-query": "^4.29.25",
"axios": "^1.4.0",
"expo": "~48.0.18",
+ "expo-file-system": "~15.2.2",
+ "expo-image-picker": "~14.1.1",
"expo-intent-launcher": "~10.5.2",
"expo-linking": "~4.0.1",
"expo-location": "~15.1.1",
@@ -35,6 +37,7 @@
"react-native-screens": "~3.20.0",
"react-native-select-dropdown": "^3.3.4",
"react-native-svg": "13.4.0",
+ "react-native-toast-notifications": "^3.3.1",
"react-query": "^3.39.3",
"react-redux": "^8.1.1",
"redux": "^4.2.1"
@@ -42,6 +45,7 @@
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/react": "~18.0.14",
+ "@types/react-native-fetch-blob": "^0.10.7",
"typescript": "^4.9.4"
},
"private": true
diff --git a/src/components/Api/Api.tsx b/src/components/Api/Api.tsx
index 20a3151..0eaad7d 100644
--- a/src/components/Api/Api.tsx
+++ b/src/components/Api/Api.tsx
@@ -1,21 +1,28 @@
import axios from "axios";
import AsyncStorage from "@react-native-async-storage/async-storage";
import {
- ActivationParams,
- LoginParams,
- OnboardingParams,
- PatchStudentData,
- RegistrationParams,
- StudentData,
+ ActivationType,
+ LocationType,
+ LoginType,
+ OnboardingType,
+ PatchUserInfoType,
+ RegistrationType,
+ StudentStatusPatchType,
+ StudentStatusType,
+ StudyGroupCreateType,
+ StudyGroupType,
} from "../../interfaces/Interfaces";
-export let backendURL = "";
-export let backendURLWebsocket = "";
-let use_production = true;
-if (__DEV__ || !use_production) {
- backendURL = "http://10.0.10.8:8000";
- backendURLWebsocket = "ws://10.0.10.8:8000";
-} else {
+export let backendURL = "https://stude.keannu1.duckdns.org";
+export let backendURLWebsocket = "ws://stude.keannu1.duckdns.org";
+if (__DEV__) {
+ backendURL = "http://10.0.10.8:8083";
+ backendURLWebsocket = "ws://10.0.10.8:8083";
+}
+
+// Switch this on if you wanna run production URLs while in development
+let use_production = false;
+if (__DEV__ && use_production) {
backendURL = "https://stude.keannu1.duckdns.org";
backendURLWebsocket = "ws://stude.keannu1.duckdns.org";
}
@@ -25,8 +32,29 @@ const instance = axios.create({
timeout: 1000,
});
+console.log("Using backend API:", backendURL);
+
+// 3rd Party APIs
+export const urlProvider =
+ "https://openstreetmap.keannu1.duckdns.org/tile/{z}/{x}/{y}.png?";
// App APIs
+// Error Handling
+export function ParseError(error: any) {
+ if (error.response && error.response.data) {
+ return JSON.stringify(error.response.data)
+ .replaceAll(/[{}()"]/g, " ")
+ .replaceAll(/,/g, "\n")
+ .replaceAll("[", "")
+ .replaceAll("]", "")
+ .replaceAll(".", "")
+ .replaceAll(/"/g, "")
+ .replaceAll("non_field_errors", "")
+ .trim();
+ }
+ return "Unable to reach server";
+}
+
// Token Handling
export async function getAccessToken() {
const accessToken = await AsyncStorage.getItem("access_token");
@@ -59,40 +87,28 @@ export async function GetConfig() {
}
// User APIs
-export function UserRegister(register: RegistrationParams) {
- console.log(JSON.stringify(register));
+export function UserRegister(register: RegistrationType) {
return instance
.post("/api/v1/accounts/users/", register)
.then(async (response) => {
return [true, response.status];
})
.catch((error) => {
- let error_message = "";
- if (error.response) error_message = error.response.data;
- else error_message = "Unable to reach servers";
+ let error_message = ParseError(error);
return [false, error_message];
});
}
-export function UserLogin(user: LoginParams) {
+export function UserLogin(user: LoginType) {
return instance
.post("/api/v1/accounts/jwt/create/", user)
.then(async (response) => {
- /*console.log(
- "Access Token:",
- response.data.access,
- "\nRefresh Token:",
- response.data.refresh
- );*/
setAccessToken(response.data.access);
setRefreshToken(response.data.refresh);
return [true];
})
.catch((error) => {
- let error_message = "";
- if (error.response) error_message = error.response.data;
- else error_message = "Unable to reach servers";
- // console.log(error_message);
+ let error_message = ParseError(error);
return [false, error_message];
});
}
@@ -106,21 +122,14 @@ export async function TokenRefresh() {
})
.then(async (response) => {
setAccessToken(response.data.access);
- /*console.log(
- "Token refresh success! New Access Token",
- response.data.access
- );*/
return true;
})
.catch((error) => {
- 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);
+ let error_message = ParseError(error);
return false;
});
}
-export async function UserInfo() {
+export async function GetUserInfo() {
const config = await GetConfig();
return instance
.get("/api/v1/accounts/users/me/", config)
@@ -129,37 +138,31 @@ export async function UserInfo() {
return [true, response.data];
})
.catch((error) => {
- let error_message = "";
- if (error.response) error_message = error.response.data;
- else error_message = "Unable to reach servers";
+ let error_message = ParseError(error);
return [false, error_message];
});
}
-export async function PatchUserInfo(info: PatchStudentData) {
+export async function PatchUserInfo(info: PatchUserInfoType) {
const config = await GetConfig();
return instance
.patch("/api/v1/accounts/users/me/", info, config)
.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_message);
+ let error_message = ParseError(error);
return [false, error_message];
});
}
-export function UserActivate(activation: ActivationParams) {
+export function UserActivate(activation: ActivationType) {
return instance
.post("/api/v1/accounts/users/activation/", activation)
- .then(async (response) => {
+ .then(() => {
return true;
})
- .catch((error) => {
+ .catch(() => {
return false;
});
}
@@ -179,9 +182,7 @@ export async function GetCourses() {
return [true, response.data];
})
.catch((error) => {
- let error_message = "";
- if (error.response) error_message = error.response.data;
- else error_message = "Unable to reach servers";
+ let error_message = ParseError(error);
return [false, error_message];
});
}
@@ -199,9 +200,7 @@ export async function GetSemesters() {
return [true, response.data];
})
.catch((error) => {
- let error_message = "";
- if (error.response) error_message = error.response.data;
- else error_message = "Unable to reach servers";
+ let error_message = ParseError(error);
return [false, error_message];
});
}
@@ -215,69 +214,135 @@ export async function GetYearLevels() {
return [true, response.data];
})
.catch((error) => {
- let error_message = "";
- if (error.response) error_message = error.response.data;
- else error_message = "Unable to reach servers";
+ let error_message = ParseError(error);
return [false, error_message];
});
}
-export async function GetSubjects(
- byCourseOnly: boolean,
- course: string,
- year_level?: string,
- semester?: string
-) {
- const config = await GetConfig();
- console.log("by course only?", byCourseOnly);
- // If year level and semester specified,
- if (!byCourseOnly && year_level && semester) {
- return instance
- .get(
- "/api/v1/subjects/" + course + "/" + year_level + "/" + semester,
- config
- )
- .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";
- return [false, error_message];
- });
- }
- // If only course is specified
- else {
- return instance
- .get("/api/v1/subjects/" + course, config)
- .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";
- return [false, error_message];
- });
- }
-}
-
-export async function OnboardingUpdateStudentInfo(info: OnboardingParams) {
+export async function GetSubjects() {
const config = await GetConfig();
return instance
- .patch("/api/v1/accounts/users/me/", info, config)
+ .get("/api/v1/subjects/", config)
.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);
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function GetStudentStatus() {
+ const config = await GetConfig();
+ return instance
+ .get("/api/v1/student_status/self/", config)
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function PatchStudentStatus(info: StudentStatusPatchType) {
+ const config = await GetConfig();
+ return instance
+ .patch("/api/v1/student_status/self/", info, config)
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function GetStudentStatusList() {
+ const config = await GetConfig();
+ return instance
+ .get("/api/v1/student_status/list/", config)
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function GetStudentStatusListNear() {
+ const config = await GetConfig();
+ return instance
+ .get("/api/v1/student_status/near/", config)
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+// To-do
+export async function GetStudentStatusListFilteredCurrentLocation(
+ location: LocationType
+) {
+ const config = await GetConfig();
+ return instance
+ .post(
+ "/api/v1/student_status/near_current_location/",
+ {
+ location: location,
+ },
+ config
+ )
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function GetStudyGroupListFiltered() {
+ const config = await GetConfig();
+ return instance
+ .get("/api/v1/study_groups/near/", config)
+ .then((response) => {
+ console.log("DEBUGGG", response.data);
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function GetStudyGroupList() {
+ const config = await GetConfig();
+ return instance
+ .get("/api/v1/study_groups/", config)
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
+ return [false, error_message];
+ });
+}
+
+export async function CreateStudyGroup(info: StudyGroupCreateType) {
+ const config = await GetConfig();
+ // console.log("Creating study group:", info);
+ return instance
+ .post("/api/v1/study_groups/create/", info, config)
+ .then((response) => {
+ return [true, response.data];
+ })
+ .catch((error) => {
+ let error_message = ParseError(error);
return [false, error_message];
});
}
diff --git a/src/components/DrawerSettings/CustomDrawerContent.tsx b/src/components/DrawerSettings/CustomDrawerContent.tsx
index 0c46297..cfd622a 100644
--- a/src/components/DrawerSettings/CustomDrawerContent.tsx
+++ b/src/components/DrawerSettings/CustomDrawerContent.tsx
@@ -5,7 +5,10 @@ import { Text, View } from "react-native";
import { colors } from "../../styles";
import styles from "../../styles";
-import { RootDrawerParamList } from "../../interfaces/Interfaces";
+import {
+ RootDrawerParamList,
+ StudentStatusPatchType,
+} from "../../interfaces/Interfaces";
import AppIcon from "../../icons/AppIcon/AppIcon";
import HomeIcon from "../../icons/HomeIcon/HomeIcon";
import LoginIcon from "../../icons/LoginIcon/LoginIcon";
@@ -18,11 +21,48 @@ import { logout } from "../../features/redux/slices/StatusSlice/StatusSlice";
import AsyncStorage from "@react-native-async-storage/async-storage";
import UserIcon from "../../icons/UserIcon/UserIcon";
import SubjectIcon from "../../icons/SubjectIcon/SubjectIcon";
+import { useMutation, useQueryClient } from "@tanstack/react-query";
+import toast from "react-native-toast-notifications/lib/typescript/toast";
+import { PatchStudentStatus } from "../Api/Api";
+import { useToast } from "react-native-toast-notifications";
export default function CustomDrawerContent(props: {}) {
const navigation = useNavigation();
const status = useSelector((state: RootState) => state.status);
const dispatch = useDispatch();
+ const queryClient = useQueryClient();
+ const toast = useToast();
+ const debug_disable_clear_on_logout = true;
+ const stop_studying_logout = useMutation({
+ mutationFn: async (info: StudentStatusPatchType) => {
+ const data = await PatchStudentStatus(info);
+ if (data[0] != true) {
+ return Promise.reject(new Error());
+ }
+ console.log("DEBUG", data);
+ return data;
+ },
+ onSuccess: async () => {
+ toast.show("Logged out. Stopped studying", {
+ type: "warning",
+ placement: "top",
+ duration: 2000,
+ animationType: "slide-in",
+ });
+ queryClient.clear();
+ dispatch(logout());
+ await AsyncStorage.clear();
+ navigation.navigate("Login");
+ },
+ onError: (error: Error) => {
+ toast.show(String(error), {
+ type: "warning",
+ placement: "top",
+ duration: 2000,
+ animationType: "slide-in",
+ });
+ },
+ });
if (status.logged_in && status.onboarding) {
return (
@@ -38,9 +78,16 @@ export default function CustomDrawerContent(props: {}) {
{
- dispatch(logout());
- await AsyncStorage.clear();
- navigation.navigate("Login");
+ if (debug_disable_clear_on_logout) {
+ queryClient.clear();
+ dispatch(logout());
+ await AsyncStorage.clear();
+ navigation.navigate("Login");
+ } else {
+ stop_studying_logout.mutate({
+ active: false,
+ });
+ }
}}
>
@@ -86,9 +133,16 @@ export default function CustomDrawerContent(props: {}) {
{
- dispatch(logout());
- await AsyncStorage.clear();
- navigation.navigate("Login");
+ if (debug_disable_clear_on_logout) {
+ queryClient.clear();
+ dispatch(logout());
+ await AsyncStorage.clear();
+ navigation.navigate("Login");
+ } else {
+ stop_studying_logout.mutate({
+ active: false,
+ });
+ }
}}
>
diff --git a/src/components/GetDistance/GetDistanceFromUSTP.tsx b/src/components/GetDistance/GetDistanceFromUSTP.tsx
new file mode 100644
index 0000000..391df27
--- /dev/null
+++ b/src/components/GetDistance/GetDistanceFromUSTP.tsx
@@ -0,0 +1,20 @@
+import { LocationType } from "../../interfaces/Interfaces";
+import GetDistance from "./GetDistance";
+
+export default function GetDistanceFromUSTP(location: LocationType) {
+ const ustpCoords = {
+ latitude: 8.4857,
+ longitude: 124.6565,
+ latitudeDelta: 0.000235,
+ longitudeDelta: 0.000067,
+ };
+
+ let dist = GetDistance(
+ location.latitude,
+ location.longitude,
+ ustpCoords.latitude,
+ ustpCoords.longitude
+ );
+ dist = Math.round(dist);
+ return dist;
+}
diff --git a/src/components/MapRenderer/MapRendererFar.tsx b/src/components/MapRenderer/MapRendererFar.tsx
new file mode 100644
index 0000000..e65a145
--- /dev/null
+++ b/src/components/MapRenderer/MapRendererFar.tsx
@@ -0,0 +1,79 @@
+import * as React from "react";
+import { View, Text } from "react-native";
+import MapView, { UrlTile, Callout, Marker } from "react-native-maps";
+import styles, { Viewport, colors } from "../../styles";
+import { urlProvider } from "../Api/Api";
+import { LocationType, RawLocationType } from "../../interfaces/Interfaces";
+import GetDistance from "../../components/GetDistance/GetDistance";
+
+type props = {
+ location: LocationType;
+ dist: any;
+};
+
+export default function MapRendererFar(props: props) {
+ return (
+ <>
+
+ You are too far from USTP {"\n"}
+ Get closer to use Stud-E
+
+
+
+
+
+
+ You are here {"\n"}
+ X: {Math.round(props.location.longitude) + "\n"}
+ Z: {Math.round(props.location.latitude)}
+
+
+
+
+
+ {props.dist}km away from USTP {"\n"}
+
+ >
+ );
+}
diff --git a/src/components/ParseError/ParseError.tsx b/src/components/ParseError/ParseError.tsx
deleted file mode 100644
index ab55ea6..0000000
--- a/src/components/ParseError/ParseError.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-export default function ParseError(text: string) {
- if (text) {
- return text
- .replaceAll(/[{}()"]/g, " ")
- .replaceAll(/,/g, "\n")
- .replaceAll("[", "")
- .replaceAll("]", "")
- .replaceAll(".", "");
- }
- return "";
-}
-
-export function ParseLoginError(text: string) {
- if (text) {
- return text
- .replaceAll(/[{}()"]/g, " ")
- .replaceAll(/,/g, "\n")
- .replaceAll("[", "")
- .replaceAll("]", "")
- .replaceAll(".", "")
- .replaceAll("non_field_errors", "");
- }
- return "";
-}
diff --git a/src/icons/DropdownIcon/DropdownIcon.tsx b/src/icons/CaretDownIcon/CaretDownIcon.tsx
similarity index 91%
rename from src/icons/DropdownIcon/DropdownIcon.tsx
rename to src/icons/CaretDownIcon/CaretDownIcon.tsx
index 27851ab..6a34501 100644
--- a/src/icons/DropdownIcon/DropdownIcon.tsx
+++ b/src/icons/CaretDownIcon/CaretDownIcon.tsx
@@ -3,7 +3,7 @@ import { IconProps } from "../../interfaces/Interfaces";
import { Svg, Path } from "react-native-svg";
import { colors } from "../../styles";
-export default function DropdownIcon(props: IconProps) {
+export default function CaretDownIcon(props: IconProps) {
return (
<>