Skip to content

Commit d387c67

Browse files
committed
build better
1 parent 1c369f2 commit d387c67

File tree

22 files changed

+363
-244
lines changed

22 files changed

+363
-244
lines changed

clientv2/.eslintignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*.js
2+
*.cjs
3+
*.mjs
4+
*.d.ts
5+
*.d.mts
6+
vite.config.ts

clientv2/.eslintrc.cjs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
extends: ['mantine'],
3+
parserOptions: {
4+
project: './tsconfig.json',
5+
},
6+
rules: {
7+
'react/react-in-jsx-scope': 'off',
8+
'import/extensions': 'off',
9+
},
10+
};

clientv2/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
"build": "tsc && vite build",
88
"preview": "vite preview",
99
"typecheck": "tsc --noEmit",
10-
"lint": "npm run lint:eslint && npm run lint:stylelint",
11-
"lint:eslint": "eslint . --ext .ts,.tsx --cache",
12-
"lint:stylelint": "stylelint '**/*.css' --cache",
10+
"lint": "eslint . --ext .ts,.tsx --cache",
1311
"prettier": "prettier --check \"**/*.{ts,tsx}\"",
1412
"prettier:write": "prettier --write \"**/*.{ts,tsx}\"",
1513
"vitest": "vitest run",
@@ -25,11 +23,13 @@
2523
"@mantine/form": "^7.11.1",
2624
"@mantine/hooks": "7.11.1",
2725
"@tabler/icons-react": "^3.10.0",
26+
"dotenv": "^16.4.5",
2827
"react": "^18.3.1",
2928
"react-dom": "^18.3.1",
3029
"react-router-dom": "^6.23.1"
3130
},
3231
"devDependencies": {
32+
"@eslint/compat": "^1.1.1",
3333
"@storybook/addon-essentials": "^8.1.10",
3434
"@storybook/addon-interactions": "^8.1.10",
3535
"@storybook/addon-links": "^8.1.10",
@@ -66,6 +66,7 @@
6666
"stylelint": "^16.6.1",
6767
"stylelint-config-standard-scss": "^13.1.0",
6868
"typescript": "^5.5.2",
69+
"typescript-eslint": "^7.16.0",
6970
"vite": "^5.3.1",
7071
"vite-tsconfig-paths": "^4.3.2",
7172
"vitest": "^1.6.0"

clientv2/src/App.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import "@mantine/core/styles.css";
2-
import { MantineProvider } from "@mantine/core";
3-
import { Router } from "./Router";
4-
import { theme } from "./theme";
1+
import '@mantine/core/styles.css';
2+
import { MantineProvider } from '@mantine/core';
3+
import { Router } from './Router';
4+
import { theme } from './theme';
55

66
export default function App() {
77
return (

clientv2/src/Router.tsx

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,53 @@
1-
import { createBrowserRouter, Navigate, RouterProvider } from "react-router-dom";
2-
import { HomePage } from "./pages/Home.page";
3-
import { AuthRoleEnum, useAuth } from "./components/AuthContext";
4-
import { LoginPage } from "./pages/Login.page";
5-
import { StudentHomePage } from "./pages/student/StudentHome.page";
1+
import {
2+
createBrowserRouter,
3+
Navigate,
4+
RouterProvider,
5+
} from 'react-router-dom';
6+
import { HomePage } from './pages/Home.page';
7+
import { AuthRoleEnum, useAuth } from './components/AuthContext';
8+
import { LoginPage } from './pages/Login.page';
9+
import { StudentHomePage } from './pages/student/StudentHome.page';
610

711
const unauthenticatedRouter = createBrowserRouter([
812
{
9-
path: "/",
13+
path: '/',
1014
element: <Navigate to="/login" replace />,
1115
},
1216
{
13-
path: "/login",
17+
path: '/login',
1418
element: <LoginPage />,
15-
}
19+
},
1620
]);
1721

1822
const recruiterRouter = createBrowserRouter([
1923
{
20-
path: "/",
24+
path: '/',
2125
element: <HomePage />,
2226
},
2327
{
24-
path: "/login",
28+
path: '/login',
2529
element: <Navigate to="/" replace />,
26-
}
30+
},
2731
]);
2832

2933
const studentRouter = createBrowserRouter([
3034
{
31-
path: "/",
35+
path: '/',
3236
element: <StudentHomePage />,
3337
},
3438
{
35-
path: "/login",
39+
path: '/login',
3640
element: <Navigate to="/" replace />,
37-
}
41+
},
3842
]);
3943

4044
export function Router() {
4145
const { isLoggedIn, userData } = useAuth();
4246
if (!isLoggedIn || !userData) {
43-
console.log("Returning unauthenticated router");
4447
return <RouterProvider router={unauthenticatedRouter} />;
45-
} else if (isLoggedIn && userData.role === AuthRoleEnum.RECRUITER) {
46-
console.log("Returning recruiter router");
48+
} if (isLoggedIn && userData.role === AuthRoleEnum.RECRUITER) {
4749
return <RouterProvider router={recruiterRouter} />;
48-
} else if (isLoggedIn && userData.role === AuthRoleEnum.STUDENT) {
49-
console.log("Returning student router");
50+
} if (isLoggedIn && userData.role === AuthRoleEnum.STUDENT) {
5051
return <RouterProvider router={studentRouter} />;
5152
}
5253
}

