99 lines
2.5 KiB
JavaScript
99 lines
2.5 KiB
JavaScript
import React, { useCallback } from 'react'
|
|
import Modal from './modal'
|
|
import { hasConversionGoalFilter } from '../../util/filters'
|
|
import { addFilter, revenueAvailable } from '../../query'
|
|
import BreakdownModal from './breakdown-modal'
|
|
import * as metrics from '../reports/metrics'
|
|
import * as url from '../../util/url'
|
|
import { useQueryContext } from '../../query-context'
|
|
import { useSiteContext } from '../../site-context'
|
|
import { SortDirection } from '../../hooks/use-order-by'
|
|
|
|
function ExitPagesModal() {
|
|
const { query } = useQueryContext()
|
|
const site = useSiteContext()
|
|
|
|
/*global BUILD_EXTRA*/
|
|
const showRevenueMetrics = BUILD_EXTRA && revenueAvailable(query, site)
|
|
|
|
const reportInfo = {
|
|
title: 'Exit pages',
|
|
dimension: 'exit_page',
|
|
endpoint: url.apiPath(site, '/exit-pages'),
|
|
dimensionLabel: 'Page url',
|
|
defaultOrder: ['visitors', SortDirection.desc]
|
|
}
|
|
|
|
const getFilterInfo = useCallback(
|
|
(listItem) => {
|
|
return {
|
|
prefix: reportInfo.dimension,
|
|
filter: ['is', reportInfo.dimension, [listItem.name]]
|
|
}
|
|
},
|
|
[reportInfo.dimension]
|
|
)
|
|
|
|
const addSearchFilter = useCallback(
|
|
(query, searchString) => {
|
|
return addFilter(query, [
|
|
'contains',
|
|
reportInfo.dimension,
|
|
[searchString],
|
|
{ case_sensitive: false }
|
|
])
|
|
},
|
|
[reportInfo.dimension]
|
|
)
|
|
|
|
function chooseMetrics() {
|
|
if (hasConversionGoalFilter(query)) {
|
|
return [
|
|
metrics.createTotalVisitors(),
|
|
metrics.createVisitors({
|
|
renderLabel: (_query) => 'Conversions',
|
|
width: 'w-28'
|
|
}),
|
|
metrics.createConversionRate(),
|
|
showRevenueMetrics && metrics.createTotalRevenue(),
|
|
showRevenueMetrics && metrics.createAverageRevenue()
|
|
].filter((metric) => !!metric)
|
|
}
|
|
|
|
if (query.period === 'realtime') {
|
|
return [
|
|
metrics.createVisitors({
|
|
renderLabel: (_query) => 'Current visitors',
|
|
width: 'w-32'
|
|
})
|
|
]
|
|
}
|
|
|
|
return [
|
|
metrics.createVisitors({
|
|
renderLabel: (_query) => 'Visitors',
|
|
sortable: true
|
|
}),
|
|
metrics.createVisits({
|
|
renderLabel: (_query) => 'Total exits',
|
|
width: 'w-32',
|
|
sortable: true
|
|
}),
|
|
metrics.createExitRate()
|
|
]
|
|
}
|
|
|
|
return (
|
|
<Modal>
|
|
<BreakdownModal
|
|
reportInfo={reportInfo}
|
|
metrics={chooseMetrics()}
|
|
getFilterInfo={getFilterInfo}
|
|
addSearchFilter={addSearchFilter}
|
|
/>
|
|
</Modal>
|
|
)
|
|
}
|
|
|
|
export default ExitPagesModal
|