fix(error tracking): streamline Rybbit integration by removing unnecessary type assertions
- Updated ErrorBoundary and ErrorTracking components to directly access the Rybbit object without type assertions. - Enhanced error tracking by ensuring stack traces and component stacks are only included if available. - Improved the HeroSection component by replacing the standard img tag with Next.js Image component for better performance and optimization.
This commit is contained in:
1 parent
4e14cc79ff
commit
50ffed4fee
4 files changed
+43
-10
No files matched your search
@@ -27,12 +27,12 @@ export class ErrorBoundary extends Component<Props, State> {
|
|||||||
|
|
||||||
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
||||||
// Enviar erro ao Rybbit se disponível
|
// Enviar erro ao Rybbit se disponível
|
||||||
if (typeof window !== "undefined" && (window as any).rybbit) {
|
if (typeof window !== "undefined" && window.rybbit) {
|
||||||
try {
|
try {
|
||||||
(window as any).rybbit.track("error", {
|
window.rybbit.track("error", {
|
||||||
message: error.message,
|
message: error.message,
|
||||||
stack: error.stack,
|
stack: error.stack || undefined,
|
||||||
componentStack: errorInfo.componentStack,
|
componentStack: errorInfo.componentStack || undefined,
|
||||||
errorName: error.name,
|
errorName: error.name,
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ export function ErrorTracking() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Handler para erros JavaScript não capturados
|
// Handler para erros JavaScript não capturados
|
||||||
const handleError = (event: ErrorEvent) => {
|
const handleError = (event: ErrorEvent) => {
|
||||||
if (typeof window !== "undefined" && (window as any).rybbit) {
|
if (typeof window !== "undefined" && window.rybbit) {
|
||||||
try {
|
try {
|
||||||
(window as any).rybbit.track("error", {
|
window.rybbit.track("error", {
|
||||||
message: event.message,
|
message: event.message,
|
||||||
filename: event.filename,
|
filename: event.filename,
|
||||||
lineno: event.lineno,
|
lineno: event.lineno,
|
||||||
@@ -30,11 +30,11 @@ export function ErrorTracking() {
|
|||||||
|
|
||||||
// Handler para Promise rejections não tratadas
|
// Handler para Promise rejections não tratadas
|
||||||
const handleUnhandledRejection = (event: PromiseRejectionEvent) => {
|
const handleUnhandledRejection = (event: PromiseRejectionEvent) => {
|
||||||
if (typeof window !== "undefined" && (window as any).rybbit) {
|
if (typeof window !== "undefined" && window.rybbit) {
|
||||||
try {
|
try {
|
||||||
const error = event.reason instanceof Error ? event.reason : new Error(String(event.reason));
|
const error = event.reason instanceof Error ? event.reason : new Error(String(event.reason));
|
||||||
|
|
||||||
(window as any).rybbit.track("error", {
|
window.rybbit.track("error", {
|
||||||
message: error.message || String(event.reason),
|
message: error.message || String(event.reason),
|
||||||
stack: error.stack,
|
stack: error.stack,
|
||||||
errorName: error.name || "UnhandledPromiseRejection",
|
errorName: error.name || "UnhandledPromiseRejection",
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { ChevronDown } from "lucide-react";
|
import { ChevronDown } from "lucide-react";
|
||||||
|
import Image from "next/image";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
|
|
||||||
export function HeroSection() {
|
export function HeroSection() {
|
||||||
@@ -17,10 +18,13 @@ export function HeroSection() {
|
|||||||
<div className="relative z-10 max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
<div className="relative z-10 max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
||||||
{/* Logo */}
|
{/* Logo */}
|
||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<img
|
<Image
|
||||||
src="/apple-touch-icon.png"
|
src="/apple-touch-icon.png"
|
||||||
alt="NutriScan Logo"
|
alt="NutriScan Logo"
|
||||||
className="w-24 h-24 mx-auto rounded-2xl shadow-xl"
|
width={96}
|
||||||
|
height={96}
|
||||||
|
className="mx-auto rounded-2xl shadow-xl"
|
||||||
|
priority
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Vendored
+29
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Definições de tipos para a API do Rybbit Analytics
|
||||||
|
* Estende a interface Window global para incluir o objeto rybbit
|
||||||
|
*/
|
||||||
|
|
||||||
|
interface RybbitTrackEvent {
|
||||||
|
message?: string;
|
||||||
|
stack?: string | null;
|
||||||
|
componentStack?: string | null;
|
||||||
|
errorName?: string;
|
||||||
|
timestamp?: string;
|
||||||
|
type?: string;
|
||||||
|
filename?: string | null;
|
||||||
|
lineno?: number | null;
|
||||||
|
colno?: number | null;
|
||||||
|
[key: string]: unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Rybbit {
|
||||||
|
track(eventName: string, data?: RybbitTrackEvent): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
rybbit?: Rybbit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {};
|
||||||
Reference in new issue
Block a user