Skip to content

Commit 83eb87f

Browse files
committed
refactor preview events to use redux
1 parent a3386df commit 83eb87f

File tree

5 files changed

+304
-96
lines changed

5 files changed

+304
-96
lines changed

src/browser/modules/App/App.tsx

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
*/
2020
import { setEditorTheme } from 'neo4j-arc/cypher-language-support'
21-
import React, { useEffect, useRef } from 'react'
21+
import React, { useCallback, useEffect, useRef } from 'react'
2222
import { connect } from 'react-redux'
2323
import { withBus } from 'react-suber'
2424
import { ThemeProvider } from 'styled-components'
@@ -96,6 +96,10 @@ import {
9696
updateUdcData
9797
} from 'shared/modules/udc/udcDuck'
9898
import { getTelemetrySettings } from 'shared/utils/selectors'
99+
import {
100+
PREVIEW_EVENT,
101+
trackPageLoad
102+
} from 'shared/modules/preview/previewDuck'
99103

100104
export const MAIN_WRAPPER_DOM_ID = 'MAIN_WRAPPER_DOM_ID'
101105

@@ -119,49 +123,55 @@ export function App(props: any) {
119123
const eventMetricsCallback = useRef((_: MetricsData) => _)
120124
const segmentTrackCallback = useRef((_: MetricsData) => _)
121125

126+
const invokeTrackingCallbacks = useCallback(
127+
({ category, label, data }: MetricsData) => {
128+
if (!isRunningE2ETest() && props.telemetrySettings.allowUserStats) {
129+
const extendedData = {
130+
browserVersion: version,
131+
neo4jEdition: props.edition,
132+
connectedTo: props.connectedTo,
133+
...data
134+
}
135+
136+
eventMetricsCallback &&
137+
eventMetricsCallback.current &&
138+
eventMetricsCallback.current({ category, label, data: extendedData })
139+
140+
segmentTrackCallback &&
141+
segmentTrackCallback.current &&
142+
segmentTrackCallback.current({ category, label, data: extendedData })
143+
}
144+
},
145+
[props.telemetrySettings.allowUserStats]
146+
)
147+
122148
useEffect(() => {
123149
const unsub =
124150
props.bus &&
125-
props.bus.take(
126-
METRICS_EVENT,
127-
({ category, label, data: originalData }: MetricsData) => {
128-
if (!isRunningE2ETest() && props.telemetrySettings.allowUserStats) {
129-
const data = {
130-
browserVersion: version,
131-
neo4jEdition: props.edition,
132-
connectedTo: props.connectedTo,
133-
...originalData
134-
}
135-
eventMetricsCallback &&
136-
eventMetricsCallback.current &&
137-
eventMetricsCallback.current({ category, label, data })
138-
segmentTrackCallback &&
139-
segmentTrackCallback.current &&
140-
segmentTrackCallback.current({ category, label, data })
141-
}
142-
}
143-
)
151+
props.bus.take(METRICS_EVENT, (metricsData: MetricsData) => {
152+
invokeTrackingCallbacks(metricsData)
153+
})
144154
return () => unsub && unsub()
145-
}, [props.telemetrySettings.allowUserStats, props.bus])
155+
}, [props.bus, invokeTrackingCallbacks])
156+
157+
useEffect(() => {
158+
const unsub =
159+
props.bus &&
160+
props.bus.take(PREVIEW_EVENT, (metricsData: MetricsData) => {
161+
invokeTrackingCallbacks(metricsData)
162+
})
163+
return () => unsub && unsub()
164+
}, [props.bus, invokeTrackingCallbacks])
146165

147166
useEffect(() => {
148167
const initAction = udcInit()
149168
props.bus && props.bus.send(initAction.type, initAction)
150169
}, [props.bus])
151170

152171
useEffect(() => {
153-
if (!isRunningE2ETest() && props.telemetrySettings.allowUserStats) {
154-
const hasTriedPreviewUI =
155-
localStorage.getItem('hasTriedPreviewUI') === 'true'
156-
segmentTrackCallback &&
157-
segmentTrackCallback.current &&
158-
segmentTrackCallback.current({
159-
category: 'preview',
160-
label: 'PREVIEW_PAGE_LOAD',
161-
data: { previewUI: false, hasTriedPreviewUI }
162-
})
163-
}
164-
}, [props.telemetrySettings.allowUserStats])
172+
const pageLoadAction = trackPageLoad()
173+
props.bus && props.bus.send(pageLoadAction.type, pageLoadAction)
174+
}, [props.bus, props.telemetrySettings.allowUserStats])
165175

166176
const {
167177
browserSyncAuthStatus,
@@ -195,6 +205,7 @@ export function App(props: any) {
195205
}, [titleString])
196206

