import React, { useEffect, useId, useRef, useState } from 'react'; import { __ } from '@wordpress/i18n'; import { Check, SquarePen } from 'lucide-react'; import { DEFAULT_PLUGIN_NOTIFICATION_SETTINGS } from '../lib/plugin-notifications.js'; import '../../styles/plugin-notifications.css'; const PluginNotificationPreferences = ( { question, description, value, onChange, error, disabled = false, onEditingChange, } ) => { const settings = { ...DEFAULT_PLUGIN_NOTIFICATION_SETTINGS, ...value, }; const baseId = useId(); const defaultName = String( question.defaultName || '' ).trim(); const defaultEmail = String( question.defaultEmail || '' ).trim(); const effectiveName = String( settings.name || defaultName ).trim(); const effectiveEmail = String( settings.email || defaultEmail ).trim(); const [ isEditing, setIsEditing ] = useState( false ); const [ draftName, setDraftName ] = useState( effectiveName ); const [ draftEmail, setDraftEmail ] = useState( effectiveEmail ); const [ draftError, setDraftError ] = useState( '' ); const nameInputRef = useRef( null ); useEffect( () => { onEditingChange?.( isEditing ); return () => onEditingChange?.( false ); }, [ isEditing, onEditingChange ] ); useEffect( () => { if ( ! isEditing ) { setDraftName( effectiveName ); setDraftEmail( effectiveEmail ); } }, [ effectiveEmail, effectiveName, isEditing ] ); useEffect( () => { if ( isEditing ) { nameInputRef.current?.focus(); nameInputRef.current?.select(); } }, [ isEditing ] ); const startEditing = () => { setDraftName( effectiveName ); setDraftEmail( effectiveEmail ); setDraftError( '' ); setIsEditing( true ); }; const saveContact = () => { if ( disabled ) return; const normalizedName = draftName.trim(); const normalizedEmail = draftEmail.trim(); const nextName = ! normalizedName || normalizedName === defaultName ? '' : normalizedName; const matchesDefault = normalizedEmail.toLowerCase() === defaultEmail.toLowerCase(); const nextEmail = matchesDefault ? '' : normalizedEmail; const validationMessage = question.validate?.( { ...settings, name: nextName, email: nextEmail, } ); if ( validationMessage ) { setDraftError( validationMessage ); return; } onChange( { ...settings, name: nextName, email: nextEmail } ); setDraftError( '' ); setIsEditing( false ); }; const handleContactKeyDown = ( event ) => { if ( event.key === 'Enter' ) { event.preventDefault(); saveContact(); return; } if ( event.key === 'Escape' ) { event.preventDefault(); setDraftName( effectiveName ); setDraftEmail( effectiveEmail ); setDraftError( '' ); setIsEditing( false ); } }; const toggleNotification = ( optionValue ) => { if ( disabled ) return; if ( question.options?.some( ( option ) => option.value === optionValue && option.required ) ) { return; } onChange( { ...settings, [ optionValue ]: ! Boolean( settings[ optionValue ] ), } ); }; const label = ( { question.label } { isEditing ? ( <> { setDraftName( event.target.value ); setDraftError( '' ); } } onKeyDown={ handleContactKeyDown } /> { setDraftEmail( event.target.value ); setDraftError( '' ); } } onKeyDown={ handleContactKeyDown } /> ) : ( <> { effectiveName || __( 'WordPress administrator', 'arrayfunnel' ) } { effectiveEmail || __( 'WordPress admin email', 'arrayfunnel' ) } ) } ); return (
{ label }
{ description && (

{ description }

) }
{ ( question.options || [] ).map( ( option ) => (
) ) }
{ ( draftError || error ) && ( ) }
); }; export default PluginNotificationPreferences;