diff --git a/__tests__/use-visitor-data.test.tsx b/__tests__/use-visitor-data.test.tsx index 4c31bba..30e5aaf 100644 --- a/__tests__/use-visitor-data.test.tsx +++ b/__tests__/use-visitor-data.test.tsx @@ -4,6 +4,7 @@ import { actWait, createWrapper } from './helpers' import { act } from 'react-dom/test-utils' import { useState } from 'react' import userEvent from '@testing-library/user-event' +import { ERROR_CLIENT_TIMEOUT } from '@fingerprintjs/fingerprintjs-pro' const testData = { visitorId: 'abcdef123456', @@ -135,4 +136,19 @@ describe('useVisitorData', () => { expect(getVisitorData).toHaveBeenNthCalledWith(1, { extendedResult: false }, undefined) expect(getVisitorData).toHaveBeenNthCalledWith(2, { extendedResult: true }, undefined) }) + + it('should correctly pass errors from SPA library', async () => { + getVisitorData.mockRejectedValueOnce(new Error(ERROR_CLIENT_TIMEOUT)) + + const wrapper = createWrapper() + const hook = renderHook(() => useVisitorData({ ignoreCache: true }, { immediate: false }), { wrapper }) + + await act(async () => { + await hook.result.current.getData({ + ignoreCache: false, + }) + }) + + expect(hook.result.current.error?.message).toBe(ERROR_CLIENT_TIMEOUT) + }) }) diff --git a/src/use-visitor-data.ts b/src/use-visitor-data.ts index fdb0d57..be0e2ae 100644 --- a/src/use-visitor-data.ts +++ b/src/use-visitor-data.ts @@ -3,6 +3,7 @@ import { useCallback, useContext, useEffect, useState } from 'react' import { GetOptions, VisitorData } from '@fingerprintjs/fingerprintjs-pro-spa' import { usePrevious } from './utils/use-previous' import deepEquals from 'fast-deep-equal' +import { toError } from './utils/to-error' export type UseVisitorDataOptions = GetOptions & Partial @@ -48,12 +49,12 @@ export function useVisitorData( ) setState((state) => ({ ...state, data: result, isLoading: false, error: undefined })) return result - } catch (error) { - if (error instanceof Error) { - error.message = `${error.name}: ${error.message}` - error.name = 'FPJSAgentError' - setState((state) => ({ ...state, data: undefined, error: error as Error })) - } + } catch (unknownError) { + const error = toError(unknownError) + + error.name = 'FPJSAgentError' + + setState((state) => ({ ...state, data: undefined, error })) } finally { setState((state) => (state.isLoading ? { ...state, isLoading: false } : state)) } diff --git a/src/utils/to-error.ts b/src/utils/to-error.ts new file mode 100644 index 0000000..20c7016 --- /dev/null +++ b/src/utils/to-error.ts @@ -0,0 +1,7 @@ +export function toError(error: unknown) { + if (error instanceof Error) { + return error + } + + return new Error(String(error)) +}