diff --git a/apps/desktop/src/components/settings/views/sound.tsx b/apps/desktop/src/components/settings/views/sound.tsx index 15a9f0d70c..249a925fd5 100644 --- a/apps/desktop/src/components/settings/views/sound.tsx +++ b/apps/desktop/src/components/settings/views/sound.tsx @@ -1,6 +1,7 @@ import { Trans, useLingui } from "@lingui/react/macro"; import { useMutation, useQuery } from "@tanstack/react-query"; import { MicIcon, Volume2Icon } from "lucide-react"; +import { useState } from "react"; import { commands as listenerCommands } from "@hypr/plugin-listener"; import { Button } from "@hypr/ui/components/ui/button"; @@ -16,6 +17,7 @@ interface PermissionItemProps { done: boolean | undefined; isPending: boolean; onRequest: () => void; + buttonText: string; } function PermissionItem({ @@ -25,6 +27,7 @@ function PermissionItem({ done, isPending, onRequest, + buttonText, }: PermissionItemProps) { return (
Requesting... ) - : Enable} + : {buttonText}} )}
@@ -69,6 +72,8 @@ function PermissionItem({ export default function Sound() { const { t } = useLingui(); + const [micPermissionRequested, setMicPermissionRequested] = useState(false); + const micPermissionStatus = useQuery({ queryKey: ["micPermission"], queryFn: () => listenerCommands.checkMicrophoneAccess(), @@ -84,11 +89,15 @@ export default function Sound() { const micPermission = useMutation({ mutationFn: () => listenerCommands.requestMicrophoneAccess(), onSuccess: () => { + setMicPermissionRequested(true); setTimeout(() => { micPermissionStatus.refetch(); }, 3000); }, - onError: console.error, + onError: (error) => { + setMicPermissionRequested(true); + console.error(error); + }, }); const capturePermission = useMutation({ @@ -102,6 +111,14 @@ export default function Sound() { onError: console.error, }); + const handleMicPermissionAction = () => { + if (micPermissionRequested && !micPermissionStatus.data) { + listenerCommands.openMicrophoneAccessSettings(); + } else { + micPermission.mutate(); + } + }; + return (
@@ -111,7 +128,8 @@ export default function Sound() { description={t`Required to transcribe your voice during meetings`} done={micPermissionStatus.data} isPending={micPermission.isPending} - onRequest={() => micPermission.mutate({})} + onRequest={handleMicPermissionAction} + buttonText={micPermissionRequested && !micPermissionStatus.data ? "Open Settings" : "Enable"} /> capturePermission.mutate({})} + buttonText="Enable" />
diff --git a/apps/desktop/src/components/welcome-modal/audio-permissions-view.tsx b/apps/desktop/src/components/welcome-modal/audio-permissions-view.tsx index c22bfc78b4..bf8f5f6cb2 100644 --- a/apps/desktop/src/components/welcome-modal/audio-permissions-view.tsx +++ b/apps/desktop/src/components/welcome-modal/audio-permissions-view.tsx @@ -9,6 +9,7 @@ import { Spinner } from "@hypr/ui/components/ui/spinner"; import { cn } from "@hypr/ui/lib/utils"; import { message } from "@tauri-apps/plugin-dialog"; import { relaunch } from "@tauri-apps/plugin-process"; +import { useState } from "react"; interface PermissionItemProps { icon: React.ReactNode; @@ -18,6 +19,7 @@ interface PermissionItemProps { isPending: boolean; onRequest: () => void; showSystemSettings?: boolean; + buttonText: string; } function PermissionItem({ @@ -28,6 +30,7 @@ function PermissionItem({ isPending, onRequest, showSystemSettings = false, + buttonText, }: PermissionItemProps) { return (
Requesting... ) - : Enable} + : {buttonText}} )} @@ -97,6 +100,8 @@ interface AudioPermissionsViewProps { export function AudioPermissionsView({ onContinue }: AudioPermissionsViewProps) { const { t } = useLingui(); + const [micPermissionRequested, setMicPermissionRequested] = useState(false); + const micPermissionStatus = useQuery({ queryKey: ["micPermission"], queryFn: () => listenerCommands.checkMicrophoneAccess(), @@ -112,11 +117,15 @@ export function AudioPermissionsView({ onContinue }: AudioPermissionsViewProps) const micPermission = useMutation({ mutationFn: () => listenerCommands.requestMicrophoneAccess(), onSuccess: () => { + setMicPermissionRequested(true); setTimeout(() => { micPermissionStatus.refetch(); }, 3000); }, - onError: console.error, + onError: (error) => { + setMicPermissionRequested(true); + console.error(error); + }, }); const capturePermission = useMutation({ @@ -130,6 +139,14 @@ export function AudioPermissionsView({ onContinue }: AudioPermissionsViewProps) onError: console.error, }); + const handleMicPermissionAction = () => { + if (micPermissionRequested && !micPermissionStatus.data) { + listenerCommands.openMicrophoneAccessSettings(); + } else { + micPermission.mutate(); + } + }; + const allPermissionsGranted = micPermissionStatus.data && systemAudioPermissionStatus.data; return ( @@ -149,7 +166,8 @@ export function AudioPermissionsView({ onContinue }: AudioPermissionsViewProps) description={t`Required for meeting transcription`} done={micPermissionStatus.data} isPending={micPermission.isPending} - onRequest={() => micPermission.mutate({})} + onRequest={handleMicPermissionAction} + buttonText={micPermissionRequested && !micPermissionStatus.data ? "Open Settings" : "Enable"} /> capturePermission.mutate({})} + buttonText="Enable" />
diff --git a/apps/desktop/src/components/welcome-modal/index.tsx b/apps/desktop/src/components/welcome-modal/index.tsx index 900e65fe5d..5bf97c1f62 100644 --- a/apps/desktop/src/components/welcome-modal/index.tsx +++ b/apps/desktop/src/components/welcome-modal/index.tsx @@ -14,7 +14,7 @@ import { Particles } from "@hypr/ui/components/ui/particles"; import { commands as dbCommands } from "@hypr/plugin-db"; import { commands as localLlmCommands } from "@hypr/plugin-local-llm"; import { AudioPermissionsView } from "./audio-permissions-view"; -import { CalendarPermissionsView } from "./calendar-permissions-view"; +// import { CalendarPermissionsView } from "./calendar-permissions-view"; import { DownloadProgressView } from "./download-progress-view"; import { LanguageSelectionView } from "./language-selection-view"; import { ModelSelectionView } from "./model-selection-view"; @@ -35,7 +35,6 @@ export function WelcomeModal({ isOpen, onClose }: WelcomeModalProps) { | "download-progress" | "audio-permissions" | "language-selection" - | "calendar-permissions" >("welcome"); const [selectedSttModel, setSelectedSttModel] = useState("QuantizedSmall"); const [wentThroughDownloads, setWentThroughDownloads] = useState(false); @@ -109,7 +108,6 @@ export function WelcomeModal({ isOpen, onClose }: WelcomeModalProps) { }; const handleLanguageSelectionContinue = async (languages: string[]) => { - // Save the selected languages to the database try { const config = await dbCommands.getConfig(); await dbCommands.setConfig({ @@ -123,17 +121,12 @@ export function WelcomeModal({ isOpen, onClose }: WelcomeModalProps) { console.error("Failed to save language preferences:", error); } - setCurrentStep("calendar-permissions"); - }; - - const handleCalendarPermissionsContinue = () => { commands.setOnboardingNeeded(false); onClose(); }; useEffect(() => { if (!isOpen && wentThroughDownloads) { - // start servers for mockup & tutorial localSttCommands.startServer(); localLlmCommands.startServer(); @@ -195,11 +188,6 @@ export function WelcomeModal({ isOpen, onClose }: WelcomeModalProps) { onContinue={handleLanguageSelectionContinue} /> )} - {currentStep === "calendar-permissions" && ( - - )} - Continue + Finish Onboarding ); diff --git a/apps/desktop/src/locales/en/messages.po b/apps/desktop/src/locales/en/messages.po index 6aff2e5004..5345e6303a 100644 --- a/apps/desktop/src/locales/en/messages.po +++ b/apps/desktop/src/locales/en/messages.po @@ -272,6 +272,11 @@ msgstr "{0}" msgid "{0} calendars selected" msgstr "{0} calendars selected" +#: src/components/welcome-modal/audio-permissions-view.tsx:82 +#: src/components/settings/views/sound.tsx:64 +msgid "{buttonText}" +msgstr "{buttonText}" + #: src/components/settings/components/wer-modal.tsx:103 msgid "{category}" msgstr "{category}" @@ -306,8 +311,8 @@ msgid "Access granted" msgstr "Access granted" #: src/components/welcome-modal/calendar-permissions-view.tsx:50 -#: src/components/welcome-modal/audio-permissions-view.tsx:55 -#: src/components/settings/views/sound.tsx:41 +#: src/components/welcome-modal/audio-permissions-view.tsx:58 +#: src/components/settings/views/sound.tsx:44 msgid "Access Granted" msgstr "Access Granted" @@ -340,7 +345,7 @@ msgstr "Add specific terms or jargon for improved transcription accuracy" msgid "Admin" msgstr "Admin" -#: src/components/welcome-modal/audio-permissions-view.tsx:142 +#: src/components/welcome-modal/audio-permissions-view.tsx:159 msgid "After you grant system audio access, app will restart to apply the changes" msgstr "After you grant system audio access, app will restart to apply the changes" @@ -399,7 +404,7 @@ msgstr "Are you sure you want to delete this note?" #~ msgid "Assistant:" #~ msgstr "Assistant:" -#: src/components/welcome-modal/audio-permissions-view.tsx:138 +#: src/components/welcome-modal/audio-permissions-view.tsx:155 msgid "Audio Permissions" msgstr "Audio Permissions" @@ -549,10 +554,9 @@ msgid "Contacts Access" msgstr "Contacts Access" #: src/components/welcome-modal/model-selection-view.tsx:137 -#: src/components/welcome-modal/language-selection-view.tsx:180 #: src/components/welcome-modal/download-progress-view.tsx:248 #: src/components/welcome-modal/calendar-permissions-view.tsx:153 -#: src/components/welcome-modal/audio-permissions-view.tsx:170 +#: src/components/welcome-modal/audio-permissions-view.tsx:189 msgid "Continue" msgstr "Continue" @@ -673,8 +677,6 @@ msgid "Emoji" msgstr "Emoji" #: src/components/welcome-modal/calendar-permissions-view.tsx:65 -#: src/components/welcome-modal/audio-permissions-view.tsx:79 -#: src/components/settings/views/sound.tsx:61 msgid "Enable" msgstr "Enable" @@ -726,11 +728,15 @@ msgstr "Enter the base URL for your custom LLM endpoint" msgid "Extract action items" msgstr "Extract action items" -#: src/routes/app.settings.tsx:78 -#: src/routes/app.settings.tsx:113 +#: src/routes/app.settings.tsx:80 +#: src/routes/app.settings.tsx:115 msgid "Feedback" msgstr "Feedback" +#: src/components/welcome-modal/language-selection-view.tsx:180 +msgid "Finish Onboarding" +msgstr "Finish Onboarding" + #: src/components/settings/views/billing.tsx:47 #~ msgid "For fast growing teams like energetic startups" #~ msgstr "For fast growing teams like energetic startups" @@ -780,7 +786,7 @@ msgstr "Grant Access" #~ msgid "Grant access to audio so Hyprnote can transcribe your meetings" #~ msgstr "Grant access to audio so Hyprnote can transcribe your meetings" -#: src/components/welcome-modal/audio-permissions-view.tsx:175 +#: src/components/welcome-modal/audio-permissions-view.tsx:194 msgid "Grant both permissions to continue" msgstr "Grant both permissions to continue" @@ -819,7 +825,7 @@ msgstr "How did you hear about Hyprnote?" #~ msgid "Integration with other apps like Notion and Google Calendar" #~ msgstr "Integration with other apps like Notion and Google Calendar" -#: src/routes/app.settings.tsx:76 +#: src/routes/app.settings.tsx:78 #: src/components/settings/views/integrations.tsx:118 msgid "Integrations" msgstr "Integrations" @@ -864,7 +870,7 @@ msgstr "Key decisions" #~ msgid "Learn more about our pricing plans" #~ msgstr "Learn more about our pricing plans" -#: src/routes/app.settings.tsx:80 +#: src/routes/app.settings.tsx:82 msgid "License" msgstr "License" @@ -917,8 +923,8 @@ msgstr "Member" msgid "Members" msgstr "Members" -#: src/components/welcome-modal/audio-permissions-view.tsx:148 -#: src/components/settings/views/sound.tsx:110 +#: src/components/welcome-modal/audio-permissions-view.tsx:165 +#: src/components/settings/views/sound.tsx:127 msgid "Microphone Access" msgstr "Microphone Access" @@ -1115,21 +1121,21 @@ msgstr "Recent Notes" #~ msgid "Remove {0} from list" #~ msgstr "Remove {0} from list" -#: src/components/welcome-modal/audio-permissions-view.tsx:76 -#: src/components/settings/views/sound.tsx:58 +#: src/components/welcome-modal/audio-permissions-view.tsx:79 +#: src/components/settings/views/sound.tsx:61 msgid "Requesting..." msgstr "Requesting..." -#: src/components/welcome-modal/audio-permissions-view.tsx:149 -#: src/components/welcome-modal/audio-permissions-view.tsx:158 +#: src/components/welcome-modal/audio-permissions-view.tsx:166 +#: src/components/welcome-modal/audio-permissions-view.tsx:176 msgid "Required for meeting transcription" msgstr "Required for meeting transcription" -#: src/components/settings/views/sound.tsx:120 +#: src/components/settings/views/sound.tsx:138 msgid "Required to transcribe other people's voice during meetings" msgstr "Required to transcribe other people's voice during meetings" -#: src/components/settings/views/sound.tsx:111 +#: src/components/settings/views/sound.tsx:128 msgid "Required to transcribe your voice during meetings" msgstr "Required to transcribe your voice during meetings" @@ -1235,9 +1241,9 @@ msgstr "Show notifications when you join a meeting." msgid "Some downloads failed, but you can continue" msgstr "Some downloads failed, but you can continue" -#: src/routes/app.settings.tsx:116 -#~ msgid "Sound" -#~ msgstr "Sound" +#: src/routes/app.settings.tsx:76 +msgid "Sound" +msgstr "Sound" #: src/components/settings/views/general.tsx:265 msgid "Spoken languages" @@ -1271,8 +1277,8 @@ msgstr "Summarize meeting" #~ msgid "Synchronization across multiple devices" #~ msgstr "Synchronization across multiple devices" -#: src/components/welcome-modal/audio-permissions-view.tsx:157 -#: src/components/settings/views/sound.tsx:119 +#: src/components/welcome-modal/audio-permissions-view.tsx:175 +#: src/components/settings/views/sound.tsx:137 msgid "System Audio Access" msgstr "System Audio Access" diff --git a/apps/desktop/src/locales/ko/messages.po b/apps/desktop/src/locales/ko/messages.po index abb2795e77..e0bdf253f2 100644 --- a/apps/desktop/src/locales/ko/messages.po +++ b/apps/desktop/src/locales/ko/messages.po @@ -272,6 +272,11 @@ msgstr "" msgid "{0} calendars selected" msgstr "" +#: src/components/welcome-modal/audio-permissions-view.tsx:82 +#: src/components/settings/views/sound.tsx:64 +msgid "{buttonText}" +msgstr "" + #: src/components/settings/components/wer-modal.tsx:103 msgid "{category}" msgstr "" @@ -306,8 +311,8 @@ msgid "Access granted" msgstr "" #: src/components/welcome-modal/calendar-permissions-view.tsx:50 -#: src/components/welcome-modal/audio-permissions-view.tsx:55 -#: src/components/settings/views/sound.tsx:41 +#: src/components/welcome-modal/audio-permissions-view.tsx:58 +#: src/components/settings/views/sound.tsx:44 msgid "Access Granted" msgstr "" @@ -340,7 +345,7 @@ msgstr "" msgid "Admin" msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:142 +#: src/components/welcome-modal/audio-permissions-view.tsx:159 msgid "After you grant system audio access, app will restart to apply the changes" msgstr "" @@ -399,7 +404,7 @@ msgstr "" #~ msgid "Assistant:" #~ msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:138 +#: src/components/welcome-modal/audio-permissions-view.tsx:155 msgid "Audio Permissions" msgstr "" @@ -549,10 +554,9 @@ msgid "Contacts Access" msgstr "" #: src/components/welcome-modal/model-selection-view.tsx:137 -#: src/components/welcome-modal/language-selection-view.tsx:180 #: src/components/welcome-modal/download-progress-view.tsx:248 #: src/components/welcome-modal/calendar-permissions-view.tsx:153 -#: src/components/welcome-modal/audio-permissions-view.tsx:170 +#: src/components/welcome-modal/audio-permissions-view.tsx:189 msgid "Continue" msgstr "" @@ -673,8 +677,6 @@ msgid "Emoji" msgstr "" #: src/components/welcome-modal/calendar-permissions-view.tsx:65 -#: src/components/welcome-modal/audio-permissions-view.tsx:79 -#: src/components/settings/views/sound.tsx:61 msgid "Enable" msgstr "" @@ -726,11 +728,15 @@ msgstr "" msgid "Extract action items" msgstr "" -#: src/routes/app.settings.tsx:78 -#: src/routes/app.settings.tsx:113 +#: src/routes/app.settings.tsx:80 +#: src/routes/app.settings.tsx:115 msgid "Feedback" msgstr "" +#: src/components/welcome-modal/language-selection-view.tsx:180 +msgid "Finish Onboarding" +msgstr "" + #: src/components/settings/views/billing.tsx:47 #~ msgid "For fast growing teams like energetic startups" #~ msgstr "" @@ -780,7 +786,7 @@ msgstr "" #~ msgid "Grant access to audio so Hyprnote can transcribe your meetings" #~ msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:175 +#: src/components/welcome-modal/audio-permissions-view.tsx:194 msgid "Grant both permissions to continue" msgstr "" @@ -819,7 +825,7 @@ msgstr "" #~ msgid "Integration with other apps like Notion and Google Calendar" #~ msgstr "" -#: src/routes/app.settings.tsx:76 +#: src/routes/app.settings.tsx:78 #: src/components/settings/views/integrations.tsx:118 msgid "Integrations" msgstr "" @@ -864,7 +870,7 @@ msgstr "" #~ msgid "Learn more about our pricing plans" #~ msgstr "" -#: src/routes/app.settings.tsx:80 +#: src/routes/app.settings.tsx:82 msgid "License" msgstr "" @@ -917,8 +923,8 @@ msgstr "" msgid "Members" msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:148 -#: src/components/settings/views/sound.tsx:110 +#: src/components/welcome-modal/audio-permissions-view.tsx:165 +#: src/components/settings/views/sound.tsx:127 msgid "Microphone Access" msgstr "" @@ -1115,21 +1121,21 @@ msgstr "" #~ msgid "Remove {0} from list" #~ msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:76 -#: src/components/settings/views/sound.tsx:58 +#: src/components/welcome-modal/audio-permissions-view.tsx:79 +#: src/components/settings/views/sound.tsx:61 msgid "Requesting..." msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:149 -#: src/components/welcome-modal/audio-permissions-view.tsx:158 +#: src/components/welcome-modal/audio-permissions-view.tsx:166 +#: src/components/welcome-modal/audio-permissions-view.tsx:176 msgid "Required for meeting transcription" msgstr "" -#: src/components/settings/views/sound.tsx:120 +#: src/components/settings/views/sound.tsx:138 msgid "Required to transcribe other people's voice during meetings" msgstr "" -#: src/components/settings/views/sound.tsx:111 +#: src/components/settings/views/sound.tsx:128 msgid "Required to transcribe your voice during meetings" msgstr "" @@ -1235,9 +1241,9 @@ msgstr "" msgid "Some downloads failed, but you can continue" msgstr "" -#: src/routes/app.settings.tsx:116 -#~ msgid "Sound" -#~ msgstr "" +#: src/routes/app.settings.tsx:76 +msgid "Sound" +msgstr "" #: src/components/settings/views/general.tsx:265 msgid "Spoken languages" @@ -1271,8 +1277,8 @@ msgstr "" #~ msgid "Synchronization across multiple devices" #~ msgstr "" -#: src/components/welcome-modal/audio-permissions-view.tsx:157 -#: src/components/settings/views/sound.tsx:119 +#: src/components/welcome-modal/audio-permissions-view.tsx:175 +#: src/components/settings/views/sound.tsx:137 msgid "System Audio Access" msgstr "" diff --git a/apps/desktop/src/routes/app.settings.tsx b/apps/desktop/src/routes/app.settings.tsx index 7cd4af796a..8b134ff0e8 100644 --- a/apps/desktop/src/routes/app.settings.tsx +++ b/apps/desktop/src/routes/app.settings.tsx @@ -72,6 +72,8 @@ function Component() { return t`Notifications`; case "templates": return t`Templates`; + case "sound": + return t`Sound`; case "integrations": return t`Integrations`; case "feedback":