<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ivan Jeremic</title>
    <description>The latest articles on DEV Community by Ivan Jeremic (@ivanjrmc).</description>
    <link>https://dev.to/ivanjrmc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F120761%2F3d23b3f1-236f-48aa-ac51-595666ef6ea0.jpg</url>
      <title>DEV Community: Ivan Jeremic</title>
      <link>https://dev.to/ivanjrmc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ivanjrmc"/>
    <language>en</language>
    <item>
      <title>The Web Should Become a VM</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Sun, 24 May 2026 14:57:00 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/the-web-should-become-a-vm-10k8</link>
      <guid>https://dev.to/ivanjrmc/the-web-should-become-a-vm-10k8</guid>
      <description>&lt;p&gt;I increasingly feel that browsers are carrying too much historical baggage.&lt;/p&gt;

&lt;p&gt;Today every browser ships gigantic subsystems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a JavaScript engine&lt;/li&gt;
&lt;li&gt;an HTML parser&lt;/li&gt;
&lt;li&gt;a CSS engine&lt;/li&gt;
&lt;li&gt;a DOM engine&lt;/li&gt;
&lt;li&gt;a rendering engine&lt;/li&gt;
&lt;li&gt;layout systems&lt;/li&gt;
&lt;li&gt;style systems&lt;/li&gt;
&lt;li&gt;compatibility layers for decades of legacy behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern browser engines are among the most complicated software projects humanity has ever built.&lt;/p&gt;

&lt;p&gt;And yet when I look at where the web is actually going, I see something different emerging.&lt;/p&gt;

&lt;p&gt;I think the future web should become a universal VM.&lt;/p&gt;

&lt;p&gt;And WebAssembly should become its true target.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Browser as an Operating System
&lt;/h2&gt;

&lt;p&gt;Modern browsers already behave like operating systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sandboxing&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;process isolation&lt;/li&gt;
&lt;li&gt;scheduling&lt;/li&gt;
&lt;li&gt;GPU access&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;IPC&lt;/li&gt;
&lt;li&gt;security boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The browser is no longer just a “document viewer”.&lt;/p&gt;

&lt;p&gt;It is becoming a secure portable runtime platform.&lt;/p&gt;

&lt;p&gt;But the current stack is still deeply tied to the document-web era:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;DOM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those technologies made perfect sense when the web was mostly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;articles&lt;/li&gt;
&lt;li&gt;forms&lt;/li&gt;
&lt;li&gt;hyperlinked pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But increasingly the web is becoming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;applications&lt;/li&gt;
&lt;li&gt;IDEs&lt;/li&gt;
&lt;li&gt;games&lt;/li&gt;
&lt;li&gt;creative tools&lt;/li&gt;
&lt;li&gt;simulations&lt;/li&gt;
&lt;li&gt;operating environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web is evolving from “documents” into “software”.&lt;/p&gt;




&lt;h2&gt;
  
  
  WebAssembly Feels Like the Real Direction
&lt;/h2&gt;

&lt;p&gt;WebAssembly changes the philosophy completely.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interpreting scripts&lt;/li&gt;
&lt;li&gt;mutating giant DOM trees&lt;/li&gt;
&lt;li&gt;depending on browser-specific behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;applications become compiled software.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Language
   ↓
WebAssembly
   ↓
Universal Web VM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much cleaner.&lt;/p&gt;

&lt;p&gt;The browser no longer needs to understand every language ecosystem.&lt;/p&gt;

&lt;p&gt;It only needs to provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;li&gt;sandboxing&lt;/li&gt;
&lt;li&gt;graphics&lt;/li&gt;
&lt;li&gt;audio&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;scheduling&lt;/li&gt;
&lt;li&gt;host APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else becomes portable compiled applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  HTML/CSS/JS Become Legacy Mode
&lt;/h2&gt;

&lt;p&gt;I do not think the legacy web should disappear.&lt;/p&gt;

&lt;p&gt;Backwards compatibility matters.&lt;/p&gt;

&lt;p&gt;But I think the future browser architecture should invert priorities.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML/CSS/JS being the core platform&lt;/li&gt;
&lt;li&gt;Wasm being an addon&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;it should become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web VM as the core platform&lt;/li&gt;
&lt;li&gt;HTML/CSS/JS as compatibility mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine browsers shipping a tiny “legacy web subsystem”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a small JavaScript engine like QuickJS&lt;/li&gt;
&lt;li&gt;compact HTML/CSS parsers&lt;/li&gt;
&lt;li&gt;lightweight renderer&lt;/li&gt;
&lt;li&gt;compatibility layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not the giant endlessly-growing engines we have today.&lt;/p&gt;

&lt;p&gt;Small enough that they could realistically remain forever.&lt;/p&gt;

&lt;p&gt;The old web keeps working indefinitely.&lt;/p&gt;

&lt;p&gt;But modern software targets the VM directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Web VM
&lt;/h2&gt;

&lt;p&gt;What I imagine is something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Web VM
├── Wasm runtime
├── GPU API
├── Audio API
├── Windowing/UI APIs
├── Networking
├── Filesystem/storage
├── Sandboxing
└── Legacy web subsystem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applications compile into this environment.&lt;/p&gt;

