import React, { useEffect, useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/router' import { useSnapshot } from 'valtio' import { useTranslation } from 'next-i18next' import classNames from 'classnames' import 'fix-date' import { accountState } from '~utils/accountState' import { formatTimeAgo } from '~utils/timeAgo' import Button from '~components/common/Button' import SaveIcon from '~public/icons/Save.svg' import ShieldIcon from '~public/icons/Shield.svg' import './index.scss' interface Props { shortcode: string id: string name: string raid: Raid grid: GridWeapon[] user?: User fullAuto: boolean autoGuard: boolean favorited: boolean createdAt: Date displayUser?: boolean | false onClick: (shortcode: string) => void onSave?: (partyId: string, favorited: boolean) => void } const GridRep = (props: Props) => { const numWeapons: number = 9 const { account } = useSnapshot(accountState) const router = useRouter() const { t } = useTranslation('common') const locale = router.locale && ['en', 'ja'].includes(router.locale) ? router.locale : 'en' const [mainhand, setMainhand] = useState() const [weapons, setWeapons] = useState>({}) const [grid, setGrid] = useState>({}) const titleClass = classNames({ empty: !props.name, }) const raidClass = classNames({ raid: true, empty: !props.raid, }) const userClass = classNames({ user: true, empty: !props.user, }) useEffect(() => { const newWeapons = Array(numWeapons) const gridWeapons = Array(numWeapons) let foundMainhand = false for (const [key, value] of Object.entries(props.grid)) { if (value.position == -1) { setMainhand(value.object) foundMainhand = true } else if (!value.mainhand && value.position != null) { newWeapons[value.position] = value.object gridWeapons[value.position] = value } } if (!foundMainhand) { setMainhand(undefined) } setWeapons(newWeapons) setGrid(gridWeapons) }, [props.grid]) function navigate() { props.onClick(props.shortcode) } function generateMainhandImage() { let url = '' if (mainhand) { const weapon = Object.values(props.grid).find( (w) => w && w.object.id === mainhand.id ) if (mainhand.element == 0 && weapon && weapon.element) { url = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-main/${mainhand.granblue_id}_${weapon.element}.jpg` } else { url = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-main/${mainhand.granblue_id}.jpg` } } return mainhand && props.grid[0] ? ( {mainhand.name[locale]} ) : ( '' ) } function generateGridImage(position: number) { let url = '' const weapon = weapons[position] const gridWeapon = grid[position] if (weapon && gridWeapon) { if (weapon.element == 0 && gridWeapon.element) { url = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-grid/${weapon.granblue_id}_${gridWeapon.element}.jpg` } else { url = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-grid/${weapon.granblue_id}.jpg` } } return weapons[position] ? ( {weapons[position]?.name[locale]} ) : ( '' ) } function sendSaveData() { if (props.onSave) props.onSave(props.id, props.favorited) } const userImage = () => { if (props.user && props.user.avatar) { return ( {props.user.avatar.picture} ) } else return ( {t('no_user')} ) } const linkedAttribution = () => ( {userImage()} {props.user ? props.user.username : t('no_user')} ) const unlinkedAttribution = () => (
{userImage()} {props.user ? props.user.username : t('no_user')}
) function fullAutoString() { const fullAutoElement = ( {` · ${t('party.details.labels.full_auto')}`} ) const autoGuardElement = ( ) return (
{fullAutoElement} {props.autoGuard ? autoGuardElement : ''}
) } const details = (

{props.name ? props.name : t('no_title')}

{props.raid ? props.raid.name[locale] : t('no_raid')} {props.fullAuto ? fullAutoString() : ''}
) const detailsWithUsername = (

{props.name ? props.name : t('no_title')}

{props.raid ? props.raid.name[locale] : t('no_raid')} {props.fullAuto ? ( {` · ${t('party.details.labels.full_auto')}`} ) : ( '' )}
{account.authorized && ((props.user && account.user && account.user.id !== props.user.id) || !props.user) ? (
{props.user ? linkedAttribution() : unlinkedAttribution()}
) return ( {props.displayUser ? detailsWithUsername : details}
{generateMainhandImage()}
    {Array.from(Array(numWeapons)).map((x, i) => { return (
  • {generateGridImage(i)}
  • ) })}
) } export default GridRep