{"id":42,"date":"2024-12-18T07:54:30","date_gmt":"2024-12-18T07:54:30","guid":{"rendered":"https:\/\/fullstacknotes.netblocs.com\/?p=42"},"modified":"2024-12-18T09:55:24","modified_gmt":"2024-12-18T09:55:24","slug":"must-know-react-libraries-redux-saga","status":"publish","type":"post","link":"https:\/\/netblocs.com\/fullstacknotes\/must-know-react-libraries-redux-saga\/","title":{"rendered":"Best React Libraries: Redux-Saga"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"506\" src=\"https:\/\/fullstacknotes.netblocs.com\/wp-content\/uploads\/2024\/12\/react-js-egitimi.png\" alt=\"\" class=\"wp-image-100\" style=\"width:400px\" srcset=\"https:\/\/netblocs.com\/fullstacknotes\/wp-content\/uploads\/2024\/12\/react-js-egitimi.png 900w, https:\/\/netblocs.com\/fullstacknotes\/wp-content\/uploads\/2024\/12\/react-js-egitimi-300x169.png 300w, https:\/\/netblocs.com\/fullstacknotes\/wp-content\/uploads\/2024\/12\/react-js-egitimi-768x432.png 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Redux-Saga<\/h3>\n\n\n\n<p>Redux-Saga is a library written in JavaScript that facilitates state management and managing side effects in React applications. Here are some key points about what Redux-Saga does:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Key Features of Redux-Saga<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Side Effect Management<\/strong>: It manages side effects such as API calls, timeouts, and other asynchronous operations.<\/li>\n\n\n\n<li><strong>Clean and Testable Code<\/strong>: It makes the code written to manage side effects cleaner and more testable.<\/li>\n\n\n\n<li><strong>Asynchronous Operations<\/strong>: It manages asynchronous operations more easily with Redux actions.<\/li>\n\n\n\n<li><strong>Flexible Control<\/strong>: It provides greater control over capturing and processing actions.<\/li>\n\n\n\n<li><strong>Manageable Flows<\/strong>: It makes complex flows and business logic more manageable.<\/li>\n<\/ol>\n\n\n\n<p>Redux-Saga works using generator functions, providing developers with great flexibility in managing complex asynchronous workflows in their applications. For example, you can use Redux-Saga to send a specific action when making an API call, and then send different actions based on whether the call is successful or fails.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Redux-Saga Example<\/h3>\n\n\n\n<p>An application where a switch button sends the light status to the backend and updates the switch status when a positive response is received from the backend:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1. App.js<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { toggleLightRequest } from '.\/redux\/actions';\n\nfunction App() {\n  const dispatch = useDispatch();\n  const lightStatus = useSelector(state =&gt; state.lightStatus);\n  const loading = useSelector(state =&gt; state.loading);\n\n  const handleToggle = () =&gt; {\n    dispatch(toggleLightRequest(!lightStatus));\n  };\n\n  return (\n    &lt;div&gt;\n      &lt;h1&gt;Light Status: {lightStatus ? 'On' : 'Off'}&lt;\/h1&gt;\n      &lt;button onClick={handleToggle} disabled={loading}&gt;\n        {loading ? 'Updating...' : 'Change Status'}\n      &lt;\/button&gt;\n    &lt;\/div&gt;\n  );\n}\n\nexport default App;\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">React<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">useEffect<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;react&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">useDispatch<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">useSelector<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;react-redux&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">toggleLightRequest<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/redux\/actions&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">function<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">App<\/span><span style=\"color: #908CAA\">()<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">dispatch<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">useDispatch<\/span><span style=\"color: #E0DEF4\">()<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">lightStatus<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">useSelector<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">state<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">state<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">lightStatus<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">loading<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">useSelector<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">state<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">state<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">loading<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97; font-style: italic\">handleToggle<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">()<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #EA9A97\">dispatch<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #EA9A97\">toggleLightRequest<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #3E8FB0\">!<\/span><span style=\"color: #E0DEF4; font-style: italic\">lightStatus<\/span><span style=\"color: #E0DEF4\">))<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #6E6A86\">&lt;<\/span><span style=\"color: #9CCFD8\">div<\/span><span style=\"color: #6E6A86\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #6E6A86\">&lt;<\/span><span style=\"color: #9CCFD8\">h1<\/span><span style=\"color: #6E6A86\">&gt;<\/span><span style=\"color: #E0DEF4\">Light Status: <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">lightStatus<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">?<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;On&#39;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;Off&#39;<\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #6E6A86\">&lt;\/<\/span><span style=\"color: #9CCFD8\">h1<\/span><span style=\"color: #6E6A86\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #6E6A86\">&lt;<\/span><span style=\"color: #9CCFD8\">button<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">onClick<\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">handleToggle<\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">disabled<\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">loading<\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #6E6A86\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">        <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">loading<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">?<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;Updating...&#39;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;Change Status&#39;<\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #6E6A86\">&lt;\/<\/span><span style=\"color: #9CCFD8\">button<\/span><span style=\"color: #6E6A86\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #6E6A86\">&lt;\/<\/span><span style=\"color: #9CCFD8\">div<\/span><span style=\"color: #6E6A86\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  )<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export default <\/span><span style=\"color: #E0DEF4; font-style: italic\">App<\/span><span style=\"color: #908CAA\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2. redux\/actions.js<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"export const TOGGLE_LIGHT_REQUEST = 'TOGGLE_LIGHT_REQUEST';\nexport const TOGGLE_LIGHT_SUCCESS = 'TOGGLE_LIGHT_SUCCESS';\nexport const TOGGLE_LIGHT_FAILURE = 'TOGGLE_LIGHT_FAILURE';\n\nexport const toggleLightRequest = (status) =&gt; ({\n  type: TOGGLE_LIGHT_REQUEST,\n  payload: status,\n});\n\nexport const toggleLightSuccess = (status) =&gt; ({\n  type: TOGGLE_LIGHT_SUCCESS,\n  payload: status,\n});\n\nexport const toggleLightFailure = () =&gt; ({\n  type: TOGGLE_LIGHT_FAILURE,\n});\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_REQUEST<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;TOGGLE_LIGHT_REQUEST&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_SUCCESS<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;TOGGLE_LIGHT_SUCCESS&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_FAILURE<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;TOGGLE_LIGHT_FAILURE&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97; font-style: italic\">toggleLightRequest<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">status<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> (<\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  type<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_REQUEST<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  payload<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">status<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97; font-style: italic\">toggleLightSuccess<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">status<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> (<\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  type<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_SUCCESS<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  payload<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">status<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97; font-style: italic\">toggleLightFailure<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">()<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> (<\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  type<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_FAILURE<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3. redux\/reducer.js<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { TOGGLE_LIGHT_SUCCESS, TOGGLE_LIGHT_FAILURE, TOGGLE_LIGHT_REQUEST } from '.\/actions';\n\nconst initialState = {\n  lightStatus: false,\n  loading: false,\n  error: null,\n};\n\nexport const lightReducer = (state = initialState, action) =&gt; {\n  switch (action.type) {\n    case TOGGLE_LIGHT_REQUEST:\n      return { ...state, loading: true };\n    case TOGGLE_LIGHT_SUCCESS:\n      return { ...state, lightStatus: action.payload, loading: false };\n    case TOGGLE_LIGHT_FAILURE:\n      return { ...state, loading: false, error: 'Could not update light status.' };\n    default:\n      return state;\n  }\n};\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_SUCCESS<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_FAILURE<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_REQUEST<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/actions&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">initialState<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  lightStatus<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">false<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  loading<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">false<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  error<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">null<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97; font-style: italic\">lightReducer<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">state<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">initialState<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">action<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">switch<\/span><span style=\"color: #E0DEF4\"> (<\/span><span style=\"color: #E0DEF4; font-style: italic\">action<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">type<\/span><span style=\"color: #E0DEF4\">) <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">case<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_REQUEST<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">...<\/span><span style=\"color: #E0DEF4; font-style: italic\">state<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> loading<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">true<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">case<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_SUCCESS<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">...<\/span><span style=\"color: #E0DEF4; font-style: italic\">state<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> lightStatus<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">action<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">payload<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> loading<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">false<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">case<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_FAILURE<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">...<\/span><span style=\"color: #E0DEF4; font-style: italic\">state<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> loading<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">false<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> error<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;Could not update light status.&#39;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">default<\/span><span style=\"color: #908CAA\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">state<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4. redux\/sagas.js<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { takeLatest, call, put } from 'redux-saga\/effects';\nimport { TOGGLE_LIGHT_REQUEST, toggleLightSuccess, toggleLightFailure } from '.\/actions';\n\nfunction* toggleLightSaga(action) {\n  try {\n    const response = yield call(apiToggleLight, action.payload); \/\/ Send request to the backend\n    if (response.ok) {\n      yield put(toggleLightSuccess(action.payload)); \/\/ Update status if successful\n    } else {\n      yield put(toggleLightFailure());\n    }\n  } catch (error) {\n    yield put(toggleLightFailure());\n  }\n}\n\nfunction apiToggleLight(status) {\n  return fetch('\/api\/toggle-light', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application\/json',\n    },\n    body: JSON.stringify({ status }),\n  });\n}\n\nexport default function* rootSaga() {\n  yield takeLatest(TOGGLE_LIGHT_REQUEST, toggleLightSaga);\n}\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">takeLatest<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">call<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">put<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;redux-saga\/effects&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_REQUEST<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">toggleLightSuccess<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">toggleLightFailure<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/actions&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">function*<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">toggleLightSaga<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">action<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">try<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">response<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">yield<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">call<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #E0DEF4; font-style: italic\">apiToggleLight<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">action<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">payload<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA; font-style: italic\">\/\/<\/span><span style=\"color: #6E6A86; font-style: italic\"> Send request to the backend<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">if<\/span><span style=\"color: #E0DEF4\"> (<\/span><span style=\"color: #E0DEF4; font-style: italic\">response<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">ok<\/span><span style=\"color: #E0DEF4\">) <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #3E8FB0\">yield<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">put<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #EA9A97\">toggleLightSuccess<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #E0DEF4; font-style: italic\">action<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">payload<\/span><span style=\"color: #E0DEF4\">))<\/span><span style=\"color: #908CAA\">;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA; font-style: italic\">\/\/<\/span><span style=\"color: #6E6A86; font-style: italic\"> Update status if successful<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">else<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #3E8FB0\">yield<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">put<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #EA9A97\">toggleLightFailure<\/span><span style=\"color: #E0DEF4\">())<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">catch<\/span><span style=\"color: #E0DEF4\"> (<\/span><span style=\"color: #E0DEF4; font-style: italic\">error<\/span><span style=\"color: #E0DEF4\">) <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #3E8FB0\">yield<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">put<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #EA9A97\">toggleLightFailure<\/span><span style=\"color: #E0DEF4\">())<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">function<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">apiToggleLight<\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">status<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">return<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">fetch<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #F6C177\">&#39;\/api\/toggle-light&#39;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    method<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;POST&#39;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    headers<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">      <\/span><span style=\"color: #F6C177\">&#39;Content-Type&#39;<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #F6C177\">&#39;application\/json&#39;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #908CAA\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    body<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">JSON<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #EA9A97\">stringify<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">status<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export default function* <\/span><span style=\"color: #EA9A97\">rootSaga<\/span><span style=\"color: #908CAA\">()<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">  yield <\/span><span style=\"color: #EA9A97\">takeLatest<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #E0DEF4; font-style: italic\">TOGGLE_LIGHT_REQUEST<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">toggleLightSaga<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5. redux\/store.js<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { createStore, applyMiddleware } from 'redux';\nimport createSagaMiddleware from 'redux-saga';\nimport { lightReducer } from '.\/reducer';\nimport rootSaga from '.\/sagas';\n\nconst sagaMiddleware = createSagaMiddleware();\nconst store = createStore(lightReducer, applyMiddleware(sagaMiddleware));\n\nsagaMiddleware.run(rootSaga);\n\nexport default store;\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">createStore<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">applyMiddleware<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;redux&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">createSagaMiddleware<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;redux-saga&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">lightReducer<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/reducer&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">rootSaga<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/sagas&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">sagaMiddleware<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">createSagaMiddleware<\/span><span style=\"color: #E0DEF4\">()<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">store<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">createStore<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #E0DEF4; font-style: italic\">lightReducer<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">applyMiddleware<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #E0DEF4; font-style: italic\">sagaMiddleware<\/span><span style=\"color: #E0DEF4\">))<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4; font-style: italic\">sagaMiddleware<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #EA9A97\">run<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #E0DEF4; font-style: italic\">rootSaga<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">export default <\/span><span style=\"color: #E0DEF4; font-style: italic\">store<\/span><span style=\"color: #908CAA\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6. index.js<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport App from '.\/App';\nimport store from '.\/redux\/store';\n\nReactDOM.render(\n  &lt;Provider store={store}&gt;\n    &lt;App \/&gt;\n  &lt;\/Provider&gt;,\n  document.getElementById('root')\n);\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">React<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;react&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">ReactDOM<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;react-dom&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">Provider<\/span><span style=\"color: #3E8FB0\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;react-redux&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">App<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/App&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #3E8FB0\">import <\/span><span style=\"color: #E0DEF4; font-style: italic\">store<\/span><span style=\"color: #3E8FB0\"> from <\/span><span style=\"color: #F6C177\">&#39;.\/redux\/store&#39;<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4; font-style: italic\">ReactDOM<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #EA9A97\">render<\/span><span style=\"color: #E0DEF4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #6E6A86\">&lt;<\/span><span style=\"color: #9CCFD8\">Provider<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">store<\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4; font-style: italic\">store<\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #6E6A86\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">    <\/span><span style=\"color: #6E6A86\">&lt;<\/span><span style=\"color: #9CCFD8\">App<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #6E6A86\">\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #6E6A86\">&lt;\/<\/span><span style=\"color: #9CCFD8\">Provider<\/span><span style=\"color: #6E6A86\">&gt;<\/span><span style=\"color: #908CAA\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #E0DEF4; font-style: italic\">document<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #EA9A97\">getElementById<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #F6C177\">&#39;root&#39;<\/span><span style=\"color: #E0DEF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Backend Example (\/api\/toggle-light)<\/h4>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#232136\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"app.post('\/api\/toggle-light', (req, res) =&gt; {\n  const { status } = req.body;\n  \/\/ Add backend logic here (e.g., save to database)\n  res.json({ success: true });\n});\" style=\"color:#e0def4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-moon\" style=\"background-color: #232136\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E0DEF4; font-style: italic\">app<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #EA9A97\">post<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #F6C177\">&#39;\/api\/toggle-light&#39;<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">(<\/span><span style=\"color: #C4A7E7; font-style: italic\">req<\/span><span style=\"color: #908CAA\">,<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #C4A7E7; font-style: italic\">res<\/span><span style=\"color: #908CAA\">)<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=&gt;<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #3E8FB0\">const<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">status<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #3E8FB0\">=<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #E0DEF4; font-style: italic\">req<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #E0DEF4; font-style: italic\">body<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">  <\/span><span style=\"color: #908CAA; font-style: italic\">\/\/<\/span><span style=\"color: #6E6A86; font-style: italic\"> Add backend logic here (e.g., save to database)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E0DEF4\">  <\/span><span style=\"color: #E0DEF4; font-style: italic\">res<\/span><span style=\"color: #3E8FB0\">.<\/span><span style=\"color: #EA9A97\">json<\/span><span style=\"color: #E0DEF4\">(<\/span><span style=\"color: #908CAA\">{<\/span><span style=\"color: #E0DEF4\"> success<\/span><span style=\"color: #908CAA\">:<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #EA9A97\">true<\/span><span style=\"color: #E0DEF4\"> <\/span><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #908CAA\">}<\/span><span style=\"color: #E0DEF4\">)<\/span><span style=\"color: #908CAA\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Information Flow<\/h3>\n\n\n\n<p>The information flow in this example occurs as follows:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>App.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>dispatch(toggleLightRequest(!lightStatus));<\/code> \u2192 When the button is pressed, the <code>TOGGLE_LIGHT_REQUEST<\/code> action in <code>actions.js<\/code> is dispatched.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>redux\/actions.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The <code>toggleLightRequest<\/code> function is called.<\/li>\n\n\n\n<li><code>return { type: TOGGLE_LIGHT_REQUEST, payload: status };<\/code> sends the new status to <code>lightReducer<\/code> in <code>redux\/reducer.js<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>redux\/reducer.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The <code>lightReducer<\/code> captures the <code>TOGGLE_LIGHT_REQUEST<\/code> action from <code>actions.js<\/code>.<\/li>\n\n\n\n<li>The <code>loading<\/code> status is updated to <code>true<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>redux\/sagas.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The <code>takeLatest(TOGGLE_LIGHT_REQUEST, toggleLightSaga)<\/code> captures the <code>TOGGLE_LIGHT_REQUEST<\/code> action from <code>actions.js<\/code>.<\/li>\n\n\n\n<li>The <code>toggleLightSaga<\/code> function runs.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>redux\/sagas.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>const response = yield call(apiToggleLight, action.payload);<\/code> \u2192 The <code>apiToggleLight<\/code> function is called to send a request to the backend.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Backend (\/api\/toggle-light)<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>app.post('\/api\/toggle-light', (req, res) =&gt; {...})<\/code> \u2192 The incoming request is processed, and the light status is saved.<\/li>\n\n\n\n<li><code>res.json({ success: true });<\/code> \u2192 A success response is returned.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>redux\/sagas.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>if (response.ok) { yield put(toggleLightSuccess(action.payload)); }<\/code> \u2192 When a successful response is received, the <code>TOGGLE_LIGHT_SUCCESS<\/code> action in <code>actions.js<\/code> is dispatched.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>redux\/reducer.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The <code>lightReducer<\/code> captures the <code>TOGGLE_LIGHT_SUCCESS<\/code> action from <code>actions.js<\/code>.<\/li>\n\n\n\n<li>The light status is updated, and the <code>loading<\/code> status is set to <code>false<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>App.js<\/strong>:\n<ul class=\"wp-block-list\">\n<li>When the Redux state is updated, the component re-renders.<\/li>\n\n\n\n<li>The light status and button status are updated (the text on the button changes).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Redux-Saga Redux-Saga is a library written in JavaScript that facilitates state management and managing side effects in React applications. Here are some key points about what Redux-Saga does: Key Features&hellip;<\/p>\n","protected":false},"author":1,"featured_media":44,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20,11,21],"tags":[15,14,19,22],"class_list":["post-42","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-libraries","category-react","category-react-libraries","tag-libraries","tag-react","tag-react-libraries","tag-redux"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/posts\/42","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/comments?post=42"}],"version-history":[{"count":4,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/posts\/42\/revisions"}],"predecessor-version":[{"id":105,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/posts\/42\/revisions\/105"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/media\/44"}],"wp:attachment":[{"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/media?parent=42"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/categories?post=42"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netblocs.com\/fullstacknotes\/wp-json\/wp\/v2\/tags?post=42"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}