'use client' import classNames from 'classnames' import { ForwardedRef, forwardRef, HTMLAttributes, ReactNode, RefObject, useCallback, useEffect, useMemo, useRef, useState, } from 'react' import { PktIcon } from '..' interface BasePktTagProps { skin?: 'blue' | 'blue-light' | 'blue-dark' | 'green' | 'red' | 'beige' | 'yellow' | 'grey' | 'gray' textStyle?: 'normal-text' | 'thin-text' size?: 'small' | 'medium' | 'large' closeTag?: boolean iconName?: string ariaLabel?: string onClose?: () => void children?: ReactNode } interface ButtonPktTagProps extends BasePktTagProps, HTMLAttributes { closeTag: true type?: 'button' | 'submit' | 'reset' } interface SpanPktTagProps extends BasePktTagProps, HTMLAttributes { closeTag?: false | undefined onClose?: undefined type?: undefined } export type IPktTag = ButtonPktTagProps | SpanPktTagProps export const PktTag = forwardRef( ( { children, skin, textStyle, size, closeTag, className, iconName, ariaLabel, onClose, type, 'aria-description': ariaDescriptionPropValue, ...props }: ButtonPktTagProps | SpanPktTagProps, forwardedRef: ForwardedRef, ) => { const [isClosed, setClosed] = useState(false) const close = useCallback(() => { setClosed(true) if (onClose) { onClose() } }, [onClose]) const spanRef: RefObject = useRef(null) const [labelText, setLabelText] = useState('') useEffect(() => { setLabelText(spanRef.current?.textContent?.trim() ?? '') }, [children]) const ariaDescription = useMemo(() => { if (closeTag && !ariaLabel) return (labelText && `Klikk for å fjerne ${labelText}`) || ariaDescriptionPropValue }, [closeTag, ariaLabel, labelText, ariaDescriptionPropValue]) const classes = { 'pkt-tag': true, [`pkt-tag--${size}`]: !!size, [`pkt-tag--${skin}`]: !!skin, [`pkt-tag--${textStyle}`]: !!textStyle, } const btnClasses = { 'pkt-tag': true, 'pkt-btn': true, 'pkt-btn--tertiary': true, [`pkt-tag--${textStyle}`]: !!textStyle, [`pkt-tag--${size}`]: !!size, [`pkt-tag--${skin}`]: !!skin, 'pkt-btn--icons-right-and-left': closeTag && !!iconName, 'pkt-hide': isClosed, } if (closeTag) { return ( ) } else { return ( }> {iconName && ) } }, ) PktTag.displayName = 'PktTag'