+
🚨
+
ARVIO Crash Diagnostics
+
+ Tap below to instantly copy this bug report to your phone clipboard and open the ARVIO Discord bug channel.
+
+
+
+
Formatted Bug Report
+
Loading diagnostic report...
+
+
+
+
+
+
+
+
+
+
diff --git a/web/app/report/page.tsx b/web/app/report/page.tsx
new file mode 100644
index 00000000..2f893923
--- /dev/null
+++ b/web/app/report/page.tsx
@@ -0,0 +1,197 @@
+"use client";
+
+import React, { Suspense, useEffect, useState } from "react";
+import { useSearchParams } from "next/navigation";
+
+const DISCORD_URL = "https://discord.gg/UavuEYMfQ4";
+
+function ReportContent() {
+ const searchParams = useSearchParams();
+ const id = searchParams.get("id") || "N/A";
+ const version = searchParams.get("v") || searchParams.get("version") || "1.0";
+ const error = searchParams.get("err") || searchParams.get("error") || "Unexpected crash";
+ const timeParam = searchParams.get("t") || searchParams.get("time");
+
+ const [copied, setCopied] = useState(false);
+ const [timeStr, setTimeStr] = useState("Just now");
+
+ useEffect(() => {
+ if (timeParam) {
+ const parsed = parseInt(timeParam, 10);
+ if (!isNaN(parsed)) {
+ setTimeStr(new Date(parsed).toLocaleString());
+ } else {
+ setTimeStr(timeParam);
+ }
+ } else {
+ setTimeStr(new Date().toLocaleString());
+ }
+ }, [timeParam]);
+
+ const sentryLink = id !== "N/A" ? `https://sentry.io/issues/?query=id%3A${id}` : "N/A";
+
+ const reportText = `**🚨 ARVIO Crash Report**
+**Crash ID:** \`${id}\`
+**Sentry Link:** ${sentryLink}
+**Version:** ${version}
+**Time:** ${timeStr}
+**Error:** ${error}`;
+
+ const handleCopyAndRedirect = async () => {
+ try {
+ if (navigator.clipboard) {
+ await navigator.clipboard.writeText(reportText);
+ } else {
+ const textArea = document.createElement("textarea");
+ textArea.value = reportText;
+ document.body.appendChild(textArea);
+ textArea.select();
+ document.execCommand("copy");
+ document.body.removeChild(textArea);
+ }
+ } catch {
+ // Fallback ignore
+ }
+
+ setCopied(true);
+ setTimeout(() => {
+ window.location.href = DISCORD_URL;
+ }, 700);
+ };
+
+ return (
+