clientv2/src/components/AuthContext/index.tsx

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
import React, { createContext, ReactNode, useContext, useState, useEffect } from "react";
2-
import { MsalProvider, useMsal } from "@azure/msal-react";
3-
import { AuthenticationResult, InteractionStatus } from "@azure/msal-browser";
1+
import React, {
2+
createContext,
3+
ReactNode,
4+
useContext,
5+
useState,
6+
useEffect,
7+
} from 'react';
8+
import { useMsal } from '@azure/msal-react';
9+
import { AuthenticationResult, InteractionStatus } from '@azure/msal-browser';
410

511
export enum AuthSourceEnum {
612
MSAL,
@@ -15,11 +21,11 @@ export enum AuthRoleEnum {
1521
export function roleToString(e?: AuthRoleEnum) {
1622
switch (e) {
1723
case AuthRoleEnum.RECRUITER:
18-
return "Recruiter"
24+
return 'Recruiter';
1925
case AuthRoleEnum.STUDENT:
20-
return "Student"
26+
return 'Student';
2127
default:
22-
return "Unknown"
28+
return 'Unknown';
2329
}
2430
}
2531

@@ -55,22 +61,18 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
5561

5662
useEffect(() => {
5763
const handleRedirect = async () => {
58-
try {
59-
const response = await instance.handleRedirectPromise();
60-
if (response) {
61-
handleMsalResponse(response);
62-
} else if (accounts.length > 0) {
63-
// User is already logged in, set the state
64-
setUserData({
65-
email: accounts[0].username,
66-
name: accounts[0].name,
67-
authenticationMethod: AuthSourceEnum.MSAL,
68-
role: AuthRoleEnum.STUDENT,
69-
});
70-
setIsLoggedIn(true);
71-
}
72-
} catch (error) {
73-
console.error(error);
64+
const response = await instance.handleRedirectPromise();
65+
if (response) {
66+
handleMsalResponse(response);
67+
} else if (accounts.length > 0) {
68+
// User is already logged in, set the state
69+
setUserData({
70+
email: accounts[0].username,
71+
name: accounts[0].name,
72+
authenticationMethod: AuthSourceEnum.MSAL,
73+
role: AuthRoleEnum.STUDENT,
74+
});
75+
setIsLoggedIn(true);
7476
}
7577
};
7678

@@ -81,7 +83,7 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
8183

8284
const handleMsalResponse = (response: AuthenticationResult) => {
8385
if (response) {
84-
const account = response.account;
86+
const { account } = response;
8587
if (account) {
8688
setUserData({
8789
email: account.username,
@@ -122,4 +124,4 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
122124
{children}
123125
</AuthContext.Provider>
124126
);
125-
};
127+
};
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import React, { createContext, ReactNode, useContext, useState } from "react";
2-
import { useAuth } from "../AuthContext";
1+
import React, { ReactNode } from 'react';
2+
import { AuthRoleEnum, useAuth } from '../AuthContext';
33

44
interface AuthGuardProps {
5-
role?: string;
5+
role?: AuthRoleEnum;
66
children: ReactNode;
77
}
88

@@ -12,10 +12,9 @@ export const AuthGuard: React.FC<AuthGuardProps> = ({ role, children }) => {
1212
return null;
1313
}
1414
if (isLoggedIn && userData) {
15-
if (role && userData.role === role) {
15+
if ((role && userData.role === role) || !role) {
1616
return children;
17-
} else {
18-
return null;
1917
}
2018
}
19+
return null;
2120
};
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { Button, Group, useMantineColorScheme } from "@mantine/core";
1+
import { Button, Group, useMantineColorScheme } from '@mantine/core';
22

33
export function ColorSchemeToggle() {
44
const { setColorScheme } = useMantineColorScheme();
55

66
return (
77
<Group justify="center" mt="xl">
8-
<Button onClick={() => setColorScheme("light")}>Light</Button>
9-
<Button onClick={() => setColorScheme("dark")}>Dark</Button>
10-
<Button onClick={() => setColorScheme("auto")}>Auto</Button>
8+
<Button onClick={() => setColorScheme('light')}>Light</Button>
9+
<Button onClick={() => setColorScheme('dark')}>Dark</Button>
10+
<Button onClick={() => setColorScheme('auto')}>Auto</Button>
1111
</Group>
1212
);
1313
}
Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
import { Button, ButtonProps } from '@mantine/core';
2-
import { useAuth } from '../AuthContext';
32
import { useMsal } from '@azure/msal-react';
43
import { InteractionStatus } from '@azure/msal-browser';
4+
import { useAuth } from '../AuthContext';
55

6-
export function AcmLoginButton(props: ButtonProps & React.ComponentPropsWithoutRef<'button'>) {
7-
const {loginMsal} = useAuth();
8-
const {inProgress} = useMsal();
9-
return <Button disabled={inProgress === InteractionStatus.Login} leftSection={null} variant="default" {...props} onClick={() => {loginMsal();}}/>;
10-
}
6+
export function AcmLoginButton(
7+
props: ButtonProps & React.ComponentPropsWithoutRef<'button'>,
8+
) {
9+
const { loginMsal } = useAuth();
10+
const { inProgress } = useMsal();
11+
return (
12+
<Button
13+
disabled={inProgress === InteractionStatus.Login}
14+
leftSection={null}
15+
variant="default"
16+
{...props}
17+
onClick={() => {
18+
loginMsal();
19+
}}
20+
/>
21+
);
22+
}

0 commit comments

Comments
 (0)