<?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: suvel rathneswar⚛️</title>
    <description>The latest articles on DEV Community by suvel rathneswar⚛️ (@rocksuvel).</description>
    <link>https://dev.to/rocksuvel</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%2F584575%2Fe5498ae8-6e3f-461d-8ca0-02b0c878f9e2.png</url>
      <title>DEV Community: suvel rathneswar⚛️</title>
      <link>https://dev.to/rocksuvel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rocksuvel"/>
    <language>en</language>
    <item>
      <title>Levitating Balls</title>
      <dc:creator>suvel rathneswar⚛️</dc:creator>
      <pubDate>Tue, 11 Apr 2023 17:50:02 +0000</pubDate>
      <link>https://dev.to/rocksuvel/levitating-balls-3162</link>
      <guid>https://dev.to/rocksuvel/levitating-balls-3162</guid>
      <description>&lt;p&gt;I was working on a task and suddenly this idea kicked in, so I took help from Chatgpt to draft a simple html app and improved it.&lt;/p&gt;

&lt;p&gt;index.html&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Levitating Balls&amp;lt;/title&amp;gt;
    &amp;lt;link rel="stylesheet" href="style.css" /&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class="container"&amp;gt;
      &amp;lt;p class="small-title"&amp;gt;Quick app ✨&amp;lt;/p&amp;gt;
      &amp;lt;h1 class="title"&amp;gt;Levitating Balls&amp;lt;/h1&amp;gt;
      &amp;lt;div class="balls-container"&amp;gt;
        &amp;lt;div id="ball-mid" class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class="ball"&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;script src="script.js"&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;style.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 {
  margin: 0;
  padding: 0;
}

.container {
  height: 100vh;
  position: relative;
  display: grid;
  place-content: center;
  overflow: hidden;
  background: blue;
}

.title {
  font-size: 8em;
  font-family: monospace;
  color: white;
}

.small-title {
  font-size: 2em;
  font-family: monospace;
  color: white;
  text-align: start;
}

.balls-container {
  height: 100%;
  width: 100%;
  position: absolute;
}