197207
const wrapperClassNames = codeFontLigatures ? '' : 'disable-font-ligatures'
208+
198209
return (
199210
<ErrorBoundary>
200211
<DesktopApi

src/browser/modules/Stream/PlayFrame.tsx

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ import { isConnectedAuraHost } from 'shared/modules/connections/connectionsDuck'
4747
import { getEdition, isEnterprise } from 'shared/modules/dbMeta/dbMetaDuck'
4848
import { DARK_THEME } from 'shared/modules/settings/settingsDuck'
4949
import { LAST_GUIDE_SLIDE } from 'shared/modules/udc/udcDuck'
50-
import { PreviewFrame } from './StartPreviewFrame'
51-
import { getTelemetrySettings, TelemetrySettings } from 'shared/utils/selectors'
50+
import PreviewFrame from './StartPreviewFrame'
5251

5352
const AuraPromotion = () => {
5453
const theme = useContext(ThemeContext)
@@ -90,15 +89,13 @@ type PlayFrameProps = {
9089
showPromotion: boolean
9190
isFullscreen: boolean
9291
isCollapsed: boolean
93-
telemetrySettings: TelemetrySettings
9492
}
9593
export function PlayFrame({
9694
stack,
9795
bus,
9896
showPromotion,
9997
isFullscreen,
100-
isCollapsed,
101-
telemetrySettings
98+
isCollapsed
10299
}: PlayFrameProps): JSX.Element {
103100
const [stackIndex, setStackIndex] = useState(0)
104101
const [atSlideStart, setAtSlideStart] = useState<boolean | null>(null)
@@ -127,8 +124,7 @@ export function PlayFrame({
127124
bus,
128125
onSlide,
129126
initialPlay,
130-
showPromotion,
131-
telemetrySettings
127+
showPromotion
132128
)
133129
if (stillMounted) {
134130
setInitialPlay(false)
@@ -211,8 +207,7 @@ function generateContent(
211207
bus: Bus,
212208
onSlide: any,
213209
shouldUseSlidePointer: boolean,
214-
showPromotion = false,
215-
telemetrySettings: TelemetrySettings
210+
showPromotion = false
216211
): Content | Promise<Content> {
217212
// Not found
218213
if (stackFrame.response && stackFrame.response.status === 404) {
@@ -301,15 +296,11 @@ function generateContent(
301296
const updatedContent =
302297
isPlayStart && showPromotion ? (
303298
<>
304-
{isPreviewAvailable ? (
305-
<PreviewFrame telemetrySettings={telemetrySettings} />
306-
) : (
307-
content
308-
)}
299+
{isPreviewAvailable ? <PreviewFrame /> : content}
309300
<AuraPromotion />
310301
</>
311302
) : isPreviewAvailable ? (
312-
<PreviewFrame telemetrySettings={telemetrySettings} />
303+
<PreviewFrame />
313304
) : (
314305
content
315306
)
@@ -392,8 +383,7 @@ const mapStateToProps = (state: GlobalState) => ({
392383
(getEdition(state) !== null &&
393384
!isEnterprise(state) &&
394385
!isConnectedAuraHost(state)) ||
395-
inDesktop(state),
396-
telemetrySettings: getTelemetrySettings(state)
386+
inDesktop(state)
397387
})
398388

399389
export default connect(mapStateToProps)(withBus(PlayFrame))

src/browser/modules/Stream/StartPreviewFrame.tsx

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
* You should have received a copy of the GNU General Public License
1818
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
*/
20-
import React, { useRef } from 'react'
21-
import { isRunningE2ETest } from 'services/utils'
22-
import { TelemetrySettings } from 'shared/utils/selectors'
23-
import { MetricsData } from '../Segment'
20+
import React, { Dispatch } from 'react'
21+
import { Action } from 'redux'
22+
import { trackNavigateToPreview } from 'shared/modules/preview/previewDuck'
23+
import { connect } from 'react-redux'
24+
import { withBus } from 'react-suber'
2425

2526
export const navigateToPreview = (): void => {
2627
const path = window.location.pathname
@@ -29,50 +30,14 @@ export const navigateToPreview = (): void => {
2930
}
3031
}
3132

32-
const useTrackAndNavigateToPreview = (
33-
telemetrySettings: TelemetrySettings
34-
): (() => void) => {
35-
const segmentTrackCallback = useRef((_: MetricsData) => _)
36-
const path = window.location.pathname
37-
38-
return () => {
39-
if (!path.endsWith('/preview/')) {
40-
if (!isRunningE2ETest() && telemetrySettings.allowUserStats) {
41-
const now = Date.now()
42-
localStorage.setItem('hasTriedPreviewUI', 'true')
43-
44-
const timeSinceLastSwitchMs =
45-
localStorage.getItem('timeSinceLastSwitchMs') ?? null
46-
localStorage.setItem('timeSinceLastSwitchMs', now.toString())
47-
48-
let timeSinceLastSwitch = null
49-
if (timeSinceLastSwitchMs !== null) {
50-
timeSinceLastSwitch = now - parseInt(timeSinceLastSwitchMs)
51-
}
52-
53-
segmentTrackCallback &&
54-
segmentTrackCallback.current &&
55-
segmentTrackCallback.current({
56-
category: 'preview',
57-
label: 'PREVIEW_UI_SWITCH',
58-
data: {
59-
switchedTo: 'preview',
60-
timeSinceLastSwitch: timeSinceLastSwitch ?? 0
61-
}
62-
})
63-
}
64-
65-
navigateToPreview()
66-
}
67-
}
68-
}
69-
7033
type PreviewFrameProps = {
71-
telemetrySettings: TelemetrySettings
34+
executeTrackNavigateToPreview: () => void
7235
}
73-
export const PreviewFrame = ({ telemetrySettings }: PreviewFrameProps) => {
74-
const trackAndNavigateToPreview =
75-
useTrackAndNavigateToPreview(telemetrySettings)
36+
const PreviewFrame = ({ executeTrackNavigateToPreview }: PreviewFrameProps) => {
37+
function trackAndNavigateToPreview() {
38+
executeTrackNavigateToPreview()
39+
navigateToPreview()
40+
}
7641

7742
return (
7843
<>
@@ -136,3 +101,15 @@ export const PreviewFrame = ({ telemetrySettings }: PreviewFrameProps) => {
136101
</>
137102
)
138103
}
104+
105+
const mapDispatchToProps = (dispatch: Dispatch<Action>) => {
106+
return {
107+
executeTrackNavigateToPreview: () => dispatch(trackNavigateToPreview())
108+
}
109+
}
110+
111+
export default withBus(
112+
connect(() => {
113+
return {}
114+
}, mapDispatchToProps)(PreviewFrame)
115+
)

0 commit comments

Comments
 (0)