0

I'm trying to connect new users through Facebook authentication and Firebase SDK with createContext, but I'm getting: new FacebookAuthProvider() is not supported on the native Firebase SDKs.

I'm using the firebase doc here : https://firebase.google.com/docs/auth/web/facebook-login and here : https://github.com/firebase/snippets-web/blob/1452a031ee1b7904a361b23391af8533237eab82/auth/facebook.js#L9-L9

My code :

import React, {createContext, useState} from 'react';

import auth from '@react-native-firebase/auth';
import firebase from '@react-native-firebase/app';

export const AuthContext = createContext({});

export const AuthProvider = ({children}) => {
  const [user, setUser] = useState(null);

  return (
    <AuthContext.Provider
      value={{
        user,
        setUser,
        login: async (email, password) => {
          try {
            await auth().signInWithEmailAndPassword(email, password);
          } catch (e) {
            return handleError(e);
          }
        },
        register: async (email, password) => {
          try {
            await auth().createUserWithEmailAndPassword(email, password);
          } catch (e) {
            return handleError(e);
          }
        },
        logout: async () => {
          try {
            await auth().signOut();
          } catch (e) {
            return handleError(e);
          }
        },
        loginWithFacebook: async (processRequest) => {
          try {
            let provider = new firebase.auth.FacebookAuthProvider();
            provider.addScope('user_birthday');
            provider.setCustomParameters({
              display: 'popup',
            });
            await firebase.auth().signInWithPopup(provider);
          } catch (e) {
            console.log(e);
          }
        },
      }}>
      {children}
    </AuthContext.Provider>
  );
};

If someone have another idea for using facebook connection with firebase SDK and useContext I'm okay too.

XplosiVe06
  • 568
  • 3
  • 23

2 Answers2

0

i use in this form, the firebase and facebook connection together. :)

import auth from '@react-native-firebase/auth';
import { AccessToken, LoginManager } from 'react-native-fbsdk';

async function (dispatch, getState) {
        try {
            if (Platform.OS === 'android') {
                LoginManager.setLoginBehavior('web_only');
            }
            const result = await LoginManager.logInWithPermissions(['public_profile', 'email']);

            if (result.isCancelled) {
                throw 'User cancelled the login process';
            }

            const data = await AccessToken.getCurrentAccessToken();

            if (!data) {
                throw 'Something went wrong obtaining access token';
            }

            const facebookCredential = auth.FacebookAuthProvider.credential(data.accessToken);

            return auth()
                .signInWithCredential(facebookCredential)
                .then(async (result) => {})
                .catch((error) => {
                    console.log(error);
                });
        } catch (error) {
            console.log(error);
        }
    };
Dániel Boros
  • 381
  • 2
  • 14
  • Thanks, but it is not really what I am looking for. I'm trying to use FacebookAuthProvider() from the firebase SDK within my authContext. – XplosiVe06 Jan 15 '21 at 08:29
0

Okay so as the doc says here :

All Authentication features, except phone authentication and popup/redirect OAuth operations, are supported.

And the solution is here

My AuthProvider now with onFaceBookButtonPress function from the above doc :

import React, {createContext, useState} from 'react';

import auth from '@react-native-firebase/auth';
import {LoginManager, AccessToken} from 'react-native-fbsdk';

export const AuthContext = createContext({});

export const AuthProvider = ({children}) => {
  const [user, setUser] = useState(null);

  return (
    <AuthContext.Provider
      value={{
        user,
        setUser,
        login: async (email, password) => {
          try {
            await auth().signInWithEmailAndPassword(email, password);
          } catch (e) {
            return handleError(e);
          }
        },
        register: async (email, password) => {
          try {
            await auth().createUserWithEmailAndPassword(email, password);
          } catch (e) {
            return handleError(e);
          }
        },
        logout: async () => {
          try {
            await auth().signOut();
          } catch (e) {
            return handleError(e);
          }
        },
        loginWithFacebook: async (processRequest) => {
          try {
            await onFacebookButtonPress();
          } catch (e) {
            throw new Error(e);
          }
        },
      }}>
      {children}
    </AuthContext.Provider>
  );

  async function onFacebookButtonPress() {
    // Attempt login with permissions
    const result = await LoginManager.logInWithPermissions([
      'public_profile',
      'email',
    ]);

    if (result.isCancelled) {
      throw 'User cancelled the login process';
    }

    // Once signed in, get the users AccesToken
    const data = await AccessToken.getCurrentAccessToken();

    if (!data) {
      throw 'Something went wrong obtaining access token';
    }

    // Create a Firebase credential with the AccessToken
    const facebookCredential = auth.FacebookAuthProvider.credential(
      data.accessToken,
    );

    // Sign-in the user with the credential
    return auth().signInWithCredential(facebookCredential);
  }

And I call it like this:

import {AuthContext} from '../../../navigation/auth/AuthProvider';

const {loginWithFacebook} = useContext(AuthContext);

<Button onPress={loginWithFacebook}
XplosiVe06
  • 568
  • 3
  • 23