From f876e868d6ec1f5ecf052dc8852da7c534fedf34 Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Mon, 25 May 2026 11:54:52 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Auto-deploy:=20melhoria=20no=20s?= =?UTF-8?q?nap=20e=20medi=C3=A7=C3=A3o=20AR=20em=2025/05/2026=2011:54:52?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/MeetingRoom.tsx | 44 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/pages/MeetingRoom.tsx b/src/pages/MeetingRoom.tsx index 6dfd57e..18aa844 100644 --- a/src/pages/MeetingRoom.tsx +++ b/src/pages/MeetingRoom.tsx @@ -404,10 +404,52 @@ function MiiAvatarBackup({ ); } +// ========================================== +// CLASSES E COMPONENTES DE RESILIÊNCIA +// ========================================== +class AvatarErrorBoundary extends React.Component<{ fallback: React.ReactNode; children: React.ReactNode }, { hasError: boolean }> { + constructor(props: { fallback: React.ReactNode; children: React.ReactNode }) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError() { + return { hasError: true }; + } + + componentDidCatch(error: any) { + console.warn("🚨 [AvatarErrorBoundary] Falha ao carregar o modelo GLB do avatar. Utilizando o avatar de fallback procedural.", error); + } + + render() { + if (this.state.hasError) { + return this.props.fallback; + } + return this.props.children; + } +} + +// O componente principal MiiAvatar agora é um wrapper resiliente com Suspense e ErrorBoundary +function MiiAvatar(props: { + avatarId: number; + username: string; + isTalking?: boolean; + scale?: number; + isLastChatSender?: boolean; +} & Record) { + return ( + }> + }> + + + + ); +} + // ========================================== // NOVOS AVATARES REALISTAS (READY PLAYER ME) // ========================================== -function MiiAvatar({ +function RealMiiAvatar({ avatarId, username, isTalking,