feat: Implement custom view tracking

This commit is contained in:
gpt-engineer-app[bot]
2025-10-10 15:53:56 +00:00
parent c39aba6994
commit 4d2d39fb5a
10 changed files with 288 additions and 58 deletions

View File

@@ -18,6 +18,7 @@ import { toast } from '@/hooks/use-toast';
import { submitCompanyUpdate } from '@/lib/companyHelpers';
import { VersionIndicator } from '@/components/versioning/VersionIndicator';
import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs';
import { trackPageView } from '@/lib/viewTracking';
export default function DesignerDetail() {
const { slug } = useParams<{ slug: string }>();
@@ -37,6 +38,13 @@ export default function DesignerDetail() {
}
}, [slug]);
// Track page view when designer is loaded
useEffect(() => {
if (designer?.id) {
trackPageView('company', designer.id);
}
}, [designer?.id]);
const fetchDesignerData = async () => {
try {
const { data, error } = await supabase

View File

@@ -1,6 +1,7 @@
import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { Header } from '@/components/layout/Header';
import { trackPageView } from '@/lib/viewTracking';
import { getBannerUrls } from '@/lib/cloudflareImageUtils';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
@@ -38,6 +39,13 @@ export default function ManufacturerDetail() {
}
}, [slug]);
// Track page view when manufacturer is loaded
useEffect(() => {
if (manufacturer?.id) {
trackPageView('company', manufacturer.id);
}
}, [manufacturer?.id]);
const fetchManufacturerData = async () => {
try {
const { data, error } = await supabase

View File

@@ -1,6 +1,7 @@
import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { Header } from '@/components/layout/Header';
import { trackPageView } from '@/lib/viewTracking';
import { getBannerUrls } from '@/lib/cloudflareImageUtils';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
@@ -41,6 +42,13 @@ export default function OperatorDetail() {
}
}, [slug]);
// Track page view when operator is loaded
useEffect(() => {
if (operator?.id) {
trackPageView('company', operator.id);
}
}, [operator?.id]);
const fetchOperatorData = async () => {
try {
const { data, error } = await supabase

View File

@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { Header } from '@/components/layout/Header';
import { getBannerUrls } from '@/lib/cloudflareImageUtils';
import { trackPageView } from '@/lib/viewTracking';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -45,6 +46,13 @@ export default function ParkDetail() {
fetchParkData();
}
}, [slug]);
// Track page view when park is loaded
useEffect(() => {
if (park?.id) {
trackPageView('park', park.id);
}
}, [park?.id]);
const fetchParkData = async () => {
try {
// Fetch park details

View File

@@ -1,6 +1,7 @@
import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { Header } from '@/components/layout/Header';
import { trackPageView } from '@/lib/viewTracking';
import { getBannerUrls } from '@/lib/cloudflareImageUtils';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
@@ -41,6 +42,13 @@ export default function PropertyOwnerDetail() {
}
}, [slug]);
// Track page view when property owner is loaded
useEffect(() => {
if (owner?.id) {
trackPageView('company', owner.id);
}
}, [owner?.id]);
const fetchOwnerData = async () => {
try {
const { data, error } = await supabase

View File

@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { Header } from '@/components/layout/Header';
import { getBannerUrls } from '@/lib/cloudflareImageUtils';
import { trackPageView } from '@/lib/viewTracking';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -50,14 +51,14 @@ import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs';
export default function RideDetail() {
const { parkSlug, rideSlug } = useParams<{ parkSlug: string; rideSlug: string }>();
const navigate = useNavigate();
const { user } = useAuth();
const { isModerator } = useUserRole();
const [ride, setRide] = useState<Ride | null>(null);
const [loading, setLoading] = useState(true);
const [activeTab, setActiveTab] = useState("overview");
const [isEditModalOpen, setIsEditModalOpen] = useState(false);
const [photoCount, setPhotoCount] = useState<number>(0);
const [statsLoading, setStatsLoading] = useState(true);
const { user } = useAuth();
const { isModerator } = useUserRole();
useEffect(() => {
if (parkSlug && rideSlug) {
@@ -65,6 +66,13 @@ export default function RideDetail() {
}
}, [parkSlug, rideSlug]);
// Track page view when ride is loaded
useEffect(() => {
if (ride?.id) {
trackPageView('ride', ride.id);
}
}, [ride?.id]);
const fetchRideData = async () => {
try {
// First get park to find park_id