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; } 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 = (
{party.editable ? ( ) : (
)}
); const generateTitle = () => { let title = party.raid ? `[${party.raid?.name[locale]}] ` : ""; const username = party.user != null ? `@${party.user?.username}` : t("header.anonymous"); if (party.name != null) title += t("header.byline", { partyName: party.name, username: username, }); else if (party.name == null && party.editable && router.route === "/new") title = t("header.new_team"); else title += t("header.untitled_team", { username: username, }); return title; }; return (
{generateTitle()} {editable && (party.name || party.description || party.raid) ? readOnly : emptyDetails} {editable}
); }; export default PartyDetails;