Fetch & display marketplace promotions (#44840)
* Fetch & display marketplace promotions * add changelog entry * Pass promos via inline JS, demove unused JS file, rely on transient only * Return early if not on expected page * Compare dates in UTC * remove unused global userLocale * Small tweaks. * TypeScript linter errors. * fix TS lint --------- Co-authored-by: Remi Corson <1649788+corsonr@users.noreply.github.com> Co-authored-by: And Finally <andfinally@users.noreply.github.com>
This commit is contained in:
parent
0d3008bede
commit
20b3d51845
|
@ -22,6 +22,7 @@ import {
|
||||||
recordLegacyTabView,
|
recordLegacyTabView,
|
||||||
} from '../../utils/tracking';
|
} from '../../utils/tracking';
|
||||||
import InstallNewProductModal from '../install-flow/install-new-product-modal';
|
import InstallNewProductModal from '../install-flow/install-new-product-modal';
|
||||||
|
import Promotions from '../promotions/promotions';
|
||||||
|
|
||||||
export default function Content(): JSX.Element {
|
export default function Content(): JSX.Element {
|
||||||
const marketplaceContextValue = useContext( MarketplaceContext );
|
const marketplaceContextValue = useContext( MarketplaceContext );
|
||||||
|
@ -134,6 +135,7 @@ export default function Content(): JSX.Element {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="woocommerce-marketplace__content">
|
<div className="woocommerce-marketplace__content">
|
||||||
|
<Promotions />
|
||||||
<InstallNewProductModal products={ products } />
|
<InstallNewProductModal products={ products } />
|
||||||
{ renderContent() }
|
{ renderContent() }
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
/**
|
||||||
|
* Internal dependencies
|
||||||
|
*/
|
||||||
|
import { LOCALE } from '../../../utils/admin-settings';
|
||||||
|
import Notice from '../notice/notice';
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
wc: {
|
||||||
|
marketplace?: {
|
||||||
|
promotions: Promotion[];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Promotion = {
|
||||||
|
date_from_gmt: string;
|
||||||
|
date_to_gmt: string;
|
||||||
|
format: string;
|
||||||
|
pages: Page[];
|
||||||
|
position: string;
|
||||||
|
content: { [ locale: string ]: string };
|
||||||
|
icon?: string | undefined;
|
||||||
|
is_dismissible?: boolean;
|
||||||
|
menu_item_id?: string;
|
||||||
|
style?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Page = {
|
||||||
|
page: string;
|
||||||
|
path: string;
|
||||||
|
tab?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Promotions: () => null | JSX.Element = () => {
|
||||||
|
const urlParams = new URLSearchParams( window.location.search );
|
||||||
|
const currentPage = urlParams.get( 'page' );
|
||||||
|
|
||||||
|
// Check if the current page is not 'wc-admin'
|
||||||
|
if ( currentPage !== 'wc-admin' ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const promotions = window.wc?.marketplace?.promotions ?? [];
|
||||||
|
const currentDateUTC = Date.now();
|
||||||
|
const currentPath = decodeURIComponent( urlParams.get( 'path' ) || '' );
|
||||||
|
const currentTab = urlParams.get( 'tab' );
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{ promotions.map( ( promotion: Promotion, index: number ) => {
|
||||||
|
// Skip this promotion if pages are not defined
|
||||||
|
if ( ! promotion.pages ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the current page, path & tab match the promotion's pages
|
||||||
|
const matchesPagePath = promotion.pages.some(
|
||||||
|
( page: Page ) => {
|
||||||
|
const normalizedPath = page.path.startsWith( '/' )
|
||||||
|
? page.path
|
||||||
|
: `/${ page.path }`;
|
||||||
|
const normalizedCurrentPath = currentPath.startsWith(
|
||||||
|
'/'
|
||||||
|
)
|
||||||
|
? currentPath
|
||||||
|
: `/${ currentPath }`;
|
||||||
|
return (
|
||||||
|
page.page === currentPage &&
|
||||||
|
normalizedPath === normalizedCurrentPath &&
|
||||||
|
( page.tab ? page.tab === currentTab : true )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( ! matchesPagePath ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const startDate = new Date( promotion.date_from_gmt ).getTime();
|
||||||
|
const endDate = new Date( promotion.date_to_gmt ).getTime();
|
||||||
|
|
||||||
|
// Promotion is not active
|
||||||
|
if ( currentDateUTC < startDate || currentDateUTC > endDate ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Promotion is a notice
|
||||||
|
if ( promotion.format === 'notice' ) {
|
||||||
|
if ( ! promotion?.content ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Notice
|
||||||
|
key={ index }
|
||||||
|
id={
|
||||||
|
promotion.menu_item_id ?? `promotion-${ index }`
|
||||||
|
}
|
||||||
|
description={
|
||||||
|
promotion.content[ LOCALE.userLocale ] ||
|
||||||
|
promotion.content.en_US
|
||||||
|
}
|
||||||
|
variant={
|
||||||
|
promotion.style ? promotion.style : 'info'
|
||||||
|
}
|
||||||
|
icon={ promotion?.icon }
|
||||||
|
isDismissible={ promotion.is_dismissible || false }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} ) }
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Promotions;
|
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: minor
|
||||||
|
Type: add
|
||||||
|
|
||||||
|
Adds logic to display notices of promotions from Woo.com on in-app marketplace pages
|
|
@ -554,6 +554,22 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) :
|
||||||
);
|
);
|
||||||
wp_enqueue_script( 'marketplace-suggestions' );
|
wp_enqueue_script( 'marketplace-suggestions' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Marketplace promotions.
|
||||||
|
if ( in_array( $screen_id, array( 'woocommerce_page_wc-admin' ), true ) ) {
|
||||||
|
|
||||||
|
$promotions = get_transient( 'wc_addons_marketplace_promotions' );
|
||||||
|
|
||||||
|
if ( false === $promotions ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wp_add_inline_script(
|
||||||
|
'wc-admin-app',
|
||||||
|
'window.wc = window.wc || {}; wc.marketplace = ' . wp_json_encode( array( 'promotions' => $promotions ) ),
|
||||||
|
'before'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue