Skip to content

Instantly share code, notes, and snippets.

@megahertz
Last active January 11, 2020 09:56
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save megahertz/3aad3adafa0f7d212b81f5e371863637 to your computer and use it in GitHub Desktop.
Save megahertz/3aad3adafa0f7d212b81f5e371863637 to your computer and use it in GitHub Desktop.
This is a provider which allows to use mobx-react Provider with wix/react-native-navigation.
import { Provider } from 'mobx-react/native';
const SPECIAL_REACT_KEYS = { children: true, key: true, ref: true };
export default class MobxRnnProvider extends Provider {
props: {
store: Object
};
context: {
mobxStores: Object
};
getChildContext() {
const stores = {};
// inherit stores
const baseStores = this.context.mobxStores;
if (baseStores) {
for (let key in baseStores) {
stores[key] = baseStores[key];
}
}
// add own stores
for (let key in this.props.store) {
if (!SPECIAL_REACT_KEYS[key]) {
stores[key] = this.props.store[key];
}
}
return {
mobxStores: stores
};
}
}
import { Navigation } from 'react-native-navigation';
import Provider from './lib/MobxRnnProvider';
import store from './store';
import HomeScreen from './screens/HomeScreen';
export default function startApplication() {
Navigation.registerComponent('myapp.HomeScreen', () => HomeScreen, store, Provider);
Navigation.startSingleScreenApp({
screen: { screen: 'myapp.HomeScreen' }
});
}
import AuthStore from './AuthStore';
import UserStore from './UserStore';
export default {
auth: new AuthStore(),
users: new UserStore()
};
import { Component } from 'react';
import { Text } from 'react-native';
import { inject, observer } from 'mobx-react/native';
@inject('users')
@observer
export default class UserScreen extends Component {
render() {
const { users } = this.props;
return (
<Text>Users count: {users.length}</Text>
);
}
}
@frangeris
Copy link

frangeris commented Feb 3, 2018

@megahertz Thanks for this snippets! 👍

Something to notice, is not possible create an object using new Store(), the store object doesn't have a constructor, it's just multiple objects, so it's gonna throws something line Object is not constructor (evaluating 'new _store.default())'

@megahertz
Copy link
Author

@frangeris, thank you, fixed

@kenkistudio
Copy link

Thanks for the snippet. Unfortunately i faced this error below when trying to inject my mst store

"Factory.Type should not be actually called. It is just a Type signature that can be used at compile time with Typescript, by using typeof type.Type"

the model:

const movies = types
	.model("moviesName", {
		// details: {},
		// genres: [],
		// list: {},
		nowPlayingMovies: types.map(types.frozen),
		popularMovies: types.map(types.frozen)
		// searchResults: {}
	})

Any clue?

@ShaMan123
Copy link

ShaMan123 commented Aug 29, 2018

Hi,
Did as suggested above.
Getting an error:
Error: MobX injector: Store 'storeName' is not available! Make sure it is provided by some Provider

Is this Provider compatible for RNN V2?
Check this out.

@ShaMan123
Copy link

My workaround (from React docs):
I wrapped my screenComponent with a storeProviderHOC:

import React, { Component } from 'react';

export default function storeProviderHOC(WrappedComponent, Provider, store) {
    return class extends Component {
        render() {
            return (
                <Provider {...store}>
                    <WrappedComponent {...this.props} />
                </Provider>
            );
        }
    };
};

Register Component:


import { Provider } from 'mobx-react';
Navigation.registerComponent(`mobX-RNN-enabled-component`, () => storeProviderHOC(ScreenComponent, Provider, myMobXStoreObject));

@jengo
Copy link

jengo commented Sep 30, 2018

Doesn't appear to work with RNN v1, getting the same store is not available error

@rommyarb
Copy link

rommyarb commented Dec 18, 2018

I am using registerComponentWithRedux
And it works.

Navigation.registerComponentWithRedux('myapp.HomeScreen', () => HomeScreen, store, Provider);

My package dependencies:
"react": "16.3.1",
"react-native": "0.55.4",
"react-native-navigation": "2.0.2641",
"mobx": "4.3.1",
"mobx-react": "5.1.0"

Thank you @megahertz !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment