| @@ -48,8 +48,11 @@ | ||
| 48 | 48 | // Private to this store — no registered `actions`; only resolvers dispatch. |
| 49 | 49 | const set = ( key, value ) => ( { type: 'SET', key, value } ); |
| 50 | 50 | const setBy = ( key, arg, value ) => ( { type: 'SET_BY', key, arg, value } ); |
| 51 | 51 | |
| 52 | +// The REST proxies pass API error bodies through as objects; UI code `.map()`s lists. | |
| 53 | +const toList = ( value ) => ( Array.isArray( value ) ? value : [] ); | |
| 54 | + | |
| 52 | 55 | const resolvers = { |
| 53 | 56 | async getSettings() { |
| 54 | 57 | const value = await apiFetch( { path: '/beyondwords/v1/settings' } ); |
| 55 | 58 | return set( 'settings', value ); |
| @@ -55,27 +58,27 @@ | ||
| 55 | 58 | return set( 'settings', value ); |
| 56 | 59 | }, |
| 57 | 60 | async getLanguages() { |
| 58 | 61 | const value = await apiFetch( { path: '/beyondwords/v1/languages' } ); |
| 59 | - return set( 'languages', value ); | |
| 62 | + return set( 'languages', toList( value ) ); | |
| 60 | 63 | }, |
| 61 | 64 | async getVoices( languageCode ) { |
| 62 | 65 | const value = await apiFetch( { |
| 63 | 66 | path: `/beyondwords/v1/languages/${ languageCode }/voices`, |
| 64 | 67 | } ); |
| 65 | - return setBy( 'voices', languageCode, value || [] ); | |
| 68 | + return setBy( 'voices', languageCode, toList( value ) ); | |
| 66 | 69 | }, |
| 67 | 70 | async getScriptTemplates() { |
| 68 | 71 | const value = await apiFetch( { |
| 69 | 72 | path: '/beyondwords/v1/summarization-settings-templates', |
| 70 | 73 | } ); |
| 71 | - return set( 'scriptTemplates', value ); | |
| 74 | + return set( 'scriptTemplates', toList( value ) ); | |
| 72 | 75 | }, |
| 73 | 76 | async getVideoTemplates() { |
| 74 | 77 | const value = await apiFetch( { |
| 75 | 78 | path: '/beyondwords/v1/video-settings-templates', |
| 76 | 79 | } ); |
| 77 | - return set( 'videoTemplates', value ); | |
| 80 | + return set( 'videoTemplates', toList( value ) ); | |
| 78 | 81 | }, |
| 79 | 82 | async getVideoSizes( projectId ) { |
| 80 | 83 | if ( ! projectId ) { |
| 81 | 84 | return setBy( 'videoSizes', projectId, [] ); |
| @@ -82,9 +85,9 @@ | ||
| 82 | 85 | } |
| 83 | 86 | const r = await apiFetch( { |
| 84 | 87 | path: `/beyondwords/v1/projects/${ projectId }/video-settings`, |
| 85 | 88 | } ); |
| 86 | - return setBy( 'videoSizes', projectId, r?.sizes ?? [] ); | |
| 89 | + return setBy( 'videoSizes', projectId, toList( r?.sizes ) ); | |
| 87 | 90 | }, |
| 88 | 91 | // The project's default `language` pre-selects the Language dropdown. |
| 89 | 92 | async getProject( projectId ) { |
| 90 | 93 | if ( ! projectId ) { |