diff --git a/package-lock.json b/package-lock.json
index d389a92..4718feb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -39,6 +39,7 @@
"jest": "^27.4.3",
"jest-resolve": "^27.4.2",
"jest-watch-typeahead": "^1.0.0",
+ "jwt-decode": "^4.0.0",
"mini-css-extract-plugin": "^2.4.5",
"miragejs": "^0.1.40",
"npm": "^9.1.2",
@@ -11354,6 +11355,15 @@
"node": ">=4.0"
}
},
+ "node_modules/jwt-decode": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+ "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -27903,6 +27913,11 @@
"object.assign": "^4.1.3"
}
},
+ "jwt-decode": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+ "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA=="
+ },
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
diff --git a/package.json b/package.json
index 7379207..bde64cd 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,7 @@
"jest": "^27.4.3",
"jest-resolve": "^27.4.2",
"jest-watch-typeahead": "^1.0.0",
+ "jwt-decode": "^4.0.0",
"mini-css-extract-plugin": "^2.4.5",
"miragejs": "^0.1.40",
"npm": "^9.1.2",
diff --git a/src/compontents/Frontpage/Frontpage.js b/src/compontents/Frontpage/Frontpage.js
index 3223336..def307c 100644
--- a/src/compontents/Frontpage/Frontpage.js
+++ b/src/compontents/Frontpage/Frontpage.js
@@ -63,9 +63,12 @@ export default function Frontpage() {
const initialize = () => {
dispatch(getMessages({auth: auth.token, path: 'inbox'}))
dispatch(getNews({auth: auth.token, path: 'current'}))
- dispatch(getGradebook({auth: auth.token}))
- dispatch(getYOResults({auth: auth.token}))
dispatch(getMonth({auth: auth.token}))
+
+ if (auth.isStudent) {
+ dispatch(getGradebook({auth: auth.token}))
+ dispatch(getYOResults({auth: auth.token}))
+ }
loadSchedule();
}
@@ -100,7 +103,12 @@ export default function Frontpage() {
loadSchedule()} className={category == 'schedule' ? styles['selected'] : null}>Työjärjestys
- loadHomework()} className={category == 'homework' ? styles['selected'] : null}>Kotitehtävät
+ {
+ auth.isStudent ?
+ loadHomework()} className={category == 'homework' ? styles['selected'] : null}>Kotitehtävät
+ :
+ null
+ }
setHover(true)} onMouseLeave={() => setHover(false)} onDoubleClick={() => setOpen(true)}>
@@ -119,10 +127,16 @@ export default function Frontpage() {
-
+ {
+ auth.isStudent ?
+
-
+
+ :
+ null
+ }
+
diff --git a/src/compontents/Navbar/Navbar.js b/src/compontents/Navbar/Navbar.js
index 1f41bb7..f848e6d 100644
--- a/src/compontents/Navbar/Navbar.js
+++ b/src/compontents/Navbar/Navbar.js
@@ -3,7 +3,7 @@ import { Link, useNavigate } from 'react-router-dom';
import { useSelector, useDispatch } from 'react-redux';
import { getConfig, useConfig } from '../../features/themes/configSlice';
import { useGrades } from '../../features/grades/gradeSlice';
-import { logoutFromWilma } from '../../features/authentication/authSlice';
+import { logoutFromWilma, useAuth } from '../../features/authentication/authSlice';
import styles from './Navbar.module.css'
@@ -12,6 +12,7 @@ export default function Navbar() {
const [expanded, setExpanded] = useState(false);
const config = useSelector(useConfig);
const grades = useSelector(useGrades);
+ const auth = useSelector(useAuth);
const dispatch = useDispatch();
const navigate = useNavigate();
@@ -22,7 +23,6 @@ export default function Navbar() {
'/friends': 'Kaverit',
'/maps': 'Kartat',
'/news': 'Tiedotteet',
- '/teachers': 'Opettajat',
'/settings': 'Asetukset'
}
@@ -77,7 +77,7 @@ export default function Navbar() {
{config.value ? username(config.value['username']) : '...'}
-
Opiskelija
+
{auth.isStudent ? 'Opiskelija' : auth.isTeacher ? 'Opettaja' : '?'}
@@ -87,6 +87,9 @@ export default function Navbar() {
OtaWilma
{grades.yoResults.length > 0 ?
Ylioppilaskirjoitukset
: null}
{Object.keys(links).slice(0, count).map(href => {
+ if (auth.isTeacher && href == '/grades' || href == '/tray' || href == '/friends') {
+ return null;
+ }
return
{links[href]}
})}
{(expanded || count < 9) ?
: null}
diff --git a/src/features/authentication/authSlice.js b/src/features/authentication/authSlice.js
index b9e1da1..5f95bd8 100644
--- a/src/features/authentication/authSlice.js
+++ b/src/features/authentication/authSlice.js
@@ -9,6 +9,7 @@ import { handleError } from '../errors/errorSlice';
import crypto from 'crypto-js';
import config from '../../config.json';
+import { jwtDecode } from 'jwt-decode';
const { signature } = config;
export const loginToWilma = createAsyncThunk(
@@ -66,6 +67,12 @@ const getToken = () => {
return getCookie('token') ? (getCookie('token') === 'null' ? null : getCookie('token')) : null;
}
+const getTokenType = () => {
+ const token = getToken();
+ const payload = jwtDecode(token);
+ return payload.isTeacher ?? false;
+}
+
export const getAgreement = () => {
const agreement = window.localStorage.getItem('agreement');
if(!agreement) window.localStorage.setItem('agreement', false);
@@ -110,6 +117,7 @@ export const authSlice = createSlice({
name: 'auth',
initialState: {
token: getToken(),
+ isTeacher: getTokenType(),
loggedIn: !(!getToken()),
loginError: null,
isLoading: false,
@@ -161,7 +169,9 @@ export const useAuth = (state) => ({
token: state.auth.token,
loggedIn: state.auth.loggedIn,
loginError: state.auth.loginError,
- isLoading: state.auth.isLoading
+ isLoading: state.auth.isLoading,
+ isTeacher: state.auth.isTeacher,
+ isStudent: !state.auth.isTeacher,
});
export default authSlice.reducer;