import React, { Fragment, useEffect, useState } from 'react'; import * as storage from '../../util/storage'; import * as url from '../../util/url'; import * as api from '../../api'; import ListReport from '../reports/list'; import * as metrics from '../reports/metrics'; import { hasGoalFilter } from "../../util/filters"; import { Menu, Transition } from '@headlessui/react'; import { ChevronDownIcon } from '@heroicons/react/20/solid'; import classNames from 'classnames'; import ImportedQueryUnsupportedWarning from '../imported-query-unsupported-warning'; import { useQueryContext } from '../../query-context'; import { useSiteContext } from '../../site-context'; import { sourcesRoute, utmCampaignsRoute, utmContentsRoute, utmMediumsRoute, utmSourcesRoute, utmTermsRoute } from '../../router'; const UTM_TAGS = { utm_medium: { label: 'UTM Medium', shortLabel: 'UTM Medium', endpoint: '/utm_mediums' }, utm_source: { label: 'UTM Source', shortLabel: 'UTM Source', endpoint: '/utm_sources' }, utm_campaign: { label: 'UTM Campaign', shortLabel: 'UTM Campai', endpoint: '/utm_campaigns' }, utm_content: { label: 'UTM Content', shortLabel: 'UTM Conten', endpoint: '/utm_contents' }, utm_term: { label: 'UTM Term', shortLabel: 'UTM Term', endpoint: '/utm_terms' }, } function AllSources({ afterFetchData }) { const { query } = useQueryContext(); const site = useSiteContext(); function fetchData() { return api.get(url.apiPath(site, '/sources'), query, { limit: 9 }) } function getFilterFor(listItem) { return { prefix: 'source', filter: ["is", "source", [listItem['name']]] } } function renderIcon(listItem) { return ( ) } function chooseMetrics() { return [ metrics.createVisitors({ meta: { plot: true } }), hasGoalFilter(query) && metrics.createConversionRate(), ].filter(metric => !!metric) } return ( search }} renderIcon={renderIcon} color="bg-blue-50" /> ) } function UTMSources({ tab, afterFetchData }) { const { query } = useQueryContext(); const site = useSiteContext(); const utmTag = UTM_TAGS[tab] const route = { utm_medium: utmMediumsRoute, utm_source: utmSourcesRoute, utm_campaign: utmCampaignsRoute, utm_content: utmContentsRoute, utm_term: utmTermsRoute, }[tab] function fetchData() { return api.get(url.apiPath(site, utmTag.endpoint), query, { limit: 9 }) } function getFilterFor(listItem) { return { prefix: tab, filter: ["is", tab, [listItem['name']]] } } function chooseMetrics() { return [ metrics.createVisitors({ meta: { plot: true } }), hasGoalFilter(query) && metrics.createConversionRate(), ].filter(metric => !!metric) } return ( search }} color="bg-blue-50" /> ) } export default function SourceList() { const site = useSiteContext(); const { query } = useQueryContext(); const tabKey = 'sourceTab__' + site.domain const storedTab = storage.getItem(tabKey) const [currentTab, setCurrentTab] = useState(storedTab || 'all') const [loading, setLoading] = useState(true) const [skipImportedReason, setSkipImportedReason] = useState(null) useEffect(() => setLoading(true), [query, currentTab]) function setTab(tab) { return () => { storage.setItem(tabKey, tab) setCurrentTab(tab) } } function renderTabs() { const activeClass = 'inline-block h-5 text-indigo-700 dark:text-indigo-500 font-bold active-prop-heading truncate text-left' const defaultClass = 'hover:text-indigo-600 cursor-pointer truncate text-left' const dropdownOptions = Object.keys(UTM_TAGS) let buttonText = UTM_TAGS[currentTab] ? UTM_TAGS[currentTab].label : 'Campaigns' return ( All {buttonText} {dropdownOptions.map((option) => { return ( {({ active }) => ( {UTM_TAGS[option].label} )} ) })} ) } function renderContent() { if (currentTab === 'all') { return } else { return } } function afterFetchData(apiResponse) { setLoading(false) setSkipImportedReason(apiResponse.skip_imported_reason) } return ( {/* Header Container */} Top Sources {renderTabs()} {/* Main Contents */} {renderContent()} ) }