/** * useUXAudit - Sentry Session Replay / UX Audit Hook * =================================================== * Phase 19: #126 Frontend Replay UI Integration * * 提供 UX 審計數據的 React Hook: * - Session Replay 統計 * - 憤怒點擊 / 死亡點擊 * - 有錯誤的 Replay 連結 * * 建立: 2026-03-31 (台北時區) * 建立者: Claude Code (#126 Replay UI) */ import { useState, useEffect, useCallback } from 'react' import { apiClient, type UXAuditResponse } from '@/lib/api-client' // ============================================================================= // Types // ============================================================================= interface UseUXAuditState { data: UXAuditResponse | null loading: boolean error: string | null } interface UseUXAuditReturn extends UseUXAuditState { refetch: () => Promise } // ============================================================================= // Hook // ============================================================================= export function useUXAudit(): UseUXAuditReturn { const [state, setState] = useState({ data: null, loading: true, error: null, }) const fetchData = useCallback(async () => { setState((prev) => ({ ...prev, loading: true, error: null })) try { const result = await apiClient.getUXAudit() setState({ data: result, loading: false, error: null, }) } catch (err) { setState((prev) => ({ ...prev, loading: false, error: err instanceof Error ? err.message : 'Failed to fetch UX audit data', })) } }, []) const refetch = useCallback(() => { return fetchData() }, [fetchData]) // Initial fetch useEffect(() => { fetchData() }, [fetchData]) // Auto-refresh every 5 minutes (Replay data changes less frequently) useEffect(() => { const interval = setInterval(fetchData, 300000) return () => clearInterval(interval) }, [fetchData]) return { ...state, refetch, } }