PluginProbe
Extendify / 0.11.1
Extendify v0.11.1
3.2.1 3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.6.0 All 127 releases
extendify / src / Onboarding / hooks / useTelemetry.js

useTelemetry.js in Extendify 0.11.1, at src/Onboarding/hooks/useTelemetry.js

128 lines 4.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { useEffect, useState } from '@wordpress/element'
2 import { createOrder } from '@onboarding/api/DataApi'
3 import { useGlobalStore } from '@onboarding/state/Global'
4 import { usePagesStore } from '@onboarding/state/Pages'
5 import { useUserSelectionStore } from '@onboarding/state/UserSelections'
6
7 export const useTelemetry = () => {
8 const {
9 goals: selectedGoals,
10 pages: selectedPages,
11 plugins: selectedPlugins,
12 siteType: selectedSiteType,
13 style: selectedStyle,
14 feedbackMissingSiteType,
15 feedbackMissingGoal,
16 siteTypeSearch,
17 exitFeedback,
18 } = useUserSelectionStore()
19 const { orderId, setOrderId, generating } = useGlobalStore()
20 const { pages, currentPageIndex } = usePagesStore()
21 const [url, setUrl] = useState()
22 const [stepProgress, setStepProgress] = useState([])
23 const [viewedStyles, setViewedStyles] = useState(new Set())
24
25 useEffect(() => {
26 const p = [...pages].map((p) => p[0])
27 // Add pages as they move around
28 setStepProgress((progress) =>
29 progress?.at(-1) === p[currentPageIndex]
30 ? progress
31 : [...progress, p[currentPageIndex]],
32 )
33 }, [currentPageIndex, pages])
34
35 useEffect(() => {
36 if (!generating) return
37 // They pressed Launch
38 setStepProgress((progress) => [...progress, 'launched'])
39 }, [generating])
40
41 useEffect(() => {
42 if (!Object.keys(selectedStyle ?? {})?.length) return
43 // Add selectedStyle to the set
44 setViewedStyles((styles) => {
45 const newStyles = new Set(styles)
46 newStyles.add(selectedStyle.recordId)
47 return newStyles
48 })
49 }, [selectedStyle])
50
51 useEffect(() => {
52 let mode = 'onboarding'
53 const search = window.location?.search
54 mode = search?.indexOf('DEVMODE') > -1 ? 'onboarding-dev' : mode
55 mode = search?.indexOf('LOCALMODE') > -1 ? 'onboarding-local' : mode
56 setUrl(window?.extOnbData?.config?.api[mode])
57 }, [])
58
59 useEffect(() => {
60 if (!url || orderId?.length) return
61 // Create a order that persists over local storage
62 createOrder()?.then((response) => {
63 if (response.data?.id) {
64 setOrderId(response.data.id)
65 }
66 })
67 }, [url, setOrderId, orderId])
68
69 useEffect(() => {
70 if (!url || !orderId) return
71 let id = 0
72 id = window.setTimeout(() => {
73 fetch(`${url}/progress`, {
74 method: 'POST',
75 headers: { 'Content-type': 'application/json' },
76 body: JSON.stringify({
77 orderId,
78 selectedGoals: selectedGoals?.map((g) => g.id),
79 selectedPages: selectedPages?.map((p) => p.id),
80 selectedPlugins,
81 selectedSiteType: selectedSiteType?.recordId
82 ? [selectedSiteType.recordId]
83 : [],
84 selectedStyle: selectedStyle?.recordId
85 ? [selectedStyle.recordId]
86 : [],
87 stepProgress,
88 pages,
89 viewedStyles: [...viewedStyles].slice(1),
90 feedbackMissingSiteType,
91 feedbackMissingGoal,
92 siteTypeSearch,
93 perfStyles: getPerformance('style'),
94 perfPages: getPerformance('page'),
95 insightsId: window.extOnbData?.insightsId,
96 activeTests: JSON.stringify(window.extOnbData?.activeTests),
97 exitFeedback,
98 }),
99 })
100 }, 1000)
101 return () => window.clearTimeout(id)
102 }, [
103 url,
104 selectedGoals,
105 selectedPages,
106 selectedPlugins,
107 selectedSiteType,
108 selectedStyle,
109 pages,
110 orderId,
111 stepProgress,
112 viewedStyles,
113 feedbackMissingSiteType,
114 feedbackMissingGoal,
115 siteTypeSearch,
116 exitFeedback,
117 ])
118 }
119
120 const getPerformance = (type) => {
121 return performance
122 ?.getEntriesByType('measure')
123 ?.filter(
124 (m) => m?.detail?.extendify && m?.detail?.context?.type === type,
125 )
126 ?.map((m) => ({ [m.name]: m.duration }))
127 }
128