How can I use the collapsible menu shown in the left side of demo? - react-admin

It appears that the Demo page has recently changed. How do I use the foldable features on the left menu layer, such as sales-order relationships? Where's the code?
No related code found in sample/demo code

You haven't searched long enough, it's in examples/demo/src/layout/Menu.js:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import compose from 'recompose/compose';
import SettingsIcon from '#material-ui/icons/Settings';
import LabelIcon from '#material-ui/icons/Label';
import { withRouter } from 'react-router-dom';
import {
translate,
DashboardMenuItem,
MenuItemLink,
Responsive,
} from 'react-admin';
import visitors from '../visitors';
import orders from '../orders';
import invoices from '../invoices';
import products from '../products';
import categories from '../categories';
import reviews from '../reviews';
import SubMenu from './SubMenu';
class Menu extends Component {
state = {
menuCatalog: false,
menuSales: false,
menuCustomers: false,
};
static propTypes = {
onMenuClick: PropTypes.func,
logout: PropTypes.object,
};
handleToggle = menu => {
this.setState(state => ({ [menu]: !state[menu] }));
};
render() {
const { onMenuClick, open, logout, translate } = this.props;
return (
<div>
{' '}
<DashboardMenuItem onClick={onMenuClick} />
<SubMenu
handleToggle={() => this.handleToggle('menuSales')}
isOpen={this.state.menuSales}
sidebarIsOpen={open}
name="pos.menu.sales"
icon={<orders.icon />}
>
<MenuItemLink
to={`/commands`}
primaryText={translate(`resources.commands.name`, {
smart_count: 2,
})}
leftIcon={<orders.icon />}
onClick={onMenuClick}
/>
<MenuItemLink
to={`/invoices`}
primaryText={translate(`resources.invoices.name`, {
smart_count: 2,
})}
leftIcon={<invoices.icon />}
onClick={onMenuClick}
/>
</SubMenu>
<SubMenu
handleToggle={() => this.handleToggle('menuCatalog')}
isOpen={this.state.menuCatalog}
sidebarIsOpen={open}
name="pos.menu.catalog"
icon={<products.icon />}
>
<MenuItemLink
to={`/products`}
primaryText={translate(`resources.products.name`, {
smart_count: 2,
})}
leftIcon={<products.icon />}
onClick={onMenuClick}
/>
<MenuItemLink
to={`/categories`}
primaryText={translate(`resources.categories.name`, {
smart_count: 2,
})}
leftIcon={<categories.icon />}
onClick={onMenuClick}
/>
</SubMenu>
<SubMenu
handleToggle={() => this.handleToggle('menuCustomer')}
isOpen={this.state.menuCustomer}
sidebarIsOpen={open}
name="pos.menu.customers"
icon={<visitors.icon />}
>
<MenuItemLink
to={`/customers`}
primaryText={translate(`resources.customers.name`, {
smart_count: 2,
})}
leftIcon={<visitors.icon />}
onClick={onMenuClick}
/>
<MenuItemLink
to={`/segments`}
primaryText={translate(`resources.segments.name`, {
smart_count: 2,
})}
leftIcon={<LabelIcon />}
onClick={onMenuClick}
/>
</SubMenu>
<MenuItemLink
to={`/reviews`}
primaryText={translate(`resources.reviews.name`, {
smart_count: 2,
})}
leftIcon={<reviews.icon />}
onClick={onMenuClick}
/>
<Responsive
xsmall={
<MenuItemLink
to="/configuration"
primaryText={translate('pos.configuration')}
leftIcon={<SettingsIcon />}
onClick={onMenuClick}
/>
}
medium={null}
/>
<Responsive
small={logout}
medium={null} // Pass null to render nothing on larger devices
/>
</div>
);
}
}
const mapStateToProps = state => ({
open: state.admin.ui.sidebarOpen,
theme: state.theme,
locale: state.i18n.locale,
});
const enhance = compose(
withRouter,
connect(
mapStateToProps,
{}
),
translate
);
export default enhance(Menu);

Related

Passing image data from screen to component

I am unable to pass the photo data from the takePicture function in CameraScreen.tsx to the AddNewPostButton.tsx component to insert the photo into the firebase database. My idea of using useContext is not working and I don't know how to solve it.
I tried to send photos from the CameraScreen screen to the AddNewPostButton component using the useContext mechanism, but I couldn't do it and I don't know how to do it.
CameraScreen.tsx
"Cannot assign argument of type 'string | undefined' to parameter of type 'string | null'.
Type 'undefined' cannot be assigned to type 'string | null'."
import React, { useContext, useState, createContext } from 'react';
import { Pressable, Center, Modal, Button, Stack, Input, TextArea, Icon, Text, View } from 'native-base';
import { MaterialCommunityIcons } from '#expo/vector-icons';
import { addDoc, Timestamp, collection } from 'firebase/firestore';
import { db } from '../firebaseConfig';
import { AuthContext } from '../utils/AuthStateListener';
import type { StackNavigationProp } from '#react-navigation/stack';
import { useNavigation } from '#react-navigation/native';
import { RootStackParamList } from '../stacks/RootStack';
type photoButton = StackNavigationProp<RootStackParamList>;
export const ImageContext = createContext<{ image: string | null, setImage: (newImage: string | null) => void }>({
image: null,
setImage: () => {},
});
function AddNewPostButton() {
const { currentUser, userProfile } = useContext(AuthContext);
//const [image, setImage] = useState<string | null>(null);
const navigation: photoButton = useNavigation();
const { image, setImage } = useContext(ImageContext);
/* const setImage = (newImage: string | null) => {
ImageContext.setImage(newImage);
} */
const [modalVisible, setModalVisible] = React.useState(false);
const [newPost, setNewPost] = React.useState({
title: '',
description: '',
location: '',
photo: ''
});
if (image) console.log(image);
const handleChange = (name: string, value: string) => {
setNewPost((prev) => ({ ...prev, [name]: value }));
};
const addNewPost = async () => {
await addDoc(collection(db, 'publicPosts'), {
title: newPost.title,
description: newPost.description,
location: newPost.location,
date: Timestamp.fromDate(new Date()),
photo: image ? image : '',
likes: 0,
authorId: currentUser?.uid,
authorName: userProfile?.name,
});
setNewPost({
title: '',
description: '',
location: '',
photo: ''
});
setModalVisible(false);
setImage('');
};
return (
<>
<Modal isOpen={modalVisible} onClose={setModalVisible}>
<Modal.Content>
<Modal.CloseButton />
<Modal.Header>Dodaj ogłoszenie</Modal.Header>
<Modal.Body>
<Stack space={1} w="75%" maxW="300px" mx="auto">
<Input
variant="outline"
placeholder="Tytuł nowego ogłoszenia"
onChangeText={(value) => handleChange('title', value)}
/>
<Input
variant="outline"
placeholder="Lokalizacja"
onChangeText={(value) => handleChange('location', value)}
/>
<TextArea
variant="outline"
placeholder="Opis ogłoszenia"
onChangeText={(value) => handleChange('description', value)}
/>
</Stack>
<View>
<Button
onPress={() => {
navigation.navigate({
name: 'Camera',
key: 'CameraScreen',
});
//navigation.navigate({name:'Camera'})
setModalVisible(false);
}}>
<Text>Dodaj zdjęcie</Text>
</Button>
</View>
</Modal.Body>
<Modal.Footer>
<Button.Group space={2}>
<Button
variant="ghost"
colorScheme="blueGray"
onPress={() => {
setModalVisible(false);
}}>
Anuluj
</Button>
<Button
onPress={() => {
addNewPost();
}}>
Zapisz
</Button>
</Button.Group>
</Modal.Footer>
</Modal.Content>
</Modal>
<Pressable
opacity={modalVisible === true ? 1 : 0.5}
py="3"
flex={1}
onPress={() => {
setModalVisible(true);
}}>
<Center>
<Icon mb="1" as={<MaterialCommunityIcons name="plus-box" />} color="white" size="sm" />
<Text color="white" fontSize="12">
Dodaj
</Text>
</Center>
</Pressable>
</>
);
}
export default AddNewPostButton;
import { Camera, CameraType } from 'expo-camera';
import { useState, useRef, useContext } from 'react';
import { StyleSheet, Text, TouchableOpacity, View, Dimensions, Alert } from 'react-native';
import { Ionicons } from '#expo/vector-icons';
import { ImageContext } from '../components/AddNewPostButton';
const screenWidth = Dimensions.get('window').width;
function CameraScreen() {
const [type, setType] = useState(CameraType.back);
const [permission, requestPermission] = Camera.useCameraPermissions();
const { image, setImage } = useContext(ImageContext);
let camera = useRef<Camera>(null);
if (!permission) {
return <View />;
}
if (!permission.granted) {
return (
<Text>Brak dostępu do kamery</Text>
);
}
const takePicture = async () => {
if (camera.current) {
try {
const options = { quality: 0.5, base64: true, orientation: 'portrait' };
const data = await camera.current.takePictureAsync(options);
setImage(data.base64);
} catch (error) {
console.error(error);
Alert.alert('Wystąpił błąd podczas dodawania zdjęcia');
}
}
}
return (
<View style={styles.container}>
<Camera ref={camera} style={styles.camera} type={type}>
<View style={styles.cameraControls}>
<TouchableOpacity
style={styles.flipButton}
onPress={() => {
setType(
type === CameraType.back
? CameraType.front
: CameraType.back
);
}}>
<Ionicons name="ios-camera-reverse-outline" size={64} color="#fff" />
</TouchableOpacity>
<TouchableOpacity
style={styles.captureButton}
onPress={() => takePicture()}>
<Ionicons name="ios-camera" size={64} color="#fff" />
</TouchableOpacity>
</View>
</Camera>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#000',
alignItems: 'center',
justifyContent: 'center',
},
camera: {
width: screenWidth,
height: screenWidth + 200,
},
cameraControls: {
width: '100%',
height: '100%',
alignItems: 'center',
justifyContent: 'space-evenly',
flexDirection: 'row',
paddingHorizontal: 16,
paddingVertical: 16,
},
flipButton: {
alignSelf: 'flex-end',
},
captureButton: {
alignSelf: 'flex-end',
},
text: {
fontSize: 14,
},
});
export default CameraScreen;
import React, { useContext } from 'react';
import { createNativeStackNavigator } from '#react-navigation/native-stack';
import { Timestamp } from 'firebase/firestore';
import ToggleDarkMode from '../components/DarkModeToggle';
import Header from '../components/Header';
import HomeScreen from '../screens/HomeScreen';
import PostDetailsScreen from '../screens/PostDetailsScreen';
import Signup from '../screens/SignupScreen';
import SigninScreen from '../screens/SigninScreen';
import { AuthContext } from '../utils/AuthStateListener';
import ResetPassword from '../screens/ResetPassword';
import HeaderNavigateBackButton from '../components/HeaderNavigateBackButton';
import UserDetailsScreen from '../screens/UserDetailsScreen';
import CameraScreen from '../screens/CameraScreen';
export type RootStackParamList = {
Home: undefined;
Signup: undefined;
Signin: undefined;
ResetPassword: undefined;
UserDetails: undefined;
Camera: {
param: string;
};
Details: {
post: {
title: string;
description: string;
date: Timestamp;
location: string;
likes: number;
};
};
};
const Stack = createNativeStackNavigator<RootStackParamList>();
// Functions to prevent eslint error of declaring component inside parent component
function ToggleDarkModeComponent() {
return <ToggleDarkMode />;
}
function HeaderComponent() {
return <Header />;
}
function NavigateBackButtonComponent() {
return <HeaderNavigateBackButton />;
}
function RootStack() {
const { currentUser } = useContext(AuthContext);
return (
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
headerStyle: { backgroundColor: '#86efac' },
headerRight: ToggleDarkModeComponent,
}}>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
headerTitle: HeaderComponent,
}}
/>
{!currentUser ? (
<>
<Stack.Screen
name="Signin"
component={SigninScreen}
options={{
headerLeft: NavigateBackButtonComponent,
}}
/>
<Stack.Screen
name="Signup"
component={Signup}
options={{
headerLeft: NavigateBackButtonComponent,
}}
/>
<Stack.Screen
name="ResetPassword"
component={ResetPassword}
options={{
headerLeft: NavigateBackButtonComponent,
}}
/>
</>
) : (
<>
<Stack.Screen
name="Details"
component={PostDetailsScreen}
options={{
headerLeft: NavigateBackButtonComponent,
}}
/>
<Stack.Screen
name="UserDetails"
component={UserDetailsScreen}
options={{
headerLeft: NavigateBackButtonComponent,
}}
/>
<Stack.Screen
name="Camera"
component={CameraScreen}
options={{
headerLeft: NavigateBackButtonComponent,
}}
/>
</>
)}
</Stack.Navigator>
);
}
export default RootStack;

× TypeError: navData.navigation.toggleDrawer is not a function v4x

I am following a react native course. I am trying to create an iconName = "ios-menu" but when trying to open it it does not work and it tells me that "TypeError: navData.navigation.toggleDrawer is not a function" I can't find a solution I would like to know why this happens somebody could help me.
enter code here
import { HeaderButtons, Item } from 'react-navigation-header-buttons';
import { CATEGORIES } from '../data/dummy-data';
import HeaderButton from'../components/HeaderButton';
import CategoryGridTile from '../components/CategoryGridTile';
import { DrawerActions } from 'react-navigation-drawer';
import { createDrawerNavigator } from 'react-navigation-drawer';
const CategoriesScreen = props => {
const renderGridItem = itemData => {
return (
<CategoryGridTile
title={itemData.item.title}
color={itemData.item.color}
onSelect={() => {
props.navigation.navigate({
routeName: 'CategoryMeals',
params: {
categoryId: itemData.item.id
}
});
}}
/>
);
};
return (
<FlatList
keyExtractor={(item, index) => item.id}
data={CATEGORIES}
renderItem={renderGridItem}
numColumns={2}
/>
);
};
CategoriesScreen.navigationOptions = navData => {
return {
headerTitle: 'Meal Categories',
headerLeft: (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Menu"
iconName="ios-menu"
onPress={() => {
navData.navigation.toggleDrawer();
}}
/>
</HeaderButtons>
)
};
};
In your DrawerNavigator.js when you create it, Probably you didn't export the module correctly at export default createAppContainer(DrawerNavigator "not stack but drawer");
Probably the reason why the toggleDrawer() function wasn't recognised as the react-navigation-drawer methods wasn't passed to App.js

