/** * Bug Report Button Component * * A floating button that users can click to submit bug reports. * Only visible on user pages (not admin or interview pages). */ import React, { useState } from 'react'; import { useLocation } from 'react-router-dom'; import { Bug, X, Send, Loader2, CheckCircle } from 'lucide-react'; import { getToken, getStoredUser } from '../../services/api'; import './BugReportButton.css'; const API_BASE = import.meta.env.VITE_API_URL || ''; function BugReportButton() { const location = useLocation(); const [isOpen, setIsOpen] = useState(false); const [submitting, setSubmitting] = useState(false); const [submitted, setSubmitted] = useState(false); const [error, setError] = useState(null); const [formData, setFormData] = useState({ title: '', description: '', category: 'general', severity: 'medium' }); // Check if we should show the bug report button const shouldShowButton = () => { const path = location.pathname; const user = getStoredUser(); // Hide on admin pages if (path.startsWith('/admin')) return false; // Hide during live interview if (path.startsWith('/interview/') && path.includes('/live')) return false; if (path.startsWith('/live-interview')) return false; // Hide on landing/auth pages (no user logged in) if (!user && (path === '/' || path === '/login' || path === '/signup')) return false; // Show on all other user pages return true; }; // Don't render if should not show if (!shouldShowButton()) { return null; } const handleSubmit = async (e) => { e.preventDefault(); setSubmitting(true); setError(null); try { const token = getToken(); const response = await fetch(`${API_BASE}/api/public/bug-report`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ ...formData, page_url: window.location.href, browser_info: navigator.userAgent }) }); if (!response.ok) { throw new Error('Failed to submit bug report'); } setSubmitted(true); setFormData({ title: '', description: '', category: 'general', severity: 'medium' }); // Reset after 3 seconds setTimeout(() => { setSubmitted(false); setIsOpen(false); }, 3000); } catch (err) { setError(err.message); } finally { setSubmitting(false); } }; const handleChange = (e) => { setFormData(prev => ({ ...prev, [e.target.name]: e.target.value })); }; return ( <> {/* Floating Button */} {/* Modal */} {isOpen && (
Your bug report has been submitted successfully.