&lt;p&gt;Not into JavaScript.&lt;/p&gt;

&lt;p&gt;Not into HTML trees.&lt;/p&gt;

&lt;p&gt;Into the VM itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  A More Powerful WebAssembly
&lt;/h2&gt;

&lt;p&gt;Current WebAssembly is still heavily influenced by C and Rust assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;static typing&lt;/li&gt;
&lt;li&gt;low-level memory&lt;/li&gt;
&lt;li&gt;structured execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I think Wasm will evolve.&lt;/p&gt;

&lt;p&gt;And honestly, it already is evolving.&lt;/p&gt;

&lt;p&gt;Features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GC&lt;/li&gt;
&lt;li&gt;reference types&lt;/li&gt;
&lt;li&gt;exception handling&lt;/li&gt;
&lt;li&gt;component models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are pushing Wasm toward something much more dynamic-language-friendly.&lt;/p&gt;

&lt;p&gt;I believe future Wasm runtimes could become excellent targets for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Lua&lt;/li&gt;
&lt;li&gt;Lisp&lt;/li&gt;
&lt;li&gt;functional languages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not through awkward transpilation.&lt;/p&gt;

&lt;p&gt;But through real compilation pipelines.&lt;/p&gt;




&lt;h2&gt;
  
  
  JavaScript Should Compile to the Web
&lt;/h2&gt;

&lt;p&gt;Ironically, I think JavaScript itself should eventually compile to WebAssembly.&lt;/p&gt;

&lt;p&gt;Not be the platform.&lt;/p&gt;

&lt;p&gt;Be a language targeting the platform.&lt;/p&gt;

&lt;p&gt;The same should be true for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Kotlin&lt;/li&gt;
&lt;li&gt;Swift&lt;/li&gt;
&lt;li&gt;Zig&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;anything else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web becomes language-neutral.&lt;/p&gt;

&lt;p&gt;That is the truly open future.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Browser Should Disappear Into the Operating System
&lt;/h2&gt;

&lt;p&gt;I also think the current separation between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;operating systems&lt;/li&gt;
&lt;li&gt;browsers&lt;/li&gt;
&lt;li&gt;app stores&lt;/li&gt;
&lt;li&gt;web apps&lt;/li&gt;
&lt;li&gt;native apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;feels increasingly artificial.&lt;/p&gt;

&lt;p&gt;The web has become too fundamental to live inside a single application called “the browser”.&lt;/p&gt;

&lt;p&gt;Right now we have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS taskbars&lt;/li&gt;
&lt;li&gt;browser tabs&lt;/li&gt;
&lt;li&gt;desktop apps&lt;/li&gt;
&lt;li&gt;browser apps&lt;/li&gt;
&lt;li&gt;app stores&lt;/li&gt;
&lt;li&gt;websites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything exists in separate worlds.&lt;/p&gt;

&lt;p&gt;It feels fragmented.&lt;/p&gt;

&lt;p&gt;You open a browser.&lt;br&gt;
Then inside the browser you open tabs.&lt;br&gt;
Inside those tabs you run applications.&lt;br&gt;
But the operating system itself already has concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;windows&lt;/li&gt;
&lt;li&gt;applications&lt;/li&gt;
&lt;li&gt;task switching&lt;/li&gt;
&lt;li&gt;icons&lt;/li&gt;
&lt;li&gt;launchers&lt;/li&gt;
&lt;li&gt;search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The duplication feels wrong.&lt;/p&gt;


&lt;h2&gt;
  
  
  Tabs Were a Historical Artifact
&lt;/h2&gt;

&lt;p&gt;Browser tabs made sense when the web was mostly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pages&lt;/li&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;browsing sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But modern web applications are not really “pages” anymore.&lt;/p&gt;

&lt;p&gt;A web IDE.&lt;br&gt;
A game.&lt;br&gt;
A design tool.&lt;br&gt;
A music app.&lt;br&gt;
A messenger.&lt;/p&gt;

&lt;p&gt;These are applications.&lt;/p&gt;

&lt;p&gt;Treating them as temporary tabs inside another application increasingly feels outdated.&lt;/p&gt;

&lt;p&gt;The browser should stop being “an app containing apps”.&lt;/p&gt;

&lt;p&gt;The operating system itself should understand the web natively.&lt;/p&gt;


&lt;h2&gt;
  
  
  One Unified Application Model
&lt;/h2&gt;

&lt;p&gt;I imagine a future where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;native apps&lt;/li&gt;
&lt;li&gt;web apps&lt;/li&gt;
&lt;li&gt;local apps&lt;/li&gt;
&lt;li&gt;remote apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all coexist naturally.&lt;/p&gt;

&lt;p&gt;One taskbar.&lt;br&gt;
One app launcher.&lt;br&gt;
One search system.&lt;br&gt;
One desktop.&lt;/p&gt;

&lt;p&gt;No distinction.&lt;/p&gt;

