Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add feedback component.
Signed-off-by: bgravenorst <[email protected]>
  • Loading branch information
bgravenorst committed Aug 13, 2025
commit bd98d69ace197feb91da49ab4105612a478bfc03
10 changes: 5 additions & 5 deletions src/components/PageFeedback/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react'
import { trackFeedbackForGA } from '../../utils/analytics'
import { trackFeedbackForGA } from '../../lib/feedbackAnalytics'
import styles from './styles.module.scss'

export default function PageFeedback() {
Expand Down Expand Up @@ -27,12 +27,12 @@ export default function PageFeedback() {
}

const handleReasonSubmit = (r: string) => {
const finalReason = r === 'other' ? otherReason.trim() : r
console.log(`💭 User selected reason: "${finalReason}"`)
console.log(`💭 User selected reason: "${r}"`)

const data = {
positive: false,
reason: finalReason,
reason: r,
...(r === 'other' && otherReason.trim() && { response: otherReason.trim() }),
locale: navigator.language,
}
trackFeedbackForGA(data)
Expand Down Expand Up @@ -121,7 +121,7 @@ export default function PageFeedback() {
Outdated content
</button>
<button className={styles.reasonButton} onClick={() => setReason('other')}>
Other
Other (include response)
</button>
</div>
</div>
Expand Down
12 changes: 12 additions & 0 deletions src/components/PageFeedback/styles.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@
gap: 1rem;
max-width: 500px;
margin: 1.5rem 0;

@media (min-width: 768px) {
margin-left: auto;
}
}

.reasonButton {
Expand Down Expand Up @@ -187,6 +191,10 @@
resize: vertical;
margin-bottom: 0.75rem;

@media (min-width: 768px) {
margin-left: auto;
}

@media (prefers-color-scheme: dark) {
color: var(--ifm-color-content);
}
Expand All @@ -212,6 +220,10 @@
width: 100%;
max-width: 500px;
margin-top: 0.5rem;

@media (min-width: 768px) {
margin-left: auto;
}
}

.charCount {
Expand Down
55 changes: 54 additions & 1 deletion src/utils/analytics.ts → src/lib/feedbackAnalytics.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,81 @@
interface FeedbackData {
positive: boolean
reason?: string
response?: string
locale?: string
timestamp?: number
device_type?: string
}

/**
* Detect device type based on user agent and screen size
*/
const getDeviceType = (): string => {
if (typeof window === 'undefined') return 'unknown'

const userAgent = navigator.userAgent.toLowerCase()
const screenWidth = window.screen.width

// Mobile devices
if (/android|webos|iphone|ipod|blackberry|iemobile|opera mini/i.test(userAgent)) {
return 'mobile'
}

// Tablet devices
if (
/ipad|android(?!.*mobile)|tablet/i.test(userAgent) ||
(screenWidth >= 768 && screenWidth <= 1024)
) {
return 'tablet'
}

// Desktop devices
if (screenWidth > 1024) {
return 'desktop'
}

// Fallback based on screen size
if (screenWidth <= 768) {
return 'mobile'
}

return 'desktop'
}

/**
* Track feedback events for Google Analytics 4
* Sends feedback data to GA4 using gtag() or dataLayer fallback
*/
export const trackFeedbackForGA = ({ positive, reason, locale, timestamp }: FeedbackData): void => {
export const trackFeedbackForGA = ({
positive,
reason,
response,
locale,
timestamp,
device_type,
}: FeedbackData): void => {
if (typeof window === 'undefined') {
console.warn('Window object not available - feedback tracking skipped')
return
}

const detectedDeviceType = device_type || getDeviceType()

const eventData = {
feedback_type: positive ? 'positive' : 'negative',
...(reason && { reason }),
...(response && { response }),
locale: locale || navigator.language,
page_path: window.location.pathname,
timestamp: timestamp || Date.now(),
device_type: detectedDeviceType,
}

// Console log for demo purposes
console.log(
`📱 Device detected as: ${detectedDeviceType} (screen: ${window.screen.width}x${window.screen.height})`
)

// Try gtag first (preferred method)
if (typeof window.gtag === 'function') {
try {
Expand Down
Loading