Unable to store data in redux store

i am trying to build a react-native app in that user can add a routine or daily task in EditRoutine.js file and it can be seen in RoutineOverviewScreen.js and i am using redux for storing these data and using hooks for storing and fetching data.
Below is the EditRoutine.js code snippet
import React, { useState, useEffect, useCallback } from "react";
import { View, StyleSheet, Text, TextInput, ScrollView } from "react-native";
import { HeaderButtons, Item } from "react-navigation-header-buttons";
import Card from "../components/Card";
import { useSelector, useDispatch } from "react-redux";
import * as routinesActions from "../store/actions/routine";
import Routine from "../models/routine";
import HeaderButton from "../components/HeaderButton";
const EditRoutine = (props) => {
const dispatch = useDispatch();
const [title, setTitle] = useState("");
const [detail, setDetail] = useState("");
const [time, setTime] = useState("");
const submitHandler = useCallback(() => {
dispatch(routinesActions.createRoutine(title, detail, time));
props.navigation.goBack();
}, [dispatch,title, detail, time]);
useEffect(() => {
props.navigation.setParams({ submit: submitHandler });
}, [submitHandler]);
return (
<Card style={styles.container}>
<Text>Title</Text>
<TextInput
style={styles.input}
value={title}
onChangeText={(text) => setTitle(text)}
/>
<Text>Details</Text>
<TextInput
style={styles.input}
multiline
numberOfLines={4}
value={detail}
onChangeText={(text) => setDetail(text)}
/>
<Text>Time</Text>
<TextInput
style={styles.input}
value={time}
onChangeText={(text) => setTime(text)}
/>
</Card>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: "center",
padding: 10,
width: "100%",
},
input: {
paddingHorizontal: 2,
borderBottomColor: "#ccc",
borderBottomWidth: 1,
width: "100%",
marginVertical: 15,
},
});
EditRoutine.navigationOptions = (navData) => {
const submitFn = navData.navigation.getParam("submit");
return {
headerTitle: "Edit Routine",
headerTitle: "Your Routines",
headerLeft: (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Menu"
iconName={
Platform.OS === "android" ? "md-arrow-back" : "ios-arrow-back"
}
onPress={() => {
navData.navigation.goBack();
}}
/>
</HeaderButtons>
),
headerRight: (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Save"
iconName={
Platform.OS === "android" ? "md-checkmark" : "ios-checkmark"
}
onPress={submitFn}
/>
</HeaderButtons>
),
};
};
export default EditRoutine;
and this is my RoutineOverviewScreen.js file where i am trying to show the created routine
import React from "react";
import { View, StyleSheet, Text, FlatList } from "react-native";
import Card from "../components/Card";
import { HeaderButtons, Item } from "react-navigation-header-buttons";
import HeaderButton from "../components/HeaderButton";
import { useSelector } from "react-redux";
const RoutineOverViewScreen = (props) => {
const routines = useSelector((state) => state.routines.myRoutine);
return (
<FlatList
data={routines}
keyExtractor={(item) => item.id}
renderItem={(itemData) => (
<Card>
<View>
<Text>{itemData.item.id} </Text>
</View>
<View>
<Text>{itemData.item.title} </Text>
</View>
<View>
<Text>{itemData.item.detail} </Text>
<View>
<Text>{itemData.item.time} </Text>
</View>
</View>
</Card>
)}
/>
);
};
const styles = StyleSheet.create({});
RoutineOverViewScreen.navigationOptions = (navData) => {
return {
headerTitle: "Your Routines",
headerLeft: (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Menu"
iconName={Platform.OS === "android" ? "md-menu" : "ios-menu"}
onPress={() => {
navData.navigation.toggleDrawer();
}}
/>
</HeaderButtons>
),
headerRight: (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Add"
iconName={
Platform.OS === "android" ? "md-add-circle" : "ios-add-circle"
}
onPress={() => {
navData.navigation.navigate("Edit");
}}
/>
</HeaderButtons>
),
};
};
export default RoutineOverViewScreen;
Below is my action file routine.js snippet
export const CREATE_ROUTINE= 'CREATE_ROUTINE';
export const deleteRoutine = routineId => {
return { type: DELETE_ROUTINE, pid: routineId };
};
export const createRoutine = (title, detail, time) => {
return {
type: CREATE_ROUTINE,
routineData: {
title,
detail,
time
}
};
};
Below is my reducer file reducer.js snippet
import {
DELETE_ROUTINE,
CREATE_ROUTINE,
UPDATE_ROUTINE,
} from "../actions/routine";
import Routine from "../../models/routine";
const initialState = {
myRoutine: {},
id: 1,
};
export default (state = initialState, action) => {
switch (action.type) {
case CREATE_ROUTINE:
const newRoutine = new Routine(
state.id,
action.routineData.title,
action.routineData.detail,
action.routineData.time
);
return {
...state,
items: { ...state.items, [state.id]: newRoutine },
id: state.id + 1,
};
default: {
return state;
}
}
return state;
};
and this is my app.js file snippet
import React, { useState } from 'react';
import { createStore, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import { AppLoading } from 'expo';
import * as Font from 'expo-font';
import routinesReducer from './store/reducers/routine';
import AppNavigator from './navigator/RoutineNavigator';
const rootReducer = combineReducers({
routines: routinesReducer,
});
const store = createStore(rootReducer);
const fetchFonts = () => {
return Font.loadAsync({
'open-sans': require('./assets/fonts/OpenSans-Regular.ttf'),
'open-sans-bold': require('./assets/fonts/OpenSans-Bold.ttf')
});
};
export default function App() {
const [fontLoaded, setFontLoaded] = useState(false);
if (!fontLoaded) {
return (
<AppLoading
startAsync={fetchFonts}
onFinish={() => {
setFontLoaded(true);
}}
/>
);
}
return (
<Provider store={store}>
<AppNavigator />
</Provider>
);
}
with these above code i am able to create a new routine but i am not knowing whether my input are getting stored in to the App central state because when i am trying to render those saved data i am unable to see in my RoutineOverviewScreen screen.please help me and
About Me: Govind Kumar Thakur ( iamgovindthakur )
email: iamgovindthakur#gmail.com
Thank You :)
You are trying to use the data of "myRoutine" but never save data to this property in the reducer.
I think that the issue you are having is due to the following line in your reducer:
items: { ...state.items, [state.id]: newRoutine },

