diff --git a/webclient/src/App.js b/webclient/src/App.js
index 70743da..f75f96c 100644
--- a/webclient/src/App.js
+++ b/webclient/src/App.js
@@ -12,6 +12,7 @@ import { Cards } from './Cards.js';
import { Training } from './Training.js';
import { AdminReportedTransactions } from './AdminTransactions.js';
import { Admin } from './Admin.js';
+import { Paste } from './Paste.js';
import { Courses, CourseDetail } from './Courses.js';
import { Classes, ClassDetail } from './Classes.js';
import { Members, MemberDetail } from './Members.js';
@@ -135,6 +136,11 @@ function App() {
as={Link}
to='/classes'
/>
+
{user && isAdmin(user) && }
{user && isAdmin(user) && }
@@ -166,69 +172,75 @@ function App() {
- {user && user.member.set_details ?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {user && isAdmin(user) &&
-
-
-
- }
-
- {user && isAdmin(user) &&
-
-
-
- }
-
-
-
-
-
- :
-
-
+
+
+
- }
+
+ {user && user.member.set_details ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {user && isAdmin(user) &&
+
+
+
+ }
+
+ {user && isAdmin(user) &&
+
+
+
+ }
+
+
+
+
+
+ :
+
+
+
+ }
+
diff --git a/webclient/src/Paste.js b/webclient/src/Paste.js
new file mode 100644
index 0000000..4c06e0e
--- /dev/null
+++ b/webclient/src/Paste.js
@@ -0,0 +1,96 @@
+import React, { useState, useEffect, useReducer, useContext } from 'react';
+import { BrowserRouter as Router, Switch, Route, Link, useParams, useHistory } from 'react-router-dom';
+import { Button, Container, Checkbox, Dimmer, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
+import { apiUrl, statusColor, BasicTable, staticUrl, requester } from './utils.js';
+import { NotFound } from './Misc.js';
+
+function PasteForm(props) {
+ const { token, input, setInput } = props;
+ const [error, setError] = useState({});
+ const [loading, setLoading] = useState(false);
+ const [success, setSuccess] = useState(false);
+
+ const handleValues = (e, v) => setInput({ ...input, [v.name]: v.value });
+ const handleChange = (e) => handleValues(e, e.currentTarget);
+
+ const handleSubmit = (e) => {
+ if (loading) return;
+ setLoading(true);
+ requester('/paste/', 'POST', token, input)
+ .then(res => {
+ setLoading(false);
+ setSuccess(true);
+ setError({});
+ setInput(res);
+ })
+ .catch(err => {
+ setLoading(false);
+ console.log(err);
+ setError(err.data);
+ });
+ };
+
+ const makeProps = (name) => ({
+ name: name,
+ onChange: handleChange,
+ value: input[name] || '',
+ error: error[name],
+ });
+
+ return (
+
+
+ {!!token &&
+ Submit
+ }
+ {success && Success!
}
+
+ );
+};
+
+let pasteCache = 'Loading...';
+
+export function Paste(props) {
+ const { token } = props;
+ const [input, setInput] = useState({ paste: pasteCache });
+ const [refreshCount, refreshPaste] = useReducer(x => x + 1, 0);
+
+ useEffect(() => {
+ requester('/paste/', 'GET', token)
+ .then(res => {
+ setInput({ paste: res.paste });
+ pasteCache = res.paste;
+ })
+ .catch(err => {
+ console.log(err);
+ });
+ }, [refreshCount]);
+
+ return (
+
+
+
+
+ Use this to quickly share info with people across devices.
+ For example: your LAN party server IP address, a config file,
+ a public key, an Arduino sketch, or a URL.
+
+
+
+ Members can write, anyone can read. Everyone shares what's below.
+
+
+
+
+ Refresh
+
+
+
+
+
+ );
+};