11import { useReducer } from 'react' ;
2+ import { AxiosError } from 'axios' ;
23import { useIntl } from '@edx/frontend-platform/i18n' ;
34
4- import { useCreateTag , useUpdateTag } from '../data/apiHooks' ;
5+ import globalMessages from '@src/messages' ;
6+ import { useCreateTag , useUpdateTag } from '@src/taxonomy/data/apiHooks' ;
7+ import type { RowId } from '@src/taxonomy/tree-table/types' ;
58import { TagTree } from './tagTree' ;
69import { TagListTableError } from './errors' ;
7- import type { RowId } from '../tree-table/types' ;
810import {
911 TABLE_MODES ,
1012 TRANSITION_TABLE ,
@@ -167,6 +169,38 @@ const useEditActions = ({
167169 return true ;
168170 } ;
169171
172+ const formatErrorMessage = ( errorMessage : string ) : string => {
173+ // Remove trailing period for better message formatting
174+ return errorMessage . replace ( / \. $ / , '' ) ;
175+ } ;
176+
177+ const getAxiosErrorMessage = ( axiosError : AxiosError ) => {
178+ const responseData = axiosError . response ?. data ;
179+ const tagError = responseData ?
180+ Object . entries ( responseData ) ?. find ( ( errItem : [ string , unknown ] ) => (
181+ [ 'tag' , 'value' , 'updated_tag_value' ] . includes ( errItem [ 0 ] . toLowerCase ( ) )
182+ ) ) :
183+ null ;
184+
185+ const errorMessages = tagError ? tagError [ 1 ] : (
186+ axiosError . message || intl . formatMessage ( globalMessages . unknownError )
187+ ) ;
188+ const errorMessage = Array . isArray ( errorMessages ) ? errorMessages . join ( '; ' ) : String ( errorMessages ) ;
189+ return formatErrorMessage ( errorMessage ) ;
190+ } ;
191+
192+ const getErrorMessage = ( error : unknown ) : string => {
193+ if ( error instanceof AxiosError ) {
194+ return getAxiosErrorMessage ( error ) ;
195+ }
196+
197+ if ( error instanceof Error && error . message ) {
198+ return formatErrorMessage ( error . message ) ;
199+ }
200+
201+ return intl . formatMessage ( globalMessages . unknownError ) ;
202+ } ;
203+
170204 const handleCreateTag = async ( value : string , parentTagValue ?: string ) => {
171205 const trimmed = value . trim ( ) ;
172206
@@ -186,11 +220,9 @@ const useEditActions = ({
186220 setIsCreatingTopTag ( false ) ;
187221 setCreatingParentId ( null ) ;
188222 } catch ( error ) {
189- const message = intl . formatMessage ( messages . tagCreationErrorMessage , { errorMessage : ( error as Error ) ?. message } ) ;
190- setDraftError (
191- ( error as Error ) ?. message || intl . formatMessage ( messages . tagCreationErrorMessage , { errorMessage : '' } ) ,
192- ) ;
193- setToast ( { show : true , message } ) ;
223+ const errorMessage = getErrorMessage ( error ) ;
224+ setDraftError ( errorMessage ) ;
225+ setToast ( { show : true , message : intl . formatMessage ( messages . tagCreationErrorMessage , { errorMessage } ) } ) ;
194226 }
195227 } ;
196228
@@ -217,11 +249,9 @@ const useEditActions = ({
217249 message : intl . formatMessage ( messages . tagUpdateSuccessMessage , { name : trimmed } ) ,
218250 } ) ;
219251 } catch ( error ) {
220- const message = intl . formatMessage ( messages . tagUpdateErrorMessage , { errorMessage : ( error as Error ) ?. message } ) ;
221- setDraftError (
222- ( error as Error ) ?. message || intl . formatMessage ( messages . tagUpdateErrorMessage , { errorMessage : '' } ) ,
223- ) ;
224- setToast ( { show : true , message } ) ;
252+ const errorMessage = getErrorMessage ( error ) ;
253+ setDraftError ( errorMessage ) ;
254+ setToast ( { show : true , message : intl . formatMessage ( messages . tagUpdateErrorMessage , { errorMessage } ) } ) ;
225255 }
226256 } ;
227257
0 commit comments