UNPKG

@fingerprintjs/fingerprintjs-pro-react-native

Version:

Official React Native client for Fingerprint. Best identification solution for React Native.

64 lines (59 loc) 1.84 kB
import { useCallback, useContext, useState } from 'react' import { FingerprintJsProContextInterface, FingerprintJsProContext } from './FingerprintJsProContext' import { QueryResult, VisitorQueryContext, VisitorData, Tags, RequestOptions } from './types' import { IdentificationError } from './errors' /** * Use the `useVisitorData` hook in your components to perform identification requests with the FingerprintJS API. * * @example * ```jsx * const { * // Request state * isLoading, * // Error info * error, * // Visitor info * data, * // A method to be called to initiate request * getData, * } = useVisitorData(); * ``` * * @group Hooks approach */ export function useVisitorData(): VisitorQueryContext { const { getVisitorData } = useContext<FingerprintJsProContextInterface>(FingerprintJsProContext) const [state, setState] = useState<QueryResult<VisitorData, IdentificationError>>({}) const getData = useCallback<VisitorQueryContext['getData']>( async (tags?: Tags, linkedId?: string, options?: RequestOptions) => { let result: VisitorData | null = null try { setState((state) => ({ ...state, isLoading: true })) result = await getVisitorData(tags, linkedId, options) setState((state) => ({ ...state, data: result as VisitorData, isLoading: false, error: undefined, })) } catch (error) { setState((state) => ({ ...state, data: undefined, error: error as IdentificationError, })) } finally { setState((state) => (state.isLoading ? { ...state, isLoading: false } : state)) } return result }, [getVisitorData] ) const { isLoading, data, error } = state return { isLoading, data, error, getData, } }