&lt;p&gt;Web apps appear exactly like native applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pinnable&lt;/li&gt;
&lt;li&gt;movable&lt;/li&gt;
&lt;li&gt;searchable&lt;/li&gt;
&lt;li&gt;launchable&lt;/li&gt;
&lt;li&gt;multitaskable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And equally important:&lt;/p&gt;

&lt;p&gt;Native apps and web apps appear together in the same ecosystem.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Web Becomes the Universal App Store
&lt;/h2&gt;

&lt;p&gt;In this world, the web itself becomes the app store.&lt;/p&gt;

&lt;p&gt;Not controlled by one company.&lt;br&gt;
Not locked behind one platform.&lt;/p&gt;

&lt;p&gt;The operating system’s search bar becomes the universal entry point.&lt;/p&gt;

&lt;p&gt;You type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installed native apps&lt;/li&gt;
&lt;li&gt;pinned web apps&lt;/li&gt;
&lt;li&gt;local tools&lt;/li&gt;
&lt;li&gt;remote tools&lt;/li&gt;
&lt;li&gt;websites&lt;/li&gt;
&lt;li&gt;cloud applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all in one place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Search → everything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The distinction between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“opening a website”&lt;/li&gt;
&lt;li&gt;“launching an app”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;starts disappearing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Instant Applications
&lt;/h2&gt;

&lt;p&gt;One beautiful thing about the web is immediacy.&lt;/p&gt;

&lt;p&gt;You can open software instantly without installation friction.&lt;/p&gt;

&lt;p&gt;I think that should remain.&lt;/p&gt;

&lt;p&gt;Users should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;launch a web app instantly&lt;/li&gt;
&lt;li&gt;use it temporarily&lt;/li&gt;
&lt;li&gt;never install anything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if they use it often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pin it&lt;/li&gt;
&lt;li&gt;move it on the desktop&lt;/li&gt;
&lt;li&gt;integrate it into the OS&lt;/li&gt;
&lt;li&gt;let it behave like any native app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same application can fluidly exist as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a temporary session&lt;/li&gt;
&lt;li&gt;a pinned app&lt;/li&gt;
&lt;li&gt;a full integrated desktop experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without artificial boundaries.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Open Ecosystem
&lt;/h2&gt;

&lt;p&gt;Of course companies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.apple.com?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;will always build their own ecosystems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payment systems&lt;/li&gt;
&lt;li&gt;discovery systems&lt;/li&gt;
&lt;li&gt;curation layers&lt;/li&gt;
&lt;li&gt;branding&lt;/li&gt;
&lt;li&gt;UX styles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is fine.&lt;/p&gt;

&lt;p&gt;But I think the core platform itself should remain open.&lt;/p&gt;

&lt;p&gt;No company should fully own application distribution.&lt;/p&gt;

&lt;p&gt;The web is too important for that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Native and Web Stop Being Different Worlds
&lt;/h2&gt;

&lt;p&gt;Eventually I think the distinction between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;native software&lt;/li&gt;
&lt;li&gt;web software&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;should mostly disappear.&lt;/p&gt;

&lt;p&gt;Applications should simply target:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the operating system&lt;/li&gt;
&lt;li&gt;the universal web VM&lt;/li&gt;
&lt;li&gt;the shared runtime layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And users should not have to care how the application was built.&lt;/p&gt;

&lt;p&gt;Only that it works.&lt;/p&gt;

&lt;p&gt;Fast.&lt;br&gt;
Secure.&lt;br&gt;
Portable.&lt;br&gt;
Open.&lt;/p&gt;

&lt;p&gt;That feels like a much healthier future than:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;locked app stores&lt;/li&gt;
&lt;li&gt;isolated ecosystems&lt;/li&gt;
&lt;li&gt;giant browser silos&lt;/li&gt;
&lt;li&gt;duplicated runtime stacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A future where the web is not “inside” the operating system.&lt;/p&gt;

&lt;p&gt;The web becomes part of the operating system itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Open Web
&lt;/h2&gt;

&lt;p&gt;Today the web is “open” mostly through standardization of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that also hardcodes enormous complexity into every browser forever.&lt;/p&gt;

&lt;p&gt;I think the next stage of openness is different.&lt;/p&gt;

&lt;p&gt;The browser becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a secure universal VM&lt;/li&gt;
&lt;li&gt;a portable runtime&lt;/li&gt;
&lt;li&gt;a standardized execution environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And languages compete above it freely.&lt;/p&gt;

&lt;p&gt;That feels cleaner.&lt;br&gt;
More scalable.&lt;br&gt;
More future-proof.&lt;/p&gt;

&lt;p&gt;And honestly, more elegant.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Legacy Web Never Dies
&lt;/h2&gt;

&lt;p&gt;One important part of this vision:&lt;/p&gt;

&lt;p&gt;The old web still works.&lt;/p&gt;

&lt;p&gt;Forever.&lt;/p&gt;

&lt;p&gt;The browser still contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a tiny HTML engine&lt;/li&gt;
&lt;li&gt;a tiny CSS engine&lt;/li&gt;
&lt;li&gt;a tiny JS runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enough to preserve decades of content.&lt;/p&gt;

&lt;p&gt;But no longer the center of the platform.&lt;/p&gt;

