import React, { useState } from 'react' import { useRouter } from 'next/router' import { Trans, useTranslation } from 'next-i18next' import classNames from 'classnames' import Alert from '~components/common/Alert' import Button from '~components/common/Button' import { ContextMenu, ContextMenuTrigger, ContextMenuContent, } from '~components/common/ContextMenu' import ContextMenuItem from '~components/common/ContextMenuItem' import EllipsisIcon from '~public/icons/Ellipsis.svg' import PlusIcon from '~public/icons/Add.svg' import styles from './index.module.scss' // Props interface Props extends React.ComponentPropsWithoutRef<'div'> { skill?: JobSkill position: number editable: boolean small?: boolean hasJob: boolean removeJobSkill: (position: number) => void } const defaultProps = { small: false, } const JobSkillItem = React.forwardRef( function useJobSkillItem( { skill, position, editable, small, hasJob, removeJobSkill: sendJobSkillToRemove, ...props }, forwardedRef ) { // Set up translation const router = useRouter() const { t } = useTranslation('common') const locale = router.locale && ['en', 'ja'].includes(router.locale) ? router.locale : 'en' // States: Component const [alertOpen, setAlertOpen] = useState(false) const [contextMenuOpen, setContextMenuOpen] = useState(false) // Classes const classes = classNames({ [styles.skill]: true, [styles.editable]: editable, [styles.small]: small, }) const imageClasses = classNames({ [styles.placeholder]: !skill, [styles.image]: true, [styles.editable]: editable && hasJob, }) const labelClasses = classNames({ [styles.placeholder]: !skill, [styles.text]: true, }) const buttonClasses = classNames({ [styles.clicked]: contextMenuOpen, }) // Methods: Data mutation function removeJobSkill() { if (skill) sendJobSkillToRemove(position) setAlertOpen(false) } // Methods: Context menu function handleButtonClicked() { setContextMenuOpen(!contextMenuOpen) } function handleContextMenuOpenChange(open: boolean) { if (!open) setContextMenuOpen(false) } // Methods: Rendering const skillImage = () => { let jsx: React.ReactNode if (skill) { jsx = ( {skill.name[locale]} ) } else { jsx = (
{editable && hasJob ? : ''}
) } return jsx } const label = () => { let jsx: React.ReactNode if (skill) { jsx =

{skill.name[locale]}

} else if (editable && hasJob) { jsx =

{t('job_skills.state.selectable')}

} else { jsx = (

{t('job_skills.state.no_skill')}

) } return jsx } const removeAlert = () => { return ( setAlertOpen(false)} cancelActionText={t('buttons.cancel')} message={ Are you sure you want to remove{' '} {{ job_skill: skill?.name[locale] }} from your team? } /> ) } const contextMenu = () => { return ( <>