diff --git a/client/components/app.jsx b/client/components/app.jsx index 95b04ef..b3527c1 100644 --- a/client/components/app.jsx +++ b/client/components/app.jsx @@ -30,6 +30,7 @@ const App = props => { import('./pages/account')} /> import('./pages/admin')} /> + import('./pages/mod')} /> () => } /> () => } /> diff --git a/client/components/pages/admin.jsx b/client/components/pages/admin.jsx index 93388c9..9ef6dbf 100644 --- a/client/components/pages/admin.jsx +++ b/client/components/pages/admin.jsx @@ -5,23 +5,26 @@ import { TokenContext } from '../utilities/token-provider'; import NewsPublisher from '../panels/news-publisher'; import NewsEditor from '../panels/news-editor'; -import PrivilegeEditor from '../panels/privilege-editor'; + +import GrantAdmin from '../panels/grant-admin'; +import GrantMod from '../panels/grant-mod'; const Admin = props => { //context const authTokens = useContext(TokenContext); //misplaced? (admin only) - if (!authTokens.accessToken || authTokens.getPayload().privilege != 'administrator') { + if (!authTokens.accessToken || !authTokens.getPayload().admin) { return ; } return (
-

Administration

+

Administration Tools

- + +
); }; diff --git a/client/components/pages/mod.jsx b/client/components/pages/mod.jsx new file mode 100644 index 0000000..9cf5f93 --- /dev/null +++ b/client/components/pages/mod.jsx @@ -0,0 +1,22 @@ +import React, { useContext } from 'react'; +import { Redirect } from 'react-router-dom'; + +import { TokenContext } from '../utilities/token-provider'; + +const Mod = props => { + //context + const authTokens = useContext(TokenContext); + + //misplaced? (admin only) + if (!authTokens.accessToken || !(authTokens.getPayload().admin || authTokens.getPayload().mod)) { + return ; + } + + return ( +
+

Moderation Tools

+
+ ); +}; + +export default Mod; \ No newline at end of file diff --git a/client/components/panels/grant-admin.jsx b/client/components/panels/grant-admin.jsx new file mode 100644 index 0000000..f4970d5 --- /dev/null +++ b/client/components/panels/grant-admin.jsx @@ -0,0 +1,74 @@ +import React, { useRef, useContext } from 'react'; + +import { TokenContext } from '../utilities/token-provider'; + +const GrantAdmin = props => { + //context + const authTokens = useContext(TokenContext); + + //ref + const usernameRef = useRef(); + + return ( +
+

Grant Admin Privileges

+
+
+ + +
+ + + + +
+
+ ); +}; + +const handleButtonPress = async (username, tokenFetch, method) => { + const result = await tokenFetch(`${process.env.AUTH_URI}/admin/admin`, { + method: method, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*' + }, + body: JSON.stringify({ + username + }) + }); + + if (!result.ok) { + const err = `${result.status}: ${await result.text()}`; + console.log(err); + return [err, false]; + } + + return [null, true]; +}; + +export default GrantAdmin; diff --git a/client/components/panels/grant-mod.jsx b/client/components/panels/grant-mod.jsx new file mode 100644 index 0000000..f70905c --- /dev/null +++ b/client/components/panels/grant-mod.jsx @@ -0,0 +1,74 @@ +import React, { useRef, useContext } from 'react'; + +import { TokenContext } from '../utilities/token-provider'; + +const GrantMod = props => { + //context + const authTokens = useContext(TokenContext); + + //ref + const usernameRef = useRef(); + + return ( +
+

Grant Moderation Privileges

+
+
+ + +
+ + + + +
+
+ ); +}; + +const handleButtonPress = async (username, tokenFetch, method) => { + const result = await tokenFetch(`${process.env.AUTH_URI}/admin/mod`, { + method: method, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*' + }, + body: JSON.stringify({ + username + }) + }); + + if (!result.ok) { + const err = `${result.status}: ${await result.text()}`; + console.log(err); + return [err, false]; + } + + return [null, true]; +}; + +export default GrantMod; diff --git a/client/components/panels/header.jsx b/client/components/panels/header.jsx index 3f5166b..5e0898d 100644 --- a/client/components/panels/header.jsx +++ b/client/components/panels/header.jsx @@ -21,7 +21,7 @@ const Member = () => { Account - - { authTokens.getPayload().privilege == 'administrator' ? + { authTokens.getPayload().admin ? Admin - @@ -29,6 +29,14 @@ const Member = () => { } + { authTokens.getPayload().mod ? + + Moderation + - + : + + } + { /* Logout button logs you out of the server too */ } { const result = await authTokens.tokenFetch(`${process.env.AUTH_URI}/auth/logout`, { //NOTE: this gets overwritten as a bugfix diff --git a/client/components/panels/privilege-editor.jsx b/client/components/panels/privilege-editor.jsx deleted file mode 100644 index f8ba9b4..0000000 --- a/client/components/panels/privilege-editor.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import React, { useState, useRef, useContext } from 'react'; -import Select from 'react-dropdown-select'; - -import { TokenContext } from '../utilities/token-provider'; - -const PrivilegeEditor = props => { - //context - const authTokens = useContext(TokenContext); - - //state - const [privilege, setPrivilege] = useState('normal'); - - //ref - const usernameRef = useRef(); - - return ( -
-

Privilege Editor

-
{ - evt.preventDefault(); - const [err, result] = await handleSubmit(usernameRef.current.value, privilege, authTokens.tokenFetch); - - if (err) { - alert(err); - } - - if (result) { - alert('Privilege set'); - usernameRef.current.value = ''; - } - }}> -
- - -
- -