0

Basically I wrapped a Side Menu in a Provider and gave it menu of a function. Inside the side menu I wrapped stack navigation, so all my navigation screens have access to useContext.state. But my sidemenu's menu() has a problem with accessing useContext.state.

I need my sidemenu to be able to access the state and display the length of useContext.state.

Here is my App.js

import React from 'react';
import { createAppContainer} from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import menu from './src/components/menu';
import SideMenu from 'react-native-side-menu-updated'
import IndexScreen from './src/screens/IndexScreen';
import { Provider } from './src/context/BlogContext';
import ShowScreen from './src/screens/ShowScreen';
import CreateScreen from './src/screens/CreateScreen';
import EditScreen from './src/screens/EditScreen';


const navigator = createStackNavigator({
  Index: IndexScreen,
  Show: ShowScreen,
  Create: CreateScreen,
  Edit: EditScreen,
}, {
  initialRouteName: 'Index',
  defaultNavigationOptions: {
    title: 'Blogs',
    headerStyle: {
      backgroundColor: '#9AC4F8',
    },
    headerTintColor: "white",
  },
});

const App = createAppContainer(navigator);

export default () => {
  return (
    <Provider>
      <SideMenu menu={menu()} >     
        <App />    
      </SideMenu>
    </Provider>
  );
}

and this is my menu.js

import React, {useContext} from 'react';
import { Context } from '../context/BlogContext';
import { View, Text } from 'react-native';
import { State } from 'react-native-gesture-handler';


const menu = () =>{
    const { state } = useContext(Context);
    console.log(state);
    return ( 
        <View>
            <Text>{State.length}</Text>
        </View>
  )
}
export default menu;

This is the error that it wrote

Can you help me to understand how to access state in this menu function?

Here is my Reducer:

import createDataContext from './createDataContext';

const blogReducer = (state, action) => {
    switch (action.type) {
        case 'edit_blogpost':
            return state.map((blogPost) => {
                return blogPost.id === action.payload.id ? action.payload : blogPost;                
            });
        case 'delete_blogpost':
            return state.filter((blogPost) => blogPost.id !== action.payload);
        case 'add_blogpost':
            return [
                ...state, 
                {
                id: Math.floor(Math.random() * 99999), 
                title: action.payload.title,
                content: action.payload.content
                }
            ];
        default:
            return state;
    }
};

const addBlogPost = (dispatch) => {
    return (title, content, callback) => {
        dispatch({type: 'add_blogpost', payload: {title: title, content: content}});
        if(callback){
            callback();
        }
    };
};

const deleteBlogPost = dispatch => {
    return (id) => {
        dispatch({ type: 'delete_blogpost', payload: id })
    };
}

const editBlogPost = dispatch => {
    return(id, title, content, callback) => {
        dispatch({ 
            type: 'edit_blogpost', 
            payload: { id:id, title:title, content:content}
        });
        if(callback){
            callback();
        }
    };
};

export const {Context, Provider} = createDataContext(
    blogReducer, 
    {addBlogPost, deleteBlogPost, editBlogPost},
    []
);

and Context:

import React, { useReducer } from 'react';

export default (reducer, actions, initialState) => {
    const Context = React.createContext();

    const Provider = ({ children }) => {
        const [state, dispatch] = useReducer(reducer, initialState);

        //actions === { addBlogPost: (dispatch) => {return () => {} } }
        const boundActions = {};
        for(let key in actions) {
            boundActions[key] = actions[key](dispatch);
        }

        return <Context.Provider value={{ state: state, ...boundActions}}>
            {children}
        </Context.Provider>
    }

    return { Context, Provider };
};

0 Answers0