-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.tsx
More file actions
118 lines (104 loc) · 3.68 KB
/
App.tsx
File metadata and controls
118 lines (104 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import "./global.css";
import { Toaster } from "@/components/ui/toaster";
import { createRoot } from "react-dom/client";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { TooltipProvider } from "@/components/ui/tooltip";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { AuthProvider } from "@/contexts/AuthContext";
import { ThemeProvider } from "next-themes";
import Index from "./pages/Index";
import NotFound from "./pages/NotFound";
import { useEffect } from "react";
import { GoogleOAuthProvider } from "@react-oauth/google";
// Capacitor imports
import { App as CapacitorApp } from "@capacitor/app";
import { StatusBar, Style } from "@capacitor/status-bar";
import { SplashScreen } from "@capacitor/splash-screen";
import { Keyboard } from "@capacitor/keyboard";
import ChangeModel from "./pages/ChangeModel";
// Extend Window interface for Capacitor
declare global {
interface Window {
Capacitor?: {
isNativePlatform(): boolean;
};
}
}
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: 2,
staleTime: 5 * 60 * 1000, // 5 minutes
refetchOnWindowFocus: false,
},
},
});
// Capacitor initialization hook
function useCapacitorInit() {
useEffect(() => {
const initCapacitor = async () => {
try {
// Hide splash screen after app loads
await SplashScreen.hide();
// Configure status bar
if (window.Capacitor && window.Capacitor.isNativePlatform()) {
await StatusBar.setStyle({ style: Style.Light });
await StatusBar.setBackgroundColor({ color: "#78c896" });
}
// Handle keyboard events for better UX (only on native platforms)
if (window.Capacitor && window.Capacitor.isNativePlatform()) {
Keyboard.addListener("keyboardWillShow", () => {
document.body.classList.add("keyboard-open");
});
Keyboard.addListener("keyboardWillHide", () => {
document.body.classList.remove("keyboard-open");
});
}
// Handle app state changes
CapacitorApp.addListener("appStateChange", ({ isActive }) => {
console.log("App state changed. Is active?", isActive);
});
// Handle back button on Android
CapacitorApp.addListener("backButton", ({ canGoBack }) => {
if (!canGoBack) {
CapacitorApp.exitApp();
} else {
window.history.back();
}
});
} catch (error) {
console.log("Capacitor initialization error:", error);
}
};
initCapacitor();
}, []);
}
const App = () => {
useCapacitorInit();
return (
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<QueryClientProvider client={queryClient}>
<AuthProvider>
<GoogleOAuthProvider clientId={import.meta.env.VITE_GOOGLE_CLIENT_ID}>
<TooltipProvider>
<div className="mobile-app safe-area-all">
<Toaster />
<Sonner />
<BrowserRouter>
<Routes>
<Route path="/" element={<Index />} />
<Route path="select" element={<ChangeModel />} />
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
</div>
</TooltipProvider>
</GoogleOAuthProvider>
</AuthProvider>
</QueryClientProvider>
</ThemeProvider>
);
};
createRoot(document.getElementById("root")!).render(<App />);