import React, { useState } from 'react' import Head from 'next/head' import { useRouter } from 'next/router' import { useSnapshot } from 'valtio' import { useTranslation } from 'next-i18next' import Linkify from 'react-linkify' import classNames from 'classnames' import * as AlertDialog from '@radix-ui/react-alert-dialog' import CrossIcon from '~public/icons/Cross.svg' import Button from '~components/Button' import CharLimitedFieldset from '~components/CharLimitedFieldset' import RaidDropdown from '~components/RaidDropdown' import TextFieldset from '~components/TextFieldset' import { accountState } from '~utils/accountState' import { appState } from '~utils/appState' import './index.scss' import Link from 'next/link' import { formatTimeAgo } from '~utils/timeAgo' const emptyRaid: Raid = { id: '', name: { en: '', ja: '' }, slug: '', level: 0, group: 0, element: 0 } // Props interface Props { editable: boolean updateCallback: (name?: string, description?: string, raid?: Raid) => void deleteCallback: (event: React.MouseEvent) => void } const PartyDetails = (props: Props) => { const { party, raids } = useSnapshot(appState) const { account } = useSnapshot(accountState) const { t } = useTranslation('common') const router = useRouter() const locale = router.locale || 'en' const nameInput = React.createRef() const descriptionInput = React.createRef() const raidSelect = React.createRef() const readOnlyClasses = classNames({ 'PartyDetails': true, 'ReadOnly': true, 'Visible': !party.detailsVisible }) const editableClasses = classNames({ 'PartyDetails': true, 'Editable': true, 'Visible': party.detailsVisible }) const emptyClasses = classNames({ 'EmptyDetails': true, 'Visible': !party.detailsVisible }) const userClass = classNames({ 'user': true, 'empty': !party.user }) const linkClass = classNames({ 'wind': party && party.element == 1, 'fire': party && party.element == 2, 'water': party && party.element == 3, 'earth': party && party.element == 4, 'dark': party && party.element == 5, 'light': party && party.element == 6 }) const [errors, setErrors] = useState<{ [key: string]: string }>({ name: '', description: '' }) function handleInputChange(event: React.ChangeEvent) { event.preventDefault() const { name, value } = event.target let newErrors = errors setErrors(newErrors) } function handleTextAreaChange(event: React.ChangeEvent) { event.preventDefault() const { name, value } = event.target let newErrors = errors setErrors(newErrors) } function toggleDetails() { appState.party.detailsVisible = !appState.party.detailsVisible // if (appState.party.detailsVisible) // scroll.scrollToBottom() // else // scroll.scrollToTop() } function updateDetails(event: React.MouseEvent) { const nameValue = nameInput.current?.value const descriptionValue = descriptionInput.current?.value const raid = raids.find(raid => raid.slug === raidSelect.current?.value) props.updateCallback(nameValue, descriptionValue, raid) toggleDetails() } const userImage = () => { if (party.user) return ( {party.user.picture.picture} ) else return (
) } const userBlock = () => { return (
{ userImage() } { (party.user) ? party.user.username : t('no_user') }
) } const linkedUserBlock = (user: User) => { return ( ) } const linkedRaidBlock = (raid: Raid) => { return ( ) } const deleteButton = () => { if (party.editable) { return ( {t('buttons.delete')} {t('modals.delete_team.title')} {t('modals.delete_team.description')}
{t('modals.delete_team.buttons.cancel')} props.deleteCallback(e)}>{t('modals.delete_team.buttons.confirm')}
) } else { return ('') } } const editable = (
{ (router.pathname !== '/new') ? deleteButton() : '' }
) const readOnly = (
{ (party.name) ?

{party.name}

: '' }
{ (party.user) ? linkedUserBlock(party.user) : userBlock() } { (party.raid) ? linkedRaidBlock(party.raid) : '' } { (party.created_at != undefined) ? : '' }
{ (party.editable) ? :
}
{ (party.description) ?

{party.description}

: '' }
) const emptyDetails = (
) const generateTitle = () => { let title = '' const username = (party.user != null) ? `@${party.user?.username}` : 'Anonymous' if (party.name != null) title = `${party.name} by ${username}` else if (party.name == null && party.editable && router.route === '/new') title = "New Team" else title = `Untitled team by ${username}` return title } return (
{generateTitle()} { (editable && (party.name || party.description || party.raid)) ? readOnly : emptyDetails} {editable}
) } export default PartyDetails