From 5fffacc2613aef745482beae759c125130a651de Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Thu, 11 Jul 2024 13:09:26 +0300 Subject: [PATCH] Remove query and site props passing from everywhere except class components --- assets/js/dashboard/comparison-input.js | 6 +- assets/js/dashboard/components/notice.js | 4 +- assets/js/dashboard/datepicker.js | 25 +-- assets/js/dashboard/extra/funnel.js | 34 ++-- assets/js/dashboard/filters.js | 19 +- assets/js/dashboard/query.js | 15 +- assets/js/dashboard/realtime.js | 9 +- .../dashboard/stats/behaviours/conversions.js | 22 ++- .../stats/behaviours/goal-conversions.js | 20 +- assets/js/dashboard/stats/behaviours/index.js | 13 +- assets/js/dashboard/stats/behaviours/props.js | 35 ++-- assets/js/dashboard/stats/devices/index.js | 51 ++--- .../dashboard/stats/graph/interval-picker.js | 14 +- .../js/dashboard/stats/graph/stats-export.js | 12 +- assets/js/dashboard/stats/graph/top-stats.js | 49 ++--- .../js/dashboard/stats/graph/visitor-graph.js | 27 ++- .../stats/graph/with-imported-switch.js | 16 +- .../imported-query-unsupported-warning.js | 4 +- assets/js/dashboard/stats/locations/index.js | 15 +- .../dashboard/stats/modals/breakdown-modal.js | 7 +- .../stats/modals/filter-modal-group.js | 6 - .../stats/modals/filter-modal-props-row.js | 8 +- .../stats/modals/filter-modal-row.js | 6 +- .../js/dashboard/stats/modals/filter-modal.js | 18 +- assets/js/dashboard/stats/pages/index.js | 35 ++-- assets/js/dashboard/stats/reports/list.js | 185 ++++++++---------- assets/js/dashboard/stats/sources/index.js | 13 +- .../dashboard/stats/sources/referrer-list.js | 23 ++- .../js/dashboard/stats/sources/source-list.js | 57 +++--- assets/js/dashboard/util/filters.js | 13 ++ 30 files changed, 394 insertions(+), 367 deletions(-) diff --git a/assets/js/dashboard/comparison-input.js b/assets/js/dashboard/comparison-input.js index 13fa1cfd6c0a4..36861d6c5d7ad 100644 --- a/assets/js/dashboard/comparison-input.js +++ b/assets/js/dashboard/comparison-input.js @@ -86,7 +86,9 @@ function ComparisonModeOption({ label, value, isCurrentlySelected, updateMode, s ) } -function MatchDayOfWeekInput({ history, query, site }) { +function MatchDayOfWeekInput({ history }) { + const site = useSiteContext() + const { query } = useQueryContext() const click = (matchDayOfWeek) => { storage.setItem(`comparison_match_day_of_week__${site.domain}`, matchDayOfWeek.toString()) navigateToQuery(history, query, { match_day_of_week: matchDayOfWeek.toString() }) @@ -184,7 +186,7 @@ const ComparisonInput = function ({ history }) { {Object.keys(COMPARISON_MODES).map((key) => ComparisonModeOption({ label: COMPARISON_MODES[key], value: key, isCurrentlySelected: key == query.comparison, updateMode, setUiMode }))} {query.comparison !== "custom" &&
- +
} diff --git a/assets/js/dashboard/components/notice.js b/assets/js/dashboard/components/notice.js index 656c7abbea7ff..1f129224269fb 100644 --- a/assets/js/dashboard/components/notice.js +++ b/assets/js/dashboard/components/notice.js @@ -1,8 +1,10 @@ import React from "react" import { sectionTitles } from "../stats/behaviours" import * as api from '../api' +import { useSiteContext } from "../site-context" -export function FeatureSetupNotice({ site, feature, title, info, callToAction, onHideAction }) { +export function FeatureSetupNotice({ feature, title, info, callToAction, onHideAction }) { + const site = useSiteContext() const sectionTitle = sectionTitles[feature] const requestHideSection = () => { diff --git a/assets/js/dashboard/datepicker.js b/assets/js/dashboard/datepicker.js index 687525a85bec7..d2b05dd997e83 100644 --- a/assets/js/dashboard/datepicker.js +++ b/assets/js/dashboard/datepicker.js @@ -1,8 +1,8 @@ import React, { Fragment, useState, useEffect, useCallback, useRef } from "react"; import { withRouter } from "react-router-dom"; import Flatpickr from "react-flatpickr"; -import { ChevronDownIcon } from '@heroicons/react/20/solid' -import { Transition } from '@headlessui/react' +import { ChevronDownIcon } from '@heroicons/react/20/solid'; +import { Transition } from '@headlessui/react'; import { shiftDays, shiftMonths, @@ -25,9 +25,9 @@ import { isSameDate } from "./util/date"; import { navigateToQuery, QueryLink, QueryButton } from "./query"; -import { shouldIgnoreKeypress } from "./keybinding.js" -import { COMPARISON_DISABLED_PERIODS, toggleComparisons, isComparisonEnabled } from "../dashboard/comparison-input.js" -import classNames from "classnames" +import { shouldIgnoreKeypress } from "./keybinding.js"; +import { COMPARISON_DISABLED_PERIODS, toggleComparisons, isComparisonEnabled } from "../dashboard/comparison-input.js"; +import classNames from "classnames"; import { useQueryContext } from "./query-context.js"; import { useSiteContext } from "./site-context.js"; @@ -65,7 +65,6 @@ function renderArrow(query, site, period, prevDate, nextDate) {
@@ -84,7 +83,6 @@ function renderArrow(query, site, period, prevDate, nextDate) { @@ -105,7 +103,9 @@ function renderArrow(query, site, period, prevDate, nextDate) { ); } -function DatePickerArrows({ site, query }) { +function DatePickerArrows() { + const { query } = useQueryContext(); + const site = useSiteContext(); if (query.period === "year") { const prevDate = formatISO(shiftMonths(query.date, -12)); const nextDate = formatISO(shiftMonths(query.date, 12)); @@ -126,7 +126,9 @@ function DatePickerArrows({ site, query }) { return null } -function DisplayPeriod({ query, site }) { +function DisplayPeriod() { + const { query } = useQueryContext(); + const site = useSiteContext(); if (query.period === "day") { if (isToday(site, query.date)) { return "Today"; @@ -302,7 +304,6 @@ function DatePicker({ history }) { setOpen(false)} - query={query} className={`${boldClass} px-4 py-2 text-sm leading-tight hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-900 dark:hover:text-gray-100 flex items-center justify-between`} > @@ -414,7 +415,7 @@ function DatePicker({ history }) { aria-controls="datemenu" > - +
@@ -437,7 +438,7 @@ function DatePicker({ history }) { return (
- + {renderPicker()}
) diff --git a/assets/js/dashboard/extra/funnel.js b/assets/js/dashboard/extra/funnel.js index 2f598cdaf0ac1..d972a1da4c34f 100644 --- a/assets/js/dashboard/extra/funnel.js +++ b/assets/js/dashboard/extra/funnel.js @@ -1,18 +1,22 @@ -import React, { useEffect, useState, useRef } from 'react' +import React, { useEffect, useState, useRef } from 'react'; import FlipMove from 'react-flip-move'; -import Chart from 'chart.js/auto' -import FunnelTooltip from './funnel-tooltip.js' -import ChartDataLabels from 'chartjs-plugin-datalabels' -import numberFormatter from '../util/number-formatter' -import Bar from '../stats/bar' +import Chart from 'chart.js/auto'; +import FunnelTooltip from './funnel-tooltip.js'; +import ChartDataLabels from 'chartjs-plugin-datalabels'; +import numberFormatter from '../util/number-formatter'; +import Bar from '../stats/bar'; -import RocketIcon from '../stats/modals/rocket-icon' +import RocketIcon from '../stats/modals/rocket-icon'; -import * as api from '../api' -import LazyLoader from '../components/lazy-loader' +import * as api from '../api'; +import LazyLoader from '../components/lazy-loader'; +import { useQueryContext } from '../query-context.js'; +import { useSiteContext } from '../site-context.js'; -export default function Funnel(props) { +export default function Funnel({ funnelName, tabs }) { + const site = useSiteContext(); + const { query } = useQueryContext(); const [loading, setLoading] = useState(true) const [visible, setVisible] = useState(false) const [error, setError] = useState(undefined) @@ -42,7 +46,7 @@ export default function Funnel(props) { } } } - }, [props.query, props.funnelName, visible, isSmallScreen]) + }, [query, funnelName, visible, isSmallScreen]) useEffect(() => { if (canvasRef.current && funnel && visible && !isSmallScreen) { @@ -115,7 +119,7 @@ export default function Funnel(props) { } const getFunnel = () => { - return props.site.funnels.find((funnel) => funnel.name === props.funnelName) + return site.funnels.find((funnel) => funnel.name === funnelName) } const fetchFunnel = async () => { @@ -123,7 +127,7 @@ export default function Funnel(props) { if (typeof funnelMeta === 'undefined') { throw new Error('Could not fetch the funnel. Perhaps it was deleted?') } else { - return api.get(`/api/stats/${encodeURIComponent(props.site.domain)}/funnels/${funnelMeta.id}`, props.query) + return api.get(`/api/stats/${encodeURIComponent(site.domain)}/funnels/${funnelMeta.id}`, query) } } @@ -256,8 +260,8 @@ export default function Funnel(props) { const header = () => { return (
-

{props.funnelName}

- {props.tabs} +

{funnelName}

+ {tabs}
) } diff --git a/assets/js/dashboard/filters.js b/assets/js/dashboard/filters.js index a111ce10888c7..cca858b70444c 100644 --- a/assets/js/dashboard/filters.js +++ b/assets/js/dashboard/filters.js @@ -1,10 +1,10 @@ import React, { Fragment, useEffect, useState } from 'react'; -import { Link, withRouter } from 'react-router-dom' -import { AdjustmentsVerticalIcon, MagnifyingGlassIcon, XMarkIcon, PencilSquareIcon } from '@heroicons/react/20/solid' -import classNames from 'classnames' -import { Menu, Transition } from '@headlessui/react' +import { Link, withRouter } from 'react-router-dom'; +import { AdjustmentsVerticalIcon, MagnifyingGlassIcon, XMarkIcon, PencilSquareIcon } from '@heroicons/react/20/solid'; +import classNames from 'classnames'; +import { Menu, Transition } from '@headlessui/react'; -import { navigateToQuery } from './query' +import { navigateToQuery } from './query'; import { FILTER_GROUP_TO_MODAL_TYPE, cleanLabels, @@ -15,7 +15,7 @@ import { getPropertyKeyFromFilterKey, getLabel, FILTER_OPERATIONS_DISPLAY_NAMES -} from "./util/filters" +} from "./util/filters"; import { useQueryContext } from './query-context'; import { useSiteContext } from './site-context'; @@ -99,7 +99,9 @@ function filterDropdownOption(site, option) { ) } -function DropdownContent({ history, site, query, wrapped }) { +function DropdownContent({ history, wrapped }) { + const site = useSiteContext(); + const { query } = useQueryContext(); const [addingFilter, setAddingFilter] = useState(false); if (wrapped === WRAPSTATE.unwrapped || addingFilter) { @@ -126,7 +128,6 @@ function DropdownContent({ history, site, query, wrapped }) { function Filters({ history }) { const { query } = useQueryContext(); - const site = useSiteContext(); const [wrapped, setWrapped] = useState(WRAPSTATE.waiting) const [viewport, setViewport] = useState(1080) @@ -267,7 +268,7 @@ function Filters({ history }) { className="rounded-md shadow-lg bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5 font-medium text-gray-800 dark:text-gray-200" > - + diff --git a/assets/js/dashboard/query.js b/assets/js/dashboard/query.js index 104d70592e1c1..fdc3688dce1f3 100644 --- a/assets/js/dashboard/query.js +++ b/assets/js/dashboard/query.js @@ -7,9 +7,10 @@ import * as storage from './util/storage' import { COMPARISON_DISABLED_PERIODS, getStoredComparisonMode, isComparisonEnabled, getStoredMatchDayOfWeek } from './comparison-input' import { getFiltersByKeyPrefix } from './util/filters' -import dayjs from 'dayjs'; -import utc from 'dayjs/plugin/utc'; +import dayjs from 'dayjs' +import utc from 'dayjs/plugin/utc' import { parseLegacyFilter, parseLegacyPropsFilter } from './util/filters' +import { useQueryContext } from './query-context' dayjs.extend(utc) @@ -49,7 +50,7 @@ export function parseQuery(querystring, site) { } export function addFilter(query, filter) { - return {...query, filters: [...query.filters, filter]} + return { ...query, filters: [...query.filters, filter] } } export function navigateToQuery(history, queryFrom, newData) { @@ -145,7 +146,7 @@ export function filtersBackwardsCompatibilityRedirect() { export function revenueAvailable(query, site) { const revenueGoalsInFilter = site.revenueGoals.filter((rg) => { const goalFilters = getFiltersByKeyPrefix(query, "goal") - + return goalFilters.some(([_op, _key, clauses]) => { return clauses.includes(rg.event_name) }) @@ -159,7 +160,8 @@ export function revenueAvailable(query, site) { } function QueryLink(props) { - const { query, history, to, className, children } = props + const { query } = useQueryContext(); + const { history, to, className, children } = props function onClick(e) { e.preventDefault() @@ -183,7 +185,8 @@ function QueryLink(props) { const QueryLinkWithRouter = withRouter(QueryLink) export { QueryLinkWithRouter as QueryLink }; -function QueryButton({ history, query, to, disabled, className, children, onClick }) { +function QueryButton({ history, to, disabled, className, children, onClick }) { + const { query } = useQueryContext(); return (