javascriptreact-nativereact-context

How to call a function defined in context on onSubmit?


I want to call register function onSubmit but when i tried to console it, it shows undefined. I also tried to use register like this const {register} = useContext(ApiContext); still it is undefined.

Auth.js

const AuthProvider = ({children}) => {
const [signUp, setSignUp] = useState([]);
const [formData, setFormData] = useState(FORM_FIELDS);

const authState = {
  signUpData: signUp,
  setSignUp: setSignUp,
  setFormData: setFormData,
  formData: formData,
  register: handleRegister,
};

  const handleRegister = async () => {
   const response = await axios
    .post(process.env.API_BASE_URL + API_ENDPOINTS.SIGN_UP, {
     email: formData.email,
     first_name: formData.firstName,
     last_name: formData.lastName,
     password: formData.password,
   })
   .then(data => console.log(data, 'apiData'));
 console.log(response, 'response');
};

 return (
   <ApiContext.Provider value={authState}>{children}</ApiContext.Provider>
  );
};
export const ApiContext = createContext(AuthProvider);

export default AuthProvider;

Register.js

 export default function MultiStepSignUp() {
     const auth = useAuth();
     const onSubmit = () => {
      console.log(auth.register, 'auth');
     // here console shows undefined
    };

useAuth.js

import {useContext} from 'react';
import {ApiContext} from 'src/context/ApiContext';

export const useAuth = () => useContext(ApiContext);

Solution

  • Here is the details and simplified answer.

    This is the IntroContext.js

    import React, {useState} from 'react';
    const initialState = {
      isLoggedIn: false,
      userData: null,
      setIsLoggedIn: () => {},
      setUserData: () => {},
    };
    const IntroContext = React.createContext(initialState);
    
    function IntroProvider({children}) {
      const [isLoggedIn, setIsLoggedIn] = useState(false);
      const [userData, setUserData] = useState(null);
      return (
        <IntroContext.Provider
          value={{
            isLoggedIn,
            setIsLoggedIn,
            userData,
            setUserData,
          }}>
          {children}
        </IntroContext.Provider>
      );
    }
    export {IntroContext, IntroProvider};
    

    How to use in the App.js file

    import React from 'react';
    import {IntroProvider} from './src/context/IntroContext';
    import App from './src/navigations/Index';
    const MainApp2 = () => {
      return (
        <IntroProvider>
          <App />
        </IntroProvider>
      );
    };
    
    export default MainApp2;
    

    Here u can use this in the LoginScreen.js

    import React, {useContext, useState} from 'react';
    import {StyleSheet, Text, TouchableOpacity, View} from 'react-native';
    import {IntroContext} from '../context/IntroContext';
    
    const LoginScreen = () => {
      const {setIsLoggedIn, setUserData} = useContext(IntroContext);
      const [user_data, setuserdata] = useState({
        first_name: 'Jhon',
        last_name: 'Burg',
        mobile_number: '+923495544123',
      });
      const onPressAccept = async () => {
        setUserData(user_data);
        setIsLoggedIn(true);
      };
    
      return (
        <View style={styles.container}>
          <View style={styles.btnsView}>
            <TouchableOpacity style={styles.btn} onPress={() => onPressAccept()}>
              <Text style={styles.btnText}>Accept</Text>
            </TouchableOpacity>
          </View>
        </View>
      );
    };
    
    const styles = StyleSheet.create({});
    
    export default LoginScreen;
    

    if you have any confusion please ask in the comment.