Bladeren bron

[web] add button for removing collaborator via project admin page (#32585)

* [web] useAsync: clear previous error on retry

* [web] add button for removing collaborator via project admin page

GitOrigin-RevId: c5efaef81600787265d669b5919fb9b1cfdd3ef3
Jakob Ackermann 4 maanden geleden
bovenliggende
commit
3f62eac181

+ 2 - 1
services/web/frontend/js/shared/hooks/use-async.ts

@@ -31,7 +31,8 @@ function useAsync<T = any, E extends Error | FetchError = Error>(
   const safeSetState = useSafeDispatch(setState)
 
   const setData = React.useCallback(
-    (data: Nullable<T>) => safeSetState({ data, status: 'resolved' }),
+    (data: Nullable<T>) =>
+      safeSetState({ data, error: null, status: 'resolved' }),
     [safeSetState]
   )
 

+ 25 - 0
services/web/test/frontend/shared/hooks/use-async.test.ts

@@ -163,6 +163,31 @@ describe('useAsync', function () {
     })
   })
 
+  it('clears the error on retry', async function () {
+    const mockError = new Error('rejected value')
+    const { result } = renderHook(() => useAsync())
+
+    act(() => {
+      result.current.setError(mockError)
+    })
+
+    expect(result.current).to.include({
+      ...rejectedState,
+      error: mockError,
+    })
+
+    const mockData = Symbol('resolved value')
+    await act(async () => {
+      await result.current.runAsync(Promise.resolve(mockData))
+    })
+
+    expect(result.current).to.include({
+      ...resolvedState,
+      error: null,
+      data: mockData,
+    })
+  })
+
   it('no state updates happen if the component is unmounted while pending', async function () {
     const { promise, resolve } = deferred()
     const { result, unmount } = renderHook(() => useAsync())