import React from 'react' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import classNames from 'classnames' import { Hovercard, HovercardContent, HovercardTrigger, } from '~components/common/Hovercard' import HovercardHeader from '~components/HovercardHeader' import Button from '~components/common/Button' import ax from '~data/ax' import styles from './index.module.scss' interface Props { gridWeapon: GridWeapon children: React.ReactNode onTriggerClick: () => void } interface KeyNames { [key: string]: { [key: string]: string en: string ja: string } } const WeaponHovercard = (props: Props) => { const router = useRouter() const locale = router.locale && ['en', 'ja'].includes(router.locale) ? router.locale : 'en' const { t } = useTranslation('common') const Element = ['null', 'wind', 'fire', 'water', 'earth', 'dark', 'light'] const WeaponKeyNames: KeyNames = { '2': { en: 'Pendulum', ja: 'ペンデュラム', }, '3': { en: 'Teluma', ja: 'テルマ', }, '17': { en: 'Gauph Key', ja: 'ガフスキー', }, '22': { en: 'Emblem', ja: 'エンブレム', }, '34': { en: 'Teluma', ja: 'テルマ', }, } const tintElement = props.gridWeapon.object.element == 0 && props.gridWeapon.element ? Element[props.gridWeapon.element] : Element[props.gridWeapon.object.element] function goTo() { const urlSafeName = props.gridWeapon.object.name.en.replaceAll(' ', '_') const url = `https://gbf.wiki/${urlSafeName}` window.open(url, '_blank') } const hovercardSide = () => { if (props.gridWeapon.position == -1) return 'right' else if ([6, 7, 8, 9, 10, 11].includes(props.gridWeapon.position)) return 'top' else return 'bottom' } function telumaImage(index: number) { const baseUrl = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-keys/` // If there is a grid weapon, it is a Draconic Weapon and it has keys if ( (props.gridWeapon.object.series === 3 || props.gridWeapon.object.series == 34) && props.gridWeapon.weapon_keys ) { const weaponKey = props.gridWeapon.weapon_keys[index] const altText = weaponKey.name[locale] let filename = `${weaponKey.slug}` if ( index === 1 || (index === 2 && parseInt(weaponKey.granblue_id) === 15008) ) { filename += `-${props.gridWeapon.object.element}` } return ( {altText} ) } } function opusImage(index: number) { const baseUrl = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-keys/` // If there is a grid weapon, it is a Dark Opus Weapon and it has keys if (props.gridWeapon.object.series === 2 && props.gridWeapon.weapon_keys) { const weaponKey = props.gridWeapon.weapon_keys[index] const altText = weaponKey.name[locale] let filename = weaponKey.slug if (weaponKey.slot === 1) { const element = props.gridWeapon.object.element const mod = props.gridWeapon.object.name.en.includes('Repudiation') ? 'primal' : 'magna' const suffixes = [ 'pendulum-strength', 'pendulum-zeal', 'pendulum-strife', 'chain-temperament', 'chain-restoration', 'chain-glorification', ] if (suffixes.includes(weaponKey.slug)) { filename += `-${mod}-${element}` } } return ( {altText} ) } } function ultimaImage(index: number) { const baseUrl = `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/weapon-keys/` // If there is a grid weapon, it is a Dark Opus Weapon and it has keys if (props.gridWeapon.object.series === 17 && props.gridWeapon.weapon_keys) { const weaponKey = props.gridWeapon.weapon_keys[index] const altText = weaponKey.name[locale] let filename = weaponKey.slug if (weaponKey.slot === 0) { filename += `-${props.gridWeapon.object.proficiency}` } return ( {altText} ) } } const createPrimaryAxSkillString = () => { const primaryAxSkills = ax[props.gridWeapon.object.ax_type - 1] if (props.gridWeapon.ax) { const simpleAxSkill = props.gridWeapon.ax[0] const axSkill = primaryAxSkills.find( (skill) => skill.id == simpleAxSkill.modifier ) return `${axSkill?.name[locale]} +${simpleAxSkill.strength}${ axSkill?.suffix ? axSkill.suffix : '' }` } return '' } const createSecondaryAxSkillString = () => { const primaryAxSkills = ax[props.gridWeapon.object.ax_type - 1] if (props.gridWeapon.ax) { const primarySimpleAxSkill = props.gridWeapon.ax[0] const secondarySimpleAxSkill = props.gridWeapon.ax[1] const primaryAxSkill = primaryAxSkills.find( (skill) => skill.id == primarySimpleAxSkill.modifier ) if (primaryAxSkill && primaryAxSkill.secondary) { const secondaryAxSkill = primaryAxSkill.secondary.find( (skill) => skill.id == secondarySimpleAxSkill.modifier ) return `${secondaryAxSkill?.name[locale]} +${ secondarySimpleAxSkill.strength }${secondaryAxSkill?.suffix ? secondaryAxSkill.suffix : ''}` } } return '' } const awakeningSection = (
{t('modals.weapon.subtitles.awakening')}
{props.gridWeapon.awakening?.type.name[locale]} {`${props.gridWeapon.awakening?.type.name[locale]}`}   {`Lv${props.gridWeapon.awakening?.level}`}
) const keysSection = (
{WeaponKeyNames[props.gridWeapon.object.series] && (
{WeaponKeyNames[props.gridWeapon.object.series][locale]} {locale === 'en' && 's'}
)} {props.gridWeapon.weapon_keys?.map((weaponKey, i) => (
{[3, 34].includes(props.gridWeapon.object.series) && ( {telumaImage(i)} )} {props.gridWeapon.object.series === 17 && ( {ultimaImage(i)} )} {props.gridWeapon.object.series === 2 && ( {opusImage(i)} )} {weaponKey.name[locale]}
))}
) const axSection = (
{t('modals.weapon.subtitles.ax_skills')}
AX1
{createPrimaryAxSkillString()}
{props.gridWeapon.ax && props.gridWeapon.ax[1].modifier && props.gridWeapon.ax[1].strength ? (
AX2
{createSecondaryAxSkillString()}
) : ( '' )}
) const wikiButton = (