diff --git a/examples/base/src/Content.tsx b/examples/base/src/Content.tsx index 8046a07..2244ee8 100644 --- a/examples/base/src/Content.tsx +++ b/examples/base/src/Content.tsx @@ -6,14 +6,14 @@ import { useAuthClient } from './auth'; export const Content: React.FC = () => { const authClient = useAuthClient(); - const [doLogin, isLoginLoading] = useAsyncCallback(() => authClient.login(), [ + const [doLogin, isLoginLoading, loginError] = useAsyncCallback(() => authClient.login(), [ authClient, ]); - const [doRefresh, isRefreshLoading] = useAsyncCallback( + const [doRefresh, isRefreshLoading, refreshError] = useAsyncCallback( () => authClient.refresh(), [authClient] ); - const [doLogout, isLogoutLoading] = useAsyncCallback( + const [doLogout, isLogoutLoading, logoutError] = useAsyncCallback( () => authClient.logout(), [authClient] ); @@ -49,25 +49,36 @@ export const Content: React.FC = () => { {isLoginLoading ?

Login in progress..

: null} {isRefreshLoading ?

Refresh in progress..

: null} + {loginError != null ?

Login error: {loginError instanceof Error ? loginError.message : 'An error occurred'}

: null} + {refreshError != null ?

Refresh error: {refreshError instanceof Error ? refreshError.message : 'An error occurred'}

: null} + {logoutError != null ?

Logout error: {logoutError instanceof Error ? logoutError.message : 'An error occurred'}

: null} +

Tokens:

{JSON.stringify(authClient.tokens, null, 2)}
); }; +type AsyncCallbackState = { isLoading: boolean; error: unknown }; + function useAsyncCallback Promise>( callback: T, deps: DependencyList -): [T, boolean] { - const [isLoading, setLoading] = useState(false); - const cb = useCallback(async (...argsx: never[]) => { - setLoading(true); +): [(...args: Parameters) => Promise, boolean, unknown] { + const [{ isLoading, error }, setState] = useState({ + isLoading: false, + error: null, + }); + const cb = useCallback(async (...argsx: Parameters) => { + setState({ isLoading: true, error: null }); try { - return await callback(...argsx); - } finally { - setLoading(false); + const result = await callback(...argsx); + setState({ isLoading: false, error: null }); + return result; + } catch (err) { + setState({ isLoading: false, error: err }); } - }, deps) as T; + }, deps); - return [cb, isLoading]; + return [cb, isLoading, error]; }