b402138464
Revert global CSS and JavaScript hooks that attempted to manage dialog positioning with the soft keyboard, which caused issues on desktop. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 77cfe984-2c65-4152-bb7a-0df28274fe66 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 3ea26578-1c32-4300-8404-7ae727e33444 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/c3c252e4-c83d-40ca-9fff-99a3ea60701e/77cfe984-2c65-4152-bb7a-0df28274fe66/qrzw3bH Replit-Helium-Checkpoint-Created: true
106 lines
4.2 KiB
TypeScript
106 lines
4.2 KiB
TypeScript
import { Switch, Route, Redirect, Router as WouterRouter, useLocation } from "wouter";
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
import { Toaster } from "@/components/ui/toaster";
|
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
import { AuthProvider } from "@/contexts/AuthContext";
|
|
import { IncomingNotePopupProvider } from "@/contexts/IncomingNotePopupContext";
|
|
import { IncomingNotePopup } from "@/components/notes/incoming-note-popup";
|
|
import { useNotificationsSocket } from "@/hooks/use-notifications-socket";
|
|
import { useAudioUnlock } from "@/hooks/use-audio-unlock";
|
|
import { useAutoplayHint } from "@/hooks/use-autoplay-hint";
|
|
// #625-followup: the global keyboard hooks (useScrollFocusedDialogField,
|
|
// useVisualViewportVars) were removed because they fired on touch-screen
|
|
// laptops too and broke desktop dialog layout. A more targeted approach
|
|
// will replace them.
|
|
import { UpcomingMeetingAlert } from "@/components/executive-meetings/upcoming-meeting-alert";
|
|
import { PushEnablePrompt } from "@/components/push-enable-prompt";
|
|
import NotFound from "@/pages/not-found";
|
|
import LoginPage from "@/pages/login";
|
|
import RegisterPage from "@/pages/register";
|
|
import ForgotPasswordPage from "@/pages/forgot-password";
|
|
import ResetPasswordPage from "@/pages/reset-password";
|
|
import HomePage from "@/pages/home";
|
|
import ServicesPage from "@/pages/services";
|
|
import NotificationsPage from "@/pages/notifications";
|
|
import AdminPage from "@/pages/admin";
|
|
import NotesPage from "@/pages/notes";
|
|
import MyOrdersPage from "@/pages/my-orders";
|
|
import OrdersIncomingPage from "@/pages/orders-incoming";
|
|
import ExecutiveMeetingsPage from "@/pages/executive-meetings";
|
|
import EmbeddedAppPage from "@/pages/embedded-app";
|
|
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
retry: false,
|
|
staleTime: 30_000,
|
|
},
|
|
},
|
|
});
|
|
|
|
function ExecutiveMeetingsRedirect() {
|
|
const [location] = useLocation();
|
|
const suffix =
|
|
typeof window !== "undefined" ? window.location.search + window.location.hash : "";
|
|
const subPath = location.replace(/^\/executive-meetings/, "");
|
|
return <Redirect to={`/meetings${subPath}${suffix}`} replace />;
|
|
}
|
|
|
|
function NotificationsSocketBridge() {
|
|
useNotificationsSocket();
|
|
useAudioUnlock();
|
|
useAutoplayHint();
|
|
return null;
|
|
}
|
|
|
|
function Router() {
|
|
return (
|
|
<AuthProvider>
|
|
<IncomingNotePopupProvider>
|
|
<NotificationsSocketBridge />
|
|
<UpcomingMeetingAlert />
|
|
<IncomingNotePopup />
|
|
<PushEnablePrompt />
|
|
<Switch>
|
|
<Route path="/login" component={LoginPage} />
|
|
<Route path="/register" component={RegisterPage} />
|
|
<Route path="/forgot-password" component={ForgotPasswordPage} />
|
|
<Route path="/reset-password" component={ResetPasswordPage} />
|
|
<Route path="/services" component={ServicesPage} />
|
|
<Route path="/notifications" component={NotificationsPage} />
|
|
<Route path="/admin" component={AdminPage} />
|
|
<Route path="/notes" component={NotesPage} />
|
|
<Route path="/my-orders" component={MyOrdersPage} />
|
|
<Route path="/orders/incoming" component={OrdersIncomingPage} />
|
|
<Route path="/meetings" component={ExecutiveMeetingsPage} />
|
|
{/* Back-compat redirect: the page used to live at
|
|
/executive-meetings. Stored PDFs, email links, and bookmarks
|
|
still point there, so catch the old path (and any deep
|
|
sub-path) and forward to /meetings while preserving the
|
|
user's query string and hash. */}
|
|
<Route path="/executive-meetings" component={ExecutiveMeetingsRedirect} />
|
|
<Route path="/executive-meetings/:rest*" component={ExecutiveMeetingsRedirect} />
|
|
<Route path="/embedded/:id" component={EmbeddedAppPage} />
|
|
<Route path="/" component={HomePage} />
|
|
<Route component={NotFound} />
|
|
</Switch>
|
|
</IncomingNotePopupProvider>
|
|
</AuthProvider>
|
|
);
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<QueryClientProvider client={queryClient}>
|
|
<TooltipProvider>
|
|
<WouterRouter base={import.meta.env.BASE_URL.replace(/\/$/, "")}>
|
|
<Router />
|
|
</WouterRouter>
|
|
<Toaster />
|
|
</TooltipProvider>
|
|
</QueryClientProvider>
|
|
);
|
|
}
|
|
|
|
export default App;
|