File "index.js"
Full Path: /home/warrior1/public_html/wp-content/plugins/astra-sites/inc/lib/onboarding/assets/src/steps/site-list/index.js
File size: 6.71 KB
MIME-type: text/x-java
Charset: utf-8
// External Dependencies.
import React, { useEffect, useState, useReducer } from 'react';
import { sprintf, __ } from '@wordpress/i18n';
import { decodeEntities } from '@wordpress/html-entities';
import { sortBy } from 'underscore';
import {
SiteType,
SiteOrder,
SiteBusinessType,
NoResultFound,
} from '@brainstormforce/starter-templates-components';
import { useNavigate } from 'react-router-dom';
// Internal Dependencies.
import { DefaultStep, PreviousStepLink, Button } from '../../components/index';
import './style.scss';
import { useStateValue } from '../../store/store';
import {
isPro,
whiteLabelEnabled,
storeCurrentState,
getAllSites,
} from '../../utils/functions';
import { setURLParmsValue } from '../../utils/url-params';
import SiteListSkeleton from './site-list-skeleton';
import GridSkeleton from './grid-skeleton';
import SiteGrid from './sites-grid/index';
import SiteSearch from './search-filter';
import FavoriteSites from './favorite-sites';
import RelatedSites from './related-sites';
export const useFilteredSites = () => {
const [ { builder, siteType, siteOrder, allSitesData } ] = useStateValue();
const allSites = !! Object.keys( allSitesData ).length
? allSitesData
: getAllSites();
let sites = [];
if ( builder ) {
for ( const siteId in allSites ) {
if ( builder === allSites[ siteId ][ 'astra-site-page-builder' ] ) {
sites[ siteId ] = allSites[ siteId ];
}
}
}
if ( siteType ) {
for ( const siteId in sites ) {
if ( siteType === sites[ siteId ][ 'astra-sites-type' ] ) {
sites[ siteId ] = sites[ siteId ];
} else {
delete sites[ siteId ];
}
}
}
if ( 'latest' === siteOrder && Object.keys( sites ).length ) {
sites = sortBy( Object.values( sites ), 'publish-date' ).reverse();
}
return sites;
};
const SiteList = () => {
const [ loadingSkeleton, setLoadingSkeleton ] = useState( true );
const allFilteredSites = useFilteredSites();
const history = useNavigate();
const [ siteData, setSiteData ] = useReducer(
( state, newState ) => ( { ...state, ...newState } ),
{
gridSkeleton: false,
sites: {},
}
);
const [ storedState, dispatch ] = useStateValue();
const {
onMyFavorite,
builder,
siteSearchTerm,
siteType,
siteOrder,
siteBusinessType,
selectedMegaMenu,
allSitesData,
} = storedState;
useEffect( () => {
setTimeout( () => {
setLoadingSkeleton( false );
}, 300 );
}, [] );
useEffect( () => {
dispatch( {
type: 'set',
templateResponse: null,
selectedTemplateName: '',
selectedTemplateType: '',
shownRequirementOnce: false,
templateId: 0,
} );
setSiteData( {
sites: allFilteredSites,
} );
}, [ builder, siteType, siteOrder, allSitesData ] );
storeCurrentState( storedState );
const siteCount = Object.keys( siteData.sites ).length;
return (
<DefaultStep
content={
<div
className={ `site-list-screen-container ${
loadingSkeleton ? 'site-loading' : 'site-loaded'
}` }
>
<SiteListSkeleton />
<div className="site-list-screen-wrap">
<h1>
{ __(
'What type of website are you building?',
'astra-sites'
) }
</h1>
<div className="site-list-content">
<SiteSearch setSiteData={ setSiteData } />
<div className="st-templates-content">
<div className="st-other-filters">
<div className="st-category-filter">
<SiteBusinessType
parent={ siteBusinessType }
menu={ selectedMegaMenu }
onClick={ (
event,
option,
childItem
) => {
dispatch( {
type: 'set',
siteBusinessType: option.ID,
selectedMegaMenu:
childItem.ID,
siteSearchTerm:
childItem.title,
onMyFavorite: false,
siteOrder: 'popular',
} );
const urlParam = setURLParmsValue(
's',
childItem.title
);
history( `?${ urlParam }` );
} }
/>
</div>
<div className="st-type-and-order-filters">
{ builder !== 'gutenberg' && (
<SiteType
value={ siteType }
onClick={ ( event, type ) => {
dispatch( {
type: 'set',
siteType: type.id,
onMyFavorite: false,
} );
} }
/>
) }
<SiteOrder
value={ siteOrder }
onClick={ ( event, order ) => {
dispatch( {
type: 'set',
siteOrder: order.id,
onMyFavorite: false,
siteBusinessType: '',
selectedMegaMenu: '',
siteSearchTerm: '',
} );
const urlParam = setURLParmsValue(
's',
''
);
history( `?${ urlParam }` );
} }
/>
</div>
</div>
{ onMyFavorite ? (
<FavoriteSites />
) : (
<>
{ siteCount ? (
<>
<div className="st-sites-grid">
{ siteSearchTerm ? (
<div className="st-sites-found-message">
{ sprintf(
/* translators: %1$s: search term. */
__(
'Starter Templates for %1$s:',
'astra-sites'
),
decodeEntities(
siteSearchTerm
)
) }
</div>
) : null }
{ siteData.gridSkeleton ? (
<GridSkeleton />
) : (
<SiteGrid
sites={
siteData.sites
}
/>
) }
</div>
</>
) : (
<>
<NoResultFound
searchTerm={
siteSearchTerm
}
/>
<RelatedSites
sites={ allFilteredSites }
/>
</>
) }
</>
) }
</div>
</div>
</div>
</div>
}
actions={
<>
<PreviousStepLink before>
{ __( 'Back', 'astra-sites' ) }
</PreviousStepLink>
{ ! isPro() && ! whiteLabelEnabled() && (
<div className="cta-strip-right">
<h5>
{ __(
'Get unlimited access to all Premium Starter Templates and more, at a single low cost!',
'astra-sites'
) }
</h5>
<Button
className="st-access-btn"
onClick={ () =>
window.open(
astraSitesVars.cta_links[ builder ]
)
}
>
{ __( 'Get Essential Bundle', 'astra-sites' ) }
</Button>
</div>
) }
</>
}
/>
);
};
export default SiteList;