import React, { useEffect, useState } from 'react'; import { Link } from "react-router-dom"; import * as BS from 'react-bootstrap' import { useForm } from "react-hook-form"; import moment from 'moment'; import Popup from 'reactjs-popup'; import 'reactjs-popup/dist/index.css'; import autosize from 'autosize'; import LazyLoad from 'react-lazyload'; import Twemoji from 'react-twemoji'; import API_URL from "../../Constants/constants.js"; import defaultAvatar from '../../default_discord_avatar.png' 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 [ 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 [ errorAlert, setErrorAlert ] = useState(false); const [ wrongID, setWrongID ] = useState(false); const [ memberDeleted, setMemberDeleted ] = useState(false); const { register: registerEdit, handleSubmit: handleSubmitEdit, setValue } = useForm(); const { register: registerPrivacy, handleSubmit: handleSubmitPrivacy } = useForm(); const { register: registerDelete, handleSubmit: handleSubmitDelete } = useForm(); const { register: registerProxy, handleSubmit: handleSubmitProxy, } = useForm(); useEffect(() => { autosize(document.querySelectorAll('textarea')); }) useEffect(() => { const { toHTML } = require('../../Functions/discord-parser.js'); 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(''); } 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.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.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]); const submitEdit = data => { props.edit(Object.assign(member, data)); fetch(`${API_URL}m/${member.id}`,{ method: 'PATCH', body: JSON.stringify(data), headers: { 'Content-Type': 'application/json', 'Authorization': localStorage.getItem("token") }}).then (res => res.json() ).then (data => { setMember(prevState => {return {...prevState, ...data}}); setErrorAlert(false); setEditMode(false); } ).catch (error => { console.error(error); setErrorAlert(true); }); } const submitPrivacy = data => { props.edit(Object.assign(member, data)); fetch(`${API_URL}m/${member.id}`,{ method: 'PATCH', body: JSON.stringify(data), headers: { 'Content-Type': 'application/json', 'Authorization': localStorage.getItem("token") }}).then (res => res.json() ).then (data => { setMember(prevState => {return {...prevState, ...data}}); setErrorAlert(false); setprivacyEdit(false) } ).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 resetProxyFields() { setproxyEdit(false); setProxyTags(member.proxy_tags); } const submitProxy = data => { 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); }); } 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'); document.body.removeChild(textField); } function renderCard() { return ( { errorAlert ? Something went wrong, please try logging in and out again. : "" } { 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 ? localStorage.getItem('twemoji') ? Display name: {displayName} : Display name: {displayName} : "" } { member.birthday ? Birthday: {birthday} : "" } { member.pronouns ? localStorage.getItem('twemoji') ? Pronouns: : Pronouns: : "" } { member.color ? Color: {color} : "" } { privacyView ? "" : proxyView ? "" : Privacy: setPrivacyView(true)}>View } { privacyView ? "" : proxyView ? "" : Proxy tags: setProxyView(true)}>View } 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') ? : } { 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 => ( close()}> )} : } {localStorage.getItem("expandcards") ? renderCard() : {renderCard()} } ) }
If you're sure you want to delete this member, please enter the member ID ({member.id}) below.
{proxytag.prefix}text{proxytag.suffix}
Description: