OwlCyberSecurity - MANAGER
Edit File: SiteInformation.jsx
import { Tooltip } from '@wordpress/components'; import { useEffect, useState } from '@wordpress/element'; import { decodeEntities } from '@wordpress/html-entities'; import { __ } from '@wordpress/i18n'; import { Icon, info } from '@wordpress/icons'; import { updateOption, getOption } from '@launch/api/WPApi'; import { AcceptTerms } from '@launch/components/BusinessInformation/AcceptTerms'; import { SiteTones } from '@launch/components/BusinessInformation/Tones'; import { LoadingIndicator } from '@launch/components/LoadingIndicator'; import { Title } from '@launch/components/Title'; import { useFetch } from '@launch/hooks/useFetch'; import { PageLayout } from '@launch/layouts/PageLayout'; import { usePagesStore } from '@launch/state/Pages'; import { pageState } from '@launch/state/factory'; import { useUserSelectionStore } from '@launch/state/user-selections'; const fetcher = async () => ({ title: await getOption('blogname') }); const fetchData = () => ({ key: 'site-info' }); export const state = pageState('Site Information', () => ({ ready: false, canSkip: false, useNav: true, onRemove: () => {}, })); export const SiteInformation = () => { const { loading } = useFetch(fetchData, fetcher); const nextPage = usePagesStore((state) => state.nextPage); const { businessInformation, setBusinessInformation, siteInformation, setSiteInformation, setSiteProfile, siteObjective, setCTALink, CTALink, } = useUserSelectionStore(); const isLandingPage = siteObjective === 'landing-page'; const [title, setTitle] = useState( decodeEntities(siteInformation.title || ''), ); const [description, setDescription] = useState( businessInformation.description || '', ); const [callToActionLink, setCallToActionLink] = useState(CTALink || ''); useEffect(() => { state.setState({ ready: false }); const timer = setTimeout(() => { setSiteInformation('title', title); setBusinessInformation('description', description); if (isLandingPage && callToActionLink) { setCTALink(callToActionLink); } state.setState({ ready: !!title.length }); }, 1000); return () => clearTimeout(timer); }, [ title, description, setSiteInformation, setBusinessInformation, isLandingPage, setCTALink, callToActionLink, ]); useEffect(() => { setSiteProfile(undefined); // this also resets SOME state updateOption('extendify_site_profile', null); }, [setSiteProfile, description, title]); const pageTitle = isLandingPage ? __('Tell Us About Your Landing Page', 'extendify-local') : __('Tell Us About Your Website', 'extendify-local'); const pageTitleDescription = isLandingPage ? __( "Share your vision, and we'll craft a landing page that's perfectly tailored to your needs, ready to launch in no time. Let's begin by learning more about what you're building.", 'extendify-local', ) : __( "Share your vision, and we'll craft a website that's perfectly tailored to your needs, ready to launch in no time. Let's begin by learning more about what you're building.", 'extendify-local', ); return ( <PageLayout> <div className="grow overflow-y-auto px-6 py-8 md:p-12 3xl:p-16"> <Title title={pageTitle} description={pageTitleDescription} /> <div className="relative mx-auto w-full max-w-xl"> {loading ? ( <LoadingIndicator /> ) : ( <form className="flex w-full flex-col gap-4" onSubmit={(e) => { e.preventDefault(); if (!state.getState().ready) return; nextPage(); }}> <SiteTitle title={title} setTitle={setTitle} isLandingPage={isLandingPage} /> <BusinessInfo description={description} setDescription={setDescription} siteObjective={siteObjective} /> {isLandingPage && ( <SiteCTA title={callToActionLink} setCTA={setCallToActionLink} /> )} <SiteTones /> <AcceptTerms /> </form> )} </div> </div> </PageLayout> ); }; const SiteTitle = ({ title, setTitle, isLandingPage }) => { return ( <div> <label htmlFor="extendify-site-title-input" className="m-0 text-lg font-medium leading-8 text-gray-900 md:text-base md:leading-10"> {isLandingPage ? __('Landing Page title (required)', 'extendify-local') : __('Website title (required)', 'extendify-local')} </label> <input data-test="site-title-input" autoComplete="off" autoFocus={true} type="text" name="site-title-input" id="extendify-site-title-input" className="input-focus h-12 w-full rounded border border-gray-200 px-4 py-6 ring-offset-0" value={title} onChange={(e) => setTitle(e.target.value)} placeholder={__('Enter your website name', 'extendify-local')} /> </div> ); }; const objectivePlaceholders = { business: __( 'E.g., We are a yoga studio in London with professionally trained instructors with focus on hot yoga for therapeutic purposes.', 'extendify-local', ), ecommerce: __( 'E.g., We are an online store specializing in eco-friendly home goods, offering sustainably sourced products to help you live a greener lifestyle.', 'extendify-local', ), blog: __( 'E.g., A personal finance blog sharing expert tips on budgeting, investing, and achieving financial freedom for young professionals.', 'extendify-local', ), 'landing-page': __( 'E.g., A free ebook packed with actionable productivity tips and strategies to help you stay focused, manage your time effectively, and achieve your goals.', 'extendify-local', ), other: __( 'E.g., A personal photography portfolio featuring a collection of landscape, portrait, and street photography, capturing moments from around the world.', 'extendify-local', ), }; const objectiveLabels = { business: __('Describe your business', 'extendify-local'), ecommerce: __('Describe your eCommerce website', 'extendify-local'), blog: __('Describe your blog', 'extendify-local'), 'landing-page': __('Describe your Landing Page', 'extendify-local'), other: __('Describe your website', 'extendify-local'), }; const BusinessInfo = ({ description, setDescription, siteObjective }) => { return ( <div> <label htmlFor="extendify-site-info-input" className="m-0 text-lg font-medium leading-8 text-gray-900 md:text-base md:leading-10"> {objectiveLabels[siteObjective] ?? objectiveLabels.business} </label> <textarea data-test="site-info-input" autoComplete="off" rows="4" name="site-info-input" id="extendify-site-info-input" className={ 'input-focus placeholder:text-md h-40 w-full rounded-lg border border-gray-300 p-2 ring-offset-0 placeholder:italic placeholder:opacity-50' } value={description} onChange={(e) => setDescription(e.target.value)} placeholder={ objectivePlaceholders[siteObjective] ?? objectivePlaceholders.business } /> </div> ); }; const SiteCTA = ({ title, setCTA }) => { return ( <div> <div className="flex items-center space-x-1"> <label htmlFor="extendify-site-cta-input" className="m-0 text-lg font-medium leading-8 text-gray-900 md:text-base md:leading-10"> {__('Call-To-Action Link', 'extendify-local')} </label> <Tooltip delay={100} text={__( 'This link will be used in all Call-to-Action buttons, directing visitors to your chosen destination.', 'extendify-local', )}> <Icon icon={info} size="16" className="fill-current text-gray-600" /> </Tooltip> </div> <input data-test="site-cta-input" autoComplete="off" type="text" name="site-cta-input" id="extendify-site-cta-input" className="input-focus h-12 w-full rounded border border-gray-200 px-4 py-6 ring-offset-0 placeholder:italic placeholder:opacity-50" value={title} onChange={(e) => setCTA(e.target.value)} placeholder="" /> </div> ); };