11import React , { useCallback , useEffect , useRef , useState } from 'react' ;
2+ import type { MongoServerError } from 'mongodb' ;
23import type HadronDocument from 'hadron-document' ;
34import { Element } from 'hadron-document' ;
45import { Button } from '../leafygreen' ;
@@ -81,13 +82,26 @@ function useHadronDocumentStatus(
8182 ? 'Deleting'
8283 : 'Initial' ;
8384 } ) ;
84- const [ errorMessage , setErrorMessage ] = useState < string | null > ( null ) ;
85+ const [ error , setError ] = useState < {
86+ message : string ;
87+ details ?: Record < string , unknown > ;
88+ } | null > ( null ) ;
8589 const invalidElementsRef = useRef ( new Set ( ) ) ;
8690
87- const updateStatus = useCallback ( ( newStatus : Status , errorMessage = null ) => {
88- setStatus ( newStatus ) ;
89- setErrorMessage ( errorMessage ) ;
90- } , [ ] ) ;
91+ const updateStatus = useCallback (
92+ ( newStatus : Status , error : Error | MongoServerError | null = null ) => {
93+ setStatus ( newStatus ) ;
94+ setError (
95+ error
96+ ? {
97+ message : error ?. message ,
98+ details : ( error as MongoServerError ) . errInfo ,
99+ }
100+ : null
101+ ) ;
102+ } ,
103+ [ ]
104+ ) ;
91105
92106 useEffect ( ( ) => {
93107 if ( status !== 'Initial' ) {
@@ -128,7 +142,7 @@ function useHadronDocumentStatus(
128142 const onUpdateSuccess = ( ) => {
129143 updateStatus ( 'UpdateSuccess' ) ;
130144 } ;
131- const onUpdateError = ( err : string ) => {
145+ const onUpdateError = ( err : Error | MongoServerError ) => {
132146 updateStatus ( 'UpdateError' , err ) ;
133147 } ;
134148 const onRemoveStart = ( ) => {
@@ -137,7 +151,7 @@ function useHadronDocumentStatus(
137151 const onRemoveSuccess = ( ) => {
138152 updateStatus ( 'DeleteSuccess' ) ;
139153 } ;
140- const onRemoveError = ( err : string ) => {
154+ const onRemoveError = ( err : Error | MongoServerError ) => {
141155 updateStatus ( 'DeleteError' , err ) ;
142156 } ;
143157
@@ -183,7 +197,7 @@ function useHadronDocumentStatus(
183197 }
184198 } , [ status , updateStatus ] ) ;
185199
186- return { status, updateStatus, errorMessage } ;
200+ return { status, updateStatus, error } ;
187201}
188202
189203const container = css ( {
@@ -261,6 +275,7 @@ const EditActionsFooter: React.FunctionComponent<{
261275 onUpdate ( force : boolean ) : void ;
262276 onDelete ( ) : void ;
263277 onCancel ?: ( ) => void ;
278+ onOpenErrorDetails ?: ( details : Record < string , unknown > ) => void ;
264279} > = ( {
265280 doc,
266281 editing,
@@ -271,11 +286,12 @@ const EditActionsFooter: React.FunctionComponent<{
271286 onUpdate,
272287 onDelete,
273288 onCancel,
289+ onOpenErrorDetails,
274290} ) => {
275291 const {
276292 status : _status ,
277293 updateStatus,
278- errorMessage ,
294+ error ,
279295 } = useHadronDocumentStatus ( doc , editing , deleting ) ;
280296
281297 const darkMode = useDarkMode ( ) ;
@@ -303,7 +319,16 @@ const EditActionsFooter: React.FunctionComponent<{
303319 data-status = { status }
304320 >
305321 < div className = { message } data-testid = "document-footer-message" >
306- { errorMessage ?? statusMessage }
322+ { error ?. message ?? statusMessage }
323+ { error ?. details && (
324+ < Button
325+ size = "xsmall"
326+ onClick = { ( ) => onOpenErrorDetails ?.( error ?. details ) }
327+ data-testid = "insert-document-error-details-button"
328+ >
329+ VIEW ERROR DETAILS
330+ </ Button >
331+ ) }
307332 </ div >
308333 { ! isSuccess ( status ) && (
309334 < div className = { buttonGroup } >
0 commit comments