'use client' import { ForwardedRef, forwardRef, type ReactNode, RefAttributes, useState } from 'react' import { PktAlert } from '../alert/Alert' import { PktButton } from '../button/Button' export interface IPktInputWrapper extends RefAttributes { forId: string label: string helptext?: string | ReactNode helptextDropdown?: string | ReactNode helptextDropdownButton?: string counter?: boolean counterCurrent?: number counterMaxLength?: number optionalTag?: boolean optionalText?: string requiredTag?: boolean requiredText?: string tagText?: string | null hasError?: boolean errorMessage?: string | ReactNode disabled?: boolean inline?: boolean ariaDescribedby?: string useWrapper?: boolean children?: ReactNode className?: string hasFieldset?: boolean role?: string counterPosition?: 'top' | 'bottom' } export const PktInputWrapper = forwardRef( ( { forId, label, helptext, helptextDropdown, helptextDropdownButton, counter, counterCurrent = 0, counterMaxLength, optionalTag = false, optionalText = 'Valgfritt', requiredTag = false, requiredText = 'Må fylles ut', tagText = null, hasError = false, errorMessage, disabled = false, inline = false, ariaDescribedby, useWrapper = true, children, className = '', hasFieldset = false, role = 'group', counterPosition = 'bottom', }: IPktInputWrapper, ref: ForwardedRef, ) => { const [isHelpTextOpen, setIsHelpTextOpen] = useState(false) const describedBy = ariaDescribedby || (helptext ? `${forId}-helptext` : undefined) const showCounter = !!counter const counterTop = showCounter && counterPosition === 'top' const counterBottom = showCounter && counterPosition === 'bottom' const toggleHelpText = () => setIsHelpTextOpen((prev) => !prev) const wrapperClasses = [ 'pkt-inputwrapper', className, hasError ? 'pkt-inputwrapper--error' : '', disabled ? 'pkt-inputwrapper--disabled' : '', inline ? 'pkt-inputwrapper--inline' : '', ] .filter(Boolean) .join(' ') const tagClasses = ['pkt-tag', 'pkt-tag--small', 'pkt-tag--thin-text'].join(' ') const Counter = () => showCounter ? (
{counterCurrent} {counterMaxLength ? `/${counterMaxLength}` : ''}
) : null const renderTags = () => { return ( <> {tagText && {tagText}} {optionalTag && {optionalText}} {requiredTag && {requiredText}} ) } const renderLabel = () => { const labelContent = ( <> {label} {renderTags()} ) if (!useWrapper) { return ( ) } if (hasFieldset) { return ( {labelContent} ) } return ( ) } const renderHelptext = () => { if (!helptext && !helptextDropdown) return null return ( <> {helptext && useWrapper && (
{helptext}
)} {helptextDropdown && (
om inputfeltet', }} />
{helptextDropdown}
)} ) } const content = ( <> {renderLabel()} {renderHelptext()} {counterTop && } {children} {counterBottom && } {hasError && errorMessage && (
{errorMessage}
)} ) return (
{hasFieldset ? (
{content}
) : (
{content}
)}
) }, ) PktInputWrapper.displayName = 'PktInputWrapper'