import React from 'react';
import { Link } from 'react-router-dom'
import FlipMove from 'react-flip-move';
import * as storage from '../../storage'
import FadeIn from '../../fade-in'
import Bar from '../bar'
import MoreLink from '../more-link'
import numberFormatter from '../../number-formatter'
import * as api from '../../api'
import LazyLoader from '../../lazy-loader'
class AllSources extends React.Component {
constructor(props) {
super(props)
this.onVisible = this.onVisible.bind(this)
this.state = {loading: true}
}
onVisible() {
this.fetchReferrers()
if (this.props.timer) this.props.timer.onTick(this.fetchReferrers.bind(this))
}
componentDidUpdate(prevProps) {
if (this.props.query !== prevProps.query) {
this.setState({loading: true, referrers: null})
this.fetchReferrers()
}
}
showNoRef() {
return this.props.query.period === 'realtime'
}
fetchReferrers() {
api.get(`/api/stats/${encodeURIComponent(this.props.site.domain)}/sources`, this.props.query, {show_noref: this.showNoRef()})
.then((res) => this.setState({loading: false, referrers: res}))
}
renderReferrer(referrer) {
const query = new URLSearchParams(window.location.search)
query.set('source', referrer.name)
return (
{ referrer.name }
{numberFormatter(referrer.count)}
)
}
label() {
return this.props.query.period === 'realtime' ? 'Current visitors' : 'Visitors'
}
renderList() {
if (this.state.referrers && this.state.referrers.length > 0) {
return (
Source
{this.label()}
{this.state.referrers.map(this.renderReferrer.bind(this))}
)
} else {
return No data yet
}
}
renderContent() {
return (
Top Sources
{ this.props.renderTabs() }
{ this.state.loading && }
{ this.renderList() }
)
}
render() {
return (
{ this.renderContent() }
)
}
}
const UTM_TAGS = {
utm_medium: {label: 'UTM Medium', endpoint: 'utm_mediums'},
utm_source: {label: 'UTM Source', endpoint: 'utm_sources'},
utm_campaign: {label: 'UTM Campaign', endpoint: 'utm_campaigns'},
}
class UTMSources extends React.Component {
constructor(props) {
super(props)
this.state = {loading: true}
}
componentDidMount() {
this.fetchReferrers()
if (this.props.timer) this.props.timer.onTick(this.fetchReferrers.bind(this))
}
componentDidUpdate(prevProps) {
if (this.props.query !== prevProps.query || this.props.tab !== prevProps.tab) {
this.setState({loading: true, referrers: null})
this.fetchReferrers()
}
}
showNoRef() {
return this.props.query.period === 'realtime'
}
fetchReferrers() {
const endpoint = UTM_TAGS[this.props.tab].endpoint
api.get(`/api/stats/${encodeURIComponent(this.props.site.domain)}/${endpoint}`, this.props.query, {show_noref: this.showNoRef()})
.then((res) => this.setState({loading: false, referrers: res}))
}
renderReferrer(referrer) {
const query = new URLSearchParams(window.location.search)
query.set(this.props.tab, referrer.name)
return (
{ referrer.name }
{numberFormatter(referrer.count)}
)
}
label() {
return this.props.query.period === 'realtime' ? 'Current visitors' : 'Visitors'
}
renderList() {
if (this.state.referrers && this.state.referrers.length > 0) {
return (
{UTM_TAGS[this.props.tab].label}
{this.label()}
{this.state.referrers.map(this.renderReferrer.bind(this))}
)
} else {
return No data yet
}
}
renderContent() {
return (
Top sources
{ this.props.renderTabs() }
{ this.state.loading && }
{ this.renderList() }
)
}
render() {
return (
{ this.renderContent() }
)
}
}
export default class SourceList extends React.Component {
constructor(props) {
super(props)
this.tabKey = 'sourceTab__' + props.site.domain
const storedTab = storage.getItem(this.tabKey)
this.state = {
tab: storedTab || 'all'
}
}
setTab(tab) {
return () => {
storage.setItem(this.tabKey, tab)
this.setState({tab})
}
}
renderTabs() {
const activeClass = 'inline-block h-5 text-indigo-700 dark:text-indigo-500 font-bold border-b-2 border-indigo-700 dark:border-indigo-500'
const defaultClass = 'hover:text-indigo-600 cursor-pointer'
return (
- All
- Medium
- Source
- Campaign
)
}
render() {
if (this.state.tab === 'all') {
return
} else if (this.state.tab === 'utm_medium') {
return
} else if (this.state.tab === 'utm_source') {
return
} else if (this.state.tab === 'utm_campaign') {
return
}
}
}