import { useEffect } from "react";
import { BrowserRouter, Routes, Route, Navigate, useNavigate } from "react-router-dom";
import { listen } from "@tauri-apps/api/event";
import RecordingView from "./views/RecordingView";
import EditorView from "./views/EditorView";
import LibraryView from "./views/LibraryView";
import OverlayView from "./views/OverlayView";
import RegionSelectorView from "./views/RegionSelectorView";
import LayoutPrototypeView from "./views/LayoutPrototypeView";
import { ShortcutProvider } from "./contexts/ShortcutContext";
import ShortcutHelp from "./components/ShortcutHelp";
import { initializeWorkflowMetricsStore } from "./lib/usageMetrics";
// Component to handle navigation events from the overlay window
function NavigationEventListener() {
const navigate = useNavigate();
useEffect(() => {
let cleanup: (() => void) | undefined;
const setupListeners = async () => {
const { getCurrentWindow } = await import("@tauri-apps/api/window");
const { WebviewWindow } = await import("@tauri-apps/api/webviewWindow");
// Check window label, not path - this is reliable even during async routing
const currentWindow = getCurrentWindow();
if (currentWindow.label !== "main") {
return; // Only main window handles navigation events
}
const unlistenEditor = await listen<{ sessionId: string }>(
"navigate-to-editor",
async (event) => {
// Get main window by label, not getCurrentWindow()
const mainWindow = await WebviewWindow.getByLabel("main");
if (mainWindow) {
await mainWindow.show();
await mainWindow.setFocus();
}
navigate(`/editor/${event.payload.sessionId}`);
}
);
const unlistenRecord = await listen("navigate-to-record", async () => {
const mainWindow = await WebviewWindow.getByLabel("main");
if (mainWindow) {
await mainWindow.show();
await mainWindow.setFocus();
}
navigate("/record");
});
const unlistenLibrary = await listen("navigate-to-library", async () => {
const mainWindow = await WebviewWindow.getByLabel("main");
if (mainWindow) {
await mainWindow.show();
await mainWindow.setFocus();
}
navigate("/library");
});
cleanup = () => {
unlistenEditor();
unlistenRecord();
unlistenLibrary();
};
};
setupListeners();
return () => {
cleanup?.();
};
}, [navigate]);
return null;
}
function AppRoutes() {
return (
<>
} />
} />
} />
} />
} />
} />
} />
{/* Future routes: /permissions, /upload/:sessionId, /share/:token */}
>
);
}
function App() {
useEffect(() => {
void initializeWorkflowMetricsStore();
}, []);
return (
);
}
export default App;