.ball {
  position: absolute;
  width: 8em;
  height: 8em;
  border: 3px solid rgb(255, 255, 255);
  background-color: blue;
  border-radius: 50%;
  transition: transform 2s;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;script.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const balls = document.getElementsByClassName('ball');

let drop = 0;
setInterval(() =&amp;gt; {
  console.log({ drop });
  for (let i = 0; i &amp;lt; balls.length; i++) {
    if (drop) {
      console.log('top');
      balls[i].style.transform = `translateY(${Math.random() * 90}vh)`;
    } else {
      balls[i].style.transform = `translateY(${90}vh)`;
    }
    balls[i].style.transform += `translateX(${Math.random() * 90}vw)`;
    const zIndex = parseInt(Math.random() * 3);
    console.log({zIndex})
    balls[i].style.zIndex = `${zIndex}`;
  }
  drop = !drop;
}, [2000]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Redirect uri does not contain ? and hits an un-known page in React Router</title>
      <dc:creator>suvel rathneswar⚛️</dc:creator>
      <pubDate>Wed, 05 Apr 2023 03:16:46 +0000</pubDate>
      <link>https://dev.to/rocksuvel/redirect-uri-does-not-contain-and-hits-an-un-known-page-in-react-router-jbj</link>
      <guid>https://dev.to/rocksuvel/redirect-uri-does-not-contain-and-hits-an-un-known-page-in-react-router-jbj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🦨 If your application is adding "&amp;amp;state=" to the url after Keyclock is initialized, then this documentation might help you 🚑.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;👉 By default, when the responseMode is set to 'fragment', Keycloak adds the state parameter to the URL fragment. However, when the responseMode is set to 'query', the state parameter is added to the query string instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keycloak
    .init({ 
    onLoad: 'login-required',
    //add the below line 👇
    responseMode: 'query' 
    })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Alternate solution, use BrowerRouter * without responseMode* (default to 'fragment')&lt;/p&gt;




&lt;h2&gt;
  
  
  Sample project example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dependencies information&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    "keycloak-js": "^19.0.2",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^6.3.0",
    "react-scripts": "5.0.1",
    "universal-cookie": "^4.0.4"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;index.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import ReactDOM from 'react-dom';
import { HashRouter } from 'react-router-dom';
import App from './App';

ReactDOM.render(
  &amp;lt;HashRouter&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/HashRouter&amp;gt;,
  document.getElementById('root')
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;App.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import './App.css';
import { Route, Routes, Navigate, Link } from 'react-router-dom';
import NotFound from './NotFound';
import components from './page';
import appRoutes from './appRoutes';

const { Login } = components;

function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;div style={{ display: 'flex', gap: '10px' }}&amp;gt;
        &amp;lt;Link to={'/login'}&amp;gt;Login&amp;lt;/Link&amp;gt;
        &amp;lt;Link to={'/a'}&amp;gt;A&amp;lt;/Link&amp;gt;
        &amp;lt;Link to={'/b'}&amp;gt;B&amp;lt;/Link&amp;gt;
        &amp;lt;Link to={'/c'}&amp;gt;C&amp;lt;/Link&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;hr /&amp;gt;
      &amp;lt;Routes element&amp;gt;
        &amp;lt;Route path='/' element={&amp;lt;Navigate to={'/login'} /&amp;gt;} /&amp;gt;
        &amp;lt;Route path='login' element={&amp;lt;Login /&amp;gt;} /&amp;gt;
        {appRoutes}
        &amp;lt;Route path='*' element={&amp;lt;NotFound /&amp;gt;} /&amp;gt;
      &amp;lt;/Routes&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;appRoutes.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Route, Outlet, useLocation, useNavigate } from 'react-router-dom';
import components from './page';
import Cookies from 'universal-cookie';
import keycloak from './keyclock';

const { A, A1, A2, A3, B, C } =
  components;

const cookie = new Cookies();

const publicPath = ['/a', '/a/a1'];

const SecureRoutes = () =&amp;gt; {
  const isGuestUser = JSON.parse(cookie.get('isGuest'));
  const location = useLocation();
  const navigate = useNavigate();

  if (!isGuestUser) {
    keycloak
      .init({ onLoad: 'login-required', responseMode: 'query' })
      .then((authenticated) =&amp;gt; {
        if (authenticated) {
          cookie.set('isGuest', false);
        } else {
          cookie.set('isGuest', true);
        }
      })
      .catch((error) =&amp;gt; {
        console.error('Failed to initialize Keycloak', error);
      });
  } else if (!publicPath.includes(location.pathname)) {
    alert('As guest you cannot access this ');
    console.log({ navigate });
  }

  return (
    &amp;lt;&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;div&amp;gt;Is Guest:{isGuestUser ? 'yes' : 'No'}&amp;lt;/div&amp;gt;
        {!isGuestUser &amp;amp;&amp;amp; (
          &amp;lt;button
            onClick={() =&amp;gt;
              keycloak.logout({ 
              //redirectUri:&amp;lt;URL to go when logout&amp;gt;
              redirectUri: 'http://localhost:3000/'
              })
            }
          &amp;gt;
            Logout
          &amp;lt;/button&amp;gt;
        )}
      &amp;lt;/div&amp;gt;
      &amp;lt;hr /&amp;gt;
      &amp;lt;Outlet /&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

const appRoutes = (
  &amp;lt;&amp;gt;
    &amp;lt;Route element={&amp;lt;SecureRoutes /&amp;gt;}&amp;gt;
      &amp;lt;Route path='/a'&amp;gt;
        &amp;lt;Route index element={&amp;lt;A /&amp;gt;} /&amp;gt;
        &amp;lt;Route path='a1' element={&amp;lt;A1 /&amp;gt;} /&amp;gt;
        &amp;lt;Route path='a2' element={&amp;lt;A2 /&amp;gt;} /&amp;gt;
        &amp;lt;Route path='a3' element={&amp;lt;A3 /&amp;gt;} /&amp;gt;
      &amp;lt;/Route&amp;gt;
      &amp;lt;Route path={'/b'} element={&amp;lt;B /&amp;gt;} /&amp;gt;
      &amp;lt;Route path='/c' element={&amp;lt;C /&amp;gt;} /&amp;gt;
    &amp;lt;/Route&amp;gt;
  &amp;lt;/&amp;gt;
);

export default appRoutes;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
