mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-05 21:20:12 +00:00
feat: add cloud gtm injection (#8311)
## Summary Add GTM injection for cloud distribution builds and push SPA page view + signup events. ## Changes - **What**: Inject GTM script into head-prepend and noscript iframe into body-prepend for cloud builds - **What**: Push `page_view` to `dataLayer` on cloud route changes (page_location + page_title) - **What**: Push `sign_up` to `dataLayer` after successful account creation (email/google/github) - **Dependencies**: None ## Review Focus - Placement order for head-prepend/body-prepend and cloud-only gating - Route-change page_view payload shape - Signup event emission only for new users ## Screenshots (if applicable) <img width="1512" height="860" alt="Screenshot 2026-01-26 at 11 38 11 AM" src="https://github.com/user-attachments/assets/03fb61db-5ca4-4432-9704-bbdcc4c6c1b7" /> <img width="1512" height="862" alt="Screenshot 2026-01-26 at 11 38 26 AM" src="https://github.com/user-attachments/assets/6e46c855-a552-4e52-9800-17898a512d4d" />
This commit is contained in:
@@ -26,6 +26,7 @@ import { t } from '@/i18n'
|
||||
import { WORKSPACE_STORAGE_KEYS } from '@/platform/auth/workspace/workspaceConstants'
|
||||
import { isCloud } from '@/platform/distribution/types'
|
||||
import { useTelemetry } from '@/platform/telemetry'
|
||||
import { pushDataLayerEvent as pushDataLayerEventBase } from '@/platform/telemetry/gtm'
|
||||
import { useDialogService } from '@/services/dialogService'
|
||||
import { useApiKeyAuthStore } from '@/stores/apiKeyAuthStore'
|
||||
import type { AuthHeader } from '@/types/authTypes'
|
||||
@@ -81,6 +82,42 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => {
|
||||
|
||||
const buildApiUrl = (path: string) => `${getComfyApiBaseUrl()}${path}`
|
||||
|
||||
function pushDataLayerEvent(event: Record<string, unknown>): void {
|
||||
if (!isCloud || typeof window === 'undefined') return
|
||||
|
||||
try {
|
||||
pushDataLayerEventBase(event)
|
||||
} catch (error) {
|
||||
console.warn('Failed to push data layer event', error)
|
||||
}
|
||||
}
|
||||
|
||||
async function hashSha256(value: string): Promise<string | undefined> {
|
||||
if (typeof crypto === 'undefined' || !crypto.subtle) return
|
||||
if (typeof TextEncoder === 'undefined') return
|
||||
const data = new TextEncoder().encode(value)
|
||||
const hash = await crypto.subtle.digest('SHA-256', data)
|
||||
return Array.from(new Uint8Array(hash))
|
||||
.map((b) => b.toString(16).padStart(2, '0'))
|
||||
.join('')
|
||||
}
|
||||
|
||||
async function trackSignUp(method: 'email' | 'google' | 'github') {
|
||||
if (!isCloud || typeof window === 'undefined') return
|
||||
|
||||
try {
|
||||
const userId = currentUser.value?.uid
|
||||
const hashedUserId = userId ? await hashSha256(userId) : undefined
|
||||
pushDataLayerEvent({
|
||||
event: 'sign_up',
|
||||
method,
|
||||
...(hashedUserId ? { user_id: hashedUserId } : {})
|
||||
})
|
||||
} catch (error) {
|
||||
console.warn('Failed to track sign up', error)
|
||||
}
|
||||
}
|
||||
|
||||
// Providers
|
||||
const googleProvider = new GoogleAuthProvider()
|
||||
googleProvider.addScope('email')
|
||||
@@ -347,6 +384,7 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => {
|
||||
method: 'email',
|
||||
is_new_user: true
|
||||
})
|
||||
await trackSignUp('email')
|
||||
}
|
||||
|
||||
return result
|
||||
@@ -365,6 +403,9 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => {
|
||||
method: 'google',
|
||||
is_new_user: isNewUser
|
||||
})
|
||||
if (isNewUser) {
|
||||
await trackSignUp('google')
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
@@ -383,6 +424,9 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => {
|
||||
method: 'github',
|
||||
is_new_user: isNewUser
|
||||
})
|
||||
if (isNewUser) {
|
||||
await trackSignUp('github')
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user