mirror of
https://github.com/CompassConnections/Compass.git
synced 2025-12-23 22:18:43 -05:00
144 lines
4.6 KiB
TypeScript
144 lines
4.6 KiB
TypeScript
import {type User} from 'common/user'
|
|
import dayjs from 'dayjs'
|
|
import utc from 'dayjs/plugin/utc'
|
|
import {getAuth, GoogleAuthProvider, signInWithCredential, signInWithPopup, connectAuthEmulator} from 'firebase/auth'
|
|
|
|
import {safeLocalStorage} from '../util/local'
|
|
import {app} from './init'
|
|
import {GOOGLE_CLIENT_ID} from "common/constants"
|
|
import {isAndroidApp} from "web/lib/util/webview"
|
|
import {SocialLogin} from "@capgo/capacitor-social-login"
|
|
import {Capacitor} from "@capacitor/core"
|
|
import {IS_FIREBASE_EMULATOR} from "common/envs/constants"
|
|
|
|
dayjs.extend(utc)
|
|
|
|
export type {User}
|
|
|
|
export const auth = getAuth(app)
|
|
|
|
if (IS_FIREBASE_EMULATOR) {
|
|
connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true })
|
|
}
|
|
|
|
// console.log('auth:', auth)
|
|
|
|
export const CACHED_REFERRAL_USERNAME_KEY = 'CACHED_REFERRAL_KEY'
|
|
|
|
// Scenarios:
|
|
// 1. User is referred by another user to homepage, group page, market page etc. explicitly via referrer= query param
|
|
// 2. User lands on a market or group without a referrer, we attribute the market/group creator
|
|
// Explicit referrers take priority over the implicit ones, (e.g. they're overwritten)
|
|
export function writeReferralInfo(
|
|
defaultReferrerUsername: string,
|
|
otherOptions?: {
|
|
contractId?: string
|
|
explicitReferrer?: string
|
|
}
|
|
) {
|
|
const local = safeLocalStorage
|
|
const cachedReferralUser = local?.getItem(CACHED_REFERRAL_USERNAME_KEY)
|
|
const {explicitReferrer} = otherOptions || {}
|
|
|
|
// Write the first referral username we see.
|
|
if (!cachedReferralUser) {
|
|
local?.setItem(
|
|
CACHED_REFERRAL_USERNAME_KEY,
|
|
explicitReferrer || defaultReferrerUsername
|
|
)
|
|
}
|
|
|
|
// Overwrite all referral info if we see an explicit referrer.
|
|
if (explicitReferrer) {
|
|
local?.setItem(CACHED_REFERRAL_USERNAME_KEY, explicitReferrer)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Authenticates a Firebase client running a webview APK on Android with Google OAuth.
|
|
*
|
|
* Calls `https://accounts.google.com/o/oauth2/v2/auth?${params}` to get the code (in external browser, as Google blocks it in webview)
|
|
* Redirects to `com.compassmeet://auth` (in webview java main activity), which triggers oauthRedirect in the app (see _app.tsx)
|
|
* Calls backend endpoint `https://api.compassmeet.com/auth-google` to get the tokens from the code ('https://oauth2.googleapis.com/token')
|
|
* Uses signInWithCredential(auth, credential) to set up firebase user in the client (auth.currentUser)
|
|
*
|
|
* Deprecated for SocialLogin with capacitor, which is native and faster
|
|
*
|
|
* @public
|
|
*/
|
|
// export async function webviewGoogleSignin() {
|
|
// const params = {
|
|
// client_id: GOOGLE_CLIENT_ID,
|
|
// redirect_uri: REDIRECT_URI,
|
|
// response_type: 'code',
|
|
// scope: 'openid email profile',
|
|
// }
|
|
// console.log('params', params)
|
|
// window.open(`https://accounts.google.com/o/oauth2/v2/auth?${new URLSearchParams(params)}`, '_system')
|
|
// }
|
|
|
|
/**
|
|
* Authenticates a Firebase client running a webview APK on Android with native Google OAuth.
|
|
*
|
|
* @public
|
|
*/
|
|
export async function googleNativeLogin() {
|
|
console.log('Platform:', Capacitor.getPlatform())
|
|
console.log('URL origin:', window.location.origin)
|
|
|
|
await SocialLogin.initialize({google: {webClientId: GOOGLE_CLIENT_ID}})
|
|
|
|
// Run the native Google OAuth
|
|
const {result}: any = await SocialLogin.login({provider: 'google', options: {}})
|
|
|
|
console.log('SocialLogin.login result:', JSON.stringify(result))
|
|
|
|
// Extract the tokens from the native result
|
|
const idToken = result?.idToken
|
|
const accessToken = result?.accessToken?.token
|
|
|
|
if (!idToken) {
|
|
throw new Error('No idToken returned from Google login')
|
|
}
|
|
|
|
// Create a Firebase credential from the Google tokens
|
|
const credential = GoogleAuthProvider.credential(idToken, accessToken)
|
|
|
|
// Sign in with Firebase using the credential
|
|
const userCredential = await signInWithCredential(auth, credential)
|
|
|
|
console.log('Firebase user:', userCredential.user)
|
|
|
|
return userCredential
|
|
}
|
|
|
|
export async function firebaseLogin() {
|
|
if (isAndroidApp()) {
|
|
console.log('Running in APK')
|
|
return await googleNativeLogin()
|
|
}
|
|
console.log('Running in web')
|
|
const provider = new GoogleAuthProvider()
|
|
return signInWithPopup(auth, provider).then(async (result) => {
|
|
return result
|
|
})
|
|
}
|
|
|
|
// export async function loginWithApple() {
|
|
// const provider = new OAuthProvider('apple.com')
|
|
// provider.addScope('email')
|
|
// provider.addScope('name')
|
|
//
|
|
// return signInWithPopup(auth, provider)
|
|
// .then((result) => {
|
|
// return result
|
|
// })
|
|
// .catch((error) => {
|
|
// console.error(error)
|
|
// })
|
|
// }
|
|
|
|
export async function firebaseLogout() {
|
|
await auth.signOut()
|
|
}
|