After a week, I found a logical way to solve this problem using the Redux plugin and react-native-restart . I also use a good screensaver for the user, not showing restart progress for this.
So let me dive into the code:
Redux action:
export const GET_APP_LAYOUT_DIRECTION = 'GET_APP_LAYOUT_DIRECTION'; export const SET_APP_LAYOUT_DIRECTION = 'SET_APP_LAYOUT_DIRECTION'; export const getAppLayoutDirection = () => ({ type: GET_APP_LAYOUT_DIRECTION, }); export const setAppLayoutDirection = direction => ({ type: SET_APP_LAYOUT_DIRECTION, direction });
Redux Reducer:
import { GET_APP_LAYOUT_DIRECTION, SET_APP_LAYOUT_DIRECTION, } from '../actions/app'; const initialState = { layout: 'ltr', }; const reducer = (state = initialState, action) => { switch (action.type) { case GET_APP_LAYOUT_DIRECTION: return { ...state, }; case SET_APP_LAYOUT_DIRECTION: return { ...state, layout: action.direction, }; default: return state; } }; export default reducer;
Home screen:
import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import RNRestart from 'react-native-restart'; // Import package from node modules import { getAppLayoutDirection, setAppLayoutDirection } from '../actions/app'; class Home extends PureComponent { constructor(props) { super(props); this.props.dispatch(getAppLayoutDirection()); if(this.props.layout === 'ltr'){ this.props.dispatch(setAppLayoutDirection('rtl')); RNRestart.Restart(); } } componentDidMount() { if(this.props.layout && this.props.layout === 'rtl'){ SplashScreen.hide(); } } } const mapStateToProps = (state) => { const { layout } = state.app; return { layout }; } export default connect(mapStateToProps)(Home);
source share