&lt;p&gt;The center becomes the VM.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Web as Universal Compute Platform
&lt;/h2&gt;

&lt;p&gt;I think we are slowly heading toward a future where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browsers look more like operating systems&lt;/li&gt;
&lt;li&gt;applications look more like portable binaries&lt;/li&gt;
&lt;li&gt;Wasm becomes a universal target&lt;/li&gt;
&lt;li&gt;the web becomes language-agnostic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And eventually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“web app”&lt;/li&gt;
&lt;li&gt;“desktop app”&lt;/li&gt;
&lt;li&gt;“native app”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;may stop meaning fundamentally different things.&lt;/p&gt;

&lt;p&gt;At that point the web is no longer a document platform.&lt;/p&gt;

&lt;p&gt;It becomes the universal runtime and viewer for software, files, documents and digital experiences.&lt;/p&gt;

</description>
      <category>webassembly</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>future</category>
    </item>
    <item>
      <title>Boost your productivity by closing the VSCode Sidebar</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Wed, 15 Jun 2022 18:33:03 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/boost-your-productivity-by-closing-the-vscode-sidebar-35j8</link>
      <guid>https://dev.to/ivanjrmc/boost-your-productivity-by-closing-the-vscode-sidebar-35j8</guid>
      <description>&lt;p&gt;I was one of those Developer who felt weird closing the Sidebar in VSCode I always needed to see my files all the time for some reason even if this made no sense while working on a problem, but one day I decided to start closing it while working on a feature/problem and it was hard for me for a few days but after I got used to having a closed sidebar my productivity skyrocketed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I start?
&lt;/h2&gt;

&lt;p&gt;I find what I need to work on and open multiple tabs side by side when needed then I close the sidebar and start working.&lt;/p&gt;

&lt;p&gt;Another pro beside productivity was my eyes hurt way less and themes which where to noisy in colors for me and I couldn't use them are now no problem anymore and I enjoy them now.&lt;/p&gt;

&lt;p&gt;Hope this will help some devs out there.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Why Podcast Apps have no comment section?</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Sun, 27 Mar 2022 10:03:07 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/why-podcast-apps-have-no-comment-section-1595</link>
      <guid>https://dev.to/ivanjrmc/why-podcast-apps-have-no-comment-section-1595</guid>
      <description>&lt;p&gt;I find it weird that audio only podcast apps have no comment section like for example videos on youtube or vimeo, I find this a good idea to have a discussion under the podcast but it is weird to me that no App has this yet, I really think if nobody does this I will create my own App but I wanted to hear more opinions about it here on DEV, so what do you all think?&lt;/p&gt;

</description>
      <category>podcast</category>
    </item>
    <item>
      <title>Microsoft PowerToys is a must-have for Developers on Windows!</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Tue, 24 Aug 2021 09:40:00 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/microsoft-powertoys-is-a-must-have-for-developers-on-windows-3a6o</link>
      <guid>https://dev.to/ivanjrmc/microsoft-powertoys-is-a-must-have-for-developers-on-windows-3a6o</guid>
      <description>&lt;p&gt;As the Docs say "Microsoft PowerToys is a set of utilities for power users to tune and streamline their Windows 10 experience for greater productivity."&lt;/p&gt;

&lt;h1&gt;
  
  
  1.) Color Picker
&lt;/h1&gt;

&lt;p&gt;You are still using buggy Color pickers in form of a Browser Extension or similar? Well guess what Microsoft PowerToys comes with the most powerful color picker in the world, you can pick colors from anywhere browser/native and more, with a traditional browser extension you can't pick colors outside of the browser window but with this one you can even pick a color from an icon on your windows taskbar. After picking your color it provider you instantly all three major ways of using colors &lt;code&gt;HEX&lt;/code&gt; - &lt;code&gt;RGB&lt;/code&gt; - &lt;code&gt;HSL&lt;/code&gt; and a set of complimentary colors. &lt;br&gt;
You can simply open it by pressing: &lt;code&gt;SHIFT + WIN + C&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-colorpicker-editor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-colorpicker-editor.gif" title="pt-colorpicker-editor" alt="pt-colorpicker-editor" width="560" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  2.) File Explorer add-ons utility
&lt;/h1&gt;

&lt;p&gt;Enabling Preview Pane&lt;br&gt;
To enable, first ensure that "Enable SVG preview", "Enable SVG thumbnails", and "Enable Markdown preview" are all set to On in the PowerToys Settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-settings-fileexplorer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-settings-fileexplorer.png" title="powertoys-settings-fileexplorer" alt="powertoys-settings-fileexplorer" width="800" height="1030"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, open Windows File Explorer, select the View tab in the File Explorer ribbon, then select Preview Pane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-fileexplorer.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-fileexplorer.gif" title="powertoys-fileexplorer" alt="powertoys-fileexplorer" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3.) Image Resizer utility
&lt;/h1&gt;

&lt;p&gt;After installing PowerToys, right-click on one or more selected image files in File Explorer, and then select Resize pictures from the menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-resize-images.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-resize-images.gif" title="powertoys-resize-images" alt="powertoys-resize-images" width="599" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Drag and Drop
&lt;/h3&gt;

