diff --git a/client/components/app.jsx b/client/components/app.jsx index 76308b7..f626eae 100644 --- a/client/components/app.jsx +++ b/client/components/app.jsx @@ -25,6 +25,8 @@ const App = props => { import('./pages/login')} /> import('./pages/account')} /> + import('./pages/admin')} /> + () => } /> () => } /> diff --git a/client/components/pages/admin.jsx b/client/components/pages/admin.jsx new file mode 100644 index 0000000..f620d94 --- /dev/null +++ b/client/components/pages/admin.jsx @@ -0,0 +1,27 @@ +import React, { useContext } from 'react'; +import { Redirect } from 'react-router-dom'; + +import { TokenContext } from '../utilities/token-provider'; + +import NewsPublisher from '../panels/news-publisher'; +import NewsEditor from '../panels/news-editor'; + +const Admin = props => { + //context + const authTokens = useContext(TokenContext); + + //misplaced? (admin only) + if (!authTokens.accessToken || !authTokens.getPayload().privilege == 'administrator') { + return ; + } + + return ( +
+

Administration

+ + +
+ ); +}; + +export default Admin; \ No newline at end of file diff --git a/client/components/pages/login.jsx b/client/components/pages/login.jsx index 94a2ea5..c8b85a5 100644 --- a/client/components/pages/login.jsx +++ b/client/components/pages/login.jsx @@ -53,7 +53,7 @@ const LogIn = props => { ); }; -//DOCS: returns two values: response and OK +//DOCS: returns two values: err and authTokens const handleSubmit = async (email, password) => { email = email.trim(); //TODO: validate email on login diff --git a/client/components/panels/news-editor.jsx b/client/components/panels/news-editor.jsx new file mode 100644 index 0000000..43ec56b --- /dev/null +++ b/client/components/panels/news-editor.jsx @@ -0,0 +1,128 @@ +import React, { useState, useEffect, useContext, useRef } from 'react'; +import Select from 'react-dropdown-select'; + +import { TokenContext } from '../utilities/token-provider'; + +const NewsEditor = props => { + //context + const authTokens = useContext(TokenContext); + + //refs + const titleRef = useRef(); + const authorRef = useRef(); + const bodyRef = useRef(); + + //state + const [articles, setArticles] = useState([]); + const [index, setIndex] = useState(null); + + //run once + useEffect(async () => { + const result = await fetch(`${process.env.NEWS_URI}/metadata?limit=999`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*' + }, + }); + + if (!result.ok) { + const err = `${result.status}: ${await result.text()}`; + console.log(err); + alert(err); + } else { + setArticles(await result.json()); + } + }, []); + + return ( +
+

News Editor

+
+ + +
+ +
+ + +
+ +
+ +