-
Notifications
You must be signed in to change notification settings - Fork 295
/
Copy pathLoyalVisitorsWidget.js
128 lines (111 loc) · 3.4 KB
/
LoyalVisitorsWidget.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* LoyalVisitorsWidget component.
*
* Site Kit by Google, Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* External dependencies
*/
import PropTypes from 'prop-types';
import { get } from 'lodash';
/**
* WordPress dependencies
*/
import { __, sprintf } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import Data from 'googlesitekit-data';
import { CORE_USER } from '../../../../googlesitekit/datastore/user/constants';
import {
DATE_RANGE_OFFSET,
MODULES_ANALYTICS_4,
} from '../../datastore/constants';
import {
MetricTileNumeric,
whenKeyMetricsWidgetVisible,
} from '../../../../components/KeyMetrics';
import { numFmt } from '../../../../util';
const { useSelect, useInViewSelect } = Data;
function LoyalVisitorsWidget( { Widget } ) {
const dates = useSelect( ( select ) =>
select( CORE_USER ).getDateRangeDates( {
offsetDays: DATE_RANGE_OFFSET,
compare: true,
} )
);
const reportOptions = {
...dates,
dimensions: [ 'newVsReturning' ],
metrics: [ { name: 'activeUsers' } ],
};
const report = useInViewSelect( ( select ) =>
select( MODULES_ANALYTICS_4 ).getReport( reportOptions )
);
const loading = useInViewSelect(
( select ) =>
! select( MODULES_ANALYTICS_4 ).hasFinishedResolution(
'getReport',
[ reportOptions ]
)
);
const { rows = [] } = report || {};
const makeFind = ( dateRange ) => ( row ) =>
get( row, 'dimensionValues.0.value' ) === 'returning' &&
get( row, 'dimensionValues.1.value' ) === dateRange;
const makeFilter = ( dateRange ) => ( row ) =>
get( row, 'dimensionValues.1.value' ) === dateRange;
const reducer = ( acc, row ) =>
acc + ( parseInt( get( row, 'metricValues.0.value' ), 10 ) || 0 );
const returning =
rows.find( makeFind( 'date_range_0' ) )?.metricValues?.[ 0 ]?.value ||
0;
const total = rows
.filter( makeFilter( 'date_range_0' ) )
.reduce( reducer, 0 );
const prevReturning =
rows.find( makeFind( 'date_range_1' ) )?.metricValues?.[ 0 ]?.value ||
0;
const prevTotal = rows
.filter( makeFilter( 'date_range_1' ) )
.reduce( reducer, 0 );
const currentPercentage = total > 0 ? returning / total : 0;
const prevPercentage = prevTotal > 0 ? prevReturning / prevTotal : 0;
const format = {
style: 'percent',
signDisplay: 'never',
maximumFractionDigits: 1,
};
return (
<MetricTileNumeric
Widget={ Widget }
title={ __( 'Loyal visitors', 'google-site-kit' ) }
metricValue={ currentPercentage }
metricValueFormat={ format }
subText={ sprintf(
/* translators: %d: Number of total visitors visiting the site. */
__( 'of %s total visitors', 'google-site-kit' ),
numFmt( total, { style: 'decimal' } )
) }
previousValue={ prevPercentage }
currentValue={ currentPercentage }
loading={ loading }
/>
);
}
LoyalVisitorsWidget.propTypes = {
Widget: PropTypes.elementType.isRequired,
};
export default whenKeyMetricsWidgetVisible()( LoyalVisitorsWidget );