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;