<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Redux on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/redux/</link>
    <description>Recent content in Redux on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sun, 23 Dec 2018 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/redux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Theme your Expo/React Native App with Redux and React Navigation</title>
      <link>https://haseebmajid.dev/posts/2018-12-23-theme-your-expo-react-native-app-with-redux-and-react-navigation/</link>
      <pubDate>Sun, 23 Dec 2018 00:00:00 +0000</pubDate>
      <author>Me</author>
      <guid>https://haseebmajid.dev/posts/2018-12-23-theme-your-expo-react-native-app-with-redux-and-react-navigation/</guid>
      <description>&lt;p&gt;Recently whilst developing a React Native app (with Expo),
I built a simple tab navigator using React Navigation library.
I wanted to theme the app so that the header would change colour depending on which page you&amp;rsquo;re on.
For example on the primary page it would be red and on the secondary page, when you change tabs, the
header would become blue.&lt;/p&gt;
&lt;p&gt;I ended up being able to do it using Redux. In this article, I will show you how you can theme your Expo
app using Redux with React Navigation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently whilst developing a React Native app (with Expo),
I built a simple tab navigator using React Navigation library.
I wanted to theme the app so that the header would change colour depending on which page you&rsquo;re on.
For example on the primary page it would be red and on the secondary page, when you change tabs, the
header would become blue.</p>
<p>I ended up being able to do it using Redux. In this article, I will show you how you can theme your Expo
app using Redux with React Navigation.</p>
<p>This article is written in British English however, the code is written using American English to make it more consistent (colour vs color).</p>
<h2 id="react-navigation">React Navigation</h2>
<p>Is a library that helps you simplify app navigation.
The main reason for using this library is because it&rsquo;s written purely in JavaScript so no native code (Swift/Android) is required to make it work. Also, it&rsquo;s the <a href="https://docs.expo.io/versions/latest/guides/routing-and-navigation">recommended navigation library</a> for Expo.</p>
<h2 id="redux">Redux</h2>
<p><a href="https://redux.js.org/">Redux</a> is used to manage global state across a React app, it can actually be used with both React and React Native. Of course, in this example, we will be using Redux with a React Native app.</p>
<p><img
    loading="lazy"
    src="https://css-tricks.com/wp-content/uploads/2016/03/redux-article-3-01.svg"
    alt="Redux Store, from https://css-tricks.com/learning-react-redux/"
    
  /></p>
<p>The diagram above explains pretty well why you may need to use Redux. Passing state can be tricky
in more complicated React Native apps, with lots of components and sub-components. Using redux
we can change the state in one component and Redux will update the state in all the other components.</p>
<p>There are many great tutorials about Redux, I particularly liked this <a href="https://www.youtube.com/watch?v=KcC8KZ_Ga2M">one</a>.
Here is brief summary how Redux will work with this app.</p>
<ul>
<li>Redux sets the initial (state) colour to red</li>
<li>Change tabs from main to the secondary page</li>
<li>This dispatches an action to the Redux store (action is called <code>toggleTheme</code>)</li>
<li>The store then calls a reducer</li>
<li>The reducer (also called <code>toggleTheme</code>) updates the old state to a new state, it changes the colour from red to blue</li>
<li>Redux updates the state in all the components</li>
</ul>
<p>Here is a GIF that might help clear up how it work.</p>
<p><img
    loading="lazy"
    src="https://camo.githubusercontent.com/5aba89b6daab934631adffc1f301d17bb273268b/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6d656469612d702e736c69642e65732f75706c6f6164732f3336343831322f696d616765732f323438343535322f415243482d5265647578322d7265616c2e676966"
    alt="Redux Flow, from http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#"
    
  /></p>
