import React, { useState, useEffect, useCallback } from 'react'
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 { hasConversionGoalFilter } from '../../util/filters'
import { useSiteContext } from '../../site-context'
import { useQueryContext } from '../../query-context'
import { useUserContext } from '../../user-context'
import { DropdownTabButton, TabButton, TabWrapper } from '../../components/tabs'
/*global BUILD_EXTRA*/
/*global require*/
function maybeRequire() {
if (BUILD_EXTRA) {
// eslint-disable-next-line @typescript-eslint/no-require-imports
return require('../../extra/funnel')
} else {
return { default: null }
}
}
const Funnel = maybeRequire().default
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', 'editor', '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 [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)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
useEffect(() => {
const justRemovedGoalFilter = !hasConversionGoalFilter(query)
if (mode === PROPS && justRemovedGoalFilter && showingPropsForGoalFilter) {
setShowingPropsForGoalFilter(false)
setMode(CONVERSIONS)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [hasConversionGoalFilter(query)])
useEffect(() => {
setMode(defaultMode())
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [enabledModes])
useEffect(() => setLoading(true), [query, mode])
function disableMode(mode) {
setEnabledModes(
enabledModes.filter((m) => {
return m !== mode
})
)
}
function setFunnelFactory(selectedFunnelName) {
return () => {
storage.setItem(tabKey, FUNNELS)
storage.setItem(funnelKey, selectedFunnelName)
setMode(FUNNELS)
setSelectedFunnel(selectedFunnelName)
}
}
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 setTabFactory(tab) {
return () => {
storage.setItem(tabKey, tab)
setMode(tab)
}
}
function afterFetchData(apiResponse) {
setLoading(false)
setSkipImportedReason(apiResponse.skip_imported_reason)
}
function renderConversions() {
if (site.hasGoals) {
return (