11import { useEffect , useMemo , useState } from 'react' ;
22import { BrowserReadAloudProvider } from '../browser/provider' ;
3+ import { BrowserReadAloudVoice } from '../browser/voice' ;
4+ import { ErrorState } from '../controller' ;
35import { RemoteReadAloudProvider , RemoteVoicesError } from '../remote/provider' ;
4- import { resolveLanguage } from '../lang' ;
5- import { getSupportedLanguages } from '../voice' ;
6+ import { RemoteInterface } from '../remote' ;
7+ import { RemoteReadAloudVoice } from '../remote/voice' ;
8+ import { ReadAloudVoice , getSupportedLanguages } from '../voice' ;
69
710/**
811 * Hook that loads all voices and manages language state.
912 */
10- export function useVoiceData ( { lang, remoteInterface, persistedEnabledVoices } ) {
11- let [ allBrowserVoices , setAllBrowserVoices ] = useState ( null ) ;
12- let [ allRemoteVoices , setAllRemoteVoices ] = useState ( null ) ;
13- let [ browserVoicesError , setBrowserVoicesError ] = useState ( null ) ;
14- let [ remoteVoicesError , setRemoteVoicesError ] = useState ( null ) ;
13+ export function useVoiceData ( { lang, remoteInterface } : {
14+ lang : string ;
15+ remoteInterface ?: RemoteInterface ;
16+ } ) {
17+ let [ allBrowserVoices , setAllBrowserVoices ] = useState < BrowserReadAloudVoice [ ] | null > ( null ) ;
18+ let [ allRemoteVoices , setAllRemoteVoices ] = useState < RemoteReadAloudVoice [ ] | null > ( null ) ;
19+ let [ browserVoicesError , setBrowserVoicesError ] = useState < ErrorState | null > ( null ) ;
20+ let [ remoteVoicesError , setRemoteVoicesError ] = useState < ErrorState | null > ( null ) ;
1521 let [ selectedLang , setSelectedLang ] = useState ( lang ) ;
1622
1723 // Fetch browser voices
@@ -35,15 +41,17 @@ export function useVoiceData({ lang, remoteInterface, persistedEnabledVoices })
3541 }
3642 }
3743 fetchVoices ( ) ;
38- return ( ) => cancelled = true ;
44+ return ( ) => {
45+ cancelled = true ;
46+ } ;
3947 } , [ ] ) ;
4048
4149 // Fetch remote voices
4250 useEffect ( ( ) => {
4351 if ( ! remoteInterface ) return undefined ;
4452 let cancelled = false ;
4553 async function fetchVoices ( ) {
46- let remoteProvider = new RemoteReadAloudProvider ( remoteInterface ) ;
54+ let remoteProvider = new RemoteReadAloudProvider ( remoteInterface ! ) ;
4755 try {
4856 let voices = await remoteProvider . getVoices ( ) ;
4957 if ( ! cancelled ) {
@@ -60,12 +68,14 @@ export function useVoiceData({ lang, remoteInterface, persistedEnabledVoices })
6068 }
6169 }
6270 fetchVoices ( ) ;
63- return ( ) => cancelled = true ;
71+ return ( ) => {
72+ cancelled = true ;
73+ } ;
6474 } , [ remoteInterface ] ) ;
6575
6676 let loaded = allBrowserVoices !== null && ( allRemoteVoices !== null || ! remoteInterface ) ;
6777
68- let allVoices = useMemo (
78+ let allVoices : ReadAloudVoice [ ] = useMemo (
6979 ( ) => [ ...( allRemoteVoices || [ ] ) , ...( allBrowserVoices || [ ] ) ] ,
7080 [ allRemoteVoices , allBrowserVoices ]
7181 ) ;
@@ -75,13 +85,6 @@ export function useVoiceData({ lang, remoteInterface, persistedEnabledVoices })
7585 [ allVoices ]
7686 ) ;
7787
78- let enabledVoices = useMemo ( ( ) => {
79- if ( ! persistedEnabledVoices ) return null ;
80- let resolvedLang = resolveLanguage ( selectedLang , [ ...persistedEnabledVoices . keys ( ) ] ) ;
81- if ( ! resolvedLang ) return null ;
82- return persistedEnabledVoices . get ( resolvedLang ) ?? null ;
83- } , [ persistedEnabledVoices , selectedLang ] ) ;
84-
8588 return {
8689 allBrowserVoices,
8790 allRemoteVoices,
@@ -92,7 +95,6 @@ export function useVoiceData({ lang, remoteInterface, persistedEnabledVoices })
9295 selectedLang,
9396 availableLanguages,
9497 effectiveLang : selectedLang ,
95- enabledVoices,
9698 handleLangChange : setSelectedLang ,
9799 } ;
98100}
0 commit comments