'use client' import React, { useEffect, useState } from 'react' import { getCookie } from 'cookies-next' import { useTranslations } from 'next-intl' import classNames from 'classnames' import Alert from '~components/common/Alert' import SearchModal from '~components/search/SearchModal' import { ContextMenu, ContextMenuTrigger, ContextMenuContent, } from '~components/common/ContextMenu' import ContextMenuItem from '~components/common/ContextMenuItem' import Button from '~components/common/Button' import type { SearchableObject } from '~types' import PlusIcon from '~public/icons/Add.svg' import SettingsIcon from '~public/icons/Settings.svg' import styles from './index.module.scss' interface Props { guidebook: Guidebook | undefined position: number editable: boolean removeGuidebook: (position: number) => void updateObject: (object: SearchableObject, position: number) => void } const GuidebookUnit = ({ guidebook, position, editable, removeGuidebook: sendGuidebookToRemove, updateObject, }: Props) => { // Translations and locale const t = useTranslations('common') const locale = (getCookie('NEXT_LOCALE') as string) || 'en' // State: UI const [searchModalOpen, setSearchModalOpen] = useState(false) const [contextMenuOpen, setContextMenuOpen] = useState(false) const [alertOpen, setAlertOpen] = useState(false) // State: Other const [imageUrl, setImageUrl] = useState('') // Classes const classes = classNames({ unit: true, [styles.unit]: true, [styles.editable]: editable, [styles.filled]: guidebook !== undefined, [styles.empty]: guidebook == undefined, }) const buttonClasses = classNames({ Options: true, Clicked: contextMenuOpen, }) // Hooks useEffect(() => { generateImageUrl() }, [guidebook]) // Methods: Open layer function openSearchModal() { if (editable) setSearchModalOpen(true) } function openRemoveGuidebookAlert() { setAlertOpen(true) } // Methods: Handle button clicked function handleButtonClicked() { setContextMenuOpen(!contextMenuOpen) } // Methods: Handle open change function handleContextMenuOpenChange(open: boolean) { if (!open) setContextMenuOpen(false) } function handleSearchModalOpenChange(open: boolean) { setSearchModalOpen(open) } // Methods: Mutate data function removeGuidebook() { if (guidebook) sendGuidebookToRemove(position) setAlertOpen(false) } // Methods: Image string generation function generateImageUrl() { let imgSrc = guidebook ? `${process.env.NEXT_PUBLIC_SIERO_IMG_URL}/guidebooks/book_${guidebook.granblue_id}.png` : '' setImageUrl(imgSrc) } const placeholderImageUrl = '/images/placeholders/placeholder-guidebook.png' // Methods: Layer element rendering const contextMenu = () => { if (editable && guidebook) { return ( <>