diff --git a/packages/app/.eslintrc.json b/packages/app/.eslintrc.json
index c12c167c..888ce976 100644
--- a/packages/app/.eslintrc.json
+++ b/packages/app/.eslintrc.json
@@ -1,17 +1,23 @@
{
- "plugins": ["react", "react-native"],
+ "root": true,
+ "parser": "@typescript-eslint/parser",
+ "plugins": ["react", "react-native","@typescript-eslint"],
"env": {
"react-native/react-native": true
},
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2023,
- "ecmaFeatures": { "jsx": true }
+ "ecmaFeatures": { "jsx": true },
+ "project": ["./tsconfig.json"],
+ "tsconfigRootDir": "packages/app/"
},
+ "ignorePatterns": ["babel.config.js", "metro.config.js"],
"extends": [
"prettier",
"eslint:recommended",
"plugin:react-native/all",
- "plugin:react/recommended"
+ "plugin:react/recommended",
+ "plugin:@typescript-eslint/recommended"
]
}
diff --git a/packages/app/Root.js b/packages/app/Root.tsx
similarity index 88%
rename from packages/app/Root.js
rename to packages/app/Root.tsx
index 6c264c87..a6b1a68a 100644
--- a/packages/app/Root.js
+++ b/packages/app/Root.tsx
@@ -21,9 +21,7 @@ import Constants from "expo-constants";
const Tab = createBottomTabNavigator();
const Stack = createNativeStackNavigator();
-import {
- GoogleSignin,
-} from "@react-native-google-signin/google-signin";
+import { GoogleSignin } from "@react-native-google-signin/google-signin";
function TabNavigation() {
return (
@@ -39,7 +37,8 @@ function App() {
const { user, setUser } = useUserContext();
const currentSession = async () => {
- let accessToken = await SecureStore.getValueFor("accessToken");
+ const accessToken = await SecureStore.getValueFor("accessToken");
+ let refreshToken = await SecureStore.getValueFor("refreshToken");
if (!accessToken) {
return;
@@ -68,7 +67,7 @@ function App() {
}
// If access token is invalid/expired, try to get a new one with the refresh token
- const refreshToken = await SecureStore.getValueFor("refreshToken");
+ refreshToken = await SecureStore.getValueFor("refreshToken");
try {
const { data: response } = await axios.post(`${ENDPOINT}/auth/token`, {
refreshToken: refreshToken,
@@ -97,10 +96,10 @@ function App() {
useEffect(() => {
GoogleSignin.configure({
- webClientId: Constants.expoConfig.extra.webClientId,
- iosClientId: Constants.expoConfig.extra.iosClientId,
+ webClientId: Constants?.expoConfig?.extra?.webClientId,
+ iosClientId: Constants?.expoConfig?.extra?.iosClientId,
});
-
+
currentSession();
}, []);
diff --git a/packages/app/__tests__/FeedDrawer.test.js b/packages/app/__tests__/FeedDrawer.test.tsx
similarity index 97%
rename from packages/app/__tests__/FeedDrawer.test.js
rename to packages/app/__tests__/FeedDrawer.test.tsx
index 104dd936..08bd3f50 100644
--- a/packages/app/__tests__/FeedDrawer.test.js
+++ b/packages/app/__tests__/FeedDrawer.test.tsx
@@ -2,7 +2,6 @@ import React from "react";
import FeedDrawer from "../screens/feed/FeedDrawer";
import { render } from "@testing-library/react-native";
import { NavigationContainer } from "@react-navigation/native";
-import jest, { test, expect } from "jest";
// This section is used to mock the user data information within the FeedScreen.
// Without this, Jest does not recognize the user data and throws an error.
diff --git a/packages/app/__tests__/GroupScreen.test.js b/packages/app/__tests__/GroupScreen.test.tsx
similarity index 82%
rename from packages/app/__tests__/GroupScreen.test.js
rename to packages/app/__tests__/GroupScreen.test.tsx
index 07026779..382ee31e 100644
--- a/packages/app/__tests__/GroupScreen.test.js
+++ b/packages/app/__tests__/GroupScreen.test.tsx
@@ -2,7 +2,7 @@ import React from "react";
import { render } from "@testing-library/react-native";
import GroupScreen from "@app/screens/group/GroupScreen";
import GroupHeader from "@app/components/GroupScreen/GroupHeader";
-import jest, { describe, it, expect } from "jest";
+import { GroupHeaderProps } from "@app/types/Group";
jest.mock("@expo/vector-icons/Ionicons", () => ({
Ionicons: () => null,
@@ -12,6 +12,8 @@ jest.mock("@expo/vector-icons/FontAwesome5", () => ({
FontAwesome5: () => null,
}));
+let props: GroupHeaderProps;
+
describe("GroupScreen Tests", () => {
describe(GroupScreen, () => {
it("renders the GroupHeader component", () => {
@@ -35,25 +37,25 @@ describe("GroupScreen Tests", () => {
describe(GroupHeader, () => {
it("renders group icon", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const groupIcon = getByTestId("groupIcon");
expect(groupIcon).toBeTruthy();
});
it("renders club banner", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const clubBanner = getByTestId("clubBanner");
expect(clubBanner).toBeTruthy();
});
it("renders group header info", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const groupHeaderInfo = getByTestId("groupHeaderInfo");
expect(groupHeaderInfo).toBeTruthy();
});
it("renders group media icons", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const groupMediaIcon = getByTestId("groupMediaIcon");
expect(groupMediaIcon).toBeTruthy();
});
diff --git a/packages/app/__tests__/Login.test.js b/packages/app/__tests__/Login.test.tsx
similarity index 79%
rename from packages/app/__tests__/Login.test.js
rename to packages/app/__tests__/Login.test.tsx
index 965b0870..9918d438 100644
--- a/packages/app/__tests__/Login.test.js
+++ b/packages/app/__tests__/Login.test.tsx
@@ -1,7 +1,7 @@
import React from "react";
import { render, fireEvent } from "@testing-library/react-native";
import LandingScreen from "@app/screens/landing/LandingScreen";
-import jest, { describe, it, expect } from "jest";
+import { LandingScreenNavigationProps } from "@app/types/Landing";
// Need these to avoid "Cannot use import statement outside a module" error
jest.mock("expo-web-browser", () => ({
@@ -14,16 +14,23 @@ jest.mock("expo-constants", () => ({
Constants: () => null,
}));
+let props: LandingScreenNavigationProps;
+const mockedNavigate = jest.fn();
+
+jest.mock("@react-navigation/native", () => ({
+ useNavigation: () => ({ navigate: mockedNavigate }),
+}));
+
describe(LandingScreen, () => {
it("renders logo text", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const logo = getByTestId("logo");
expect(logo).toBeTruthy();
});
describe("Email/Password Text Inputs", () => {
it("renders correctly", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const emailInput = getByTestId("emailInput.textInput");
const passwordInput = getByTestId("passwordInput.textInput");
expect(emailInput).toBeTruthy();
@@ -31,7 +38,7 @@ describe(LandingScreen, () => {
});
it("displays the placeholder text", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const emailInput = getByTestId("emailInput.textInput");
const passwordInput = getByTestId("passwordInput.textInput");
@@ -41,7 +48,7 @@ describe(LandingScreen, () => {
});
it("accepts inputs", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const emailInput = getByTestId("emailInput.textInput");
const passwordInput = getByTestId("passwordInput.textInput");
@@ -54,7 +61,9 @@ describe(LandingScreen, () => {
});
it("doesn't accept an invalid email/password", () => {
- const { queryByTestId, getByTestId } = render();
+ const { queryByTestId, getByTestId } = render(
+
+ );
const loginButton = getByTestId("loginButton");
const emailInput = getByTestId("emailInput.textInput");
const passwordInput = getByTestId("passwordInput.textInput");
@@ -69,7 +78,7 @@ describe(LandingScreen, () => {
});
it("visibility icon toggles password visibility", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const hidePasswordButton = getByTestId("passwordInput.visibility");
const passwordInput = getByTestId("passwordInput.textInput");
@@ -81,25 +90,22 @@ describe(LandingScreen, () => {
describe("Buttons", () => {
it("login button renders correctly", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const loginButton = getByTestId("loginButton");
expect(loginButton).toBeTruthy();
fireEvent.press(loginButton);
});
it("google button renders correctly", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const googleButton = getByTestId("googleButton");
expect(googleButton).toBeTruthy();
fireEvent.press(googleButton);
});
it("signup button renders correctly", () => {
- const mockNavigation = {
- navigate: jest.fn(),
- };
const { getByTestId } = render(
-
+
);
const signupButton = getByTestId("signupButton");
expect(signupButton).toBeTruthy();
@@ -107,7 +113,7 @@ describe(LandingScreen, () => {
});
it("forgot password button renders correctly", () => {
- const { getByTestId } = render();
+ const { getByTestId } = render();
const forgotPassButton = getByTestId("forgotPassButton");
expect(forgotPassButton).toBeTruthy();
fireEvent.press(forgotPassButton);
diff --git a/packages/app/__tests__/todo.test.js b/packages/app/__tests__/todo.test.tsx
similarity index 57%
rename from packages/app/__tests__/todo.test.js
rename to packages/app/__tests__/todo.test.tsx
index 4cb2b25a..028592b3 100644
--- a/packages/app/__tests__/todo.test.js
+++ b/packages/app/__tests__/todo.test.tsx
@@ -1,5 +1,3 @@
-import { test, expect } from "jest";
-
test("test", () => {
expect(true).toBe(true);
});
diff --git a/packages/app/app.config.js b/packages/app/app.config.ts
similarity index 96%
rename from packages/app/app.config.js
rename to packages/app/app.config.ts
index 3524a07e..668ab984 100644
--- a/packages/app/app.config.js
+++ b/packages/app/app.config.ts
@@ -1,4 +1,5 @@
-require("dotenv").config();
+import dotenv from 'dotenv';
+dotenv.config();
module.exports = {
name: "Icebreak",
diff --git a/packages/app/assets/eye-line-off.js b/packages/app/assets/eye-line-off.tsx
similarity index 96%
rename from packages/app/assets/eye-line-off.js
rename to packages/app/assets/eye-line-off.tsx
index e25fa10a..cb57e767 100644
--- a/packages/app/assets/eye-line-off.js
+++ b/packages/app/assets/eye-line-off.tsx
@@ -1,7 +1,7 @@
import * as React from "react";
import Svg, { Path } from "react-native-svg";
-const EyeOff = (props) => (
+const EyeOff = (props: any) => (