Error when simulate change text react native with jest

Let's say I create a login screen. Inside that screen, I import form component. And inside form component I have a text input.
Then, I want to simulate text input on change text, but always get an error
Method “simulate” is meant to be run on 1 node. 0 found instead.
This is my test file
it('calls the login submit method', () => {
const fieldPhoneNumber = wrapper
.find('Form')
.dive()
.find('TextInput[id="fieldPhoneNumber"]');
fieldPhoneNumber
.at(0)
.simulate('changeText', { target: { value: '082262366193' } });
});
This is my component login file
import React, { useState, useEffect } from 'react';
import { ScrollView, StatusBar, Platform } from 'react-native';
import Header from './components/Header';
import Form from './components/Form';
import ButtonSocialMedia from './components/ButtonSocialMedia';
function LoginScreen() {
const [phoneNumber, setPhoneNumber] = useState('');
const [focus, setFocus] = useState(false);
useEffect(() => {
}, [phoneNumber]);
const changePhoneNumber = (value) => {
setPhoneNumber(value);
};
const showAppleButton = () => {
if (Platform.OS === 'ios') {
const version = Platform.Version.split('.')[0];
if (version >= 13) {
return true;
} else {
return false;
}
} else {
return false;
}
};
const loginSubmit = () => {
console.log('Login Submit');
};
return (
<ScrollView>
<StatusBar
translucent
backgroundColor="transparent"
barStyle="light-content"
/>
<Header />
<Form
phoneNumber={phoneNumber}
changePhoneNumber={(value) => changePhoneNumber(value)}
focus={focus}
setFocus={() => setFocus(true)}
loginSubmit={() => loginSubmit()} />
<ButtonSocialMedia showAppleButton={() => showAppleButton()} />
</ScrollView>
);
}
export default LoginScreen;
This is my form component
/* eslint-disable prettier/prettier */
import React from 'react';
import { View, Text, TextInput } from 'react-native';
import styles from '../styles/StyleForm';
import color from '../../../../__global__/styles/themes/colorThemes';
import regex from '../../../../constant/regex';
import * as yup from 'yup';
import { Formik } from 'formik';
import ButtonFull from '../../../../__global__/button/buttonFull';
const regexPhoneNumber = regex.phone;
function Form(props) {
const renderFocus = () => {
if (props.focus) {
return (
<Text style={styles.textFocus}>Type your phone number</Text>
);
}
};
return (
<Formik
enableReinitialize={true}
initialValues={{
phoneNumber: props.phoneNumber,
}}
onSubmit={values => {
console.log('Login Submit');
}}
validateOnMount={true}
validationSchema={yup.object().shape({
phoneNumber: yup
.string()
.required()
.min(8)
.matches(regexPhoneNumber, 'Phone number is not valid'),
})}>
{({
// values,
handleChange,
errors,
setFieldTouched,
touched,
isValid,
handleSubmit,
}) => (
<View style={styles.form}>
<View style={styles.subContainer}>
<View style={styles.containerTitle}>
<Text style={styles.textTitle}>+62</Text>
</View>
<View style={styles.containerPhoneNumber}>
{renderFocus()}
<TextInput
id={'fieldPhoneNumber'}
onFocus={() => props.setFocus(true)}
value={props.phoneNumber}
style={styles.subContainerPhoneNumber}
placeholderStyle={styles.placeholder}
placeholder={'Type your phone number'}
onChangeText={(value) => {
handleChange('phoneNumber');
props.changePhoneNumber(value);
setFieldTouched('phoneNumber', true);
}}
keyboardType={'numeric'}
onBlur={() => setFieldTouched('phoneNumber', true)}
/>
</View>
</View>
{touched.phoneNumber && errors.phoneNumber && (
<View style={styles.containerError}>
<Text style={styles.textError}>Phone number is not valid</Text>
</View>
)}
<View style={styles.containerButton}>
<ButtonFull
isDisabled={!isValid}
id={'buttonLogin'}
color={isValid ? color.thema : color.grey}
handleSubmit={() => props.loginSubmit()}
title={'Next'}
/>
</View>
</View>
)}
</Formik>
);
}
export default Form;
The error you're facing implies that the statement const fieldPhoneNumber wrapper.find('Form').dive().find('TextInput[id="fieldPhoneNumber"]'); couldn't find the TextInput component and hence the simulate function cannot be called. Try searching for the string "TextInput" inside the wrapper, and see if that works.

