diff --git a/src/lib/StringPay.d.ts b/src/lib/StringPay.d.ts index ed6734d..c615dab 100644 --- a/src/lib/StringPay.d.ts +++ b/src/lib/StringPay.d.ts @@ -1,19 +1,26 @@ export interface StringPayload { - apiKey: string; - name: string; - collection?: string; - currency: string; - price: number; - imageSrc: string; - imageAlt?: string; - chainID: number; - userAddress: string; - contractAddress: string; - contractFunction: string; - contractReturn: string; - contractParameters: string[]; - txValue: string; + options?: StringOptions; + apiKey: string; + name: string; + collection?: string; + currency: string; + price: number; + imageSrc: string; + imageAlt?: string; + chainID: number; + userAddress: string; + contractAddress: string; + contractFunction: string; + contractReturn: string; + contractParameters: string[]; + txValue: string; + gasLimit?: string; } + +export interface StringOptions { + bypassDeviceCheck?: boolean; +} + export declare class StringPay { container?: Element; frame?: HTMLIFrameElement; diff --git a/src/lib/StringPay.ts b/src/lib/StringPay.ts index 72153e4..20fc3f0 100644 --- a/src/lib/StringPay.ts +++ b/src/lib/StringPay.ts @@ -1,6 +1,7 @@ import { createServices, type Services } from "./services"; export interface StringPayload { + options?: StringOptions apiKey: string; name: string; collection?: string; @@ -18,6 +19,10 @@ export interface StringPayload { gasLimit?: string; } +export interface StringOptions { + bypassDeviceCheck?: boolean; +} + const IFRAME_URL = import.meta.env.VITE_IFRAME_URL; const API_URL = import.meta.env.VITE_API_URL; diff --git a/src/lib/services/apiClient.service.ts b/src/lib/services/apiClient.service.ts index e086101..0d02e16 100644 --- a/src/lib/services/apiClient.service.ts +++ b/src/lib/services/apiClient.service.ts @@ -98,7 +98,7 @@ export function createApiClient({ baseUrl }: ApiClientOptions): ApiClient { } } - async function loginUser(nonce: string, signature: string, visitor?: VisitorData) { + async function loginUser(nonce: string, signature: string, visitor?: VisitorData, bypassDeviceCheck = false) { const headers = { "X-Api-Key": apiKey }; const body = { nonce, @@ -110,7 +110,7 @@ export function createApiClient({ baseUrl }: ApiClientOptions): ApiClient { const { data } = await httpClient.post<{ authToken: AuthToken; user: User; - }>(`/login/sign`, body, { headers }); + }>(`/login/sign${bypassDeviceCheck ? "?bypassDevice=true" : ""}`, body, { headers }); return data; } catch (e: any) { const error = _getErrorFromAxiosError(e); @@ -243,7 +243,7 @@ export interface ApiClient { createUser: (nonce: string, signature: string, visitor?: VisitorData) => Promise<{ authToken: AuthToken; user: User }>; updateUser: (userId: string, userUpdate: UserUpdate) => Promise; requestEmailVerification: (userId: string, email: string) => Promise; - loginUser: (nonce: string, signature: string, visitor?: VisitorData) => Promise<{ authToken: AuthToken; user: User }>; + loginUser: (nonce: string, signature: string, visitor?: VisitorData, bypassDeviceCheck?: boolean) => Promise<{ authToken: AuthToken; user: User }>; refreshToken: (walletAddress: string) => Promise<{ authToken: AuthToken; user: User }>; logoutUser: () => Promise; getUserStatus: (userId: string) => Promise<{ status: string }>; diff --git a/src/lib/services/auth.service.ts b/src/lib/services/auth.service.ts index 35e469a..169a007 100644 --- a/src/lib/services/auth.service.ts +++ b/src/lib/services/auth.service.ts @@ -4,8 +4,14 @@ import type { LocationService, VisitorData } from './location.service'; export function createAuthService({ apiClient, locationService }: { apiClient: ApiClient, locationService: LocationService }): AuthService { const previousAttempt = { signature: "", nonce: "" }; + let _bypassDeviceCheck = false; + + const setBypassDeviceCheck = (value?: boolean) => { + _bypassDeviceCheck = value || false; + }; + const login = async (nonce: string, signature: string, visitorData?: VisitorData) => { - const data = await apiClient.loginUser(nonce, signature, visitorData); + const data = await apiClient.loginUser(nonce, signature, visitorData, _bypassDeviceCheck); return data; }; @@ -42,8 +48,7 @@ export function createAuthService({ apiClient, locationService }: { apiClient: A if (!previousAttempt.signature) throw { code: "UNAUTHORIZED" }; const visitorData = await locationService.getVisitorData(); - const data = await apiClient.loginUser(previousAttempt.nonce, previousAttempt.signature, visitorData); - return data; + return login(previousAttempt.nonce, previousAttempt.signature, visitorData); }; @@ -78,15 +83,17 @@ export function createAuthService({ apiClient, locationService }: { apiClient: A return { loginOrCreateUser, + fetchLoggedInUser, retryLogin, logout, - fetchLoggedInUser + setBypassDeviceCheck }; } export interface AuthService { loginOrCreateUser: (walletAddress: string) => Promise<{ user: User }>; - retryLogin: () => Promise<{ user: User }>; fetchLoggedInUser: (walletAddress: string) => Promise; + retryLogin: () => Promise<{ user: User }>; logout: () => Promise; + setBypassDeviceCheck: (value?: boolean) => void; } \ No newline at end of file diff --git a/src/lib/services/events.service.ts b/src/lib/services/events.service.ts index 4725cae..adfbb14 100644 --- a/src/lib/services/events.service.ts +++ b/src/lib/services/events.service.ts @@ -105,6 +105,7 @@ export function createEventsService(authService: AuthService, quoteService: Quot apiClient.setWalletAddress(stringPay.payload.userAddress); apiClient.setApiKey(stringPay.payload.apiKey); + authService.setBypassDeviceCheck(stringPay.payload.options?.bypassDeviceCheck); // init fp service locationService.getFPInstance().catch((err) => console.debug("getFPInstance error: ", err));