diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..32a2d7bd --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22.22.1 diff --git a/package-lock.json b/package-lock.json index 38d3e0cf..58e37a3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,6 +73,10 @@ "vite-plugin-electron": "^0.28.6", "vite-plugin-electron-renderer": "^0.14.5", "vitest": "^4.0.16" + }, + "engines": { + "node": "22.22.1", + "npm": "10.9.4" } }, "node_modules/@alloc/quick-lru": { diff --git a/package.json b/package.json index 7275192a..d59420c6 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,11 @@ "private": true, "version": "1.2.0", "type": "module", + "packageManager": "npm@10.9.4", + "engines": { + "node": "22.22.1", + "npm": "10.9.4" + }, "scripts": { "dev": "vite", "build": "tsc && vite build && electron-builder", diff --git a/src/App.tsx b/src/App.tsx index 83b39727..9772ef89 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from "react"; import { LaunchWindow } from "./components/launch/LaunchWindow"; import { SourceSelector } from "./components/launch/SourceSelector"; +import { Toaster } from "./components/ui/sonner"; import { TooltipProvider } from "./components/ui/tooltip"; import { ShortcutsConfigDialog } from "./components/video-editor/ShortcutsConfigDialog"; import VideoEditor from "./components/video-editor/VideoEditor"; @@ -48,5 +49,10 @@ export default function App() { } })(); - return {content}; + return ( + + {content} + + + ); } diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index e9a3fa28..d18c5721 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -19,6 +19,7 @@ import { RxDragHandleDots2 } from "react-icons/rx"; import { useAudioLevelMeter } from "../../hooks/useAudioLevelMeter"; import { useMicrophoneDevices } from "../../hooks/useMicrophoneDevices"; import { useScreenRecorder } from "../../hooks/useScreenRecorder"; +import { requestCameraAccess } from "../../lib/requestCameraAccess"; import { formatTimePadded } from "../../utils/timeUtils"; import { AudioLevelMeter } from "../ui/audio-level-meter"; import { Tooltip } from "../ui/tooltip"; @@ -110,6 +111,16 @@ export function LaunchWindow() { }; }, [recording, recordingStart]); + useEffect(() => { + if (!import.meta.env.DEV) { + return; + } + + void requestCameraAccess().catch((error) => { + console.warn("Failed to trigger camera access request during development:", error); + }); + }, []); + const [selectedSource, setSelectedSource] = useState("Screen"); const [hasSelectedSource, setHasSelectedSource] = useState(false); @@ -251,8 +262,8 @@ export function LaunchWindow() {