<h2 id="prerequisite">Prerequisite</h2>
<ul>
<li>An Expo/React Native app</li>
<li>An Android emulator/device to test on</li>
<li>Install the following dependencies</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;react-navigation&#34;: &#34;^2.18.0&#34;,
</span></span><span class="line"><span class="cl">&#34;react-redux&#34;: &#34;^5.1.1&#34;,
</span></span><span class="line"><span class="cl">&#34;redux&#34;: &#34;^4.0.1&#34;,
</span></span></code></pre></div><h2 id="solution">Solution</h2>
<p>Now to the interesting part of this article let&rsquo;s take a look at the code.</p>
<h3 id="structure">Structure</h3>
<p>The project structure will look like this</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">├── src
</span></span><span class="line"><span class="cl">│   ├── actions
</span></span><span class="line"><span class="cl">│   ├── components
</span></span><span class="line"><span class="cl">│   ├── containers
</span></span><span class="line"><span class="cl">│   ├── reducers
</span></span><span class="line"><span class="cl">│   ├── screens
</span></span><span class="line"><span class="cl">│   ├── store
</span></span><span class="line"><span class="cl">|   └── themes
</span></span><span class="line"><span class="cl">├── package.json
</span></span><span class="line"><span class="cl">├── App.js
</span></span></code></pre></div><h3 id="themes">themes</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">COLORS</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">red</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;red&#34;</span><span class="p">,</span> <span class="nx">hexCode</span><span class="o">:</span> <span class="s2">&#34;#DE5448&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">blue</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;blue&#34;</span><span class="p">,</span> <span class="nx">hexCode</span><span class="o">:</span> <span class="s2">&#34;#498AF4&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>Here we define our two colours that will be used as themes, red and blue. I have given each colour a name because it makes the toggle logic easier to follow.</p>
<h3 id="reducers">reducers</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">COLORS</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../themes&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">initialState</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">colorData</span><span class="o">:</span> <span class="nx">COLORS</span><span class="p">.</span><span class="nx">red</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">Theme</span> <span class="o">=</span> <span class="p">(</span><span class="nx">state</span> <span class="o">=</span> <span class="nx">initialState</span><span class="p">,</span> <span class="nx">action</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">switch</span> <span class="p">(</span><span class="nx">action</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="s1">&#39;TOGGLE_THEME&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">      <span class="k">switch</span><span class="p">(</span><span class="nx">action</span><span class="p">.</span><span class="nx">payload</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">case</span> <span class="s1">&#39;red&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="p">{</span> <span class="nx">colorData</span><span class="o">:</span> <span class="nx">COLORS</span><span class="p">.</span><span class="nx">blue</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="k">case</span> <span class="s1">&#39;blue&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="p">{</span> <span class="nx">colorData</span><span class="o">:</span> <span class="nx">COLORS</span><span class="p">.</span><span class="nx">red</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="nx">state</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Theme</span><span class="p">;</span>
</span></span></code></pre></div><p>A reducer is a pure function which takes some state and returns a new state. In this example
it gets passed the current theme colour and swaps it to the new theme colour.</p>
<p>In this example if the action is <code>TOGGLE_THEME</code>, we get the colour name from the payload and using a switch
statement we swap the colours over. So if the current colour is red we update the state (<code>colorData</code>) to be
blue.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">combineReducers</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;redux&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Theme</span> <span class="nx">from</span> <span class="s1">&#39;./Theme&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">combineReducers</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Theme</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>Here we combine all of our reducers, in this example, we are only using the one reducer but if we had multiple reducers, The <code>combineReducers</code> function to would be necessary to combine them together. In this
example we can simply add new reducers to the function as and when we need them.</p>
<h3 id="actions">actions</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">TOGGLE_THEME</span> <span class="o">=</span> <span class="s2">&#34;TOGGLE_THEME&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>This file defines all the actions we can dispatch to our store. In this example, we only need one action to
toggle our theme.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">TOGGLE_THEME</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;./actionTypes&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">toggleTheme</span> <span class="o">=</span> <span class="nx">theme</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">type</span><span class="o">:</span> <span class="nx">TOGGLE_THEME</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">payload</span><span class="o">:</span> <span class="nx">theme</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>In this file, we define our actions, so here we have a single action <code>toggleTheme</code>, which takes a
theme as input and passes it as our payload, hence to access the name of the colour we use <code>action.payload.name</code> in our reducer.</p>
<h3 id="store">store</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createStore</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;redux&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">rootReducer</span> <span class="nx">from</span> <span class="s1">&#39;../reducers&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">store</span> <span class="o">=</span> <span class="nx">createStore</span><span class="p">(</span><span class="nx">rootReducer</span><span class="p">);</span>
</span></span></code></pre></div><p>The Redux store is used to store the current state for our app, we have to link our store with our reducers we can do this using the <code>createStore</code> function and import the reducers from <code>reducers/index.js</code>.</p>
<h3 id="appjs">App.js</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Component</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Provider</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-redux&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">store</span> <span class="nx">from</span> <span class="s1">&#39;./src/store&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">CustomTabNavigator</span> <span class="nx">from</span> <span class="s1">&#39;./src/components/CustomTabNavigator&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kr">class</span> <span class="nx">App</span> <span class="kr">extends</span> <span class="nx">Component</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">Provider</span> <span class="nx">store</span><span class="o">=</span><span class="p">{</span><span class="nx">store</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">CustomTabNavigator</span> <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/Provider&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>This acts as the main file for our app, to use Redux with our app we must wrap around <code>Provider</code> tags and
set the store props to our <code>store/index.js</code> file. The <code>&lt;CustomTabNavigator&gt;</code> contains the logic for our two screens and the tab navigator.</p>
<h3 id="components">components</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">store</span> <span class="nx">from</span> <span class="s1">&#39;../store&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createMaterialTopTabNavigator</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-navigation&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">PageA</span> <span class="nx">from</span> <span class="s1">&#39;../screens/PageA&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">PageB</span> <span class="nx">from</span> <span class="s1">&#39;../screens/PageB&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">COLORS</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../themes&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">toggleTheme</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../actions&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">commonTabOptions</span> <span class="o">=</span> <span class="nx">color</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">activeTintColor</span><span class="o">:</span> <span class="s1">&#39;white&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">pressColor</span><span class="o">:</span> <span class="s1">&#39;#fff&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">inactiveTintColor</span><span class="o">:</span> <span class="s1">&#39;#ddd&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">style</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">backgroundColor</span><span class="o">:</span> <span class="nx">color</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">CustomerTabNavigator</span> <span class="o">=</span> <span class="nx">createMaterialTopTabNavigator</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Encoding</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">screen</span><span class="o">:</span> <span class="nx">PageA</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">navigationOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tabBarLabel</span><span class="o">:</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tabBarOptions</span><span class="o">:</span> <span class="nx">commonTabOptions</span><span class="p">(</span><span class="nx">COLORS</span><span class="p">.</span><span class="nx">red</span><span class="p">.</span><span class="nx">hexCode</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tabBarOnPress</span><span class="o">:</span> <span class="p">({</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">defaultHandler</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">store</span><span class="p">.</span><span class="nx">dispatch</span><span class="p">(</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="nx">COLORS</span><span class="p">.</span><span class="nx">blue</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">        <span class="nx">defaultHandler</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">Decoding</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">screen</span><span class="o">:</span> <span class="nx">PageB</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">navigationOptions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tabBarLabel</span><span class="o">:</span> <span class="s1">&#39;B&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tabBarOptions</span><span class="o">:</span> <span class="nx">commonTabOptions</span><span class="p">(</span><span class="nx">COLORS</span><span class="p">.</span><span class="nx">blue</span><span class="p">.</span><span class="nx">hexCode</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">      <span class="nx">tabBarOnPress</span><span class="o">:</span> <span class="p">({</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">defaultHandler</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">store</span><span class="p">.</span><span class="nx">dispatch</span><span class="p">(</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="nx">COLORS</span><span class="p">.</span><span class="nx">red</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">        <span class="nx">defaultHandler</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tabBarPosition</span><span class="o">:</span> <span class="s1">&#39;bottom&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">CustomerTabNavigator</span><span class="p">;</span>
</span></span></code></pre></div><p>Here is where we use react navigation to create our tab navigator. We define two screens called A and B,
each screen has a different tab colour, red for A and blue for B. The main part of this file is the following</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="nx">tabBarOnPress</span><span class="o">:</span> <span class="p">({</span> <span class="nx">defaultHandler</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">store</span><span class="p">.</span><span class="nx">dispatch</span><span class="p">(</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="nx">COLORS</span><span class="p">.</span><span class="nx">red</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nx">defaultHandler</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><p>On tab change (from A -&gt; B), we detect the tab press and dispatch the <code>toggleTheme</code> action to the Redux
store. So when we change tabs from A -&gt; B the colour in the store will change from Red -&gt; Blue and
vice versa for B -&gt; A.</p>
<p>One other thing to note is the tab colour is set using the following function. The colour is passed by the <code>tabBarOptions</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">commonTabOptions</span> <span class="o">=</span> <span class="p">(</span><span class="nx">color</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">activeTintColor</span><span class="o">:</span> <span class="s2">&#34;white&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">pressColor</span><span class="o">:</span> <span class="s2">&#34;#fff&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">inactiveTintColor</span><span class="o">:</span> <span class="s2">&#34;#ddd&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">style</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">backgroundColor</span><span class="o">:</span> <span class="nx">color</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="nx">tabBarOptions</span><span class="o">:</span> <span class="nx">commonTabOptions</span><span class="p">(</span><span class="nx">COLORS</span><span class="p">.</span><span class="nx">red</span><span class="p">.</span><span class="nx">hexCode</span><span class="p">);</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Component</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">View</span><span class="p">,</span> <span class="nx">Button</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-native&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">connect</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-redux&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">toggleTheme</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../actions&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">ToggleTheme</span> <span class="kr">extends</span> <span class="nx">Component</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">View</span> <span class="nx">style</span><span class="o">=</span><span class="p">{{</span><span class="nx">marginTop</span><span class="o">:</span> <span class="mi">25</span><span class="p">}}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">Button</span>
</span></span><span class="line"><span class="cl">          <span class="nx">title</span><span class="o">=</span><span class="s2">&#34;Toggle Color&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="nx">color</span><span class="o">=</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">hexCode</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="nx">onPress</span><span class="o">=</span><span class="p">{()</span> <span class="p">=&gt;</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">color</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl">        <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/View&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">mapStateToProps</span> <span class="o">=</span> <span class="nx">state</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span><span class="o">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">Theme</span><span class="p">.</span><span class="nx">colorData</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">mapDispatchToProps</span> <span class="o">=</span> <span class="nx">dispatch</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">toggleTheme</span><span class="o">:</span> <span class="nx">color</span> <span class="p">=&gt;</span> <span class="nx">dispatch</span><span class="p">(</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="nx">color</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">connect</span><span class="p">(</span><span class="nx">mapStateToProps</span><span class="p">,</span> <span class="nx">mapDispatchToProps</span><span class="p">)(</span><span class="nx">ToggleTheme</span><span class="p">);</span>
</span></span></code></pre></div><p>This file does most of the heavy lifting for this app, this is where most of the logic sits. So, first of all, we have a button, which calls <code>toggleTheme</code> on a press of the and passes the current colour (state) as an argument.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">Button</span>
</span></span><span class="line"><span class="cl">  <span class="na">title</span><span class="o">=</span><span class="s">&#34;Toggle Color&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">color</span><span class="o">=</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">color</span><span class="p">.</span><span class="nx">hexCode</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="na">onPress</span><span class="o">=</span><span class="p">{()</span> <span class="p">=&gt;</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">color</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl"><span class="p">/&gt;</span>
</span></span></code></pre></div><p>The colour of the button is also using the current (state) colour, so in this case, it will start off as red, <code>this.props.color</code>. We can access the current state using <code>this.props</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">mapStateToProps</span> <span class="o">=</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">color</span><span class="o">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">Theme</span><span class="p">.</span><span class="nx">colorData</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>This function is used to map the Redux store to the state of this component. We map <code>state.Theme.colorData</code>,
where <code>Theme</code> is the name of our reducer and <code>colorData</code> is the item name. In this example, we&rsquo;ve mapped the current <code>colorData</code> to <code>color</code> props in this component.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">mapDispatchToProps</span> <span class="o">=</span> <span class="p">(</span><span class="nx">dispatch</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">toggleTheme</span><span class="o">:</span> <span class="p">(</span><span class="nx">color</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">dispatch</span><span class="p">(</span><span class="nx">toggleTheme</span><span class="p">(</span><span class="nx">color</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>This function maps a function to an action (and dispatches it), in this example when the <code>toggleTheme</code> function is called in the component it will dispatch the <code>toggleTheme</code> action to redux. So when the
button is pressed it will dispatch an action to toggle the theme.</p>
<h3 id="pagea">PageA</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Component</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">View</span><span class="p">,</span> <span class="nx">Text</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-native&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">ToggleTheme</span> <span class="nx">from</span> <span class="s1">&#39;../components/ToggleTheme&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kr">class</span> <span class="nx">PageA</span> <span class="kr">extends</span> <span class="nx">Component</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">View</span> <span class="na">style</span><span class="o">=</span><span class="p">{{</span> <span class="nx">flex</span><span class="o">:</span> <span class="mi">1</span> <span class="p">}}&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">ToggleTheme</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">Text</span><span class="p">&gt;</span><span class="nx">PageA</span><span class="p">&lt;/</span><span class="nt">Text</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">View</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This is an example of one of our screens, it&rsquo;s very simple just the page name and <code>&lt;ToggleTheme&gt;</code> component.</p>
<h2 id="example">Example</h2>
<p><img
        loading="lazy"
        src="/posts/2018-12-23-theme-your-expo-react-native-app-with-redux-and-react-navigation/images/example.gif"
        type=""
        alt="example"
        
      /></p>
<p>Here is an example of the app running, as you can see there are two ways we can toggle the theme. We
could use the button click, or change tabs.</p>
<p><em>Extra Task</em>: If you want some practice, currently this won&rsquo;t detect a swipe action to change tabs
look at how you can do this. An example of it working can be found <a href="https://gitlab.com/hmajid2301/stegappasaurus/blob/development/src/screens/Decoding.js">here</a>.</p>
<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://gitlab.com/hmajid2301/blog/-/tree/main/content/posts/2018-12-23-theme-your-expo-react-native-app-with-redux-and-react-navigation/source_code">Example source code</a></li>
<li><a href="https://reactnavigation.org/">React Navigation</a></li>
<li><a href="https://css-tricks.com/learning-react-redux/">Redux Animation</a></li>
<li><a href="http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#">Redux Diagram</a></li>
<li><a href="https://redux.js.org/">Redux</a></li>
<li>GIFs created with <a href="https://www.screentogif.com/">screentogif</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