React-Native: Picker can't select any other item. Error: Actions may not have and undefined "type" property. Have you misspelled a constant?

I'm learning React Native and I'm stuck on a Picker problem. On clicking it shows up but I can't select anything else other than "Monday". Whenever I do, I get an error
I've tried searching for the problem on the internet and worked with my action creators but nothing seems to work
import React, { Component } from 'react';
import { Picker, Text } from 'react-native';
import { connect } from 'react-redux';
import { employeeUpdate } from '../actions';
import { Card, CardSection, Input, Button } from './common';
class EmployeeCreate extends Component {
render() {
return (
<Card>
<CardSection>
<Input
label='Name'
placeholder='Jane'
value={this.props.name}
onChangeText={value => this.props.employeeUpdate({ prop: 'name', value })}
/>
</CardSection>
<CardSection>
<Input
label='Phone'
placeholder='555-555-5555'
value={this.props.phone}
onChangeText={value => this.props.employeeUpdate({ prop: 'phone', value })}
/>
</CardSection>
<CardSection style={{ flexDirection: 'column' }}>
<Text style={styles.pickerTextStyle}>Shift</Text>
<Picker
style={{ alignItems: "center" }}
selectedValue={this.props.shift}
onValueChange={value => this.props.employeeUpdate({ prop: 'shift', value })}
>
<Picker.Item label="Monday" value="Monday" />
<Picker.Item label="Tuesday" value="Tuesday" />
<Picker.Item label="Wednesday" value="Wednesday" />
<Picker.Item label="Thursday" value="Thursday" />
<Picker.Item label="Friday" value="Friday" />
<Picker.Item label="Saturday" value="Saturday" />
<Picker.Item label="Sunday" value="Sunday" />
</Picker>
</CardSection>
<CardSection>
<Button>Create</Button>
</CardSection>
</Card>
);
}
}
const styles = {
pickerTextStyle: {
fontSize: 18,
paddingLeft: 20
}
};
const mapStateToProps = (state) => {
const { name, phone, shift } = state.employeeForm;
return { name, phone, shift };
};
export default connect(mapStateToProps, { employeeUpdate })(EmployeeCreate);
Here is my EmployeeActions File:
import EMPLOYEE_UPDATE from './types'
export const employeeUpdate = ({ prop, value }) => {
return {
type: EMPLOYEE_UPDATE,
payload: { prop, value }
};
};
Here is the EmployeeFormReducer:
import EMPLOYEE_UPDATE from '../actions/types';
const INITIAL_STATE = { name: '', phone: '', shift: '' };
export default (state = INITIAL_STATE, action) => {
switch (action.type) {
case EMPLOYEE_UPDATE:
//action.payload === { prop: 'name', value: 'jane' }
return { ...state, [action.payload.prop]: action.payload.value };
default:
return state;
}
}
I expect to select any day as per my choice
Solved. Did some changes in types.js file:
export const EMAIL_CHANGED = 'email_changed';
export const PASSWORD_CHANGED = 'password_changed';
export const LOGIN_USER_SUCCESS = 'login_user_success';
export const LOGIN_USER_FAIL = 'login_user_fail';
export const LOGIN_USER = 'login_user';
export const EMPLOYEE_UPDATE = 'employee_update';
export default {
EMAIL_CHANGED,
PASSWORD_CHANGED,
LOGIN_USER_SUCCESS,
LOGIN_USER_FAIL,
LOGIN_USER,
EMPLOYEE_UPDATE
}