From f799500abceed40f3cc435497edb500e8d14588c Mon Sep 17 00:00:00 2001 From: Arjun <6592213+arkml@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:18:07 +0530 Subject: [PATCH] added permissions --- apps/x/apps/renderer/src/App.tsx | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index 668df0fa..8f41a1fc 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -46,6 +46,8 @@ import { useSidebar, } from "@/components/ui/sidebar" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog" +import { Button } from "@/components/ui/button" import { Toaster } from "@/components/ui/sonner" import { stripKnowledgePrefix, toKnowledgePath, wikiLabel } from '@/lib/wiki-links' import { splitFrontmatter, joinFrontmatter } from '@/lib/frontmatter' @@ -3350,6 +3352,17 @@ function App() { }, [loadDirectory, navigateToFile, fileTabs]) const meetingNotePathRef = useRef(null) + const [showMeetingPermissions, setShowMeetingPermissions] = useState(false) + + const startMeetingAfterPermissions = useCallback(async () => { + setShowMeetingPermissions(false) + localStorage.setItem('meeting-permissions-acknowledged', '1') + const notePath = await meetingTranscription.start() + if (notePath) { + meetingNotePathRef.current = notePath + await handleVoiceNoteCreated(notePath) + } + }, [meetingTranscription, handleVoiceNoteCreated]) const handleToggleMeeting = useCallback(async () => { if (meetingTranscription.state === 'recording') { @@ -3388,6 +3401,11 @@ function App() { meetingNotePathRef.current = null } } else if (meetingTranscription.state === 'idle') { + // Show permissions modal on first use + if (!localStorage.getItem('meeting-permissions-acknowledged')) { + setShowMeetingPermissions(true) + return + } const notePath = await meetingTranscription.start() if (notePath) { meetingNotePathRef.current = notePath @@ -4276,6 +4294,29 @@ function App() { open={showOnboarding} onComplete={handleOnboardingComplete} /> + + + + Meeting transcription setup + + Rowboat needs Screen Recording permission to capture meeting audio from other apps (Zoom, Meet, etc.). + + +
+

To enable this:

+
    +
  1. Open System SettingsPrivacy & Security
  2. +
  3. Click Screen Recording
  4. +
  5. Toggle on Rowboat
  6. +
  7. You may need to restart the app after granting permission
  8. +
+
+ + + + +
+
) }