File "user-details.js"

Full Path: /home/fresvfqn/waterdamagerestorationandrepairsmithtown.com/wp-content/plugins/surerank/src/apps/admin-onboarding/steps/user-details.js
File size: 4.77 KB
MIME-type: text/html
Charset: utf-8

import { __, sprintf } from '@wordpress/i18n';
import { Fragment, renderToString, useState } from '@wordpress/element';
import { Title } from '@bsf/force-ui';
import { useOnboardingState } from '@Onboarding/store';
import { renderField } from '../utils';
import StepNavButtons from '../components/nav-buttons';
import apiFetch from '@wordpress/api-fetch';
import { ONBOARDING_URL } from '@Global/constants/api';
import useFormValidation from '@Global/hooks/use-form-validation';

const inputFields = [
	{
		label: __( 'First Name', 'surerank' ),
		name: 'first_name',
		type: 'text',
		width: 'half',
		required: true,
	},
	{
		label: __( 'Last Name', 'surerank' ),
		name: 'last_name',
		type: 'text',
		width: 'half',
		required: false,
	},
	{
		label: __( 'Email Address', 'surerank' ),
		name: 'email',
		type: 'email',
		width: 'full',
		required: true,
	},
	{
		label: (
			<div
				dangerouslySetInnerHTML={ {
					__html: sprintf(
						// translators: %1$s is replaced with the privacy policy link.
						__(
							'Get notified about SEO issues on your website. Plus help improve SureRank by sharing how you use the plugin. %1$s',
							'surerank'
						),
						renderToString(
							<a
								className="no-underline focus:ring-0"
								href={ surerank_globals.privacy_policy_url }
								target="_blank"
								rel="noopener noreferrer"
							>
								{ __( 'View our Privacy Policy', 'surerank' ) }
							</a>
						)
					),
				} }
			/>
		),
		name: 'agree_to_terms',
		value: 'agree_to_terms',
		type: 'checkbox',
		required: true,
	},
];

const UserDetails = () => {
	const [
		{ userDetails = {}, websiteDetails = {}, socialProfilesURLs = {} },
		dispatch,
	] = useOnboardingState();
	// Local form state
	const [ formState, setFormState ] = useState( userDetails );
	const { errors, validate, clearFieldError } = useFormValidation(
		formState,
		inputFields
	);

	const handleSaveForm = () => {
		dispatch( { userDetails: formState } );
	};

	const handleChangeSelection = ( name ) => ( value ) => {
		clearFieldError( name );
		setFormState( {
			...formState,
			[ name ]: value,
		} );
		handleSaveForm();
	};

	const handleSubmit = ( event ) => {
		event.preventDefault();
	};

	const handleClickNext =
		( skip = false ) =>
		async ( setIsLoading ) => {
			setIsLoading( ( prevState ) => ( { ...prevState, next: true } ) );

			if ( ! skip && ! validate() ) {
				setIsLoading( ( prevState ) => ( {
					...prevState,
					next: false,
				} ) );
				throw new Error( `Form validation error!`, {
					cause: 'form-validation',
				} );
			}

			try {
				const about_page =
					websiteDetails?.about_page?.value ??
					websiteDetails?.about_page;
				const contact_page =
					websiteDetails?.contact_page?.value ??
					websiteDetails?.contact_page;

				const payload = {
					website_type: websiteDetails.website_type || '',
					website_name: websiteDetails.website_name || '',
					website_owner_name: websiteDetails.website_owner_name || '',
					organization_type:
						websiteDetails.organization_type || 'Organization',
					website_owner_phone:
						websiteDetails.website_owner_phone || '',
					website_logo: websiteDetails.website_logo?.url || '',
					about_page: about_page ? parseInt( about_page ) : 0,
					contact_page: contact_page ? parseInt( contact_page ) : 0,
					social_profiles: socialProfilesURLs || [],
					...( ! skip && {
						first_name: formState.first_name || '',
						last_name: formState.last_name || '',
						email: formState.email || '',
					} ),
				};

				await apiFetch( {
					path: ONBOARDING_URL,
					method: 'POST',
					headers: {
						'Content-Type': 'application/json',
					},
					body: JSON.stringify( payload ),
				} );
			} catch ( error ) {}
		};

	return (
		<form
			className="flex flex-col gap-6"
			onSubmit={ handleSubmit }
			noValidate
		>
			<div className="space-y-1">
				<Title
					tag="h4"
					title={ __( 'Okay, just one last step…', 'surerank' ) }
					size="md"
				/>
				<p>
					{ __(
						'Help us tailor your SureRank experience and keep you updated with SEO tips, feature improvements, and helpful recommendations.',
						'surerank'
					) }
				</p>
			</div>

			<div className="flex flex-wrap gap-6">
				{ inputFields.map( ( field, index ) => (
					<Fragment key={ field.name }>
						{ renderField(
							field,
							formState[ field.name ],
							handleChangeSelection( field.name ),
							errors[ field.name ],
							{
								initialFocus: index === 0,
							}
						) }
					</Fragment>
				) ) }
			</div>

			{ /* Nav Buttons */ }
			<StepNavButtons
				nextProps={ {
					onClick: handleClickNext( false ),
					children: __( 'Finish', 'surerank' ),
				} }
				backProps={ {
					onClick: handleSaveForm,
				} }
				skipProps={ {
					onClick: handleClickNext( true ),
				} }
			/>
		</form>
	);
};

export default UserDetails;