import React, { Fragment, useState, useEffect, useCallback } from 'react' import { Menu, Transition } from '@headlessui/react' import { ChevronDownIcon } from '@heroicons/react/20/solid' import classNames from 'classnames' import * as storage from '../../util/storage' import ImportedQueryUnsupportedWarning from '../imported-query-unsupported-warning' import GoalConversions, { specialTitleWhenGoalFilter, SPECIAL_GOALS } from './goal-conversions' import Properties from './props' import { FeatureSetupNotice } from '../../components/notice' import { hasGoalFilter } from '../../util/filters' import { useSiteContext } from '../../site-context' import { useQueryContext } from '../../query-context' import { useUserContext } from '../../user-context' /*global BUILD_EXTRA*/ /*global require*/ function maybeRequire() { if (BUILD_EXTRA) { return require('../../extra/funnel') } else { return { default: null } } } const Funnel = maybeRequire().default const ACTIVE_CLASS = 'inline-block h-5 text-indigo-700 dark:text-indigo-500 font-bold active-prop-heading truncate text-left' const DEFAULT_CLASS = 'hover:text-indigo-600 cursor-pointer truncate text-left' export const CONVERSIONS = 'conversions' export const PROPS = 'props' export const FUNNELS = 'funnels' export const sectionTitles = { [CONVERSIONS]: 'Goal Conversions', [PROPS]: 'Custom Properties', [FUNNELS]: 'Funnels' } export default function Behaviours({ importedDataInView }) { const { query } = useQueryContext(); const site = useSiteContext(); const user = useUserContext(); const adminAccess = ['owner', 'admin', 'super_admin'].includes(user.role) const tabKey = storage.getDomainScopedStorageKey('behavioursTab', site.domain) const funnelKey = storage.getDomainScopedStorageKey('behavioursTabFunnel', site.domain) const [enabledModes, setEnabledModes] = useState(getEnabledModes()) const [mode, setMode] = useState(defaultMode()) const [loading, setLoading] = useState(true) const [funnelNames, _setFunnelNames] = useState(site.funnels.map(({ name }) => name)) const [selectedFunnel, setSelectedFunnel] = useState(defaultSelectedFunnel()) const [showingPropsForGoalFilter, setShowingPropsForGoalFilter] = useState(false) const [skipImportedReason, setSkipImportedReason] = useState(null) const onGoalFilterClick = useCallback((e) => { const goalName = e.target.innerHTML const isSpecialGoal = Object.keys(SPECIAL_GOALS).includes(goalName) const isPageviewGoal = goalName.startsWith('Visit ') if (!isSpecialGoal && !isPageviewGoal && enabledModes.includes(PROPS) && site.hasProps) { setShowingPropsForGoalFilter(true) setMode(PROPS) } }, []) useEffect(() => { const justRemovedGoalFilter = !hasGoalFilter(query) if (mode === PROPS && justRemovedGoalFilter && showingPropsForGoalFilter) { setShowingPropsForGoalFilter(false) setMode(CONVERSIONS) } }, [hasGoalFilter(query)]) useEffect(() => { setMode(defaultMode()) }, [enabledModes]) useEffect(() => setLoading(true), [query, mode]) function disableMode(mode) { setEnabledModes(enabledModes.filter((m) => { return m !== mode })) } function setFunnel(selectedFunnel) { return () => { storage.setItem(tabKey, FUNNELS) storage.setItem(funnelKey, selectedFunnel) setMode(FUNNELS) setSelectedFunnel(selectedFunnel) } } function defaultSelectedFunnel() { const stored = storage.getItem(funnelKey) const storedExists = stored && site.funnels.some((f) => f.name === stored) if (storedExists) { return stored } else if (site.funnels.length > 0) { const firstAvailable = site.funnels[0].name storage.setItem(funnelKey, firstAvailable) return firstAvailable } } function hasFunnels() { return site.funnels.length > 0 && site.funnelsAvailable } function tabFunnelPicker() { return
} function tabSwitcher(toMode, displayName) { const className = classNames({ [ACTIVE_CLASS]: mode == toMode, [DEFAULT_CLASS]: mode !== toMode }) const setTab = () => { storage.setItem(tabKey, toMode) setMode(toMode) } return (