react-native-gigya-sdk
Version:
SAP CDC/Gigya SDK for your React Native applications
58 lines (47 loc) • 1.7 kB
text/typescript
import { NativeModules } from 'react-native'
const { GigyaSdk } = NativeModules
import type { GigyaSdkAccountInfoType, GigyaSdkSocialProvidersType } from '../types'
import logout from './logout'
import getState from './getState'
import isGigyaError from './isGigyaError'
import { setState } from '../internals/state'
import formatParams from '../internals/formatParams'
import handleSdkCall from '../internals/handleSdkCall'
import clearErrorState from '../internals/clearErrorState'
import saveAuthenticationAttempt from '../internals/saveAuthenticationAttempt'
export default function <ParamsType extends Record<string, unknown>>(
provider: GigyaSdkSocialProvidersType,
params?: ParamsType
): Promise<GigyaSdkAccountInfoType> {
return new Promise(async (resolve, reject) => {
if (params?.loginMode && !params.regToken) {
reject(
new Error(
"regToken is required when using loginMode. Use GigyaSdk.linkToSocialProvider() instead if you're trying to resolve an account conflict."
)
)
}
try {
const state = await getState()
const { lang, ...rest } = params || { lang: state.lang }
await logout()
const response = await handleSdkCall<GigyaSdkAccountInfoType>(
GigyaSdk.socialLogin(provider, formatParams({ lang, ...(rest && rest) }))
)
await setState({ UID: response.UID })
try {
await clearErrorState()
} catch (err) {}
resolve(response)
} catch (e) {
if (await isGigyaError(e)) {
try {
await saveAuthenticationAttempt(provider, e)
} catch (err) {
return reject(err)
}
}
reject(e)
}
})
}