&lt;p&gt;Image Resizer also allows you to resize images by dragging and dropping your selected files with the right mouse button. This allows you to quickly save your resized pictures in another folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-resize-drag-drop.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-resize-drag-drop.gif" title="powertoys-resize-drag-drop" alt="powertoys-resize-drag-drop" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Settings
&lt;/h3&gt;

&lt;p&gt;Inside the PowerToys Image Resizer tab, you can configure the following settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-imageresize-settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-imageresize-settings.png" title="powertoys-imageresize-settings" alt="powertoys-imageresize-settings" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4.) Awake utility
&lt;/h1&gt;

&lt;p&gt;Awake is a utility tool for Windows designed to keep a computer awake without having to manage its power &amp;amp; sleep settings. This behavior can be helpful when running time-consuming tasks, ensuring that the computer does not go to sleep or turn off its screens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-awake-settings-menu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-awake-settings-menu.png" title="pt-awake-settings-menu" alt="pt-awake-settings-menu" width="799" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following Awake states can be selected:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Off (Passive) - The computer awakeness state is unaffected. The application is waiting for user input.&lt;/li&gt;
&lt;li&gt;Keep awake indefinitely - The computer stays awake indefinitely, until the user explicitly puts the machine to sleep or exits/disables the application.&lt;/li&gt;
&lt;li&gt;Keep awake temporarily - Keep machine awake for a pre-defined limited time. Once the time elapses, computer resumes its previous awakeness state.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  5.) FancyZones utility
&lt;/h1&gt;

&lt;p&gt;FancyZones is a window manager utility for arranging and snapping windows into efficient layouts to improve the speed of your workflow and restore layouts quickly. FancyZones allows the user to define a set of window locations for a desktop that are drag targets for windows. When the user drags a window into a zone, the window is resized and repositioned to fill that zone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancy-zones2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancy-zones2.png" title="pt-fancy-zones2" alt="pt-fancy-zones2" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose your layout (Layout Editor)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-picker.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-picker.png" title="pt-fancy-zones2" alt="pt-fancy-zones2" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If multiple displays are in use, the editor will detect the available monitors and display them for the user to choose between. The chosen monitor will then be the target of the selected layout.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-multimon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-multimon.png" title="pt-fancy-zones2" alt="pt-fancy-zones2" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Space around zones
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-spacearound.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-spacearound.png" title="pt-fancy-zones2" alt="pt-fancy-zones2" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a custom layout
&lt;/h3&gt;

&lt;p&gt;The zones editor also supports creating and saving custom layouts. Select the + Create new layout button at the bottom-right.&lt;/p&gt;

&lt;p&gt;There are two ways to create custom zone layouts: Grid layout and Canvas layout. These can also be thought of as subtractive and additive models.&lt;/p&gt;

&lt;p&gt;The subtractive Grid model starts with a three column grid and allows zones to be created by splitting and merging zones, resizing the gutter between zones as desired.&lt;/p&gt;

&lt;p&gt;To merge two zones, select and hold the left mouse button and drag the mouse until a second zone is selected, then release the button and a popup menu will show up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-grideditor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-grideditor.png" title="pt-fancy-zones2" alt="pt-fancy-zones2" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The additive Canvas model starts with a blank layout and supports adding zones that can be dragged and resized similar to windows.&lt;/p&gt;

&lt;p&gt;Canvas layout also has keyboard support for zone editing. Use the Arrows keys to move a zone by 10 pixels, or &lt;code&gt;Ctrl + Arrows&lt;/code&gt; to move a zone by 1 pixel. Use the &lt;code&gt;Shift + Arrows&lt;/code&gt; keys to resize a zone by 10 pixels (5 per edge), or &lt;code&gt;Ctrl + Shift + Arrows&lt;/code&gt; to resize a zone by 2 pixels (1 per edge). To switch between the editor and dialog, press the &lt;code&gt;Ctrl + Tab&lt;/code&gt; keys.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-canvaseditor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-canvaseditor.png" title="pt-fancy-zones2" alt="pt-fancy-zones2" width="799" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quickly changing between layouts
&lt;/h3&gt;

&lt;p&gt;With a custom layout, this layout can be configured to a user-defined hotkey to quickly apply it to the desired desktop. The hotkey can be set by opening the custom layout's edit menu. Once set, the custom layout can be applied by pressing the &lt;code&gt;Win ⊞ + Ctrl + Alt + [hotkey]&lt;/code&gt; binding. The layout can also be applied by pressing the hotkey when dragging a window.&lt;/p&gt;

&lt;p&gt;In the demo below, we start with a default template applied to the screen and 2 custom layouts that we assign hotkeys for. We then use the &lt;code&gt;Win ⊞ + Ctrl + Alt + [hotkey]&lt;/code&gt; binding to apply the first custom layout and bind a window to it. Finally, we apply the second custom layout while dragging a window and bind the window to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-quickswap.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-fancyzones-quickswap.gif" title="pt-fancyzones-quickswap" alt="pt-fancyzones-quickswap" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  6.) Keyboard Manager utility
&lt;/h1&gt;

&lt;p&gt;The PowerToys Keyboard Manager enables you to redefine keys on your keyboard.&lt;/p&gt;

