@@ -4,22 +4,25 @@ import { isError } from '@app/functions/is-api-error';
44import { useOnUnmount } from '@app/hooks/use-on-unmount' ;
55import { useTranslation } from '@app/language/use-translation' ;
66import { useUpdateCaseMutation } from '@app/redux-api/case/api' ;
7+ import type { CaseType } from '@app/redux-api/case/types' ;
78import { Textarea , type TextareaProps } from '@navikt/ds-react' ;
8- import { useCallback , useEffect , useState } from 'react' ;
9+ import type { SerializedError } from '@reduxjs/toolkit' ;
10+ import type { FetchBaseQueryError } from '@reduxjs/toolkit/query' ;
11+ import { type ReactNode , useCallback , useEffect , useState } from 'react' ;
912
1013interface Props extends Omit < TextareaProps , 'label' | 'onError' | 'onChange' > {
1114 caseId : string ;
1215 value : string ;
1316 label : string ;
1417 modified : string ;
18+ type : CaseType ;
1519}
1620
17- export const BegrunnelseText = ( { caseId, value, modified, error, ...props } : Props ) => {
21+ export const BegrunnelseText = ( { caseId, value, modified, error, type , ...props } : Props ) => {
1822 const [ localValue , setLocalValue ] = useState ( value ) ;
19- const [ updateCase , status ] = useUpdateCaseMutation ( { fixedCacheKey : caseId } ) ;
23+ const [ updateCase , { reset , ... status } ] = useUpdateCaseMutation ( { fixedCacheKey : caseId } ) ;
2024 const [ lastSaved , setLastSaved ] = useState < string > ( modified ) ;
21- const { skjema } = useTranslation ( ) ;
22- const { failed } = skjema . begrunnelse . autosave ;
25+ const errorMessage = useErrorMessage ( type , status . error , error ) ;
2326
2427 const updateFritekst = useCallback (
2528 async ( newValue : string ) => {
@@ -29,17 +32,15 @@ export const BegrunnelseText = ({ caseId, value, modified, error, ...props }: Pr
2932 [ caseId , updateCase ] ,
3033 ) ;
3134
32- const unauthorized = isError ( status . error ) && status . error . status === 401 ;
33-
3435 useEffect ( ( ) => {
35- if ( value === localValue || unauthorized ) {
36+ if ( value === localValue || status . isError ) {
3637 return ;
3738 }
3839
3940 const timeout = setTimeout ( ( ) => updateFritekst ( localValue ) , 1000 ) ;
4041
4142 return ( ) => clearTimeout ( timeout ) ;
42- } , [ value , localValue , updateFritekst , unauthorized ] ) ;
43+ } , [ value , localValue , updateFritekst , status . isError ] ) ;
4344
4445 useOnUnmount ( ( ) => {
4546 if ( value !== localValue ) {
@@ -54,13 +55,31 @@ export const BegrunnelseText = ({ caseId, value, modified, error, ...props }: Pr
5455 maxLength = { 0 }
5556 minLength = { 1 }
5657 minRows = { 10 }
57- onChange = { ( { target } ) => setLocalValue ( target . value ) }
58+ onChange = { ( { target } ) => {
59+ reset ( ) ; // Reset (error) status for every change, so the user can see if the next save attempt fails or succeeds
60+ setLocalValue ( target . value ) ;
61+ } }
5862 value = { localValue }
5963 placeholder = "Skriv her"
60- error = { status . isError ? failed : error }
64+ error = { errorMessage }
6165 { ...props }
6266 />
6367 < AutosaveProgressIndicator { ...status } lastSaved = { lastSaved } />
6468 </ div >
6569 ) ;
6670} ;
71+
72+ const useErrorMessage = (
73+ type : CaseType ,
74+ rtkqError : FetchBaseQueryError | SerializedError | undefined ,
75+ validationError : ReactNode ,
76+ ) => {
77+ const { skjema } = useTranslation ( ) ;
78+ const { failed } = skjema . begrunnelse . autosave ;
79+
80+ if ( isError ( rtkqError ) && rtkqError . status === 409 ) {
81+ return skjema . begrunnelse . errors . finished [ type ] ;
82+ }
83+
84+ return rtkqError === undefined ? validationError : failed ;
85+ } ;
0 commit comments