diff --git a/src/App.js b/src/App.js
index cbe79b08..66817686 100644
--- a/src/App.js
+++ b/src/App.js
@@ -17,51 +17,51 @@ import Navbar from './Components/Navbar.js'
export default function App() {
- const [isLoading, setIsLoading] = useState(false);
- const [isSubmit, setIsSubmit] = useState(false);
- const [isInvalid, setIsInvalid] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
+ const [isSubmit, setIsSubmit] = useState(false);
+ const [isInvalid, setIsInvalid] = useState(false);
- const [, updateState] = useState();
- const forceUpdate = useCallback(() => updateState({}), []);
+ const [, updateState] = useState();
+ const forceUpdate = useCallback(() => updateState({}), []);
- useEffect(() => {
- if (localStorage.getItem("pk-darkmode")) {
- document.body.classList.add('dark-mode')
- }
- else {
- document.body.classList.remove('dark-mode')
- }
- forceUpdate();
+ useEffect(() => {
+ if (localStorage.getItem("pk-darkmode")) {
+ document.body.classList.add('dark-mode')
+ }
+ else {
+ document.body.classList.remove('dark-mode')
+ }
+ forceUpdate();
}, []);
- return (
-
-
-
-
-
-
-
- { !localStorage.getItem('token') || isInvalid ? :
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
+ return (
+
+
+
+
+
+
+
+ { !localStorage.getItem('token') || isInvalid ? :
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
}
diff --git a/src/Components/Private/Edit/EditSystem.js b/src/Components/Private/Edit/EditSystem.js
index 40eea325..bf90ba46 100644
--- a/src/Components/Private/Edit/EditSystem.js
+++ b/src/Components/Private/Edit/EditSystem.js
@@ -8,148 +8,148 @@ import "moment-timezone";
import API_URL from "../../../Constants/constants.js";
const EditSystem = ({
- name,
- tag,
- timezone,
- avatar,
- banner,
- editDesc,
- setEditMode,
- setErrorAlert,
- user,
- setUser,
- setErrorMessage
+ name,
+ tag,
+ timezone,
+ avatar,
+ banner,
+ editDesc,
+ setEditMode,
+ setErrorAlert,
+ user,
+ setUser,
+ setErrorMessage
}) => {
- const [invalidTimezone, setInvalidTimezone] = useState(false);
+ const [invalidTimezone, setInvalidTimezone] = useState(false);
- const { register: registerEdit, handleSubmit: handleSubmitEdit } = useForm();
+ const { register: registerEdit, handleSubmit: handleSubmitEdit } = useForm();
- const submitEdit = (data) => {
- if (data.tz) {
- if (!moment.tz.zone(data.tz)) {
- setInvalidTimezone(true);
- return;
- }
- }
- fetch(`${API_URL}s`, {
- method: "PATCH",
- body: JSON.stringify(data),
- headers: {
- "Content-Type": "application/json",
- Authorization: localStorage.getItem("token"),
- },
- })
- .then((res) => {
- if (!res.ok)
- throw new Error('HTTP Status ' + res.status)
- return res.json();
- })
- .then(() => {
- setUser((prevState) => {
- return { ...prevState, ...data };
- });
- localStorage.setItem("user", JSON.stringify(user));
- setEditMode(false);
- })
- .catch((error) => {
- console.log(error);
- setErrorMessage(error.message);
- if (error.message === 'HTTP Status 401') {
- setErrorMessage("Your token is invalid, please log out and enter a new token.")
- };
- if (error.message === 'HTTP Status 500') {
- setErrorMessage("500: Internal server error.")
- }
- setErrorAlert(true);
- });
- };
+ const submitEdit = (data) => {
+ if (data.tz) {
+ if (!moment.tz.zone(data.tz)) {
+ setInvalidTimezone(true);
+ return;
+ }
+ }
+ fetch(`${API_URL}s`, {
+ method: "PATCH",
+ body: JSON.stringify(data),
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: localStorage.getItem("token"),
+ },
+ })
+ .then((res) => {
+ if (!res.ok)
+ throw new Error('HTTP Status ' + res.status)
+ return res.json();
+ })
+ .then(() => {
+ setUser((prevState) => {
+ return { ...prevState, ...data };
+ });
+ localStorage.setItem("user", JSON.stringify(user));
+ setEditMode(false);
+ })
+ .catch((error) => {
+ console.log(error);
+ setErrorMessage(error.message);
+ if (error.message === 'HTTP Status 401') {
+ setErrorMessage("Your token is invalid, please log out and enter a new token.")
+ };
+ if (error.message === 'HTTP Status 500') {
+ setErrorMessage("500: Internal server error.")
+ }
+ setErrorAlert(true);
+ });
+ };
- return (
-
-
- Note: if you refresh the page, the old data might show up again,
- this is due to the bot caching data.
-
- Try editing a member to clear the cache, or wait a few minutes before
- refreshing.
-
-
-
- Name:
-
-
-
- Tag:
-
-
-
- Timezone:
-
- {invalidTimezone ? (
-
- Please enter a valid
-
- timezone
-
-
- ) : (
- ""
- )}
-
-
- Avatar url:
-
-
-
- Banner url:
-
-
-
-
- Description:
-
-
- setEditMode(false)}>
- Cancel
- {" "}
-
- Submit
-
-
- );
+ return (
+
+
+ Note: if you refresh the page, the old data might show up again,
+ this is due to the bot caching data.
+
+ Try editing a member to clear the cache, or wait a few minutes before
+ refreshing.
+
+
+
+ Name:
+
+
+
+ Tag:
+
+
+
+ Timezone:
+
+ {invalidTimezone ? (
+
+ Please enter a valid
+
+ timezone
+
+
+ ) : (
+ ""
+ )}
+
+
+ Avatar url:
+
+
+
+ Banner url:
+
+
+
+
+ Description:
+
+
+ setEditMode(false)}>
+ Cancel
+ {" "}
+
+ Submit
+
+
+ );
};
export default EditSystem;
diff --git a/src/Components/Private/Edit/EditSystemPrivacy.js b/src/Components/Private/Edit/EditSystemPrivacy.js
index 27e6c6f1..aee196a9 100644
--- a/src/Components/Private/Edit/EditSystemPrivacy.js
+++ b/src/Components/Private/Edit/EditSystemPrivacy.js
@@ -6,113 +6,113 @@ import * as BS from "react-bootstrap";
import API_URL from "../../../Constants/constants.js";
const EditSystemPrivacy = ({
- setErrorAlert,
- setUser,
- user,
- setPrivacyEdit,
- setErrorMessage
+ setErrorAlert,
+ setUser,
+ user,
+ setPrivacyEdit,
+ setErrorMessage
}) => {
- const { register: registerPrivacy, handleSubmit: handleSubmitPrivacy } =
- useForm();
+ const { register: registerPrivacy, handleSubmit: handleSubmitPrivacy } =
+ useForm();
- // submit privacy stuffs
- const submitPrivacy = (data) => {
- fetch(`${API_URL}s`, {
- method: "PATCH",
- body: JSON.stringify(data),
- headers: {
- "Content-Type": "application/json",
- Authorization: localStorage.getItem("token"),
- },
- })
- .then((res) => {
- if (!res.ok)
- throw new Error('HTTP Status ' + res.status)
- return res.json();
- })
- .then(() => {
- setUser((prevState) => {
- return { ...prevState, ...data };
- });
- localStorage.setItem("user", JSON.stringify(user));
- setPrivacyEdit(false);
- })
- .catch((error) => {
- console.log(error);
- setErrorMessage(error.message);
- if (error.message === 'HTTP Status 401') {
- setErrorMessage("Your token is invalid, please log out and enter a new token.")
- };
- if (error.message === 'HTTP Status 500') {
- setErrorMessage("500: Internal server error.")
- }
- setErrorAlert(true);
- });
- };
+ // submit privacy stuffs
+ const submitPrivacy = (data) => {
+ fetch(`${API_URL}s`, {
+ method: "PATCH",
+ body: JSON.stringify(data),
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: localStorage.getItem("token"),
+ },
+ })
+ .then((res) => {
+ if (!res.ok)
+ throw new Error('HTTP Status ' + res.status)
+ return res.json();
+ })
+ .then(() => {
+ setUser((prevState) => {
+ return { ...prevState, ...data };
+ });
+ localStorage.setItem("user", JSON.stringify(user));
+ setPrivacyEdit(false);
+ })
+ .catch((error) => {
+ console.log(error);
+ setErrorMessage(error.message);
+ if (error.message === 'HTTP Status 401') {
+ setErrorMessage("Your token is invalid, please log out and enter a new token.")
+ };
+ if (error.message === 'HTTP Status 500') {
+ setErrorMessage("500: Internal server error.")
+ }
+ setErrorAlert(true);
+ });
+ };
- return (
-
-
- Editing privacy settings
-
-
- Description:
-
- public
- private
-
-
-
- Member list:
-
- public
- private
-
-
-
- Front:
-
- public
- private
-
-
-
- Front history:
-
- public
- private
-
-
-
- setPrivacyEdit(false)}>
- Cancel
- {" "}
-
- Submit
-
-
-
- );
+ return (
+
+
+ Editing privacy settings
+
+
+ Description:
+
+ public
+ private
+
+
+
+ Member list:
+
+ public
+ private
+
+
+
+ Front:
+
+ public
+ private
+
+
+
+ Front history:
+
+ public
+ private
+
+
+
+ setPrivacyEdit(false)}>
+ Cancel
+ {" "}
+
+ Submit
+
+
+
+ );
};
export default EditSystemPrivacy;
diff --git a/src/Components/Private/MemberCard.js b/src/Components/Private/MemberCard.js
index 7272e7c9..6e0eccb5 100644
--- a/src/Components/Private/MemberCard.js
+++ b/src/Components/Private/MemberCard.js
@@ -16,454 +16,454 @@ import { FaLink, FaLock, FaTrashAlt } from "react-icons/fa";
export default function MemberCard(props) {
- const system = JSON.parse(localStorage.getItem('user'));
- const sysID = system.id;
- const [member, setMember] = useState(props.member);
+ const system = JSON.parse(localStorage.getItem('user'));
+ const sysID = system.id;
+ const [member, setMember] = useState(props.member);
- const [ displayName, setDisplayName ] = useState("");
- const [ birthday, setBirthday ] = useState("");
- const [ birthdate, setBirthdate ] = useState("");
- const [ created, setCreated ] = useState("");
- const [ pronouns, setPronouns ] = useState("");
- const [ editPronouns, setEditPronouns ] = useState("");
- const [ avatar, setAvatar ] = useState("");
- const [ banner, setBanner ] = useState("");
- const [ color, setColor ] = useState("");
- const [ desc, setDesc ] = useState("");
- const [ editDesc, setEditDesc ] = useState("");
- const [ proxyTags, setProxyTags ] = useState(member.proxy_tags);
+ const [ displayName, setDisplayName ] = useState("");
+ const [ birthday, setBirthday ] = useState("");
+ const [ birthdate, setBirthdate ] = useState("");
+ const [ created, setCreated ] = useState("");
+ const [ pronouns, setPronouns ] = useState("");
+ const [ editPronouns, setEditPronouns ] = useState("");
+ const [ avatar, setAvatar ] = useState("");
+ const [ banner, setBanner ] = useState("");
+ const [ color, setColor ] = useState("");
+ const [ desc, setDesc ] = useState("");
+ const [ editDesc, setEditDesc ] = useState("");
+ const [ proxyTags, setProxyTags ] = useState(member.proxy_tags);
- const [ editMode, setEditMode ] = useState(false);
- const [ privacyEdit, setprivacyEdit ] = useState(false);
- const [ privacyView, setPrivacyView ] = useState(false);
- const [ proxyView, setProxyView ] = useState(false);
- const [ proxyEdit, setproxyEdit ] = useState(false);
-
- const [open, setOpen] = useState(false);
- const closeModal = () => setOpen(false);
+ const [ editMode, setEditMode ] = useState(false);
+ const [ privacyEdit, setprivacyEdit ] = useState(false);
+ const [ privacyView, setPrivacyView ] = useState(false);
+ const [ proxyView, setProxyView ] = useState(false);
+ const [ proxyEdit, setproxyEdit ] = useState(false);
+
+ const [open, setOpen] = useState(false);
+ const closeModal = () => setOpen(false);
- const [ errorAlert, setErrorAlert ] = useState(false);
- const [ wrongID, setWrongID ] = useState(false);
- const [ memberDeleted, setMemberDeleted ] = useState(false);
- const [ errorMessage, setErrorMessage ] = useState("");
+ const [ errorAlert, setErrorAlert ] = useState(false);
+ const [ wrongID, setWrongID ] = useState(false);
+ const [ memberDeleted, setMemberDeleted ] = useState(false);
+ const [ errorMessage, setErrorMessage ] = useState("");
- const {
- register: registerEdit,
- handleSubmit: handleSubmitEdit,
- setValue
- } = useForm();
+ const {
+ register: registerEdit,
+ handleSubmit: handleSubmitEdit,
+ setValue
+ } = useForm();
- const {
- register: registerPrivacy,
- handleSubmit: handleSubmitPrivacy
- } = useForm();
+ const {
+ register: registerPrivacy,
+ handleSubmit: handleSubmitPrivacy
+ } = useForm();
- const {
- register: registerDelete,
- handleSubmit: handleSubmitDelete
- } = useForm();
-
- const {
- register: registerProxy,
- handleSubmit: handleSubmitProxy,
- } = useForm();
+ const {
+ register: registerDelete,
+ handleSubmit: handleSubmitDelete
+ } = useForm();
+
+ const {
+ register: registerProxy,
+ handleSubmit: handleSubmitProxy,
+ } = useForm();
- useEffect(() => {
- autosize(document.querySelectorAll('textarea'));
- })
+ useEffect(() => {
+ autosize(document.querySelectorAll('textarea'));
+ })
- useEffect(() => {
- const { toHTML } = require('../../Functions/discord-parser.js');
+ useEffect(() => {
+ const { toHTML } = require('../../Functions/discord-parser.js');
- if (member.display_name) {
- setDisplayName(member.display_name)
- } else setDisplayName('')
+ if (member.display_name) {
+ setDisplayName(member.display_name)
+ } else setDisplayName('')
- if (member.birthday) {
- setBirthdate(member.birthday)
- if (member.birthday.startsWith('0004-')) {
- var bdaymoment = moment(member.birthday, 'YYYY-MM-DD').format('MMM D');
- setBirthday(bdaymoment);
- } else {
- var birthdaymoment = moment(member.birthday, 'YYYY-MM-DD').format('MMM D, YYYY');
- setBirthday(birthdaymoment);
- }
- } else { setBirthday('');
- setBirthdate('');
- }
+ if (member.birthday) {
+ setBirthdate(member.birthday)
+ if (member.birthday.startsWith('0004-')) {
+ var bdaymoment = moment(member.birthday, 'YYYY-MM-DD').format('MMM D');
+ setBirthday(bdaymoment);
+ } else {
+ var birthdaymoment = moment(member.birthday, 'YYYY-MM-DD').format('MMM D, YYYY');
+ setBirthday(birthdaymoment);
+ }
+ } else { setBirthday('');
+ setBirthdate('');
+ }
- var createdmoment = moment(member.created).format('MMM D, YYYY');
- setCreated(createdmoment);
+ var createdmoment = moment(member.created).format('MMM D, YYYY');
+ setCreated(createdmoment);
- if (member.pronouns) {
- setPronouns(toHTML(member.pronouns));
- setEditPronouns(member.pronouns);
- } else { setPronouns('');
- setEditPronouns('');
- }
+ if (member.pronouns) {
+ setPronouns(toHTML(member.pronouns));
+ setEditPronouns(member.pronouns);
+ } else { setPronouns('');
+ setEditPronouns('');
+ }
- if (member.avatar_url) {
- var avatarsmall = member.avatar_url.replace('&format=jpeg', '');
- setAvatar(avatarsmall.replace('?width=256&height=256', ''))
- } else setAvatar('')
-
- if (member.color) {
- setColor(member.color);
- } else setColor('');
+ if (member.avatar_url) {
+ var avatarsmall = member.avatar_url.replace('&format=jpeg', '');
+ setAvatar(avatarsmall.replace('?width=256&height=256', ''))
+ } else setAvatar('')
+
+ if (member.color) {
+ setColor(member.color);
+ } else setColor('');
- if (member.banner) {
- setBanner(member.banner);
- } else setBanner("");
+ if (member.banner) {
+ setBanner(member.banner);
+ } else setBanner("");
- if (member.description) {
- setDesc(toHTML(member.description));
- setEditDesc(member.description);
- } else { setDesc("(no description)");
- setEditDesc("");
- }
- }, [member.description, member.color, member.birthday, member.display_name, member.pronouns, member.avatar_url, member.proxy_tags, member.created, member.banner]);
+ if (member.description) {
+ setDesc(toHTML(member.description));
+ setEditDesc(member.description);
+ } else { setDesc("(no description)");
+ setEditDesc("");
+ }
+ }, [member.description, member.color, member.birthday, member.display_name, member.pronouns, member.avatar_url, member.proxy_tags, member.created, member.banner]);
- function submitEditPatch(data) {
- fetch(`${API_URL}m/${member.id}`,{
- method: 'PATCH',
- body: JSON.stringify(data),
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': localStorage.getItem("token")
- }}).then (res => {
- if (!res.ok) {
- throw new Error('HTTP Status ' + res.status);
- }
- return res.json();
- }
- ).then (data => {
- setMember(prevState => {return {...prevState, ...data}});
- setErrorAlert(false);
- setEditMode(false);
- }
- ).catch (error => {
- console.log(error);
- setErrorMessage(error.message);
- if (error.message === 'HTTP Status 401') {
- setErrorMessage("401: Your token is invalid, please log out and enter a new token.")
- };
- if (error.message === 'HTTP Status 500') {
- setErrorMessage("500: Internal server error.")
- }
- setErrorAlert(true);
- });
- }
+ function submitEditPatch(data) {
+ fetch(`${API_URL}m/${member.id}`,{
+ method: 'PATCH',
+ body: JSON.stringify(data),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': localStorage.getItem("token")
+ }}).then (res => {
+ if (!res.ok) {
+ throw new Error('HTTP Status ' + res.status);
+ }
+ return res.json();
+ }
+ ).then (data => {
+ setMember(prevState => {return {...prevState, ...data}});
+ setErrorAlert(false);
+ setEditMode(false);
+ }
+ ).catch (error => {
+ console.log(error);
+ setErrorMessage(error.message);
+ if (error.message === 'HTTP Status 401') {
+ setErrorMessage("401: Your token is invalid, please log out and enter a new token.")
+ };
+ if (error.message === 'HTTP Status 500') {
+ setErrorMessage("500: Internal server error.")
+ }
+ setErrorAlert(true);
+ });
+ }
- const submitEdit = data => {
- props.edit(Object.assign(member, data));
- submitEditPatch(data);
- }
+ const submitEdit = data => {
+ props.edit(Object.assign(member, data));
+ submitEditPatch(data);
+ }
- const submitPrivacy = data => {
- props.edit(Object.assign(member, data));
- submitEditPatch(data);
- }
+ const submitPrivacy = data => {
+ props.edit(Object.assign(member, data));
+ submitEditPatch(data);
+ }
- const deleteMember = data => {
- if (data.memberID !== member.id) {
- setWrongID(true);
- } else {
- fetch(`${API_URL}m/${member.id}`,{
- method: 'DELETE',
- headers: {
- 'Authorization': localStorage.getItem("token")
- }}).then (() => {
- setErrorAlert(false);
- setMemberDeleted(true);
- })
- .catch (error => {
- console.error(error);
- setErrorAlert(true);
- })
- }
- }
+ const deleteMember = data => {
+ if (data.memberID !== member.id) {
+ setWrongID(true);
+ } else {
+ fetch(`${API_URL}m/${member.id}`,{
+ method: 'DELETE',
+ headers: {
+ 'Authorization': localStorage.getItem("token")
+ }}).then (() => {
+ setErrorAlert(false);
+ setMemberDeleted(true);
+ })
+ .catch (error => {
+ console.error(error);
+ setErrorAlert(true);
+ })
+ }
+ }
- function addProxyField() {
- setProxyTags(oldTags => [...oldTags, {prefix: '', suffix: ''}] )
- }
+ function addProxyField() {
+ setProxyTags(oldTags => [...oldTags, {prefix: '', suffix: ''}] )
+ }
- function resetProxyFields() {
- setproxyEdit(false);
- setProxyTags(member.proxy_tags);
- }
+ function resetProxyFields() {
+ setproxyEdit(false);
+ setProxyTags(member.proxy_tags);
+ }
- const submitProxy = data => {
+ const submitProxy = data => {
- const newdata = {proxy_tags: data.proxy_tags.filter(tag => !(tag.prefix === "" && tag.suffix === ""))}
- props.edit(Object.assign(member, newdata));
+ const newdata = {proxy_tags: data.proxy_tags.filter(tag => !(tag.prefix === "" && tag.suffix === ""))}
+ props.edit(Object.assign(member, newdata));
- fetch(`${API_URL}m/${member.id}`,{
- method: 'PATCH',
- body: JSON.stringify(newdata),
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': localStorage.getItem("token")
- }}).then (res => res.json()
- ).then (data => {
- setMember(prevState => {return {...prevState, ...data}});
- setProxyTags(data.proxy_tags);
- setErrorAlert(false);
- setproxyEdit(false);
- }
- ).catch (error => {
- console.error(error);
- setErrorAlert(true);
- });
- }
+ fetch(`${API_URL}m/${member.id}`,{
+ method: 'PATCH',
+ body: JSON.stringify(newdata),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': localStorage.getItem("token")
+ }}).then (res => res.json()
+ ).then (data => {
+ setMember(prevState => {return {...prevState, ...data}});
+ setProxyTags(data.proxy_tags);
+ setErrorAlert(false);
+ setproxyEdit(false);
+ }
+ ).catch (error => {
+ console.error(error);
+ setErrorAlert(true);
+ });
+ }
- function copyLink() {
- var link = `https://pk-webs.spectralitree.com/profile/${sysID}/${member.id}`
- var textField = document.createElement('textarea')
- textField.innerText = link
- document.body.appendChild(textField);
+ function copyLink() {
+ var link = `https://pk-webs.spectralitree.com/profile/${sysID}/${member.id}`
+ var textField = document.createElement('textarea')
+ textField.innerText = link
+ document.body.appendChild(textField);
- textField.select();
- textField.setSelectionRange(0, 99999);
- document.execCommand('copy');
+ textField.select();
+ textField.setSelectionRange(0, 99999);
+ document.execCommand('copy');
- document.body.removeChild(textField);
- }
+ document.body.removeChild(textField);
+ }
- function renderCard() {
- return (
-
- { errorAlert ? {errorMessage} : "" }
- { editMode ?
- <>
-
-
-
- Name:
-
-
-
- Display name:
-
-
-
- Birthday:
-
- (YYYY-MM-DD)
-
-
- Pronouns:
-
-
-
- Avatar url:
-
-
-
- Banner url:
-
-
-
- Color:
-
- (hexcode)
-
-
-
- Description:
- { localStorage.getItem('template1') ? setValue('description', localStorage.getItem('template1'))}>Template 1 : ""} { localStorage.getItem('template2') ? setValue('description', localStorage.getItem('template2'))}>Template 2 : ""} { localStorage.getItem('template3') ? setValue('description', localStorage.getItem('template3'))}>Template 3 : ""}
-
-
- setEditMode(false)}>Cancel Submit setOpen(o => !o)}>Delete
-
-
-
-
-
- Are you sure you want to delete {member.name}?
-
-
- { wrongID ? Incorrect ID, please check the spelling. : "" }
- If you're sure you want to delete this member, please enter the member ID ({member.id}) below.
-
- Member ID:
-
- Delete Cancel
-
-
-
-
- >
- :
- <>
-
- ID: {member.id}
- { member.display_name ?
- Display name: { localStorage.getItem("twemoji") ? : } : "" }
- { member.birthday ? Birthday: {birthday} : "" }
- { member.pronouns ? Pronouns: { localStorage.getItem("twemoji") ? : } : "" }
- { member.color ? Color: {color} : "" }
- { privacyView ? "" : proxyView ? "" : Privacy: setPrivacyView(true)}>View }
- { privacyView ? "" : proxyView ? "" : Proxy tags: setProxyView(true)}>View }
- { privacyView || proxyView || !member.banner ? "" :
-
- Banner: {" "}
-
- View
-
- }
- className="banner"
- modal
- >
- {(close) => (
-
- )}
-
-
- }
- Created: {created}
-
- { privacyEdit ?
-
- Editing privacy settings
-
-
- Visibility:
-
- public
- private
-
-
-
- Name:
-
- public
- private
-
-
-
- Description:
-
- public
- private
-
-
-
- Avatar:
-
- public
- private
-
-
-
- Birthday:
-
- public
- private
-
-
-
- Pronouns:
-
- public
- private
-
-
-
- Meta:
-
- public
- private
-
-
-
- setprivacyEdit(false)}>Cancel Submit
-
- : privacyView ? <>
- Viewing privacy settings
-
- Visibility: {member.visibility}
- Name: {member.name_privacy}
- Description: {member.description_privacy}
- Avatar: {member.avatar_privacy}
- Birthday: {member.birthday_privacy}
- Pronouns: {member.pronoun_privacy}
- Meta: {member.metadata_privacy}
-
- setPrivacyView(false)}>Exit setprivacyEdit(true)}>Edit
- > : "" }
- { proxyEdit ?
- <>
- Editing proxy tags
-
-
- { proxyTags.map((item, index) => (
-
-
-
-
-
-
-
-
-
- ))} addProxyField()}>Add new
-
- resetProxyFields()}>Exit Submit
- > : proxyView ?
- <>
- Viewing proxy tags
-
- { proxyTags.length === 0 ? No proxy tags set. : proxyTags.map((proxytag, index) => {proxytag.prefix}text{proxytag.suffix}
)}
-
- setProxyView(false)}>Exit setproxyEdit(true)}>Edit
- > : "" }
- Description:
- { localStorage.getItem("twemoji") ?
:
}
- { !member.banner || !localStorage.getItem("bottombanners") ? "" :
-
- }
- { proxyView ? "" : privacyEdit ? "" : privacyView ? "" : <> setEditMode(true)}>Edit View page > }
- > }
- )
- }
+ function renderCard() {
+ return (
+
+ { errorAlert ? {errorMessage} : "" }
+ { editMode ?
+ <>
+
+
+
+ Name:
+
+
+
+ Display name:
+
+
+
+ Birthday:
+
+ (YYYY-MM-DD)
+
+
+ Pronouns:
+
+
+
+ Avatar url:
+
+
+
+ Banner url:
+
+
+
+ Color:
+
+ (hexcode)
+
+
+
+ Description:
+ { localStorage.getItem('template1') ? setValue('description', localStorage.getItem('template1'))}>Template 1 : ""} { localStorage.getItem('template2') ? setValue('description', localStorage.getItem('template2'))}>Template 2 : ""} { localStorage.getItem('template3') ? setValue('description', localStorage.getItem('template3'))}>Template 3 : ""}
+
+
+ setEditMode(false)}>Cancel Submit setOpen(o => !o)}>Delete
+
+
+
+
+
+ Are you sure you want to delete {member.name}?
+
+
+ { wrongID ? Incorrect ID, please check the spelling. : "" }
+ If you're sure you want to delete this member, please enter the member ID ({member.id}) below.
+
+ Member ID:
+
+ Delete Cancel
+
+
+
+
+ >
+ :
+ <>
+
+ ID: {member.id}
+ { member.display_name ?
+ Display name: { localStorage.getItem("twemoji") ? : } : "" }
+ { member.birthday ? Birthday: {birthday} : "" }
+ { member.pronouns ? Pronouns: { localStorage.getItem("twemoji") ? : } : "" }
+ { member.color ? Color: {color} : "" }
+ { privacyView ? "" : proxyView ? "" : Privacy: setPrivacyView(true)}>View }
+ { privacyView ? "" : proxyView ? "" : Proxy tags: setProxyView(true)}>View }
+ { privacyView || proxyView || !member.banner ? "" :
+
+ Banner: {" "}
+
+ View
+
+ }
+ className="banner"
+ modal
+ >
+ {(close) => (
+
+ )}
+
+
+ }
+ Created: {created}
+
+ { privacyEdit ?
+
+ Editing privacy settings
+
+
+ Visibility:
+
+ public
+ private
+
+
+
+ Name:
+
+ public
+ private
+
+
+
+ Description:
+
+ public
+ private
+
+
+
+ Avatar:
+
+ public
+ private
+
+
+
+ Birthday:
+
+ public
+ private
+
+
+
+ Pronouns:
+
+ public
+ private
+
+
+
+ Meta:
+
+ public
+ private
+
+
+
+ setprivacyEdit(false)}>Cancel Submit
+
+ : privacyView ? <>
+ Viewing privacy settings
+
+ Visibility: {member.visibility}
+ Name: {member.name_privacy}
+ Description: {member.description_privacy}
+ Avatar: {member.avatar_privacy}
+ Birthday: {member.birthday_privacy}
+ Pronouns: {member.pronoun_privacy}
+ Meta: {member.metadata_privacy}
+
+ setPrivacyView(false)}>Exit setprivacyEdit(true)}>Edit
+ > : "" }
+ { proxyEdit ?
+ <>
+ Editing proxy tags
+
+
+ { proxyTags.map((item, index) => (
+
+
+
+
+
+
+
+
+
+ ))} addProxyField()}>Add new
+
+ resetProxyFields()}>Exit Submit
+ > : proxyView ?
+ <>
+ Viewing proxy tags
+
+ { proxyTags.length === 0 ? No proxy tags set. : proxyTags.map((proxytag, index) => {proxytag.prefix}text{proxytag.suffix}
)}
+
+ setProxyView(false)}>Exit setproxyEdit(true)}>Edit
+ > : "" }
+ Description:
+ { localStorage.getItem("twemoji") ?
:
}
+ { !member.banner || !localStorage.getItem("bottombanners") ? "" :
+
+ }
+ { proxyView ? "" : privacyEdit ? "" : privacyView ? "" : <> setEditMode(true)}>Edit View page > }
+ > }
+ )
+ }
- return (
- memberDeleted ? Member Deleted :
-
-
- { member.visibility === 'public' ?
- Copy public link
-
- }> copyLink()}> :
- }
- { localStorage.getItem('pagesonly') ?
- {member.name} ({member.id})
- : {member.name} ({member.id}) }
- { member.avatar_url ? } className="avatar" modal>
- {close => (
-
- )}
- :
- }
-
- {localStorage.getItem("expandcards") ? renderCard() :
- {renderCard()}
- }
-
-
- )
+ return (
+ memberDeleted ? Member Deleted :
+
+
+ { member.visibility === 'public' ?
+ Copy public link
+
+ }> copyLink()}> :
+ }
+ { localStorage.getItem('pagesonly') ?
+ {member.name} ({member.id})
+ : {member.name} ({member.id}) }
+ { member.avatar_url ? } className="avatar" modal>
+ {close => (
+
+ )}
+ :
+ }
+
+ {localStorage.getItem("expandcards") ? renderCard() :
+ {renderCard()}
+ }
+
+
+ )
}
diff --git a/src/Components/Private/Memberlist.js b/src/Components/Private/Memberlist.js
index 9c010c77..1652c305 100644
--- a/src/Components/Private/Memberlist.js
+++ b/src/Components/Private/Memberlist.js
@@ -14,435 +14,435 @@ import { FaPlus } from "react-icons/fa";
export default function Memberlist() {
- const { path } = useRouteMatch();
-
- const user = JSON.parse(localStorage.getItem('user'));
- const userId = user.id;
+ const { path } = useRouteMatch();
+
+ const user = JSON.parse(localStorage.getItem('user'));
+ const userId = user.id;
- const [isLoading, setIsLoading ] = useState(false);
- const [isError, setIsError ] = useState(false);
- const [errorAlert, setErrorAlert ] = useState(false);
+ const [isLoading, setIsLoading ] = useState(false);
+ const [isError, setIsError ] = useState(false);
+ const [errorAlert, setErrorAlert ] = useState(false);
- const [proxyView, setProxyView] = useState(false);
- const [privacyView, setPrivacyView] = useState(false);
- const [currentPage, setCurrentPage] = useState(1);
- const [membersPerPage, setMembersPerPage] = useState(25);
+ const [proxyView, setProxyView] = useState(false);
+ const [privacyView, setPrivacyView] = useState(false);
+ const [currentPage, setCurrentPage] = useState(1);
+ const [membersPerPage, setMembersPerPage] = useState(25);
- const [open, setOpen] = useState(false);
- const closeModal = () => setOpen(false);
+ const [open, setOpen] = useState(false);
+ const closeModal = () => setOpen(false);
- const [members, setMembers ] = useState([]);
+ const [members, setMembers ] = useState([]);
- const [searchBy, setSearchBy] = useState('name')
- const [privacyFilter, setPrivacyFilter] = useState('all')
- const [sortBy, setSortBy] = useState('name')
- const [sortOrder, setSortOrder] = useState('ascending')
+ const [searchBy, setSearchBy] = useState('name')
+ const [privacyFilter, setPrivacyFilter] = useState('all')
+ const [sortBy, setSortBy] = useState('name')
+ const [sortOrder, setSortOrder] = useState('ascending')
- const [value, setValue] = useState('');
- const [proxyTags, setProxyTags] = useState([{
- prefix: "", suffix: ""
- }]);
+ const [value, setValue] = useState('');
+ const [proxyTags, setProxyTags] = useState([{
+ prefix: "", suffix: ""
+ }]);
- const {register, handleSubmit, setValue: setTemplate} = useForm();
+ const {register, handleSubmit, setValue: setTemplate} = useForm();
- const fetchMembers = useCallback( () => {
- setIsLoading(true);
- setIsError(false);
- setMembersPerPage(localStorage.getItem("expandcards") ? 10 : 25);
+ const fetchMembers = useCallback( () => {
+ setIsLoading(true);
+ setIsError(false);
+ setMembersPerPage(localStorage.getItem("expandcards") ? 10 : 25);
- fetch(`${API_URL}s/${userId}/members`,{
- method: 'GET',
- headers: {
- 'Authorization': localStorage.getItem("token")
- }}).then ( res => res.json()
- ).then (data => {
- setMembers(data)
- setIsLoading(false);
- })
- .catch (error => {
- console.log(error);
- setIsError(true);
- setIsLoading(false);
- })
- }, [userId])
+ fetch(`${API_URL}s/${userId}/members`,{
+ method: 'GET',
+ headers: {
+ 'Authorization': localStorage.getItem("token")
+ }}).then ( res => res.json()
+ ).then (data => {
+ setMembers(data)
+ setIsLoading(false);
+ })
+ .catch (error => {
+ console.log(error);
+ setIsError(true);
+ setIsLoading(false);
+ })
+ }, [userId])
- useEffect(() => {
- fetchMembers();
- }, [fetchMembers])
+ useEffect(() => {
+ fetchMembers();
+ }, [fetchMembers])
- const indexOfLastMember = currentPage * membersPerPage;
- const indexOfFirstMember = indexOfLastMember - membersPerPage;
+ const indexOfLastMember = currentPage * membersPerPage;
+ const indexOfFirstMember = indexOfLastMember - membersPerPage;
- let Members = members.map(member => {
- if (member.display_name) {
- return {...member, displayName: member.display_name}
- } return {...member, displayName: member.name}
- })
- let Members1 = Members.map(member => {
- if (member.description) {
- return {...member, desc: member.description}
- } return {...member, desc: "(no description)"}
- })
+ let Members = members.map(member => {
+ if (member.display_name) {
+ return {...member, displayName: member.display_name}
+ } return {...member, displayName: member.name}
+ })
+ let Members1 = Members.map(member => {
+ if (member.description) {
+ return {...member, desc: member.description}
+ } return {...member, desc: "(no description)"}
+ })
- const currentMembers = Members1.filter(member => {
- if (!value & privacyFilter === 'all') return true;
-
- if (privacyFilter === 'private') {
- if (member.visibility !== 'private') {
- return false;
- }
- } else if (privacyFilter === 'public') {
- if (member.visibility !== 'public') {
- return false;
- }
- }
+ const currentMembers = Members1.filter(member => {
+ if (!value & privacyFilter === 'all') return true;
+
+ if (privacyFilter === 'private') {
+ if (member.visibility !== 'private') {
+ return false;
+ }
+ } else if (privacyFilter === 'public') {
+ if (member.visibility !== 'public') {
+ return false;
+ }
+ }
- if (searchBy === 'name') {
- if (member.name.toLowerCase().includes(value.toLowerCase())) {
- return true;
- }
- return false;
- } else if (searchBy === 'display name') {
- if (member.displayName.toLowerCase().includes(value.toLowerCase())) {
- return true;
- }
- return false
- } else if (searchBy === 'description') {
- if (member.desc.toLowerCase().includes(value.toLowerCase())) {
- return true;
- }
- return false;
- } else if (searchBy === 'ID') {
- if (member.id.toLowerCase().includes(value.toLowerCase())) {
- return true;
- }
- return false;
- }
+ if (searchBy === 'name') {
+ if (member.name.toLowerCase().includes(value.toLowerCase())) {
+ return true;
+ }
+ return false;
+ } else if (searchBy === 'display name') {
+ if (member.displayName.toLowerCase().includes(value.toLowerCase())) {
+ return true;
+ }
+ return false
+ } else if (searchBy === 'description') {
+ if (member.desc.toLowerCase().includes(value.toLowerCase())) {
+ return true;
+ }
+ return false;
+ } else if (searchBy === 'ID') {
+ if (member.id.toLowerCase().includes(value.toLowerCase())) {
+ return true;
+ }
+ return false;
+ }
- return false;
- })
+ return false;
+ })
- const active = currentPage;
- const pageAmount = Math.ceil(currentMembers.length / membersPerPage);
+ const active = currentPage;
+ const pageAmount = Math.ceil(currentMembers.length / membersPerPage);
- var sortMembers = currentMembers;
- if (sortBy === 'name') {
- if (sortOrder === 'descending') {
- sortMembers = currentMembers.sort((a, b) => a.name.localeCompare(b.name)).reverse().slice(indexOfFirstMember, indexOfLastMember);
- } else sortMembers = currentMembers.sort((a, b) => a.name.localeCompare(b.name)).slice(indexOfFirstMember, indexOfLastMember);
- }
- else if (sortBy === 'display name') {
- if (sortOrder === 'descending') {
- sortMembers = currentMembers.sort((a, b) => a.displayName.localeCompare(b.displayName)).reverse().slice(indexOfFirstMember, indexOfLastMember);
- } else sortMembers = currentMembers.sort((a, b) => a.displayName.localeCompare(b.displayName)).slice(indexOfFirstMember, indexOfLastMember);
- }
- else if (sortBy === 'ID') {
- if (sortOrder === 'descending') {
- sortMembers = currentMembers.sort((a, b) => a.id.localeCompare(b.id)).reverse().slice(indexOfFirstMember, indexOfLastMember);
- } else sortMembers = currentMembers.sort((a, b) => a.id.localeCompare(b.id)).slice(indexOfFirstMember, indexOfLastMember);
- }
- else if (sortBy === 'date created') {
- if (sortOrder === 'descending') {
- sortMembers = currentMembers.sort((a, b) => a.created.localeCompare(b.created)).reverse().slice(indexOfFirstMember, indexOfLastMember);
- } else sortMembers = currentMembers.sort((a, b) => a.created.localeCompare(b.created)).slice(indexOfFirstMember, indexOfLastMember);
- }
+ var sortMembers = currentMembers;
+ if (sortBy === 'name') {
+ if (sortOrder === 'descending') {
+ sortMembers = currentMembers.sort((a, b) => a.name.localeCompare(b.name)).reverse().slice(indexOfFirstMember, indexOfLastMember);
+ } else sortMembers = currentMembers.sort((a, b) => a.name.localeCompare(b.name)).slice(indexOfFirstMember, indexOfLastMember);
+ }
+ else if (sortBy === 'display name') {
+ if (sortOrder === 'descending') {
+ sortMembers = currentMembers.sort((a, b) => a.displayName.localeCompare(b.displayName)).reverse().slice(indexOfFirstMember, indexOfLastMember);
+ } else sortMembers = currentMembers.sort((a, b) => a.displayName.localeCompare(b.displayName)).slice(indexOfFirstMember, indexOfLastMember);
+ }
+ else if (sortBy === 'ID') {
+ if (sortOrder === 'descending') {
+ sortMembers = currentMembers.sort((a, b) => a.id.localeCompare(b.id)).reverse().slice(indexOfFirstMember, indexOfLastMember);
+ } else sortMembers = currentMembers.sort((a, b) => a.id.localeCompare(b.id)).slice(indexOfFirstMember, indexOfLastMember);
+ }
+ else if (sortBy === 'date created') {
+ if (sortOrder === 'descending') {
+ sortMembers = currentMembers.sort((a, b) => a.created.localeCompare(b.created)).reverse().slice(indexOfFirstMember, indexOfLastMember);
+ } else sortMembers = currentMembers.sort((a, b) => a.created.localeCompare(b.created)).slice(indexOfFirstMember, indexOfLastMember);
+ }
- const memberList = sortMembers.map((member) =>
- setMembers(members.map(member => member.id === memberEdit.id ? Object.assign(member, memberEdit) : member))}
- />
-
- );
+ const memberList = sortMembers.map((member) =>
+ setMembers(members.map(member => member.id === memberEdit.id ? Object.assign(member, memberEdit) : member))}
+ />
+
+ );
- function addProxyField() {
- setProxyTags(oldTags => [...oldTags, {prefix: '', suffix: ''}] )
- }
+ function addProxyField() {
+ setProxyTags(oldTags => [...oldTags, {prefix: '', suffix: ''}] )
+ }
- const submitMember = data => {
- setIsLoading(true);
+ const submitMember = data => {
+ setIsLoading(true);
- const newdata = data.proxy_tags ? {...data, proxy_tags: data.proxy_tags.filter(tag => !(tag.prefix === "" && tag.suffix === ""))} : data
+ const newdata = data.proxy_tags ? {...data, proxy_tags: data.proxy_tags.filter(tag => !(tag.prefix === "" && tag.suffix === ""))} : data
- fetch(`${API_URL}m/`,{
- method: 'POST',
- body: JSON.stringify(newdata),
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': localStorage.getItem("token")
- }}).then (res => res.json()
- ).then (data => {
- setErrorAlert(false);
- closeModal();
- fetchMembers();
- }
- ).catch (error => {
- console.error(error);
- setErrorAlert(true);
- });
- }
+ fetch(`${API_URL}m/`,{
+ method: 'POST',
+ body: JSON.stringify(newdata),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': localStorage.getItem("token")
+ }}).then (res => res.json()
+ ).then (data => {
+ setErrorAlert(false);
+ closeModal();
+ fetchMembers();
+ }
+ ).catch (error => {
+ console.error(error);
+ setErrorAlert(true);
+ });
+ }
- return (
-
-
- <>
-
-
-
-
-
- {
- setMembersPerPage(e.target.value);
- setCurrentPage(1);
- }}>
- 10
- 25
- 50
- 100
-
-
-
-
-
-
-
-
- {
- setSearchBy(e.target.value)
- }}>
- name
- display name
- description
- ID
-
-
-
-
-
-
-
-
- {
- setSortBy(e.target.value)
- }}>
- name
- display name
- ID
- date created
-
-
-
-
-
-
-
-
- {
- setSortOrder(e.target.value)
- }}>
- ascending
- descending
-
-
-
-
-
-
-
-
-
-
- {
- setPrivacyFilter(e.target.value)
- }}>
- all
- private
- public
-
-
-
-
-
-
- {setValue(e.target.value); setCurrentPage(1);}} placeholder={`Search by ${searchBy}`}/>
-
-
-
- fetchMembers()}>Refresh
-
-
-
-
- { currentPage === 1 ? : setCurrentPage(currentPage - 1)} />}
- { currentPage < 3 ? "" : setCurrentPage(1)} active={1 === active}>{1} }
- { currentPage < 4 ? "" : currentPage < 5 ? setCurrentPage(2)} active={2 === active}>{2} : }
- { currentPage > 1 ? setCurrentPage(currentPage - 1)}>{currentPage - 1} : "" }
- setCurrentPage(currentPage)} active={currentPage === active}>{currentPage}
- { currentPage < pageAmount ? setCurrentPage(currentPage + 1)}>{currentPage + 1} : "" }
- { currentPage > pageAmount - 3 ? "" : currentPage === pageAmount - 3 ? setCurrentPage(pageAmount - 1)} active={pageAmount - 1 === active}>{pageAmount - 1} : }
- { currentPage > pageAmount - 2 ? "" : setCurrentPage(pageAmount)} active={pageAmount === active}>{pageAmount} }
- { currentPage === pageAmount ? : setCurrentPage(currentPage + 1)} />}
-
-
- { isLoading ? : isError ?
- Error fetching members. :
- <>
-
-
- setOpen(o => !o)}> Add Member
-
-
-
-
- Add member
-
-
- { errorAlert ? Something went wrong, please try logging in and out again. : "" }
-
-
-
-
-
- Name:
-
-
-
- Display name:
-
-
-
- Birthday:
-
- (YYYY-MM-DD)
-
-
- Pronouns:
-
-
-
- Avatar url:
-
-
-
- Banner url:
-
-
-
- Color:
-
- (hexcode)
-
-
- Proxy tags:
- setProxyView(view => !view)}> { proxyView ? "Hide" : "Show" }
-
-
- Privacy settings:
- setPrivacyView(view => !view)}> { privacyView ? "Hide" : "Show" }
-
-
-
- { proxyView ? <>
- Proxy Tags
-
- { proxyTags.map((item, index) => (
-
-
-
-
-
-
-
-
-
- ))} addProxyField()}>Add new
-
- > : "" }
- { privacyView ? <>privacy settings
-
-
- Visibility:
-
- public
- private
-
-
-
- Name:
-
- public
- private
-
-
-
- Description:
-
- public
- private
-
-
-
- Birthday:
-
- public
- private
-
-
-
- Pronouns:
-
- public
- private
-
-
-
- Meta:
-
- public
- private
-
-
-
- > : "" }
-
- Description:
- { localStorage.getItem('template1') ? setTemplate('description', localStorage.getItem('template1'))}>Template 1 : ""} { localStorage.getItem('template2') ? setTemplate('description', localStorage.getItem('template2'))}>Template 2 : ""} { localStorage.getItem('template3') ? setTemplate('description', localStorage.getItem('template3'))}>Template 3 : ""}
-
-
- Submit Cancel
-
-
-
-
-
-
-
-
-
- {memberList}
-
-
-
- { currentPage === 1 ? : setCurrentPage(currentPage - 1)} />}
- { currentPage < 3 ? "" : setCurrentPage(1)} active={1 === active}>{1} }
- { currentPage < 4 ? "" : currentPage < 5 ? setCurrentPage(2)} active={2 === active}>{2} : }
- { currentPage > 1 ? setCurrentPage(currentPage - 1)}>{currentPage - 1} : "" }
- setCurrentPage(currentPage)} active={currentPage === active}>{currentPage}
- { currentPage < pageAmount ? setCurrentPage(currentPage + 1)}>{currentPage + 1} : "" }
- { currentPage > pageAmount - 3 ? "" : currentPage === pageAmount - 3 ? setCurrentPage(pageAmount - 1)} active={pageAmount - 1 === active}>{pageAmount - 1} : }
- { currentPage > pageAmount - 2 ? "" : setCurrentPage(pageAmount)} active={pageAmount === active}>{pageAmount} }
- { currentPage === pageAmount ? : setCurrentPage(currentPage + 1)} />}
-
-
- >
- }
- >
-
-
- { isLoading ? :
- setMembers(members.map(member => member.id === memberEdit.id ? Object.assign(member, memberEdit) : member))}/>}
-
-
- )
+ return (
+
+
+ <>
+
+
+
+
+
+ {
+ setMembersPerPage(e.target.value);
+ setCurrentPage(1);
+ }}>
+ 10
+ 25
+ 50
+ 100
+
+
+
+
+
+
+
+
+ {
+ setSearchBy(e.target.value)
+ }}>
+ name
+ display name
+ description
+ ID
+
+
+
+
+
+
+
+
+ {
+ setSortBy(e.target.value)
+ }}>
+ name
+ display name
+ ID
+ date created
+
+
+
+
+
+
+
+
+ {
+ setSortOrder(e.target.value)
+ }}>
+ ascending
+ descending
+
+
+
+
+
+
+
+
+
+
+ {
+ setPrivacyFilter(e.target.value)
+ }}>
+ all
+ private
+ public
+
+
+
+
+
+
+ {setValue(e.target.value); setCurrentPage(1);}} placeholder={`Search by ${searchBy}`}/>
+
+
+
+ fetchMembers()}>Refresh
+
+
+
+
+ { currentPage === 1 ? : setCurrentPage(currentPage - 1)} />}
+ { currentPage < 3 ? "" : setCurrentPage(1)} active={1 === active}>{1} }
+ { currentPage < 4 ? "" : currentPage < 5 ? setCurrentPage(2)} active={2 === active}>{2} : }
+ { currentPage > 1 ? setCurrentPage(currentPage - 1)}>{currentPage - 1} : "" }
+ setCurrentPage(currentPage)} active={currentPage === active}>{currentPage}
+ { currentPage < pageAmount ? setCurrentPage(currentPage + 1)}>{currentPage + 1} : "" }
+ { currentPage > pageAmount - 3 ? "" : currentPage === pageAmount - 3 ? setCurrentPage(pageAmount - 1)} active={pageAmount - 1 === active}>{pageAmount - 1} : }
+ { currentPage > pageAmount - 2 ? "" : setCurrentPage(pageAmount)} active={pageAmount === active}>{pageAmount} }
+ { currentPage === pageAmount ? : setCurrentPage(currentPage + 1)} />}
+
+
+ { isLoading ? : isError ?
+ Error fetching members. :
+ <>
+
+
+ setOpen(o => !o)}> Add Member
+
+
+
+
+ Add member
+
+
+ { errorAlert ? Something went wrong, please try logging in and out again. : "" }
+
+
+
+
+
+ Name:
+
+
+
+ Display name:
+
+
+
+ Birthday:
+
+ (YYYY-MM-DD)
+
+
+ Pronouns:
+
+
+
+ Avatar url:
+
+
+
+ Banner url:
+
+
+
+ Color:
+
+ (hexcode)
+
+
+ Proxy tags:
+ setProxyView(view => !view)}> { proxyView ? "Hide" : "Show" }
+
+
+ Privacy settings:
+ setPrivacyView(view => !view)}> { privacyView ? "Hide" : "Show" }
+
+
+
+ { proxyView ? <>
+ Proxy Tags
+
+ { proxyTags.map((item, index) => (
+
+
+
+
+
+
+
+
+
+ ))} addProxyField()}>Add new
+
+ > : "" }
+ { privacyView ? <>privacy settings
+
+
+ Visibility:
+
+ public
+ private
+
+
+
+ Name:
+
+ public
+ private
+
+
+
+ Description:
+
+ public
+ private
+
+
+
+ Birthday:
+
+ public
+ private
+
+
+
+ Pronouns:
+
+ public
+ private
+
+
+
+ Meta:
+
+ public
+ private
+
+
+
+ > : "" }
+
+ Description:
+ { localStorage.getItem('template1') ? setTemplate('description', localStorage.getItem('template1'))}>Template 1 : ""} { localStorage.getItem('template2') ? setTemplate('description', localStorage.getItem('template2'))}>Template 2 : ""} { localStorage.getItem('template3') ? setTemplate('description', localStorage.getItem('template3'))}>Template 3 : ""}
+
+
+ Submit Cancel
+
+
+
+
+
+
+
+
+
+ {memberList}
+
+
+
+ { currentPage === 1 ? : setCurrentPage(currentPage - 1)} />}
+ { currentPage < 3 ? "" : setCurrentPage(1)} active={1 === active}>{1} }
+ { currentPage < 4 ? "" : currentPage < 5 ? setCurrentPage(2)} active={2 === active}>{2} : }
+ { currentPage > 1 ? setCurrentPage(currentPage - 1)}>{currentPage - 1} : "" }
+ setCurrentPage(currentPage)} active={currentPage === active}>{currentPage}
+ { currentPage < pageAmount ? setCurrentPage(currentPage + 1)}>{currentPage + 1} : "" }
+ { currentPage > pageAmount - 3 ? "" : currentPage === pageAmount - 3 ? setCurrentPage(pageAmount - 1)} active={pageAmount - 1 === active}>{pageAmount - 1} : }
+ { currentPage > pageAmount - 2 ? "" : setCurrentPage(pageAmount)} active={pageAmount === active}>{pageAmount} }
+ { currentPage === pageAmount ? : setCurrentPage(currentPage + 1)} />}
+
+
+ >
+ }
+ >
+
+
+ { isLoading ? :
+ setMembers(members.map(member => member.id === memberEdit.id ? Object.assign(member, memberEdit) : member))}/>}
+
+
+ )
}
\ No newline at end of file
diff --git a/src/Components/Private/System.js b/src/Components/Private/System.js
index a6059647..b36998fa 100644
--- a/src/Components/Private/System.js
+++ b/src/Components/Private/System.js
@@ -13,266 +13,266 @@ import EditSystem from "./Edit/EditSystem.js";
import EditSystemPrivacy from "./Edit/EditSystemPrivacy.js";
export default function System() {
- // match the url, if there's a member ID there, don't render this component at all
- const match = useRouteMatch("/dash/:memberID");
+ // match the url, if there's a member ID there, don't render this component at all
+ const match = useRouteMatch("/dash/:memberID");
- // get the user from the localstorage
- const [user, setUser] = useState(JSON.parse(localStorage.getItem("user")));
+ // get the user from the localstorage
+ const [user, setUser] = useState(JSON.parse(localStorage.getItem("user")));
- // bunch of useState stuff, used in the useEffect() hook below
- const [name, setName] = useState("");
- const [tag, setTag] = useState("");
- const [timezone, setTimezone] = useState("");
- const [avatar, setAvatar] = useState("");
- const [banner, setBanner] = useState("");
- const [desc, setDesc] = useState("");
- const [editDesc, setEditDesc] = useState("");
+ // bunch of useState stuff, used in the useEffect() hook below
+ const [name, setName] = useState("");
+ const [tag, setTag] = useState("");
+ const [timezone, setTimezone] = useState("");
+ const [avatar, setAvatar] = useState("");
+ const [banner, setBanner] = useState("");
+ const [desc, setDesc] = useState("");
+ const [editDesc, setEditDesc] = useState("");
- // more useState, this time to actually handle state
- // TODO: name them something more intuitive maybe?
- const [editMode, setEditMode] = useState(false);
- const [privacyEdit, setPrivacyEdit] = useState(false);
- const [privacyView, setPrivacyView] = useState(false);
+ // more useState, this time to actually handle state
+ // TODO: name them something more intuitive maybe?
+ const [editMode, setEditMode] = useState(false);
+ const [privacyEdit, setPrivacyEdit] = useState(false);
+ const [privacyView, setPrivacyView] = useState(false);
- const [errorAlert, setErrorAlert] = useState(false);
- const [ errorMessage, setErrorMessage ] = useState("");
+ const [errorAlert, setErrorAlert] = useState(false);
+ const [ errorMessage, setErrorMessage ] = useState("");
- // this useEffect does a couple of things after the user is gotten from localstorage
- useEffect(() => {
- // first require the discord markdown parser
- const { toHTML } = require("../../Functions/discord-parser.js");
+ // this useEffect does a couple of things after the user is gotten from localstorage
+ useEffect(() => {
+ // first require the discord markdown parser
+ const { toHTML } = require("../../Functions/discord-parser.js");
- // check if there's a name object in user, if it's null, set name to a blank string, otherwise set name to user.name
- if (user.name) {
- setName(user.name);
- } else setName("");
+ // check if there's a name object in user, if it's null, set name to a blank string, otherwise set name to user.name
+ if (user.name) {
+ setName(user.name);
+ } else setName("");
- // same as above, but with the user tag instead
- if (user.tag) {
- setTag(user.tag);
- } else setTag("");
+ // same as above, but with the user tag instead
+ if (user.tag) {
+ setTag(user.tag);
+ } else setTag("");
- // same as above but with timezone
- if (user.tz) {
- setTimezone(user.tz);
- } else setTimezone("");
+ // same as above but with timezone
+ if (user.tz) {
+ setTimezone(user.tz);
+ } else setTimezone("");
- // also trims the avatar url so that 1. pngs won't be converted to jpegs and 2. won't be resized to 256x256
- if (user.avatar_url) {
- var avatarsmall = user.avatar_url.replace("&format=jpeg", "");
- setAvatar(avatarsmall.replace("?width=256&height=256", ""));
- } else setAvatar("");
+ // also trims the avatar url so that 1. pngs won't be converted to jpegs and 2. won't be resized to 256x256
+ if (user.avatar_url) {
+ var avatarsmall = user.avatar_url.replace("&format=jpeg", "");
+ setAvatar(avatarsmall.replace("?width=256&height=256", ""));
+ } else setAvatar("");
- if (user.banner) {
- setBanner(user.banner);
- } else setBanner("");
+ if (user.banner) {
+ setBanner(user.banner);
+ } else setBanner("");
- // same as above, but with descriptions
- // two description variables! one is just the plain description, the other is parsed and converted to html
- if (user.description) {
- setDesc(toHTML(user.description));
- setEditDesc(user.description);
- } else {
- setDesc("(no description)");
- setEditDesc("");
- }
- }, [user.description, user.tag, user.avatar_url, user.tz, user.name, user.banner]);
+ // same as above, but with descriptions
+ // two description variables! one is just the plain description, the other is parsed and converted to html
+ if (user.description) {
+ setDesc(toHTML(user.description));
+ setEditDesc(user.description);
+ } else {
+ setDesc("(no description)");
+ setEditDesc("");
+ }
+ }, [user.description, user.tag, user.avatar_url, user.tz, user.name, user.banner]);
- // this just resizes the textarea when filled with larger amounts of text
- useEffect(() => {
- autosize(document.querySelector("textarea"));
- });
+ // this just resizes the textarea when filled with larger amounts of text
+ useEffect(() => {
+ autosize(document.querySelector("textarea"));
+ });
- if (match) return null;
+ if (match) return null;
- return (
- <>
- { user.banner && !localStorage.getItem("hidebanners") ?
: ""}
-
-
-
- {name} ({user.id})
-
- {user.avatar_url ? (
-
- }
- className="avatar"
- modal
- >
- {(close) => (
-
- )}
-
- ) : (
-
- )}
-
-
- {errorAlert ? (
-
- {errorMessage}
-
- ) : (
- ""
- )}
- {editMode ? (
-
- ) : (
- <>
-
-
- ID: {user.id}
-
-
- Tag: {tag}
-
-
- Timezone: {timezone}
-
- {privacyView ? (
- ""
- ) : (
- <>
-
- Privacy: {" "}
- setPrivacyView(true)}
- >
- View
-
-
- {user.banner ?
-
- Banner: {" "}
-
- View
-
- }
- className="banner"
- modal
- >
- {(close) => (
-
- )}
-
-
- : "" }
- >
- )}
-
- {privacyEdit ? (
-
- ) : privacyView ? (
- <>
-
- Viewing privacy settings
-
-
- Description: {user.description_privacy}
-
-
- Member list:
- {user.member_list_privacy}
-
-
- Front: {user.front_privacy}
-
-
- Front history: {user.front_history_privacy}
-
-
- setPrivacyView(false)}
- >
- Exit
- {" "}
- setPrivacyEdit(true)}
- >
- Edit
-
-
- >
- ) : (
- ""
- )}
-
- Description:
-
- { localStorage.getItem("twemoji") ?
:
}
- { !user.banner || !localStorage.getItem("bottombanners") ? "" :
-
- }
- {privacyEdit ? (
- ""
- ) : privacyView ? (
- ""
- ) : (
- <>
- setEditMode(true)}>
- Edit
-
- history.push(`/profile/${user.id}`)}
- >
- Profile
-
- >
- )}
- >
- )}
-
-
- >
- );
+ return (
+ <>
+ { user.banner && !localStorage.getItem("hidebanners") ?
: ""}
+
+
+
+ {name} ({user.id})
+
+ {user.avatar_url ? (
+
+ }
+ className="avatar"
+ modal
+ >
+ {(close) => (
+
+ )}
+
+ ) : (
+
+ )}
+
+
+ {errorAlert ? (
+
+ {errorMessage}
+
+ ) : (
+ ""
+ )}
+ {editMode ? (
+
+ ) : (
+ <>
+
+
+ ID: {user.id}
+
+
+ Tag: {tag}
+
+
+ Timezone: {timezone}
+
+ {privacyView ? (
+ ""
+ ) : (
+ <>
+
+ Privacy: {" "}
+ setPrivacyView(true)}
+ >
+ View
+
+
+ {user.banner ?
+
+ Banner: {" "}
+
+ View
+
+ }
+ className="banner"
+ modal
+ >
+ {(close) => (
+
+ )}
+
+
+ : "" }
+ >
+ )}
+
+ {privacyEdit ? (
+
+ ) : privacyView ? (
+ <>
+
+ Viewing privacy settings
+
+
+ Description: {user.description_privacy}
+
+
+ Member list:
+ {user.member_list_privacy}
+
+
+ Front: {user.front_privacy}
+
+
+ Front history: {user.front_history_privacy}
+
+
+ setPrivacyView(false)}
+ >
+ Exit
+ {" "}
+ setPrivacyEdit(true)}
+ >
+ Edit
+
+
+ >
+ ) : (
+ ""
+ )}
+
+ Description:
+
+ { localStorage.getItem("twemoji") ?
:
}
+ { !user.banner || !localStorage.getItem("bottombanners") ? "" :
+
+ }
+ {privacyEdit ? (
+ ""
+ ) : privacyView ? (
+ ""
+ ) : (
+ <>
+ setEditMode(true)}>
+ Edit
+
+ history.push(`/profile/${user.id}`)}
+ >
+ Profile
+
+ >
+ )}
+ >
+ )}
+
+
+ >
+ );
}
diff --git a/src/Pages/Home.js b/src/Pages/Home.js
index 7957c4e2..6ba65f5d 100644
--- a/src/Pages/Home.js
+++ b/src/Pages/Home.js
@@ -10,202 +10,202 @@ import { FaLockOpen, FaHome } from "react-icons/fa";
import API_URL from "../Constants/constants.js";
const Home = ({isInvalid, setIsInvalid, isLoading, setIsLoading, isSubmit, setIsSubmit, forceUpdate }) => {
- const { register, handleSubmit } = useForm();
+ const { register, handleSubmit } = useForm();
- const [ errorMessage, setErrorMessage ] = useState("");
+ const [ errorMessage, setErrorMessage ] = useState("");
- // submit login form, add the token to the localstorage
- const onSubmit = (data) => {
- localStorage.setItem("token", data.pkToken);
- logIn();
- };
+ // submit login form, add the token to the localstorage
+ const onSubmit = (data) => {
+ localStorage.setItem("token", data.pkToken);
+ logIn();
+ };
- function logIn() {
+ function logIn() {
- // make sure the token is not set to invalid and add a funny little spinner to indicate loading
- setIsInvalid(false);
- setIsLoading(true);
-
- // then fetch the system data with the token stored in localstorage
- fetch(`${API_URL}s/`, {
- method: "GET",
- headers: {
- Authorization: localStorage.getItem("token"),
- },
- })
- // put all the system data in localstorage
- .then((res) => {
- if (!res.ok)
- throw new Error('HTTP Status ' + res.status);
- return res.json();
- })
- .then((data) => {
- localStorage.setItem("user", JSON.stringify(data));
- setIsSubmit(true);
- setIsLoading(false);
- history.push("/dash");
- })
- // remove the token and user data from localstorage if there's an error, also set the token as invalid
- .catch((error) => {
- console.log(error);
- setIsInvalid(true);
- setErrorMessage(error.message);
- if (error.message === "HTTP Status 401")
- setErrorMessage("Your token is invalid.")
- localStorage.removeItem("token");
- localStorage.removeItem("user");
- setIsLoading(false);
- });
- }
+ // make sure the token is not set to invalid and add a funny little spinner to indicate loading
+ setIsInvalid(false);
+ setIsLoading(true);
+
+ // then fetch the system data with the token stored in localstorage
+ fetch(`${API_URL}s/`, {
+ method: "GET",
+ headers: {
+ Authorization: localStorage.getItem("token"),
+ },
+ })
+ // put all the system data in localstorage
+ .then((res) => {
+ if (!res.ok)
+ throw new Error('HTTP Status ' + res.status);
+ return res.json();
+ })
+ .then((data) => {
+ localStorage.setItem("user", JSON.stringify(data));
+ setIsSubmit(true);
+ setIsLoading(false);
+ history.push("/dash");
+ })
+ // remove the token and user data from localstorage if there's an error, also set the token as invalid
+ .catch((error) => {
+ console.log(error);
+ setIsInvalid(true);
+ setErrorMessage(error.message);
+ if (error.message === "HTTP Status 401")
+ setErrorMessage("Your token is invalid.")
+ localStorage.removeItem("token");
+ localStorage.removeItem("user");
+ setIsLoading(false);
+ });
+ }
- // Logout function
- function logOut() {
- setIsSubmit(false);
- localStorage.removeItem("token");
- localStorage.removeItem("user");
- history.push("/");
- forceUpdate();
- };
+ // Logout function
+ function logOut() {
+ setIsSubmit(false);
+ localStorage.removeItem("token");
+ localStorage.removeItem("user");
+ history.push("/");
+ forceUpdate();
+ };
- // when the homepage loads, check if there's a token, if there is, check if it's still valid
- // removing the dependency array causes a rerender loop, so just ignore ESlint here
- useEffect(() => {
- if (localStorage.getItem('token')) {
- checkLogIn();
- }
- }, []);
+ // when the homepage loads, check if there's a token, if there is, check if it's still valid
+ // removing the dependency array causes a rerender loop, so just ignore ESlint here
+ useEffect(() => {
+ if (localStorage.getItem('token')) {
+ checkLogIn();
+ }
+ }, []);
- // very similar to LogIn(), only difference is that it doesn't push the user afterwards
- // TODO: useless double code that probably could be refactored somehow
- function checkLogIn() {
- setIsInvalid(false);
- setIsLoading(true);
-
- fetch(`${API_URL}s/`,{
- method: 'GET',
- headers: {
- 'Authorization': localStorage.getItem("token")
- }}).then ( res => res.json()
- ).then (data => {
- localStorage.setItem('user', JSON.stringify(data));
- setIsSubmit(true);
- setIsLoading(false);
- })
- .catch (error => {
- console.log(error);
- setIsInvalid(true);
- localStorage.removeItem('token');
- localStorage.removeItem('user');
- setIsLoading(false);
- })
- };
+ // very similar to LogIn(), only difference is that it doesn't push the user afterwards
+ // TODO: useless double code that probably could be refactored somehow
+ function checkLogIn() {
+ setIsInvalid(false);
+ setIsLoading(true);
+
+ fetch(`${API_URL}s/`,{
+ method: 'GET',
+ headers: {
+ 'Authorization': localStorage.getItem("token")
+ }}).then ( res => res.json()
+ ).then (data => {
+ localStorage.setItem('user', JSON.stringify(data));
+ setIsSubmit(true);
+ setIsLoading(false);
+ })
+ .catch (error => {
+ console.log(error);
+ setIsInvalid(true);
+ localStorage.removeItem('token');
+ localStorage.removeItem('user');
+ setIsLoading(false);
+ })
+ };
- return (
- <>
- {/* if the page is loading, just show the loading component */}
- {isLoading ? (
-
- ) : (
-
-
-
-
- Login
-
-
-
- {/* if the login form has been submitted, and there's no user object, show a generic error */}
- {isSubmit && !localStorage.getItem("user") ? (
-
- Something went wrong, please try again.
-
- ) : (
- ""
- )}
- {/* if the inserted token is invalid, show invalid error!
- this also shows if the token used in checkLogIn() is invalid */}
- {isInvalid ? (
- {errorMessage}
- ) : (
- ""
- )}
- { // if there's a user object in localstorage, and there's a token in localstorage, the user is logged in already
- localStorage.getItem("user") && localStorage.getItem("token") ? (
- <>
-
- You are logged in already, click here to continue to the dash.
-
- history.push("/dash")}
- >
- Continue to dash
-
- logOut()}
- >Log out
-
- >
- ) : (
- // otherwise, show login form
-
-
-
-
- Enter your token here. You can get your token by using{" "}
- "pk;token" .
-
-
-
-
-
-
-
-
-
- Submit
-
-
-
-
- )}
-
-
- )}
-
-
-
-
- Welcome!
-
-
-
- Pk-webs is a web interface for PluralKit, it lets you edit your system and members using PluralKit's API, without having to use commands on discord.
-
- This website is an ongoing project and will be sporadically updated. If you have any issues or questions, join PluralKit's support server and ping us (Fulmine#1917). Since this project is unofficial, the actual pluralkit devs will not be able to help you with everything.
-
-
- FAQ:
- Will groups be added to this website?
- In the future, yes! Groups are not in the API as of now, which is what this site depends on. When APIv2 comes out, they will eventually be added here too.
- Will switch history/editing switches be added to this website?
- Probably when APIv2 comes out, right now the API is very limited in how it can handle switches. And we'd rather add everything in one go.
- What about bulk editing?
- Probably not. Bulk commands are planned for the main bot, and we're not sure how to fit them into the main site at the moment.
- Can you add [other feature]?
- Depends on the feature. Ping us in the support server and we'll let you know if it's feasible or not. If it's accessibility related, chances are good that we'll add it.
- Can i contribute to this?
- Yeah sure! The code is open source on github . Be warned though that we're currently in the middle of cleaning it all up and adding comments to everything, so some sections are quite messy still.
-
-
- >
- );
+ return (
+ <>
+ {/* if the page is loading, just show the loading component */}
+ {isLoading ? (
+
+ ) : (
+
+
+
+
+ Login
+
+
+
+ {/* if the login form has been submitted, and there's no user object, show a generic error */}
+ {isSubmit && !localStorage.getItem("user") ? (
+
+ Something went wrong, please try again.
+
+ ) : (
+ ""
+ )}
+ {/* if the inserted token is invalid, show invalid error!
+ this also shows if the token used in checkLogIn() is invalid */}
+ {isInvalid ? (
+ {errorMessage}
+ ) : (
+ ""
+ )}
+ { // if there's a user object in localstorage, and there's a token in localstorage, the user is logged in already
+ localStorage.getItem("user") && localStorage.getItem("token") ? (
+ <>
+
+ You are logged in already, click here to continue to the dash.
+
+ history.push("/dash")}
+ >
+ Continue to dash
+
+ logOut()}
+ >Log out
+
+ >
+ ) : (
+ // otherwise, show login form
+
+
+
+
+ Enter your token here. You can get your token by using{" "}
+ "pk;token" .
+
+
+
+
+
+
+
+
+
+ Submit
+
+
+
+
+ )}
+
+
+ )}
+
+
+
+
+ Welcome!
+
+
+
+ Pk-webs is a web interface for PluralKit, it lets you edit your system and members using PluralKit's API, without having to use commands on discord.
+
+ This website is an ongoing project and will be sporadically updated. If you have any issues or questions, join PluralKit's support server and ping us (Fulmine#1917). Since this project is unofficial, the actual pluralkit devs will not be able to help you with everything.
+
+
+ FAQ:
+ Will groups be added to this website?
+ In the future, yes! Groups are not in the API as of now, which is what this site depends on. When APIv2 comes out, they will eventually be added here too.
+ Will switch history/editing switches be added to this website?
+ Probably when APIv2 comes out, right now the API is very limited in how it can handle switches. And we'd rather add everything in one go.
+ What about bulk editing?
+ Probably not. Bulk commands are planned for the main bot, and we're not sure how to fit them into the main site at the moment.
+ Can you add [other feature]?
+ Depends on the feature. Ping us in the support server and we'll let you know if it's feasible or not. If it's accessibility related, chances are good that we'll add it.
+ Can i contribute to this?
+ Yeah sure! The code is open source on github . Be warned though that we're currently in the middle of cleaning it all up and adding comments to everything, so some sections are quite messy still.
+
+
+ >
+ );
};
export default Home;
diff --git a/src/Pages/MemberProfile.js b/src/Pages/MemberProfile.js
index 41665226..4e8d5eb9 100644
--- a/src/Pages/MemberProfile.js
+++ b/src/Pages/MemberProfile.js
@@ -7,48 +7,48 @@ import API_URL from '../Constants/constants';
import ProfilePage from '../Components/Public/ProfilePage';
const MemberProfile = () => {
- const { memberID } = useParams();
+ const { memberID } = useParams();
- const [isLoading, setIsLoading ] = useState(false);
- const [isError, setIsError ] = useState(false);
- const [isForbidden, setIsForbidden ] = useState(false);
- const [ member, setMember ] = useState({});
+ const [isLoading, setIsLoading ] = useState(false);
+ const [isError, setIsError ] = useState(false);
+ const [isForbidden, setIsForbidden ] = useState(false);
+ const [ member, setMember ] = useState({});
- const fetchMember = useCallback( () => {
- setIsLoading(true);
- setIsError(false);
-
- fetch(`${API_URL}m/${memberID}`,{
- method: 'GET',
- }).then ( res => {
- if (res.status === 403) {
- throw new Error('Access denied!');
- }
- return res.json()
- }
- ).then (data => {
- setMember(data)
- setIsLoading(false);
- })
- .catch (error => {
- if (error.message === 'Access denied!') {
- setIsForbidden(true);
- } else {
- console.log(error);
- setIsError(true);
- }
- setIsLoading(false);
- })
- }, [memberID])
-
- useEffect(() => {
- fetchMember();
- }, [fetchMember])
+ const fetchMember = useCallback( () => {
+ setIsLoading(true);
+ setIsError(false);
+
+ fetch(`${API_URL}m/${memberID}`,{
+ method: 'GET',
+ }).then ( res => {
+ if (res.status === 403) {
+ throw new Error('Access denied!');
+ }
+ return res.json()
+ }
+ ).then (data => {
+ setMember(data)
+ setIsLoading(false);
+ })
+ .catch (error => {
+ if (error.message === 'Access denied!') {
+ setIsForbidden(true);
+ } else {
+ console.log(error);
+ setIsError(true);
+ }
+ setIsLoading(false);
+ })
+ }, [memberID])
+
+ useEffect(() => {
+ fetchMember();
+ }, [fetchMember])
- return (
- isLoading ? : isError ?
- Error fetching member. : isForbidden ? This member is private. :
- );
+ return (
+ isLoading ? : isError ?
+ Error fetching member. : isForbidden ? This member is private. :
+ );
}
export default MemberProfile;
\ No newline at end of file
diff --git a/src/Pages/Settings.js b/src/Pages/Settings.js
index 719f057e..70ce6a40 100644
--- a/src/Pages/Settings.js
+++ b/src/Pages/Settings.js
@@ -7,250 +7,250 @@ import Toggle from "react-toggle";
const Settings = ({ forceUpdate }) => {
// this all should be pretty self-explanatory, might add comments later tho
- return (
-
-
-
-
- Settings
-
-
-
-
- Change how you view and use pk-webs here, changes will be saved after
- refreshing. You will have to apply them again in different browsers
- and on different devices.
-
-
-
-
- {localStorage.getItem("opendyslexic") ? (
- {
- localStorage.removeItem("opendyslexic");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("opendyslexic", "true");
- forceUpdate();
- }}
- />
- )}
- Use opendyslexic?
-
-
- {localStorage.getItem("twemoji") ? (
- {
- localStorage.removeItem("twemoji");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("twemoji", "true");
- forceUpdate();
- }}
- />
- )}
- Use twemoji?
-
-
- {localStorage.getItem("pagesonly") ? (
- {
- localStorage.removeItem("pagesonly");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("pagesonly", "true");
- forceUpdate();
- }}
- />
- )}
- Use only member pages?
-
-
- {localStorage.getItem("fullbg") ? (
- {
- localStorage.removeItem("fullbg");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("fullbg", "true");
- forceUpdate();
- }}
- />
- )}
- Remove gradient from background color?
-
-
- {localStorage.getItem("colorbg") ? (
- {
- localStorage.removeItem("colorbg");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("colorbg", "false");
- forceUpdate();
- }}
- />
- )}
- Hide colored backgrounds altogether?
-
-
- {localStorage.getItem("expandcards") ? (
- {
- localStorage.removeItem("expandcards");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("expandcards", "true");
- forceUpdate();
- }}
- />
- )}
- Expand member cards on default?
-
-
- {localStorage.getItem("hidebanners") ? (
- {
- localStorage.removeItem("hidebanners");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("hidebanners", "true");
- forceUpdate();
- }}
- />
- )}
- Hide banners at the top?
-
-
- {localStorage.getItem("bottombanners") ? (
- {
- localStorage.removeItem("bottombanners");
- forceUpdate();
- }}
- />
- ) : (
- {
- localStorage.setItem("bottombanners", "true");
- forceUpdate();
- }}
- />
- )}
- Show banners at the bottom?
-
-
-
-
- );
+ return (
+
+
+
+
+ Settings
+
+
+
+
+ Change how you view and use pk-webs here, changes will be saved after
+ refreshing. You will have to apply them again in different browsers
+ and on different devices.
+
+
+
+
+ {localStorage.getItem("opendyslexic") ? (
+ {
+ localStorage.removeItem("opendyslexic");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("opendyslexic", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Use opendyslexic?
+
+
+ {localStorage.getItem("twemoji") ? (
+ {
+ localStorage.removeItem("twemoji");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("twemoji", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Use twemoji?
+
+
+ {localStorage.getItem("pagesonly") ? (
+ {
+ localStorage.removeItem("pagesonly");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("pagesonly", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Use only member pages?
+
+
+ {localStorage.getItem("fullbg") ? (
+ {
+ localStorage.removeItem("fullbg");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("fullbg", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Remove gradient from background color?
+
+
+ {localStorage.getItem("colorbg") ? (
+ {
+ localStorage.removeItem("colorbg");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("colorbg", "false");
+ forceUpdate();
+ }}
+ />
+ )}
+ Hide colored backgrounds altogether?
+
+
+ {localStorage.getItem("expandcards") ? (
+ {
+ localStorage.removeItem("expandcards");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("expandcards", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Expand member cards on default?
+
+
+ {localStorage.getItem("hidebanners") ? (
+ {
+ localStorage.removeItem("hidebanners");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("hidebanners", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Hide banners at the top?
+
+
+ {localStorage.getItem("bottombanners") ? (
+ {
+ localStorage.removeItem("bottombanners");
+ forceUpdate();
+ }}
+ />
+ ) : (
+ {
+ localStorage.setItem("bottombanners", "true");
+ forceUpdate();
+ }}
+ />
+ )}
+ Show banners at the bottom?
+
+
+
+
+ );
};
export default Settings;
diff --git a/src/index.js b/src/index.js
index c54904ce..1ddf9b8b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -6,8 +6,8 @@ import './index.css';
import App from './App';
ReactDOM.render(
-
-
- ,
- document.getElementById('root')
+
+
+ ,
+ document.getElementById('root')
);