<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>state management | Kate Gable</title>
	<atom:link href="https://www.katesky.com/tag/state-management/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.katesky.com</link>
	<description>sharing knowledge, encouraging to learn, promoting passion for coding, supporting mothers who code</description>
	<lastBuildDate>Tue, 20 Dec 2022 21:29:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
<site xmlns="com-wordpress:feed-additions:1">193364748</site>	<item>
		<title>Data polling with ngrx effect and how to unit test it</title>
		<link>https://www.katesky.com/2022/12/20/data-polling-with-ngrx-effect-and-how-to-unit-test-it/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=data-polling-with-ngrx-effect-and-how-to-unit-test-it</link>
		
		<dc:creator><![CDATA[Katerina Gable]]></dc:creator>
		<pubDate>Tue, 20 Dec 2022 18:30:11 +0000</pubDate>
				<category><![CDATA[angular]]></category>
		<category><![CDATA[effects]]></category>
		<category><![CDATA[kate sky]]></category>
		<category><![CDATA[ngrx]]></category>
		<category><![CDATA[state management]]></category>
		<category><![CDATA[TestScheduler]]></category>
		<category><![CDATA[unit tests]]></category>
		<guid isPermaLink="false">https://www.katesky.com/?p=260</guid>

					<description><![CDATA[<p>I just finished implementing data polling using ngrx effects. For those unfamiliar with ngrx, it is a popular library for implementing the Redux pattern in Angular applications. To implement data polling with ngrx effects, you can create an effect that listens for <br /><a href="https://www.katesky.com/2022/12/20/data-polling-with-ngrx-effect-and-how-to-unit-test-it/" class="more-link">Read More</a></p>
The post <a href="https://www.katesky.com/2022/12/20/data-polling-with-ngrx-effect-and-how-to-unit-test-it/">Data polling with ngrx effect and how to unit test it</a> first appeared on <a href="https://www.katesky.com">Kate Gable</a>.]]></description>
										<content:encoded><![CDATA[<body>
<p>I just finished implementing data polling using ngrx effects. For those unfamiliar with ngrx, it is a popular library for implementing the Redux pattern in Angular applications.</p>



<p>To implement data polling with ngrx effects, you can create an effect that listens for a specific action, such as a <code>POLL_DATA</code> action. When this action is dispatched, the effect can perform an HTTP request to retrieve the data from a remote server, and then dispatch a new action with the data.</p>



<p>You can use the <code>@Effect</code> decorator to create an effect that listens for specific actions. The <code>@Effect</code> decorator takes an options object as an argument, which allows you to specify the action that the effect should listen for and the effect’s behavior.</p>



<p>For example, you might create an effect that listens for the <code>POLL_DATA</code> action and performs an HTTP request to retrieve the data like this:</p>


<div class="wp-block-syntaxhighlighter-code code"><pre class="brush: jscript; highlight: [1]; title: ; notranslate">
@Injectable()
export class PollingEffects {
  pollData$: Observable&lt;Action&gt; = this.actions$.pipe(
    ofType(POLL_DATA),
    switchMap(() =&gt;
      this.http.get('/api/data').pipe(
        map((data) =&gt; ({ type: DATA_RECEIVED, payload: data })),
        catchError(() =&gt; of({ type: DATA_REQUEST_FAILED }))
      )
    )
  );
}


</pre></div>


<p>This effect listens for the <code>POLL_DATA</code> action and then performs an HTTP request using the <code>HttpClient</code> service. If the request is successful, it dispatches a <code>DATA_RECEIVED</code> action with the received data as the payload. If the request fails, it dispatches a <code>DATA_REQUEST_FAILED</code> action.</p>



<p>To ensure that the data is polled at regular intervals, you can use the <code>interval</code> operator from the RxJS library. You can modify the effect above to poll the data every 10 seconds like this:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
@Injectable()
export class PollingEffects {
  pollData$: Observable&lt;Action&gt; = this.actions$.pipe(
    ofType(POLL_DATA),
    switchMap(() =&gt; interval(10000)),
    switchMap(() =&gt;
      this.http.get('/api/data').pipe(
        map((data) =&gt; ({ type: DATA_RECEIVED, payload: data })),
        catchError(() =&gt; of({ type: DATA_REQUEST_FAILED }))
      )
    )
  );
}

</pre></div>


<p>In this modified version of the effect, the <code>interval</code> operator is used to emit a value every 10 seconds (10000 milliseconds). The effect then uses the <code>switchMap</code> operator to perform an HTTP request every time the interval emits a value.</p>



<p>To stop the data polling, you can simply dispatch a new action that the effect can listen for and respond to.</p>



<p>For example, you might create a <code>STOP_POLLING</code> action that the effect can listen for and use to stop polling the data. You can modify the effect above to stop polling when the <code>STOP_POLLING</code> action is dispatched like this:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
@Injectable()
export class PollingEffects {
  pollData$: Observable&lt;Action&gt; = this.actions$.pipe(
    ofType(POLL_DATA),
    switchMap(() =&gt;
      interval(10000).pipe(takeUntil(this.actions$.pipe(ofType(STOP_POLLING))))
    ),
    switchMap(() =&gt;
      this.http.get('/api/data').pipe(
        map((data) =&gt; ({ type: DATA_RECEIVED, payload: data })),
        catchError(() =&gt; of({ type: DATA_REQUEST_FAILED }))
      )
    )
  );
}
</pre></div>


<p>In this modified version of the effect, the <code>takeUntil</code> operator is used to stop the data polling when the <code>STOP_POLLING</code> action is dispatched. The <code>takeUntil</code> operator takes an observable as an argument and completes the source observable (in this case, the <code>interval</code> observable) when the argument observable emits a value.</p>



<p>To use this modified effect, you can dispatch the <code>POLL_DATA</code> action to start polling and the <code>STOP_POLLING</code> action to stop polling.</p>



<h4 class="wp-block-heading">To create a unit test for the data polling effect using the TestScheduler from the RxJS library, you can use the following steps: </h4>



<p>First you have to modify your effect to use asyncScheduler like this:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
@Injectable()
export class PollingEffects {
  pollData$: Observable&amp;lt;Action&gt; = this.actions$.pipe(
    ofType(POLL_DATA),
    switchMap(() =&gt;
      interval(10000, asyncScheduler).pipe(
        takeUntil(this.actions$.pipe(ofType(STOP_POLLING)))
      )
    ),
    switchMap(() =&gt;
      this.http.get('/api/data').pipe(
        map((data) =&gt; ({ type: DATA_RECEIVED, payload: data })),
        catchError(() =&gt; of({ type: DATA_REQUEST_FAILED }))
      )
    )
  );
}

</pre></div>


<p>In this modified version of the effect, the <code>interval</code> operator is called with the <code>asyncScheduler</code> as the second argument. This causes the interval to use the <code>asyncScheduler</code> to schedule its emissions.</p>



<p>The <code>asyncScheduler</code> is a scheduler that schedules work asynchronously, using the JavaScript <code>interval</code> function. This can be useful if you want to simulate a delay in the data polling effect, or if you want to ensure that the effect is run outside the Angular zone.</p>



<p>I hope this helps clarify how to use the <code>asyncScheduler</code> with the data polling effect. Next you will add your unit tests file and follow the steps:</p>



<ol class="has-small-font-size wp-block-list">
<li>Import the <code>TestScheduler</code> from the RxJS library. The <code>TestScheduler</code> is used to control the virtual time in the test;</li>



<li>Create an instance of the <code>TestScheduler</code> and set up the test actions and expected results. To do this, you will need to define the actions that the effect should listen for and the expected results of the effect. </li>



<li>Set up the dependencies for the effect under test. This will typically include any services or dependencies that the effect uses, such as the <code>HttpClient</code> service. You can use mock implementations of these dependencies to control their behavior in the test.</li>



<li>Create an instance of the effect under test and pass in the dependencies.</li>



<li>Pass <code>TestScheduler</code> instance into the effect that is under test. This will execute the effect with a virtual timer.</li>
</ol>



<p>Here is an example of a unit test for the data polling effect using the TestScheduler:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
@Injectable()
export class PollingEffects {

    pollData$ = createEffect(() =&gt; ({ scheduler = asyncScheduler} = {}) =&gt;
    this.actions$.pipe(
      ofType(POLL_DATA),
      switchMap(() =&gt; interval(10000, asyncScheduler).pipe(
        takeUntil(this.actions$.pipe(ofType(STOP_POLLING)))
      )),
      switchMap(() =&gt; this.http.get('/api/data').pipe(
        map(data =&gt; ({ type: DATA_RECEIVED, payload: data })),
        catchError(() =&gt; of({ type: DATA_REQUEST_FAILED }))
      ))
    )
  );

}

</pre></div>


<p>To use the <code>createEffect</code> function from the ngrx library with the data polling effect, you can modify the effect like this:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">

</pre></div>


<p>The <code>createEffect</code> function takes a function that returns an observable as an argument, and returns an observable of actions. The function that is passed to <code>createEffect</code> should contain the logic for the effect.</p>



<p>In this modified version of the effect, the <code>createEffect</code> function is used to wrap the logic for the effect in a way that is compatible with the ngrx store. The effect listens for the <code>POLL_DATA</code> action and performs an HTTP request to retrieve the data every 10 seconds (10000 milliseconds) using asyncScheduler.  If the request is successful, it dispatches a <code>DATA_RECEIVED</code> action with the received data as the payload. If the request fails, it dispatches a <code>DATA_REQUEST_FAILED</code> action.</p>



<p>I hope this helps clarify how to use the <code>createEffect</code> function with the data polling effect. </p>



<p></p>



<p>Using ngrx effects to implement data polling is a straightforward process. Essentially, you can create an effect that listens for a specific action, such as a <code>POLL_DATA</code> action, and performs an HTTP request to retrieve data from a remote server. The effect can then dispatch a new action, such as a <code>DATA_RECEIVED</code> action, with the received data as the payload.</p>



<p>To stop the data polling, you can simply dispatch a new action, such as a <code>STOP_POLLING</code> action, that the effect can listen for and use to stop the data polling process.</p>



<p>Unit testing this effect is a bit tricky but you got it!</p>



<p>Hope all the code examples help you!</p>



<p>Hope you enjoyed this article.</p>



<p></p>



<p></p>



<pre class="wp-block-preformatted"></pre>
</body>The post <a href="https://www.katesky.com/2022/12/20/data-polling-with-ngrx-effect-and-how-to-unit-test-it/">Data polling with ngrx effect and how to unit test it</a> first appeared on <a href="https://www.katesky.com">Kate Gable</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">260</post-id>	</item>
		<item>
		<title>Enterprise Application Journey</title>
		<link>https://www.katesky.com/2020/04/21/enterprise-application-journey/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=enterprise-application-journey</link>
		
		<dc:creator><![CDATA[Katerina Gable]]></dc:creator>
		<pubDate>Tue, 21 Apr 2020 20:42:59 +0000</pubDate>
				<category><![CDATA[angular]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Monorepo]]></category>
		<category><![CDATA[Enterprise Application]]></category>
		<category><![CDATA[full-stack]]></category>
		<category><![CDATA[kate sky]]></category>
		<category><![CDATA[ngrx]]></category>
		<category><![CDATA[state management]]></category>
		<guid isPermaLink="false">https://www.katesky.com/?p=137</guid>

					<description><![CDATA[<p>Angular: front-end from start to MVP by Kate Sky I am making this post as the first step in documenting my journey of building an Enterprise application for my side project. The application is in the process of going towards an MVP. This <br /><a href="https://www.katesky.com/2020/04/21/enterprise-application-journey/" class="more-link">Read More</a></p>
The post <a href="https://www.katesky.com/2020/04/21/enterprise-application-journey/">Enterprise Application Journey</a> first appeared on <a href="https://www.katesky.com">Kate Gable</a>.]]></description>
										<content:encoded><![CDATA[<body>
<h3 class="wp-block-heading">Angular: front-end from start to MVP</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>by Kate Sky</p></blockquote>



<p>I am making this post as the first step in documenting my journey of building an Enterprise application for my side project.</p>



<p>The application is in the process of going towards an MVP.</p>



<p>This application is an “Uber for home services.” </p>



<p>The reason I had started this project: is to provide a value-based service while practicing and teaching others skills I had acquired over the years.</p>



<p>The objective of this post is to establish a timeline of the application going live from its infancy.</p>



<hr class="wp-block-separator">



<p>Following is the list of topics that we are going to discuss in this article:</p>



<ol class="wp-block-list"><li>Application Stack</li><li>Architectural decisions<ol style="user-select: auto;"><li>Monorepo with Nx</li><li>Domain-Driven Design with Angular</li><li>State management with NGRX </li><li>Logging with LogRocket</li><li>Authentication with Auth0</li></ol></li><li>Conclusion</li><li>Links</li></ol>



<hr class="wp-block-separator">



<h4 class="wp-block-heading">1. Application Stack</h4>



<p>WEB- Angular<br>API – .Net Core<br>DB – SQL server</p>



<hr class="wp-block-separator">



<h4 class="wp-block-heading">2. Architectural decisions</h4>



<p>For web client, I am using Angular framework.</p>



<p>My goal – to be able to scale the development of this application by having the ability to go from one team to many teams building multiple frontend and backend applications all in the same workspace. </p>



<p>I chose <a target="_blank" href="https://nx.dev/angular" rel="noreferrer noopener">NX</a>, so developers have a holistic dev experience powered by an advanced CLI (with editor plugins), capabilities for controlled code sharing, and consistent code generation.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" decoding="async" width="446" height="664" src="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/1.png?resize=446%2C664&#038;ssl=1" alt="" class="wp-image-139" loading="lazy" srcset="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/1.png?w=446&amp;ssl=1 446w, https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/1.png?resize=202%2C300&amp;ssl=1 202w" sizes="auto, (max-width: 446px) 100vw, 446px" /></figure></div>



<hr class="wp-block-separator">



<p>Monorepos allow huge enterprise applications to be subdivided into small and maintainable libraries. I followed the best practice from the creators of NX and have added a <a rel="noreferrer noopener" style="user-select: auto;" target="_blank" href="https://www.npmjs.com/package/@angular-architects/ddd">domain-driven</a> design approach to creating the features. One of the features is the search capability for the providers that are displayed. I added a domain ‘Providers’ it contains the feature store for state management and the infrastructure where service is implemented to call the API.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>We need to first define criteria for slicing our application into individual parts and we must establish rules for communication between them.</p><cite>referenced: <a href="https://www.angulararchitects.io/aktuelles/sustainable-angular-architectures-1/">https://www.angulararchitects.io/aktuelles/sustainable-angular-architectures-1/</a></cite></blockquote>



<p></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" decoding="async" width="463" height="379" src="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/2.png?resize=463%2C379&#038;ssl=1" alt="" class="wp-image-140" loading="lazy" srcset="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/2.png?w=463&amp;ssl=1 463w, https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/2.png?resize=300%2C246&amp;ssl=1 300w" sizes="auto, (max-width: 463px) 100vw, 463px" /></figure></div>



<hr class="wp-block-separator">



<p>I have added <a rel="noreferrer noopener" style="user-select: auto;" target="_blank" href="https://ngrx.io/">NGRX </a>from the very beginning because I would like to have an ability to replay the user’s trip through the application, and I will be adding <a rel="noreferrer noopener" style="user-select: auto;" target="_blank" href="https://logrocket.com/">LogRocket </a>to view that path. NGRX will also help me write clean reactive components with async pipes. Root store has its own module and is at the root of the application. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Stop guessing why bugs happen. LogRocket lets you replay what users do on your site, helping you reproduce bugs and fix issues faster.</p><cite><a href="https://logrocket.com/">https://logrocket.com/</a></cite></blockquote>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" decoding="async" width="467" height="482" src="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/3-2.png?resize=467%2C482&#038;ssl=1" alt="" class="wp-image-143" loading="lazy" srcset="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/3-2.png?w=467&amp;ssl=1 467w, https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/3-2.png?resize=291%2C300&amp;ssl=1 291w" sizes="auto, (max-width: 467px) 100vw, 467px" /></figure></div>



<hr class="wp-block-separator">



<p>Since we have 2 features now, we can see that NGRX stores for each feature are located near the domain for each feature’s library. There is separate module for each store to be able to import each feature module lazily.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" decoding="async" width="498" height="575" src="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/4.png?resize=498%2C575&#038;ssl=1" alt="" class="wp-image-144" loading="lazy" srcset="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/4.png?w=498&amp;ssl=1 498w, https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/4.png?resize=260%2C300&amp;ssl=1 260w" sizes="auto, (max-width: 498px) 100vw, 498px" /></figure></div>



<hr class="wp-block-separator">



<p>Users have to register, and for authentication, I picked <a rel="noreferrer noopener" style="user-select: auto;" target="_blank" href="https://auth0.com/">Auth0</a>. Right now, you can see that authentication is on the root store. I have a login and logout actions that are calling the service to execute the correct code. I am using the service I download from the example provided by auth0. It still needs to be cleaned up. </p>



<p>I added a component for the callback path need for the login of the authentication. There is a CanActivate guard that is used for components that need an authorized user.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" decoding="async" width="506" height="454" src="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/5.png?resize=506%2C454&#038;ssl=1" alt="" class="wp-image-145" loading="lazy" srcset="https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/5.png?w=506&amp;ssl=1 506w, https://i0.wp.com/www.katesky.com/wp-content/uploads/2020/04/5.png?resize=300%2C269&amp;ssl=1 300w" sizes="auto, (max-width: 506px) 100vw, 506px" /></figure></div>



<hr class="wp-block-separator">



<h4 class="wp-block-heading">3 . Conclusion</h4>



<p>In conclusion, we will go through whats next.</p>



<p>I wanted to get the frontend started first and have a clear user experience throughout the application.</p>



<p>I will add the .net Core API to store the data to the database next. </p>



<p>I deployed code to GitHub pages to be able to get user feedback at the very early stages of this application.</p>



<hr class="wp-block-separator">



<h4 class="wp-block-heading">4. Links</h4>



<p>Code: <a style="user-select: auto;" href="https://github.com/katesky/saraphan-radio">https://github.com/katesky/saraphan-radio</a></p>



<p>Dev version: <a href="https://katesky.github.io/saraphan-radio/">https://katesky.github.io/saraphan-radio/</a></p>



<p>Domain: <a href="http://sarafanradio.com/">http://saraphanradio.com</a></p>



<p></p>



<p></p>
</body>The post <a href="https://www.katesky.com/2020/04/21/enterprise-application-journey/">Enterprise Application Journey</a> first appeared on <a href="https://www.katesky.com">Kate Gable</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">137</post-id>	</item>
	</channel>
</rss>
