diff --git a/src/short-urls/ShortUrlVisits.js b/src/short-urls/ShortUrlVisits.js index 3ec188bf..f2778be2 100644 --- a/src/short-urls/ShortUrlVisits.js +++ b/src/short-urls/ShortUrlVisits.js @@ -7,13 +7,21 @@ import Moment from 'react-moment' import { connect } from 'react-redux' import { Card, CardBody, CardHeader, UncontrolledTooltip } from 'reactstrap' import DateInput from '../common/DateInput' -import visitsParser from '../visits/services/VisitsParser' +import { + processOsStats, + processBrowserStats, + processCountriesStats, + processReferrersStats, +} from '../visits/services/VisitsParser' import { getShortUrlVisits } from './reducers/shortUrlVisits' import './ShortUrlVisits.scss' import MutedMessage from '../utils/MuttedMessage'; const defaultProps = { - visitsParser, + processOsStats, + processBrowserStats, + processCountriesStats, + processReferrersStats, }; export class ShortUrlsVisits extends React.Component { @@ -34,7 +42,10 @@ export class ShortUrlsVisits extends React.Component { const { match: { params }, selectedServer, - visitsParser, + processOsStats, + processBrowserStats, + processCountriesStats, + processReferrersStats, shortUrlVisits: { visits, loading, error, shortUrl } } = this.props; const serverUrl = selectedServer ? selectedServer.url : ''; @@ -96,10 +107,10 @@ export class ShortUrlsVisits extends React.Component { return (
- {renderGraphCard('Operating systems', visitsParser.processOsStats(visits), false)} - {renderGraphCard('Browsers', visitsParser.processBrowserStats(visits), false)} - {renderGraphCard('Countries', visitsParser.processCountriesStats(visits), true, 'Visits')} - {renderGraphCard('Referrers', visitsParser.processReferrersStats(visits), true, 'Visits')} + {renderGraphCard('Operating systems', processOsStats(visits), false)} + {renderGraphCard('Browsers', processBrowserStats(visits), false)} + {renderGraphCard('Countries', processCountriesStats(visits), true, 'Visits')} + {renderGraphCard('Referrers', processReferrersStats(visits), true, 'Visits')}
); }; @@ -173,4 +184,7 @@ export class ShortUrlsVisits extends React.Component { ShortUrlsVisits.defaultProps = defaultProps; -export default connect(pick(['selectedServer', 'shortUrlVisits']), { getShortUrlVisits })(ShortUrlsVisits); +export default connect( + pick(['selectedServer', 'shortUrlVisits']), + { getShortUrlVisits } +)(ShortUrlsVisits); diff --git a/src/visits/services/VisitsParser.js b/src/visits/services/VisitsParser.js index 679363cd..f74088ba 100644 --- a/src/visits/services/VisitsParser.js +++ b/src/visits/services/VisitsParser.js @@ -41,53 +41,48 @@ const extractDomain = url => { return domain.split(':')[0]; }; -export class VisitsParser { - processOsStats = visits => - reduce( - (stats, visit) => { - const userAgent = visit.userAgent; - const os = isNil(userAgent) ? 'Others' : osFromUserAgent(userAgent); - return assoc(os, (stats[os] || 0) + 1, stats); - }, - {}, - visits, - ); +export const processOsStats = visits => + reduce( + (stats, visit) => { + const userAgent = visit.userAgent; + const os = isNil(userAgent) ? 'Others' : osFromUserAgent(userAgent); + return assoc(os, (stats[os] || 0) + 1, stats); + }, + {}, + visits, + ); - processBrowserStats = visits => - reduce( - (stats, visit) => { - const userAgent = visit.userAgent; - const browser = isNil(userAgent) ? 'Others' : browserFromUserAgent(userAgent); - return assoc(browser, (stats[browser] || 0) + 1, stats); - }, - {}, - visits, - ); +export const processBrowserStats = visits => + reduce( + (stats, visit) => { + const userAgent = visit.userAgent; + const browser = isNil(userAgent) ? 'Others' : browserFromUserAgent(userAgent); + return assoc(browser, (stats[browser] || 0) + 1, stats); + }, + {}, + visits, + ); - processReferrersStats = visits => - reduce( - (stats, visit) => { - const notHasDomain = isNil(visit.referer) || isEmpty(visit.referer); - const domain = notHasDomain ? 'Unknown' : extractDomain(visit.referer); - return assoc(domain, (stats[domain]|| 0) + 1, stats); - }, - {}, - visits, - ); +export const processReferrersStats = visits => + reduce( + (stats, visit) => { + const notHasDomain = isNil(visit.referer) || isEmpty(visit.referer); + const domain = notHasDomain ? 'Unknown' : extractDomain(visit.referer); + return assoc(domain, (stats[domain]|| 0) + 1, stats); + }, + {}, + visits, + ); - processCountriesStats = visits => - reduce( - (stats, { visitLocation }) => { - const notHasCountry = isNil(visitLocation) - || isNil(visitLocation.countryName) - || isEmpty(visitLocation.countryName); - const country = notHasCountry ? 'Unknown' : visitLocation.countryName; - return assoc(country, (stats[country]|| 0) + 1, stats); - }, - {}, - visits, - ); -} - -const visitsParser = new VisitsParser(); -export default visitsParser; +export const processCountriesStats = visits => + reduce( + (stats, { visitLocation }) => { + const notHasCountry = isNil(visitLocation) + || isNil(visitLocation.countryName) + || isEmpty(visitLocation.countryName); + const country = notHasCountry ? 'Unknown' : visitLocation.countryName; + return assoc(country, (stats[country]|| 0) + 1, stats); + }, + {}, + visits, + ); diff --git a/test/visits/services/VisitsParser.test.js b/test/visits/services/VisitsParser.test.js index e2141c73..568ebb71 100644 --- a/test/visits/services/VisitsParser.test.js +++ b/test/visits/services/VisitsParser.test.js @@ -1,4 +1,9 @@ -import visitsParser from '../../../src/visits/services/VisitsParser'; +import { + processOsStats, + processBrowserStats, + processReferrersStats, + processCountriesStats, +} from '../../../src/visits/services/VisitsParser'; describe('VisitsParser', () => { const visits = [ @@ -36,7 +41,7 @@ describe('VisitsParser', () => { describe('processOsStats', () => { it('properly parses OS stats', () => { - expect(visitsParser.processOsStats(visits)).toEqual({ + expect(processOsStats(visits)).toEqual({ 'Linux': 3, 'Windows': 1, 'MacOS': 1, @@ -46,7 +51,7 @@ describe('VisitsParser', () => { describe('processBrowserStats', () => { it('properly parses browser stats', () => { - expect(visitsParser.processBrowserStats(visits)).toEqual({ + expect(processBrowserStats(visits)).toEqual({ 'Firefox': 2, 'Chrome': 2, 'Opera': 1, @@ -56,7 +61,7 @@ describe('VisitsParser', () => { describe('processReferrersStats', () => { it('properly parses referrer stats', () => { - expect(visitsParser.processReferrersStats(visits)).toEqual({ + expect(processReferrersStats(visits)).toEqual({ 'Unknown': 2, 'google.com': 2, 'm.facebook.com': 1, @@ -66,7 +71,7 @@ describe('VisitsParser', () => { describe('processCountriesStats', () => { it('properly parses countries stats', () => { - expect(visitsParser.processCountriesStats(visits)).toEqual({ + expect(processCountriesStats(visits)).toEqual({ 'Spain': 3, 'United States': 1, 'Unknown': 1,