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":