&lt;p&gt;For example, you can exchange the letter &lt;code&gt;A&lt;/code&gt; for the letter &lt;code&gt;D&lt;/code&gt; on your keyboard. When you select the &lt;code&gt;A&lt;/code&gt; key, a &lt;code&gt;D&lt;/code&gt; will display.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-keyboard-remap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowertoys-keyboard-remap.png" title="powertoys-keyboard-remap" alt="powertoys-keyboard-remap" width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  7.) PowerRename utility
&lt;/h1&gt;

&lt;p&gt;PowerRename is a bulk renaming tool that enables you to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Modify the file names of a large number of files (without renaming all of the files the same name).&lt;/li&gt;
&lt;li&gt;Perform a search and replace on a targeted section of file names.&lt;/li&gt;
&lt;li&gt;Perform a regular expression rename on multiple files.&lt;/li&gt;
&lt;li&gt;Check expected rename results in a preview window before finalizing a bulk rename.&lt;/li&gt;
&lt;li&gt;Undo a rename operation after it is completed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this demo, all instances of the file name "Pampalona" are replaced with "Pamplona". Since all of the files are uniquely named, this would have taken a long time to complete manually one-by-one. PowerRename enables a single bulk rename. Notice that the "Undo Rename" (Ctrl+Z) command enables the ability to undo the change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowerrename-demo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpowerrename-demo.gif" title="powerrename-demo" alt="powerrename-demo" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  8.) PowerToys Run utility
&lt;/h1&gt;

&lt;p&gt;PowerToys Run is a quick launcher for power users that contains some additional features without sacrificing performance. It is open source and modular for additional plugins.&lt;/p&gt;

&lt;p&gt;To use PowerToys Run, select &lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;Space&lt;/code&gt; and start typing!&lt;/p&gt;

&lt;p&gt;If that shortcut isn't what you like, don't worry, it is fully configurable in the settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-powerrun-demo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fimages%2Fpt-powerrun-demo.gif" title="pt-powerrun-demo" alt="pt-powerrun-demo" width="720" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  9.) Video Conference Mute (Preview)
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Important
&lt;/h4&gt;

&lt;p&gt;This is a preview feature and only included in the pre-release version of PowerToys. Running this pre-release requires Windows 10 version 1903 (build 18362) or later.&lt;/p&gt;

&lt;p&gt;Quickly mute your microphone (audio) and turn off your camera (video) while on a conference call with a single keystroke, regardless of what application has focus on your computer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;The default settings to use Video Conference Mute are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;⊞ Win&lt;/code&gt;+&lt;code&gt;N&lt;/code&gt; to toggle both Audio and Video at the same time&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⊞ Win&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;A&lt;/code&gt; to toggle microphone&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⊞ Win&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;O&lt;/code&gt; to toggle video&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When using the microphone and/or camera toggle shortcut keys, you will see a small toolbar window display letting you know whether the your Microphone and Camera are set to on, off, or not in use. You can set the position of this toolbar in the Video Conference Mute tab of PowerToys settings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Note
&lt;/h4&gt;

&lt;p&gt;Remember that you must have the pre-release/experimental version of PowerToys installed and running, with the Video Conference Mute feature enabled in PowerToys settings in order to use this utility.&lt;/p&gt;

&lt;h2&gt;
  
  
  This was a quick intro to Microsoft PowerToys
&lt;/h2&gt;

&lt;p&gt;It is developed on GitHub under Microsoft's official GitHub account &lt;a href="https://github.com/microsoft/PowerToys" rel="noopener noreferrer"&gt;https://github.com/microsoft/PowerToys&lt;/a&gt; the recommended way of downloading it is directly the &lt;code&gt;.exe&lt;/code&gt; from the GitHub releases page &lt;a href="https://github.com/microsoft/PowerToys/releases/download/v0.43.0/PowerToysSetup-0.43.0-x64.exe" rel="noopener noreferrer"&gt;https://github.com/microsoft/PowerToys/releases/download/v0.43.0/PowerToysSetup-0.43.0-x64.exe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;

</description>
      <category>powertoys</category>
      <category>developers</category>
      <category>programming</category>
      <category>utilities</category>
    </item>
    <item>
      <title>To use React Context for state correctly use it like recoil</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Tue, 20 Apr 2021 19:23:57 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/to-use-context-for-state-correctly-use-it-like-recoil-14pg</link>
      <guid>https://dev.to/ivanjrmc/to-use-context-for-state-correctly-use-it-like-recoil-14pg</guid>
      <description>&lt;p&gt;One of the biggest problems in managing state with Context is that react re-renders all the children if a value in the provider changes, So having multiple pieces of state that have nothing to do with one another will make your applications do unnecessary re-renders all the time and this is not manageable stop this!&lt;/p&gt;

&lt;p&gt;Imagine having a counter state and a modal state and both are provided to the App via the same Context, that means when you open/close the modal all components of the counter will rerender to.&lt;/p&gt;

