import Arrow from 'assets/arrow-right.svg'; import classNames from 'classnames'; import Link from 'components/common/Link'; import WorldMap from 'components/common/WorldMap'; import GridRow from 'components/layout/GridRow'; import MenuLayout from 'components/layout/MenuLayout'; import Page from 'components/layout/Page'; import BrowsersTable from 'components/metrics/BrowsersTable'; import CountriesTable from 'components/metrics/CountriesTable'; import DevicesTable from 'components/metrics/DevicesTable'; import LanguagesTable from 'components/metrics/LanguagesTable'; import OSTable from 'components/metrics/OSTable'; import PagesTable from 'components/metrics/PagesTable'; import QueryParametersTable from 'components/metrics/QueryParametersTable'; import ReferrersTable from 'components/metrics/ReferrersTable'; import ScreenTable from 'components/metrics/ScreenTable'; import WebsiteChart from 'components/metrics/WebsiteChart'; import useApi from 'hooks/useApi'; import usePageQuery from 'hooks/usePageQuery'; import { DEFAULT_ANIMATION_DURATION } from 'lib/constants'; import { useState } from 'react'; import { Column, Loading } from 'react-basics'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import EventDataButton from './../common/EventDataButton'; import EventsChart from './../metrics/EventsChart'; import EventsTable from './../metrics/EventsTable'; import styles from './WebsiteDetails.module.css'; const messages = defineMessages({ pages: { id: 'metrics.pages', defaultMessage: 'Pages' }, referrers: { id: 'metrics.referrers', defaultMessage: 'Referrers' }, screens: { id: 'metrics.screens', defaultMessage: 'Screens' }, browsers: { id: 'metrics.browsers', defaultMessage: 'Browsers' }, os: { id: 'metrics.operating-systems', defaultMessage: 'Operating system' }, devices: { id: 'metrics.devices', defaultMessage: 'Devices' }, countries: { id: 'metrics.countries', defaultMessage: 'Countries' }, languages: { id: 'metrics.languages', defaultMessage: 'Languages' }, events: { id: 'metrics.events', defaultMessage: 'Events' }, query: { id: 'metrics.query-parameters', defaultMessage: 'Query parameters' }, }); const views = { url: PagesTable, referrer: ReferrersTable, browser: BrowsersTable, os: OSTable, device: DevicesTable, screen: ScreenTable, country: CountriesTable, language: LanguagesTable, event: EventsTable, query: QueryParametersTable, }; export default function WebsiteDetails({ websiteId }) { const { get, useQuery } = useApi(); const { data, isLoading } = useQuery(['websites', websiteId], () => get(`/websites/${websiteId}`), ); const [chartLoaded, setChartLoaded] = useState(false); const [countryData, setCountryData] = useState(); const { resolve, query: { view }, } = usePageQuery(); const { formatMessage } = useIntl(); const BackButton = () => (
} sizes="small">
); const menuOptions = [ { render: BackButton, }, { label: formatMessage(messages.pages), value: resolve({ view: 'url' }), }, { label: formatMessage(messages.referrers), value: resolve({ view: 'referrer' }), }, { label: formatMessage(messages.browsers), value: resolve({ view: 'browser' }), }, { label: formatMessage(messages.os), value: resolve({ view: 'os' }), }, { label: formatMessage(messages.devices), value: resolve({ view: 'device' }), }, { label: formatMessage(messages.countries), value: resolve({ view: 'country' }), }, { label: formatMessage(messages.languages), value: resolve({ view: 'language' }), }, { label: formatMessage(messages.screens), value: resolve({ view: 'screen' }), }, { label: formatMessage(messages.events), value: resolve({ view: 'event' }), }, { label: formatMessage(messages.query), value: resolve({ view: 'query' }), }, ]; const tableProps = { websiteId, websiteDomain: data?.domain, limit: 10, }; const DetailsComponent = views[view]; function handleDataLoad() { if (!chartLoaded) { setTimeout(() => setChartLoaded(true), DEFAULT_ANIMATION_DURATION); } } if (isLoading) { return ; } if (!data) { return null; } return ( {!chartLoaded && } {chartLoaded && !view && ( <> )} {view && chartLoaded && ( )} ); }