130130
131131<script setup lang="ts">
132132import Button from ' primevue/button'
133- import { computed , nextTick , onMounted , ref } from ' vue'
133+ import { computed , nextTick , onBeforeUnmount , onMounted , ref } from ' vue'
134134import type { CSSProperties , Component } from ' vue'
135135import { useI18n } from ' vue-i18n'
136136
137137import PuzzleIcon from ' @/components/icons/PuzzleIcon.vue'
138138import { isCloud } from ' @/platform/distribution/types'
139139import { useSettingStore } from ' @/platform/settings/settingStore'
140+ import { useTelemetry } from ' @/platform/telemetry'
140141import type { ReleaseNote } from ' @/platform/updates/common/releaseService'
141142import { useReleaseStore } from ' @/platform/updates/common/releaseStore'
142143import { useCommandStore } from ' @/stores/commandStore'
@@ -188,6 +189,7 @@ const { t, locale } = useI18n()
188189const releaseStore = useReleaseStore ()
189190const commandStore = useCommandStore ()
190191const settingStore = useSettingStore ()
192+ const telemetry = useTelemetry ()
191193
192194// Emits
193195const emit = defineEmits <{
@@ -199,6 +201,7 @@ const isSubmenuVisible = ref(false)
199201const submenuRef = ref <HTMLElement | null >(null )
200202const submenuStyle = ref <CSSProperties >({})
201203let hoverTimeout: number | null = null
204+ const openedAt = ref <number >(Date .now ())
202205
203206// Computed
204207const hasReleases = computed (() => releaseStore .releases .length > 0 )
@@ -218,6 +221,7 @@ const moreItems = computed<MenuItem[]>(() => {
218221 label: t (' helpCenter.desktopUserGuide' ),
219222 visible: isElectron (),
220223 action : () => {
224+ trackResourceClick (' docs' , true )
221225 const docsUrl =
222226 electronAPI ().getPlatform () === ' darwin'
223227 ? EXTERNAL_LINKS .DESKTOP_GUIDE_MACOS
@@ -273,6 +277,7 @@ const menuItems = computed<MenuItem[]>(() => {
273277 icon: ' pi pi-book' ,
274278 label: t (' helpCenter.docs' ),
275279 action : () => {
280+ trackResourceClick (' docs' , true )
276281 openExternalLink (EXTERNAL_LINKS .DOCS )
277282 emit (' close' )
278283 }
@@ -283,6 +288,7 @@ const menuItems = computed<MenuItem[]>(() => {
283288 icon: ' pi pi-discord' ,
284289 label: ' Discord' ,
285290 action : () => {
291+ trackResourceClick (' discord' , true )
286292 openExternalLink (EXTERNAL_LINKS .DISCORD )
287293 emit (' close' )
288294 }
@@ -293,6 +299,7 @@ const menuItems = computed<MenuItem[]>(() => {
293299 icon: ' pi pi-github' ,
294300 label: t (' helpCenter.github' ),
295301 action : () => {
302+ trackResourceClick (' github' , true )
296303 openExternalLink (EXTERNAL_LINKS .GITHUB )
297304 emit (' close' )
298305 }
@@ -303,6 +310,7 @@ const menuItems = computed<MenuItem[]>(() => {
303310 icon: ' pi pi-question-circle' ,
304311 label: t (' helpCenter.helpFeedback' ),
305312 action : () => {
313+ trackResourceClick (' help_feedback' , false )
306314 void commandStore .execute (' Comfy.ContactSupport' )
307315 emit (' close' )
308316 }
@@ -318,6 +326,7 @@ const menuItems = computed<MenuItem[]>(() => {
318326 label: t (' helpCenter.managerExtension' ),
319327 showRedDot: shouldShowManagerRedDot .value ,
320328 action : async () => {
329+ trackResourceClick (' manager' , false )
321330 await useManagerState ().openManager ({
322331 initialTab: ManagerTab .All ,
323332 showToastOnLegacyError: false
@@ -341,6 +350,23 @@ const menuItems = computed<MenuItem[]>(() => {
341350})
342351
343352// Utility Functions
353+ const trackResourceClick = (
354+ resourceType :
355+ | ' docs'
356+ | ' discord'
357+ | ' github'
358+ | ' help_feedback'
359+ | ' manager'
360+ | ' release_notes' ,
361+ isExternal : boolean
362+ ): void => {
363+ telemetry ?.trackHelpResourceClicked ({
364+ resource_type: resourceType ,
365+ is_external: isExternal ,
366+ source: ' help_center'
367+ })
368+ }
369+
344370const openExternalLink = (url : string ): void => {
345371 window .open (url , ' _blank' , ' noopener,noreferrer' )
346372}
@@ -496,6 +522,7 @@ const onReinstall = (): void => {
496522}
497523
498524const onReleaseClick = (release : ReleaseNote ): void => {
525+ trackResourceClick (' release_notes' , true )
499526 void releaseStore .handleShowChangelog (release .version )
500527 const versionAnchor = formatVersionAnchor (release .version )
501528 const changelogUrl = ` ${getChangelogUrl ()}#${versionAnchor } `
@@ -504,6 +531,7 @@ const onReleaseClick = (release: ReleaseNote): void => {
504531}
505532
506533const onUpdate = (_ : ReleaseNote ): void => {
534+ trackResourceClick (' docs' , true )
507535 openExternalLink (EXTERNAL_LINKS .UPDATE_GUIDE )
508536 emit (' close' )
509537}
@@ -518,10 +546,16 @@ const getChangelogUrl = (): string => {
518546
519547// Lifecycle
520548onMounted (async () => {
549+ telemetry ?.trackHelpCenterOpened ({ source: ' sidebar' })
521550 if (! hasReleases .value ) {
522551 await releaseStore .fetchReleases ()
523552 }
524553})
554+
555+ onBeforeUnmount (() => {
556+ const timeSpentSeconds = Math .round ((Date .now () - openedAt .value ) / 1000 )
557+ telemetry ?.trackHelpCenterClosed ({ time_spent_seconds: timeSpentSeconds })
558+ })
525559 </script >
526560
527561<style scoped>
0 commit comments