Signup
);
};
-const handleSubmit = async (password) => {
- //generate a new formdata payload
- let formData = new FormData();
-
- formData.append('password', password);
-
- const result = await fetch('/api/accounts/deletion', { method: 'DELETE', body: formData });
+const handleSubmit = async (password, authTokens) => {
+ //schedule a deletion
+ const result = await authTokens.tokenFetch(`${process.env.AUTH_URI}/deletion`, {
+ method: 'DELETE',
+ headers: {
+ 'Access-Control-Allow-Origin': '*',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ password
+ })
+ });
if (!result.ok) {
- alert(await result.text());
- } else {
- //force logout
- fetch('/api/accounts/logout', { method: 'POST' })
- .then(alert(await result.text()))
- .then(() => window.location.reload(true)) //BUFGIX: force reload of the header element
- .catch(e => console.error(e))
- ;
+ return [`${await result.status}: ${await result.text()}`];
}
+
+ //force a logout
+ const result2 = await authTokens.tokenFetch(`${process.env.AUTH_URI}/logout`, {
+ method: 'DELETE',
+ headers: {
+ 'Access-Control-Allow-Origin': '*',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ token: authTokens.refreshToken
+ })
+ });
+
+ if (!result2.ok) {
+ return [`${await result2.status}: ${await result2.text()}`];
+ }
+
+ authTokens.setAccessToken('');
+ authTokens.setRefreshToken('');
+
+ return [null];
};
export default DeleteAccount;
\ No newline at end of file
diff --git a/client/components/panels/header.jsx b/client/components/panels/header.jsx
index ee7b8ea..e420a23 100644
--- a/client/components/panels/header.jsx
+++ b/client/components/panels/header.jsx
@@ -1,48 +1,57 @@
-import React from 'react';
-import { useCookies } from 'react-cookie';
+import React, { useContext } from 'react';
+import { Link } from 'react-router-dom';
+
+import { TokenContext } from '../utilities/token-provider';
const Visitor = () => {
return (
);
};
const Member = () => {
+ const authTokens = useContext(TokenContext);
+
return (
-
Account
+
Account
-
-
Log out
+ { /* Logout button logs you out of the server too */ }
+
{
+ const result = await authTokens.tokenFetch(`${process.env.AUTH_URI}/logout`, { //NOTE: this gets overwritten as a bugfix
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Access-Control-Allow-Origin': '*'
+ },
+ body: JSON.stringify({
+ token: authTokens.refreshToken
+ })
+ });
+
+ //any problems?
+ if (!result.ok) {
+ console.error(await result.text());
+ } else {
+ authTokens.setAccessToken('');
+ authTokens.setRefreshToken('');
+ }
+ }}>Log out
);
};
-const logout = async () => {
- await fetch('/api/accounts/logout', { method: 'POST' })
- .catch(e => console.error(e))
- ;
-};
-
const Header = () => {
- const [cookies, setCookie] = useCookies(['loggedin']);
-
- let Options;
-
- //check for logged in/out status
- if (cookies['loggedin']) {
- Options = Member;
- } else {
- Options = Visitor;
- }
+ const authTokens = useContext(TokenContext);
return (
-
-
+ MERN Template
+ { authTokens.accessToken ? : }
);
};
diff --git a/client/components/panels/news-editor.jsx b/client/components/panels/news-editor.jsx
index 0fa1f85..43ec56b 100644
--- a/client/components/panels/news-editor.jsx
+++ b/client/components/panels/news-editor.jsx
@@ -1,31 +1,39 @@
-import React, { useState } from 'react';
+import React, { useState, useEffect, useContext, useRef } from 'react';
import Select from 'react-dropdown-select';
-//DOCS: props.uri is the address of a live news-server
-//DOCS: props.newsKey is the key of the live news-server
+import { TokenContext } from '../utilities/token-provider';
+
const NewsEditor = props => {
- let titleElement, authorElement, bodyElement;
- const [articles, setArticles] = useState(null);
+ //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);
- if (!articles) {
- fetch(`${props.uri}/titles?limit=999`, {
+ //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': '*'
},
- })
- .then(a => {
- if (!a.ok) {
- throw `Network error ${a.status}: ${a.statusText} ${a.url}`;
- }
- return a.json();
- })
- .then(a => setArticles(a))
- .catch(e => console.error(e))
- ;
- }
+ });
+
+ if (!result.ok) {
+ const err = `${result.status}: ${await result.text()}`;
+ console.log(err);
+ alert(err);
+ } else {
+ setArticles(await result.json());
+ }
+ }, []);
return (
@@ -33,28 +41,56 @@ const NewsEditor = props => {
-