From 01cfb41de10927acac5529d1dcb258da2a113a95 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Tue, 1 Mar 2022 14:18:35 +0100 Subject: [PATCH 1/2] feat(ui) - check for alphanumeric in version compare --- .../TrackerUpdateMessage.js | 21 ++++++++++++------- frontend/app/utils.js | 6 ++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js b/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js index a5fe4411c..787751d79 100644 --- a/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js +++ b/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js @@ -1,18 +1,25 @@ -import React from 'react' +import React, { useEffect } from 'react' import { Icon } from 'UI' import { connect } from 'react-redux' import { withRouter } from 'react-router-dom'; import { onboarding as onboardingRoute } from 'App/routes' import { withSiteId } from 'App/routes'; +import { isGreaterOrEqualVersion } from 'App/utils' const TrackerUpdateMessage= (props) => { - // const { site } = props; - const { site, sites, match: { params: { siteId } } } = props; + const [needUpdate, setNeedUpdate] = React.useState(false) + const { sites, match: { params: { siteId } } } = props; const activeSite = sites.find(s => s.id == siteId); - const hasSessions = !!activeSite && !activeSite.recorded; - const appVersionInt = parseInt(window.ENV.TRACKER_VERSION.split(".").join("")) - const trackerVersionInt = site.trackerVersion ? parseInt(site.trackerVersion.split(".").join("")) : 0 - const needUpdate = !hasSessions && appVersionInt > trackerVersionInt; + + useEffect(() => { + if (!activeSite || !activeSite.trackerVersion) return; + + const isLatest = isGreaterOrEqualVersion(activeSite.trackerVersion, window.ENV.TRACKER_VERSION); + if (!isLatest && activeSite.recorded) { + setNeedUpdate(true) + } + }, [activeSite]) + return needUpdate ? ( <> {( diff --git a/frontend/app/utils.js b/frontend/app/utils.js index 52b2a9d6a..4c1a0c607 100644 --- a/frontend/app/utils.js +++ b/frontend/app/utils.js @@ -226,4 +226,10 @@ export const iceServerConfigFromString = (str) => { return server } }) +} + +export const isGreaterOrEqualVersion = (version, compareTo) => { + const [major, minor, patch] = version.split("-")[0].split('.'); + const [majorC, minorC, patchC] = compareTo.split("-")[0].split('.'); + return (major > majorC) || (major === majorC && minor > minorC) || (major === majorC && minor === minorC && patch >= patchC); } \ No newline at end of file From 6e7f0c33a7bdd83007c257bc757d35f8df9d5461 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Tue, 1 Mar 2022 16:03:41 +0100 Subject: [PATCH 2/2] feat(ui) - api recalls --- frontend/app/Router.js | 21 +++++++++++++- .../Alerts/Notifications/Notifications.js | 6 ++-- .../components/Announcements/Announcements.js | 6 +--- .../app/components/BugFinder/BugFinder.js | 28 ------------------- .../app/components/BugFinder/DateRange.js | 2 +- .../BugFinder/SessionsMenu/SessionsMenu.js | 6 ++-- frontend/app/components/Client/Client.js | 2 -- frontend/app/components/Header/Header.js | 4 --- .../app/components/Header/SiteDropdown.js | 12 ++++++-- 9 files changed, 37 insertions(+), 50 deletions(-) diff --git a/frontend/app/Router.js b/frontend/app/Router.js index 86f07c4f6..782f47e74 100644 --- a/frontend/app/Router.js +++ b/frontend/app/Router.js @@ -21,6 +21,10 @@ import Header from 'Components/Header/Header'; import FunnelDetails from 'Components/Funnels/FunnelDetails'; import FunnelIssueDetails from 'Components/Funnels/FunnelIssueDetails'; import { fetchList as fetchIntegrationVariables } from 'Duck/customField'; +import { fetchList as fetchSiteList } from 'Duck/site'; +import { fetchList as fetchAnnouncements } from 'Duck/announcements'; +import { fetchList as fetchAlerts } from 'Duck/alerts'; +import { fetchWatchdogStatus } from 'Duck/watchdogs'; import APIClient from './api_client'; import * as routes from './routes'; @@ -80,7 +84,14 @@ const ONBOARDING_REDIRECT_PATH = routes.onboarding(OB_DEFAULT_TAB); onboarding: state.getIn([ 'user', 'onboarding' ]) }; }, { - fetchUserInfo, fetchTenants, setSessionPath, fetchIntegrationVariables + fetchUserInfo, + fetchTenants, + setSessionPath, + fetchIntegrationVariables, + fetchSiteList, + fetchAnnouncements, + fetchAlerts, + fetchWatchdogStatus, }) class Router extends React.Component { state = { @@ -93,6 +104,14 @@ class Router extends React.Component { props.fetchUserInfo().then(() => { props.fetchIntegrationVariables() }), + props.fetchSiteList().then(() => { + setTimeout(() => { + props.fetchAnnouncements(); + props.fetchAlerts(); + props.fetchWatchdogStatus(); + }, 100); + }), + // props.fetchAnnouncements(), ]) // .then(() => this.onLoginLogout()); } diff --git a/frontend/app/components/Alerts/Notifications/Notifications.js b/frontend/app/components/Alerts/Notifications/Notifications.js index deb14b640..a30ad824f 100644 --- a/frontend/app/components/Alerts/Notifications/Notifications.js +++ b/frontend/app/components/Alerts/Notifications/Notifications.js @@ -18,9 +18,9 @@ class Notifications extends React.Component { constructor(props) { super(props); - setTimeout(() => { - props.fetchList(); - }, 1000); + // setTimeout(() => { + // props.fetchList(); + // }, 1000); setInterval(() => { props.fetchList(); diff --git a/frontend/app/components/Announcements/Announcements.js b/frontend/app/components/Announcements/Announcements.js index ff392e2e7..733b4ce37 100644 --- a/frontend/app/components/Announcements/Announcements.js +++ b/frontend/app/components/Announcements/Announcements.js @@ -10,11 +10,7 @@ import { withRouter } from 'react-router-dom'; @withToggle('visible', 'toggleVisisble') @withRouter class Announcements extends React.Component { - constructor(props) { - super(props); - props.fetchList(); - } - + navigateToUrl = url => { if (url) { if (url.startsWith(window.ENV.ORIGIN)) { diff --git a/frontend/app/components/BugFinder/BugFinder.js b/frontend/app/components/BugFinder/BugFinder.js index f0024c20a..6d30359f1 100644 --- a/frontend/app/components/BugFinder/BugFinder.js +++ b/frontend/app/components/BugFinder/BugFinder.js @@ -4,14 +4,11 @@ import withPageTitle from 'HOCs/withPageTitle'; import { fetchFavoriteList as fetchFavoriteSessionList } from 'Duck/sessions'; -import { countries } from 'App/constants'; import { applyFilter, clearEvents, addAttribute } from 'Duck/filters'; import { fetchList as fetchFunnelsList } from 'Duck/funnels'; -import { defaultFilters, preloadedFilters } from 'Types/filter'; import { KEYS } from 'Types/filter/customFilter'; import SessionList from './SessionList'; import stl from './bugFinder.css'; -import { fetchList as fetchSiteList } from 'Duck/site'; import withLocationHandlers from "HOCs/withLocationHandlers"; import { fetch as fetchFilterVariables } from 'Duck/sources'; import { fetchSources } from 'Duck/customField'; @@ -68,7 +65,6 @@ const allowedQueryKeys = [ fetchSources, clearEvents, setActiveTab, - fetchSiteList, fetchFunnelsList, resetFunnel, resetFunnelFilters, @@ -81,7 +77,6 @@ export default class BugFinder extends React.PureComponent { state = {showRehydratePanel: false} constructor(props) { super(props); - // props.fetchFavoriteSessionList(); // TODO should cache the response // props.fetchSources().then(() => { @@ -115,29 +110,6 @@ export default class BugFinder extends React.PureComponent { this.setState({ showRehydratePanel: !this.state.showRehydratePanel }) } - // fetchPreloadedFilters = () => { - // this.props.fetchFilterVariables('filterValues').then(function() { - // const { filterValues } = this.props; - // const keys = [ - // {key: KEYS.USER_OS, label: 'OS'}, - // {key: KEYS.USER_BROWSER, label: 'Browser'}, - // {key: KEYS.USER_DEVICE, label: 'Device'}, - // {key: KEYS.REFERRER, label: 'Referrer'}, - // {key: KEYS.USER_COUNTRY, label: 'Country'}, - // ] - // if (filterValues && filterValues.size != 0) { - // keys.forEach(({key, label}) => { - // const _keyFilters = filterValues.get(key) - // if (key === KEYS.USER_COUNTRY) { - // preloadedFilters.push(_keyFilters.map(item => ({label, type: key, key, value: item, actualValue: countries[item], isFilter: true}))); - // } else { - // preloadedFilters.push(_keyFilters.map(item => ({label, type: key, key, value: item, isFilter: true}))); - // } - // }) - // } - // }.bind(this)); - // } - setActiveTab = tab => { this.props.setActiveTab(tab); } diff --git a/frontend/app/components/BugFinder/DateRange.js b/frontend/app/components/BugFinder/DateRange.js index ed8c76c98..c0758b426 100644 --- a/frontend/app/components/BugFinder/DateRange.js +++ b/frontend/app/components/BugFinder/DateRange.js @@ -10,7 +10,7 @@ import DateRangeDropdown from 'Shared/DateRangeDropdown'; }) export default class DateRange extends React.PureComponent { onDateChange = (e) => { - this.props.fetchFunnelsList(e.rangeValue) + // this.props.fetchFunnelsList(e.rangeValue) this.props.applyFilter(e) } render() { diff --git a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js index 2436d4be6..be98a28cd 100644 --- a/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js +++ b/frontend/app/components/BugFinder/SessionsMenu/SessionsMenu.js @@ -22,9 +22,9 @@ function SessionsMenu(props) { } } - useEffect(() => { - fetchWatchdogStatus() - }, []) + // useEffect(() => { + // fetchWatchdogStatus() + // }, []) const capturingAll = props.captureRate && props.captureRate.get('captureAll'); diff --git a/frontend/app/components/Client/Client.js b/frontend/app/components/Client/Client.js index 6cae36710..cb55d933d 100644 --- a/frontend/app/components/Client/Client.js +++ b/frontend/app/components/Client/Client.js @@ -3,7 +3,6 @@ import { withRouter } from 'react-router-dom'; import { Switch, Route, Redirect } from 'react-router'; import { CLIENT_TABS, client as clientRoute } from 'App/routes'; import { fetchList as fetchMemberList } from 'Duck/member'; -import { fetchList as fetchSiteList } from 'Duck/site'; import ProfileSettings from './ProfileSettings'; import Integrations from './Integrations'; @@ -21,7 +20,6 @@ import Roles from './Roles'; appearance: state.getIn([ 'user', 'account', 'appearance' ]), }), { fetchMemberList, - fetchSiteList, }) @withRouter export default class Client extends React.PureComponent { diff --git a/frontend/app/components/Header/Header.js b/frontend/app/components/Header/Header.js index 38d958c17..6d541fca7 100644 --- a/frontend/app/components/Header/Header.js +++ b/frontend/app/components/Header/Header.js @@ -66,10 +66,6 @@ const Header = (props) => { } }, [showTrackingModal]) - useEffect(() => { - fetchSiteList() - }, []) - return (
diff --git a/frontend/app/components/Header/SiteDropdown.js b/frontend/app/components/Header/SiteDropdown.js index 55259c088..74b650055 100644 --- a/frontend/app/components/Header/SiteDropdown.js +++ b/frontend/app/components/Header/SiteDropdown.js @@ -11,6 +11,8 @@ import cn from 'classnames'; import NewSiteForm from '../Client/Sites/NewSiteForm'; import { clearSearch } from 'Duck/search'; import { fetchList as fetchIntegrationVariables } from 'Duck/customField'; +import { fetchList as fetchAlerts } from 'Duck/alerts'; +import { fetchWatchdogStatus } from 'Duck/watchdogs'; @withRouter @connect(state => ({ @@ -23,13 +25,15 @@ import { fetchList as fetchIntegrationVariables } from 'Duck/customField'; init, clearSearch, fetchIntegrationVariables, + fetchAlerts, + fetchWatchdogStatus, }) export default class SiteDropdown extends React.PureComponent { state = { showProductModal: false } - componentDidMount() { - this.props.fetchIntegrationVariables(); - } + // componentDidMount() { + // this.props.fetchIntegrationVariables(); + // } closeModal = (e, newSite) => { this.setState({ showProductModal: false }) @@ -44,6 +48,8 @@ export default class SiteDropdown extends React.PureComponent { this.props.setSiteId(siteId); this.props.clearSearch(); this.props.fetchIntegrationVariables(); + this.props.fetchAlerts(); + this.props.fetchWatchdogStatus(); } render() {