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 '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 ? 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 }0 { privacyView || proxyView || !member.banner ? "" : Banner:{" "} View } className="banner" modal > {(close) => (
close()}>
)}
} Created: {created}
{ privacyEdit ?
Editing privacy settings
Visibility: Name: Description: Avatar: Birthday: Pronouns: Meta: 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 => (
close()}>
)}
: }
{localStorage.getItem("expandcards") ? renderCard() : {renderCard()} }
) }