Skip to content

Commit 734ad09

Browse files
SamigosDimillian
andauthored
fix: microphone permission request (#226)
Co-authored-by: Thomas Ricouard <ricouard77@gmail.com>
1 parent cafa8c1 commit 734ad09

7 files changed

Lines changed: 46 additions & 3 deletions

File tree

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"tauri-plugin-liquid-glass-api": "^0.1.6"
4242
},
4343
"devDependencies": {
44-
"@tauri-apps/cli": "^2",
44+
"@tauri-apps/cli": "^2.9.6",
4545
"@testing-library/react": "^16.3.2",
4646
"@types/prismjs": "^1.26.5",
4747
"@types/react": "^19.1.8",

src-tauri/src/dictation.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,11 @@ pub(crate) async fn dictation_start(
833833
Ok(DictationSessionState::Listening)
834834
}
835835

836+
#[tauri::command]
837+
pub(crate) async fn dictation_request_permission(app: AppHandle) -> Result<bool, String> {
838+
request_microphone_permission(&app).await
839+
}
840+
836841
#[tauri::command]
837842
pub(crate) async fn dictation_stop(
838843
app: AppHandle,

src-tauri/src/dictation_stub.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ pub(crate) async fn dictation_start(
157157
Err(message)
158158
}
159159

160+
#[tauri::command]
161+
pub(crate) async fn dictation_request_permission(_app: AppHandle) -> Result<bool, String> {
162+
Err(UNSUPPORTED_MESSAGE.to_string())
163+
}
164+
160165
#[tauri::command]
161166
pub(crate) async fn dictation_stop(
162167
app: AppHandle,
@@ -188,4 +193,3 @@ pub(crate) async fn dictation_cancel(
188193
);
189194
Ok(DictationSessionState::Idle)
190195
}
191-

src-tauri/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ pub fn run() {
137137
dictation::dictation_cancel_download,
138138
dictation::dictation_remove_model,
139139
dictation::dictation_start,
140+
dictation::dictation_request_permission,
140141
dictation::dictation_stop,
141142
dictation::dictation_cancel,
142143
local_usage::local_usage_snapshot

src/features/app/hooks/useDictationController.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useDictation } from "../../dictation/hooks/useDictation";
33
import { useDictationModel } from "../../dictation/hooks/useDictationModel";
44
import { useHoldToDictate } from "../../dictation/hooks/useHoldToDictate";
55
import type { AppSettings } from "../../../types";
6+
import { requestDictationPermission } from "../../../services/tauri";
67

78
type DictationController = {
89
dictationModel: ReturnType<typeof useDictationModel>;
@@ -38,6 +39,8 @@ export function useDictationController(appSettings: AppSettings): DictationContr
3839
} = useDictation();
3940
const dictationReady = dictationModel.status?.state === "ready";
4041
const holdDictationKey = (appSettings.dictationHoldKey ?? "").toLowerCase();
42+
const permissionRequestPendingRef = useRef(false);
43+
const permissionRequestedRef = useRef(false);
4144

4245
const handleToggleDictation = useCallback(async () => {
4346
if (!appSettings.dictationEnabled || !dictationReady) {
@@ -96,6 +99,32 @@ export function useDictationController(appSettings: AppSettings): DictationContr
9699
cancelDictation,
97100
});
98101

102+
useEffect(() => {
103+
if (!appSettings.dictationEnabled) {
104+
permissionRequestedRef.current = false;
105+
return;
106+
}
107+
if (permissionRequestPendingRef.current) {
108+
return;
109+
}
110+
if (!dictationReady) {
111+
permissionRequestedRef.current = false;
112+
return;
113+
}
114+
if (permissionRequestedRef.current) {
115+
return;
116+
}
117+
permissionRequestedRef.current = true;
118+
permissionRequestPendingRef.current = true;
119+
void requestDictationPermission()
120+
.catch(() => {
121+
// Errors are surfaced during dictation start.
122+
})
123+
.finally(() => {
124+
permissionRequestPendingRef.current = false;
125+
});
126+
}, [appSettings.dictationEnabled, dictationReady]);
127+
99128
return {
100129
dictationModel,
101130
dictationState,

src/services/tauri.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,10 @@ export async function startDictation(
523523
return invoke("dictation_start", { preferredLanguage });
524524
}
525525

526+
export async function requestDictationPermission(): Promise<boolean> {
527+
return invoke("dictation_request_permission");
528+
}
529+
526530
export async function stopDictation(): Promise<DictationSessionState> {
527531
return invoke("dictation_stop");
528532
}

0 commit comments

Comments
 (0)