4
4
import { _x } from '@wordpress/i18n' ;
5
5
import { useState , useCallback , useEffect } from '@wordpress/element' ;
6
6
import { CSSTransition , TransitionGroup } from 'react-transition-group' ;
7
+ import CurrencyFactory from '@woocommerce/currency' ;
8
+ import { getSetting } from '@woocommerce/settings' ; // eslint-disable-line import/no-unresolved
7
9
8
10
/**
9
11
* Internal dependencies
10
12
*/
11
13
import useCountdown from '.~/hooks/useCountdown' ;
14
+ import useAppSelectDispatch from '.~/hooks/useAppSelectDispatch' ;
15
+ import AppSpinner from '.~/components/app-spinner' ;
12
16
import MockupShopping from './mockup-shopping' ;
13
17
import MockupYouTube from './mockup-youtube' ;
14
18
import MockupSearch from './mockup-search' ;
@@ -17,6 +21,7 @@ import MockupDisplay from './mockup-display';
17
21
import MockupMap from './mockup-map' ;
18
22
import productSampleImageURL from './images/product-sample-image.jpg' ;
19
23
import shopSampleLogoURL from './images/shop-sample-logo.png' ;
24
+ import { glaData } from '.~/constants' ;
20
25
import './campaign-preview.scss' ;
21
26
22
27
/**
@@ -47,6 +52,13 @@ const fallbackProduct = {
47
52
shopUrl : 'colleensteestore.com' ,
48
53
} ;
49
54
55
+ const bestsellingQuery = {
56
+ page : 1 ,
57
+ per_page : 1 ,
58
+ orderby : 'total_sales' ,
59
+ order : 'desc' ,
60
+ } ;
61
+
50
62
const mockups = [
51
63
MockupShopping ,
52
64
MockupYouTube ,
@@ -56,12 +68,36 @@ const mockups = [
56
68
MockupGmail ,
57
69
] ;
58
70
71
+ function resolvePreviewProduct ( products = [ ] ) {
72
+ const currencyFactory = CurrencyFactory ( getSetting ( 'currency' ) ) ;
73
+ const [ product = { } ] = products ;
74
+ const { title, price, image_url : coverUrl } = product ;
75
+ const previewProduct = {
76
+ title,
77
+ coverUrl,
78
+ price : currencyFactory . formatAmount ( price ) ,
79
+ shopName : getSetting ( 'siteTitle' ) ,
80
+ shopUrl : new URL ( getSetting ( 'homeUrl' ) ) . host ,
81
+ shopLogoUrl : glaData . siteLogoUrl ,
82
+ } ;
83
+
84
+ Object . entries ( previewProduct ) . forEach ( ( [ key , val ] ) => {
85
+ // All possible values won't be number 0, so here simply use falsy condition to do fallback.
86
+ if ( ! val ) {
87
+ previewProduct [ key ] = fallbackProduct [ key ] ;
88
+ }
89
+ } ) ;
90
+
91
+ return previewProduct ;
92
+ }
93
+
59
94
export default function CampaignPreview ( ) {
60
95
const [ index , setIndex ] = useState ( 0 ) ;
61
96
const { second, callCount, startCountdown } = useCountdown ( ) ;
62
-
63
- // TODO: Fetch required data from API.
64
- const product = fallbackProduct ;
97
+ const { hasFinishedResolution, data } = useAppSelectDispatch (
98
+ 'getMCProductFeed' ,
99
+ bestsellingQuery
100
+ ) ;
65
101
66
102
const moveBy = useCallback ( ( step ) => {
67
103
setIndex ( ( currentIndex ) => {
@@ -70,15 +106,24 @@ export default function CampaignPreview() {
70
106
} , [ ] ) ;
71
107
72
108
useEffect ( ( ) => {
73
- if ( second === 0 ) {
109
+ if ( hasFinishedResolution && second === 0 ) {
74
110
if ( callCount > 0 ) {
75
111
moveBy ( 1 ) ;
76
112
}
77
113
startCountdown ( 5 ) ;
78
114
}
79
- } , [ second , callCount , startCountdown , moveBy ] ) ;
115
+ } , [ hasFinishedResolution , second , callCount , startCountdown , moveBy ] ) ;
116
+
117
+ if ( ! hasFinishedResolution ) {
118
+ return (
119
+ < div className = "gla-ads-mockup" >
120
+ < AppSpinner />
121
+ </ div >
122
+ ) ;
123
+ }
80
124
81
125
const Mockup = mockups [ index ] ;
126
+ const product = resolvePreviewProduct ( data ?. products ) ;
82
127
83
128
return (
84
129
< TransitionGroup className = "gla-campaign-preview" >
0 commit comments