File "index.js"
Full Path: /home/fresvfqn/waterdamagerestorationandrepairsmithtown.com/wp-content/plugins/astra-sites/inc/lib/onboarding/assets/src/components/site-preview/index.js
File size: 3.83 KB
MIME-type: text/x-java
Charset: utf-8
import React, { memo, useEffect, useRef, useState } from 'react';
import { sendPostMessage, classNames } from '../../utils/functions';
import { useStateValue } from '../../store/store';
import { prependHTTPS } from '../../utils/prepend-https';
import { stripSlashes } from '../../utils/strip-slashes';
import { addTrailingSlash } from '../../utils/add-trailing-slash';
import SiteSkeleton from './site-skeleton';
const SitePreview = () => {
const [ { templateResponse, showSidebar, siteLogo }, dispatch ] =
useStateValue();
const [ previewUrl, setPreviewUrl ] = useState( '' );
const [ loading, setLoading ] = useState( true );
const previewContainer = useRef( null );
useEffect( () => {
const url = templateResponse
? templateResponse?.[ 'astra-site-url' ]
: '';
if ( url !== '' ) {
setPreviewUrl(
addTrailingSlash( prependHTTPS( stripSlashes( url ) ) )
);
}
}, [ templateResponse ] );
useEffect( () => {
if ( loading !== false ) {
return;
}
sendPostMessage( {
param: 'cleanStorage',
data: siteLogo,
} );
}, [ loading ] );
const updateScaling = () => {
const container = previewContainer.current;
if ( ! container ) {
return;
}
const iframe =
container.querySelector( 'iframe' ) ?? container.children[ 1 ];
const containerWidth = document.body.clientWidth;
const containerHeight = document.body.clientHeight - 44;
const iframeWidth = iframe.clientWidth;
const iframeHeight = iframe.clientHeight;
const scaleX = containerWidth / iframeWidth;
const scaleY = containerHeight / iframeHeight;
const scaleValue = Math.min( scaleX, scaleY );
// Set the scale for both width and height
iframe.style.transform = `scale(${ scaleValue })`;
iframe.style.transformOrigin = 'top left';
iframe.style.height = `${ containerHeight / scaleValue }px`;
};
const handleIframeLoading = () => {
updateScaling();
setLoading( false );
};
useEffect( () => {
const intervalId = setInterval( updateScaling, 125 );
setTimeout( () => {
clearInterval( intervalId );
}, 500 );
return () => {
clearInterval( intervalId );
};
}, [ showSidebar ] );
const handleResize = () => {
// Collapse the sidebar when it's a mobile view.
if ( showSidebar ) {
if ( window.innerWidth < 1024 ) {
dispatch( {
type: 'set',
showSidebar: false,
} );
} else {
dispatch( {
type: 'set',
showSidebar: true,
} );
}
}
updateScaling();
};
// Update scaling on window resize.
useEffect( () => {
handleResize();
window.addEventListener( 'resize', handleResize );
return () => {
window.removeEventListener( 'resize', handleResize );
};
}, [] );
const renderBrowserFrame = () => (
<div
className={ classNames(
'flex items-center justify-start py-3 px-4 bg-browser-bar shadow-sm rounded-t-lg mx-auto h-[44px] z-[1] relative',
'w-full mx-0'
) }
>
<div className="flex gap-2 py-[3px] w-20">
<div className="w-[14px] h-[14px] border border-solid border-border-primary rounded-full" />
<div className="w-[14px] h-[14px] border border-solid border-border-primary rounded-full" />
<div className="w-[14px] h-[14px] border border-solid border-border-primary rounded-full" />
</div>
</div>
);
return (
<>
{ loading ? <SiteSkeleton /> : null }
{ previewUrl !== '' && (
<div className="w-full h-full p-4">
<div
ref={ previewContainer }
className="h-full relative overflow-hidden shadow-template-preview w-full mx-auto"
>
{ renderBrowserFrame() }
<div className="w-full h-full">
<iframe
id="astra-starter-templates-preview"
className="w-full h-full"
title="Website Preview"
height="100%"
width="100%"
src={ previewUrl }
onLoad={ handleIframeLoading }
/>
</div>
</div>
</div>
) }
</>
);
};
export default memo( SitePreview );