&lt;p&gt;So how to solve this problem? For people who are familiar with Recoil js, they know that the so-called &lt;code&gt;atoms&lt;/code&gt; are only one piece of state and not a store for having all kinds of state in it, they hold really only one piece. So let's do the same in Context, we will create for each state of our application a separate Context file that will hold only one piece of state maximum, Our Provider will provide only the &lt;code&gt;state&lt;/code&gt; and the &lt;code&gt;setter&lt;/code&gt; for this one piece of state.&lt;/p&gt;

&lt;p&gt;Here an example with &lt;code&gt;counter&lt;/code&gt; &amp;amp; &lt;code&gt;modal&lt;/code&gt; state&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/contexts/CounterContext.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const CounterContext = createContext();

export function CounterContextProvider({ children }) {
  const [count, setCount] = useState(0);

  return (
    &amp;lt;CounterContext.Provider value={[count, setCount]}&amp;gt;
      {children}
    &amp;lt;/CounterContext.Provider&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the modal in a separate file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/contexts/ModalContext.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const ModalContext = createContext();

export function ModalContextProvider({ children }) {
  const [open, setOpen] = useState(false);

  return (
    &amp;lt;ModalContext.Provider value={[open, setOpen]}&amp;gt;
      {children}
    &amp;lt;/ModalContext.Provider&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I recommend using a folder "contexts" that holds all your state if you are used to "stores" look at you contexts folder as store :)&lt;/p&gt;

&lt;p&gt;Now you use the state where you need it as you develop, important here is never wrap the whole App in the providers, if a button in the Header component needs the counter state only wrap the parts one level above in the provider or even more cleaner create a wapper folder and create a wrapper for each component that needs state, this way only the parts re-render that need to change.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/wrappers/CounterButtonWrapper.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function CounterButton() {
  const [count, setCount] = useContext(CounterContext);

  const increment = () =&amp;gt; {
    setCount((prevState) =&amp;gt; {
      return prevState + 1
    })
  }

  return (
    &amp;lt;button onClick={increment}&amp;gt;Increment&amp;lt;/Button&amp;gt;
  );
}

// use this in your Header
export default function CounterButtonWrapper() {
  return (
   &amp;lt;CounterContext.Provider&amp;gt;
     &amp;lt;CounterButton /&amp;gt;
   &amp;lt;/CounterContext.Provider&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, it is more boilerplate than recoil but not everyone wants to use libraries and if you really want to manage client state with Context then this method with separate contexts for each piece of state and wrappers will scale and is the best way if you ask me.&lt;/p&gt;

</description>
      <category>react</category>
      <category>recoiljs</category>
      <category>recoil</category>
      <category>redux</category>
    </item>
    <item>
      <title>How CSS Media Queries should work in the Browser.</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Sun, 13 Dec 2020 00:28:27 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/how-css-media-queries-should-work-in-the-browser-2cmp</link>
      <guid>https://dev.to/ivanjrmc/how-css-media-queries-should-work-in-the-browser-2cmp</guid>
      <description>&lt;p&gt;This is how Media Queries currently work in the Browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.nav {
  background-color: #f40
}

@media screen and (max-width: 992px) {
 .nav {
    background-color: blue;
  }
}

@media screen and (max-width: 600px) {
  .nav {
    background-color: olive;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is how I think CSS Media Queries should work in CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  breakpoints: {
    sm: 30em,
    md: 48em,
    lg: 62em,
    xl: 80em,
  };
}

.nav {
  background-color: { sm: olive, md: olive, lg: blue, xl: blue };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No code duplication.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>prevState with useReducer hook in React.</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Sat, 19 Sep 2020 06:18:41 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/prevstate-with-usereducer-hook-in-react-4819</link>
      <guid>https://dev.to/ivanjrmc/prevstate-with-usereducer-hook-in-react-4819</guid>
      <description>&lt;p&gt;I wanted to share not only how I currently do State Management with React Context but also what I do when I need prevState, If there are any suggestions for improvement let me know.&lt;/p&gt;

&lt;p&gt;Hope this helps some of you :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* ******* */&lt;/span&gt;
&lt;span class="cm"&gt;/* Reducer */&lt;/span&gt;
&lt;span class="cm"&gt;/* ******* */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOGIN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StateContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DispatchContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PrevStateContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StateContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Context must be used within a Provider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DispatchContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Context must be used within a Provider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PrevStateContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Context must be used within a Provider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AppContextProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;usePrevious&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePrevious&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StateContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DispatchContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PrevStateContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PrevStateContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/DispatchContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/StateContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useAppContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;StateContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;StateContext&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;DispatchContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DispatchContext&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;PrevStateContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrevStateContext&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AppContextProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useAppContext&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>react</category>
      <category>usereducer</category>
      <category>hooks</category>
      <category>prevstate</category>
    </item>
    <item>
      <title>StateHub - Easy Context API for React JS</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Wed, 09 Sep 2020 19:31:31 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/statehub-easy-context-api-for-react-js-2jbn</link>
      <guid>https://dev.to/ivanjrmc/statehub-easy-context-api-for-react-js-2jbn</guid>
      <description>&lt;p&gt;Everything starts with creating a new StateHub with &lt;code&gt;createHub&lt;/code&gt;, this StateHub is everything you will ever need in your components, no other unnecessary imports!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createHub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;statehub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createHub&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Welcome to StateHub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHANGE_TITLE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is the changed StateHub title.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;LogSomething&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello Statehub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;AlertSomething&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;StateHub Alert!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now wrap your App with the Provider who comes with the DemoHub you created before.&lt;/p&gt;

&lt;p&gt;As you can see the API is very clean everything you ever &lt;code&gt;import&lt;/code&gt; is your created StateHub and nothing more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../hubs/DemoHub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DemoHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/DemoHub.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can use the state in your component.&lt;/p&gt;

&lt;p&gt;And again you can see, everything you need is coming from your created StateHub, no other imports are required except your DemoHub.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../hubs/DemoHub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// call .use() to use the state.&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHANGE_TITLE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Change&lt;/span&gt; &lt;span class="nx"&gt;Title&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Method&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LogSomething&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Log&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Method&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AlertSomething&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Trigger&lt;/span&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;state &amp;amp; reducer is optional that means you can create StateHub's with methods only and retrieve them directly where needed by calling &lt;code&gt;YourHub.methods()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../hubs/DemoHub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LogSomething&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AlertSomething&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Method&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;LogSomething&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Log&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Method&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;AlertSomething&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Trigger&lt;/span&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use as many StateHubs as you want.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthHub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DatabaseHub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ResponsiveHub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ModalHub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../hubs/DemoHub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AuthHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DatabaseHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ResponsiveHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ModalHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ModalHub.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ResponsiveHub.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/DatabaseHub.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AuthHub.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Support for Class Components:&lt;/p&gt;

&lt;p&gt;To support React &amp;lt; 16.8.0, where the Context needs to be consumed by class&lt;br&gt;
components here the render-prop based API for context consumers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DemoHub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../hubs/DemoHub&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DemoHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Consumer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CHANGE_TITLE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nx"&gt;Change&lt;/span&gt; &lt;span class="nx"&gt;Title&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Method&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LogSomething&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nx"&gt;Log&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Method&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AlertSomething&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nx"&gt;Trigger&lt;/span&gt; &lt;span class="nx"&gt;alert&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;)}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/DemoHub.Consumer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>react</category>
      <category>statemanagement</category>
      <category>context</category>
    </item>
    <item>
      <title>Why Dev.to has a .to domain?</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Fri, 03 Jul 2020 03:07:49 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/why-dev-to-has-a-to-domain-221o</link>
      <guid>https://dev.to/ivanjrmc/why-dev-to-has-a-to-domain-221o</guid>
      <description>&lt;p&gt;Why Dev.to has a .to domain and not something like Dev.io or Dev.dev?&lt;/p&gt;

</description>
      <category>dev</category>
    </item>
    <item>
      <title>DEV.TO Platform questions</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Wed, 27 May 2020 08:41:12 +0000</pubDate>
      <link>https://dev.to/ivanjrmc/dev-to-platform-questions-1ef3</link>
      <guid>https://dev.to/ivanjrmc/dev-to-platform-questions-1ef3</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Why is DEV.TO sending random notifications without following the post or author, this leads to too much information that I don't need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Since I know for DEV.TO I'm not able to comment on the mobile PWA when I click on send I get only the loading animation, multiple times tried to delete and install PWA again but always the same problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A bit more technical question but what was the reason to choose Ruby over Nodejs for DEV.TO backend?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks&lt;/p&gt;

</description>
      <category>dev</category>
    </item>
    <item>
      <title>Complex Custom Hooks with createContext();</title>
      <dc:creator>Ivan Jeremic</dc:creator>
      <pubDate>Thu, 07 May 2020 16:44:14 +0000</pubDate>
      <link>https://dev.to/ivanjeremic/complex-custom-hooks-with-createcontext-codesandbox-example-4ica</link>
      <guid>https://dev.to/ivanjeremic/complex-custom-hooks-with-createcontext-codesandbox-example-4ica</guid>
      <description>&lt;h3&gt;
  
  
  Tell me what you think in the comments :)
&lt;/h3&gt;

&lt;p&gt;The reason I like this way of creating hooks is, it is easier &amp;amp; cleaner to provide executable functions to components. Any suggestions or tips?&lt;/p&gt;

&lt;p&gt;I know the title says Complex Custom Hooks but this example is very simple so everyone can follow.&lt;/p&gt;

&lt;p&gt;I use this way of creating Custom Hooks also for complex Mutations with React Apollo, so all the mutation logic is inside my hook and the component has only markup all it gets are the functions from the custom hook.&lt;/p&gt;

&lt;p&gt;The difference to normal hooks is you need to wrap your -&lt;br&gt;
component who needs the data with the Context.Provider to use the hook.&lt;/p&gt;

&lt;h2&gt;
  
  
  CodeSandbox Example
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/useaddtask-complex-hooks-with-context-hooks-api-w2pn5?file=/src/App.js"&gt;https://codesandbox.io/s/useaddtask-complex-hooks-with-context-hooks-api-w2pn5?file=/src/App.js&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>hooks</category>
      <category>javascript</category>
      <category>reacthooks</category>
    </item>
  </channel>
</rss>
