138138
139139<script setup lang="ts">
140140import Button from ' primevue/button'
141- import { computed , nextTick , onMounted , ref } from ' vue'
141+ import { computed , nextTick , onBeforeUnmount , onMounted , ref } from ' vue'
142142import type { CSSProperties , Component } from ' vue'
143143import { useI18n } from ' vue-i18n'
144144
145145import PuzzleIcon from ' @/components/icons/PuzzleIcon.vue'
146146import { isCloud } from ' @/platform/distribution/types'
147147import { useSettingStore } from ' @/platform/settings/settingStore'
148+ import { useTelemetry } from ' @/platform/telemetry'
148149import type { ReleaseNote } from ' @/platform/updates/common/releaseService'
149150import { useReleaseStore } from ' @/platform/updates/common/releaseStore'
150151import { useCommandStore } from ' @/stores/commandStore'
@@ -196,6 +197,7 @@ const { t, locale } = useI18n()
196197const releaseStore = useReleaseStore ()
197198const commandStore = useCommandStore ()
198199const settingStore = useSettingStore ()
200+ const telemetry = useTelemetry ()
199201
200202// Emits
201203const emit = defineEmits <{
@@ -207,6 +209,7 @@ const isSubmenuVisible = ref(false)
207209const submenuRef = ref <HTMLElement | null >(null )
208210const submenuStyle = ref <CSSProperties >({})
209211let hoverTimeout: number | null = null
212+ const openedAt = ref <number >(Date .now ())
210213
211214// Computed
212215const hasReleases = computed (() => releaseStore .releases .length > 0 )
@@ -226,6 +229,7 @@ const moreItems = computed<MenuItem[]>(() => {
226229 label: t (' helpCenter.desktopUserGuide' ),
227230 visible: isElectron (),
228231 action : () => {
232+ trackResourceClick (' docs' , true )
229233 const docsUrl =
230234 electronAPI ().getPlatform () === ' darwin'
231235 ? EXTERNAL_LINKS .DESKTOP_GUIDE_MACOS
@@ -281,6 +285,7 @@ const menuItems = computed<MenuItem[]>(() => {
281285 icon: ' pi pi-book' ,
282286 label: t (' helpCenter.docs' ),
283287 action : () => {
288+ trackResourceClick (' docs' , true )
284289 openExternalLink (EXTERNAL_LINKS .DOCS )
285290 emit (' close' )
286291 }
@@ -291,6 +296,7 @@ const menuItems = computed<MenuItem[]>(() => {
291296 icon: ' pi pi-discord' ,
292297 label: ' Discord' ,
293298 action : () => {
299+ trackResourceClick (' discord' , true )
294300 openExternalLink (EXTERNAL_LINKS .DISCORD )
295301 emit (' close' )
296302 }
@@ -301,6 +307,7 @@ const menuItems = computed<MenuItem[]>(() => {
301307 icon: ' pi pi-github' ,
302308 label: t (' helpCenter.github' ),
303309 action : () => {
310+ trackResourceClick (' github' , true )
304311 openExternalLink (EXTERNAL_LINKS .GITHUB )
305312 emit (' close' )
306313 }
@@ -311,6 +318,7 @@ const menuItems = computed<MenuItem[]>(() => {
311318 icon: ' pi pi-question-circle' ,
312319 label: t (' helpCenter.helpFeedback' ),
313320 action : () => {
321+ trackResourceClick (' help_feedback' , false )
314322 void commandStore .execute (' Comfy.ContactSupport' )
315323 emit (' close' )
316324 }
@@ -326,6 +334,7 @@ const menuItems = computed<MenuItem[]>(() => {
326334 label: t (' helpCenter.managerExtension' ),
327335 showRedDot: shouldShowManagerRedDot .value ,
328336 action : async () => {
337+ trackResourceClick (' manager' , false )
329338 await useManagerState ().openManager ({
330339 initialTab: ManagerTab .All ,
331340 showToastOnLegacyError: false
@@ -349,6 +358,23 @@ const menuItems = computed<MenuItem[]>(() => {
349358})
350359
351360// Utility Functions
361+ const trackResourceClick = (
362+ resourceType :
363+ | ' docs'
364+ | ' discord'
365+ | ' github'
366+ | ' help_feedback'
367+ | ' manager'
368+ | ' release_notes' ,
369+ isExternal : boolean
370+ ): void => {
371+ telemetry ?.trackHelpResourceClicked ({
372+ resource_type: resourceType ,
373+ is_external: isExternal ,
374+ source: ' help_center'
375+ })
376+ }
377+
352378const openExternalLink = (url : string ): void => {
353379 window .open (url , ' _blank' , ' noopener,noreferrer' )
354380}
@@ -504,6 +530,7 @@ const onReinstall = (): void => {
504530}
505531
506532const onReleaseClick = (release : ReleaseNote ): void => {
533+ trackResourceClick (' release_notes' , true )
507534 void releaseStore .handleShowChangelog (release .version )
508535 const versionAnchor = formatVersionAnchor (release .version )
509536 const changelogUrl = ` ${getChangelogUrl ()}#${versionAnchor } `
@@ -512,6 +539,7 @@ const onReleaseClick = (release: ReleaseNote): void => {
512539}
513540
514541const onUpdate = (_ : ReleaseNote ): void => {
542+ trackResourceClick (' docs' , true )
515543 openExternalLink (EXTERNAL_LINKS .UPDATE_GUIDE )
516544 emit (' close' )
517545}
@@ -526,10 +554,16 @@ const getChangelogUrl = (): string => {
526554
527555// Lifecycle
528556onMounted (async () => {
557+ telemetry ?.trackHelpCenterOpened ({ source: ' sidebar' })
529558 if (! hasReleases .value ) {
530559 await releaseStore .fetchReleases ()
531560 }
532561})
562+
563+ onBeforeUnmount (() => {
564+ const timeSpentSeconds = Math .round ((Date .now () - openedAt .value ) / 1000 )
565+ telemetry ?.trackHelpCenterClosed ({ time_spent_seconds: timeSpentSeconds })
566+ })
533567 </script >
534568
535569<style scoped>
0 commit comments