import { appBasePath } from "@agent-native/core/client/api-path"; import { useT } from "@agent-native/core/client/i18n"; import { bugReportContextToSearchParams, parseBugReportContext, type BugReportContext, type BugReportSeverity, } from "@shared/bug-report"; import { IconArrowRight, IconBug, IconExternalLink, IconShieldCheck, } from "@tabler/icons-react"; import { useEffect, useMemo, useState } from "react"; import { useLocation, useOutlet } from "react-router"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import enMessages from "@/i18n/en-US"; import { cn } from "@/lib/utils"; export function meta() { return [{ title: enMessages.bugReportRoute.pageTitle }]; } function openRecorder(url: string) { const opened = window.open( url, "agent-native-clips-bug-report", "popup,width=1120,height=820", ); if (!opened) { window.location.href = url; return; } opened.focus(); } export default function BugReportRoute() { const t = useT(); const location = useLocation(); const outlet = useOutlet(); const initialContext = useMemo(() => { const params = new URLSearchParams(location.search); return parseBugReportContext(params, { allowLoose: true }); }, [location.search]); const [title, setTitle] = useState(initialContext?.title ?? ""); const [description, setDescription] = useState( initialContext?.description ?? "", ); const [reporterEmail, setReporterEmail] = useState( initialContext?.reporterEmail ?? "", ); const [severity, setSeverity] = useState( initialContext?.severity ?? "normal", ); const [referrer, setReferrer] = useState(null); useEffect(() => { setReferrer(document.referrer || null); }, []); const sourceUrl = initialContext?.sourceUrl ?? referrer; const pageTitle = initialContext?.pageTitle ?? null; const sourceLabel = pageTitle || sourceUrl || t("bugReportRoute.sourceUnknown"); if (outlet) return outlet; const startRecording = () => { const context: BugReportContext = { projectId: initialContext?.projectId ?? null, title: title.trim() || initialContext?.title || null, description: description.trim() || initialContext?.description || null, severity, sourceUrl, pageTitle, appVersion: initialContext?.appVersion ?? null, environment: initialContext?.environment ?? null, reporterEmail: reporterEmail.trim() || initialContext?.reporterEmail || null, reporterName: initialContext?.reporterName ?? null, reporterId: initialContext?.reporterId ?? null, metadata: initialContext?.metadata ?? null, returnUrl: initialContext?.returnUrl ?? sourceUrl, }; const params = bugReportContextToSearchParams(context); params.set("intent", "bug-report"); params.set("mode", "screen"); params.set("surface", "browser"); openRecorder(`${appBasePath()}/record?${params.toString()}`); }; return (

{t("bugReportRoute.eyebrow")}

{t("bugReportRoute.title")}

{t("bugReportRoute.description")}

setTitle(event.target.value)} placeholder={t("bugReportRoute.issueTitlePlaceholder")} />