'use client' import React, { useState } from 'react' import { getCookie } from 'cookies-next' import { useTranslations } from 'next-intl' 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 t = useTranslations('common') const locale = (getCookie('NEXT_LOCALE') as string) || 'en' ? 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={ <> {t.rich('modals.job_skills.messages.remove', { job_skill: skill?.name[locale], strong: (chunks) => {chunks} })} } /> ) } const contextMenu = () => { return ( <>