@@ -3,6 +3,7 @@ import { useDictation } from "../../dictation/hooks/useDictation";
33import { useDictationModel } from "../../dictation/hooks/useDictationModel" ;
44import { useHoldToDictate } from "../../dictation/hooks/useHoldToDictate" ;
55import type { AppSettings } from "../../../types" ;
6+ import { requestDictationPermission } from "../../../services/tauri" ;
67
78type 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,
0 commit comments