import { configureTracking } from "@agent-native/core/client/analytics"; import { appPath, appApiPath } from "@agent-native/core/client/api-path"; import { useDbSync } from "@agent-native/core/client/hooks"; import { AppProviders, createAgentNativeQueryClient, } from "@agent-native/core/client/hooks"; import { DEFAULT_LOCALE, LOCALE_HYDRATION_GLOBAL, LOCALE_STORAGE_KEY, getLocaleInitScript, normalizeLocaleCode, type LocaleCode, } from "@agent-native/core/client/i18n"; import { ErrorReportActions, getThemeInitScript, } from "@agent-native/core/client/ui"; import { useQueryClient } from "@tanstack/react-query"; import { useEffect, useRef, useState } from "react"; import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration, useRouteError, } from "react-router"; import type { LinksFunction } from "react-router"; import { AppLayout } from "@/components/layout/AppLayout"; import { Button } from "@/components/ui/button"; import { Toaster } from "@/components/ui/sonner"; import { AppToolkitProvider } from "@/components/ui/toolkit-provider"; import { markExternalEmailRefresh } from "@/hooks/use-emails"; import { MAIL_INTEGRATION_STATUS_QUERY_KEY, mailIntegrationProviderFromAppStateKey, } from "@/lib/integration-status"; import { isMcpEmbedSurface } from "@/lib/mcp-embed"; import { shouldInvalidateMailQueryForActionEvent } from "@/lib/sync-invalidation"; import { TAB_ID } from "@/lib/tab-id"; import { i18nCatalog } from "./i18n"; import stylesheet from "./global.css?url"; configureTracking({ getDefaultProps: (_name, properties) => ({ ...properties, app: "agent-native-mail", }), }); export const links: LinksFunction = () => [ { rel: "stylesheet", href: stylesheet }, ]; const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]"; const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]"; function getHydrationStableThemeInitScript() { if (typeof document !== "undefined") { const existing = document.querySelector( THEME_INIT_SCRIPT_SELECTOR, ); if (existing?.innerHTML) return existing.innerHTML; } return getThemeInitScript(); } function getHydrationStableLocaleInitScript() { if (typeof document !== "undefined") { const existing = document.querySelector( LOCALE_INIT_SCRIPT_SELECTOR, ); if (existing?.innerHTML) return existing.innerHTML; } return getLocaleInitScript(); } const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript(); const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript(); const MAIL_ERROR_COPY: Record< LocaleCode, { title: string; fallback: string; back: string; reload: string; sendFeedback: string; feedbackPlaceholder: string; openGitHubIssue: string; } > = { "en-US": { title: "Mail could not load this view.", fallback: "Something went wrong while loading Mail.", back: "Back", reload: "Reload", sendFeedback: "Send feedback", feedbackPlaceholder: "Describe what happened before this Mail error appeared.", openGitHubIssue: "Open GitHub issue", }, "zh-CN": { title: "Mail 无法加载此视图。", fallback: "加载 Mail 时出现问题。", back: "返回", reload: "重新加载", sendFeedback: "发送反馈", feedbackPlaceholder: "描述此 Mail 错误出现前发生了什么。", openGitHubIssue: "打开 GitHub issue", }, "zh-TW": { title: "Mail 無法載入此檢視。", fallback: "載入 Mail 時發生問題。", back: "返回", reload: "重新載入", sendFeedback: "傳送意見回饋", feedbackPlaceholder: "描述此 Mail 錯誤出現前發生了什麼。", openGitHubIssue: "開啟 GitHub issue", }, "es-ES": { title: "Mail no pudo cargar esta vista.", fallback: "Algo salió mal al cargar Mail.", back: "Atrás", reload: "Recargar", sendFeedback: "Enviar comentarios", feedbackPlaceholder: "Describe qué pasó antes de que apareciera este error de Mail.", openGitHubIssue: "Abrir issue en GitHub", }, "fr-FR": { title: "Mail n'a pas pu charger cette vue.", fallback: "Un problème est survenu lors du chargement de Mail.", back: "Retour", reload: "Recharger", sendFeedback: "Envoyer un retour", feedbackPlaceholder: "Décrivez ce qui s'est passé avant cette erreur de Mail.", openGitHubIssue: "Ouvrir une issue GitHub", }, "de-DE": { title: "Mail konnte diese Ansicht nicht laden.", fallback: "Beim Laden von Mail ist ein Fehler aufgetreten.", back: "Zurück", reload: "Neu laden", sendFeedback: "Feedback senden", feedbackPlaceholder: "Beschreiben Sie, was vor diesem Mail-Fehler passiert ist.", openGitHubIssue: "GitHub-Issue öffnen", }, "ja-JP": { title: "Mail はこのビューを読み込めませんでした。", fallback: "Mail の読み込み中に問題が発生しました。", back: "戻る", reload: "再読み込み", sendFeedback: "フィードバックを送信", feedbackPlaceholder: "この Mail エラーの直前に起きたことを説明してください。", openGitHubIssue: "GitHub issue を開く", }, "ko-KR": { title: "Mail에서 이 보기를 불러올 수 없습니다.", fallback: "Mail을 불러오는 중 문제가 발생했습니다.", back: "뒤로", reload: "새로고침", sendFeedback: "피드백 보내기", feedbackPlaceholder: "이 Mail 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.", openGitHubIssue: "GitHub issue 열기", }, "pt-BR": { title: "O Mail não conseguiu carregar esta visualização.", fallback: "Algo deu errado ao carregar o Mail.", back: "Voltar", reload: "Recarregar", sendFeedback: "Enviar feedback", feedbackPlaceholder: "Descreva o que aconteceu antes deste erro do Mail aparecer.", openGitHubIssue: "Abrir issue no GitHub", }, "hi-IN": { title: "Mail यह दृश्य लोड नहीं कर सका।", fallback: "Mail लोड करते समय कुछ गलत हुआ।", back: "वापस", reload: "रीलोड", sendFeedback: "फ़ीडबैक भेजें", feedbackPlaceholder: "इस Mail त्रुटि से पहले क्या हुआ, उसका वर्णन करें।", openGitHubIssue: "GitHub issue खोलें", }, "ar-SA": { title: "تعذر على Mail تحميل هذا العرض.", fallback: "حدث خطأ أثناء تحميل Mail.", back: "رجوع", reload: "إعادة التحميل", sendFeedback: "إرسال الملاحظات", feedbackPlaceholder: "صف ما حدث قبل ظهور خطأ Mail هذا.", openGitHubIssue: "فتح مشكلة في GitHub", }, }; function activeErrorLocale(): LocaleCode { if (typeof window === "undefined") return DEFAULT_LOCALE; const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale; const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY); return ( normalizeLocaleCode(stored) ?? normalizeLocaleCode(hydrated) ?? DEFAULT_LOCALE ); } export function Layout({ children }: { children: React.ReactNode }) { return (