From f8f29d2a1733a4344aaa80b6abf4f1872b423c12 Mon Sep 17 00:00:00 2001
From: Kamran Ahmed <kamranahmed.se@gmail.com>
Date: Fri, 29 Mar 2024 19:35:41 +0000
Subject: [PATCH] Fix flickering issue

---
 src/components/Roadmaps/RoadmapsPage.tsx      | 84 ++++++++++---------
 .../Roadmaps/RoadmapsPageHeader.tsx           | 28 +++++++
 src/pages/roadmaps.astro                      | 31 +------
 3 files changed, 75 insertions(+), 68 deletions(-)
 create mode 100644 src/components/Roadmaps/RoadmapsPageHeader.tsx

diff --git a/src/components/Roadmaps/RoadmapsPage.tsx b/src/components/Roadmaps/RoadmapsPage.tsx
index 77513251f..4d21fda08 100644
--- a/src/components/Roadmaps/RoadmapsPage.tsx
+++ b/src/components/Roadmaps/RoadmapsPage.tsx
@@ -365,54 +365,58 @@ const groups: GroupType[] = [
   },
 ];
 
+const roleRoadmaps = groups.flatMap((group) =>
+  group.roadmaps.filter((roadmap) => roadmap.type === 'role'),
+);
+const skillRoadmaps = groups.flatMap((group) =>
+  group.roadmaps.filter((roadmap) => roadmap.type === 'skill'),
+);
+
+const allGroups = [
+  {
+    group: 'Role Based Roadmaps',
+    roadmaps: roleRoadmaps,
+  },
+  {
+    group: 'Skill Based Roadmaps',
+    roadmaps: skillRoadmaps,
+  },
+];
+
 export function RoadmapsPage() {
   const [activeGroup, setActiveGroup] = useState<AllowGroupNames>('');
-  const [visibleGroups, setVisibleGroups] = useState<GroupType[]>([]);
+  const [visibleGroups, setVisibleGroups] = useState<GroupType[]>(allGroups);
 
   useEffect(() => {
     if (!activeGroup) {
-      const roleRoadmaps = groups.flatMap((group) =>
-        group.roadmaps.filter((roadmap) => roadmap.type === 'role'),
-      );
-      const skillRoadmaps = groups.flatMap((group) =>
-        group.roadmaps.filter((roadmap) => roadmap.type === 'skill'),
-      );
+      setVisibleGroups(allGroups);
+      return;
+    }
 
-      setVisibleGroups([
-        {
-          group: 'Role Based Roadmaps',
-          roadmaps: roleRoadmaps,
-        },
-        {
-          group: 'Skill Based Roadmaps',
-          roadmaps: skillRoadmaps,
-        },
-      ]);
-    } else {
-      const group = groups.find((group) => group.group === activeGroup);
+    const group = groups.find((group) => group.group === activeGroup);
+    if (!group) {
+      return;
+    }
 
-      if (group) {
-        // other groups that have a roadmap that is in the same group
-        const otherGroups = groups.filter((g) => {
-          return (
-            g.group !== group.group &&
-            g.roadmaps.some((roadmap) => {
-              return roadmap.otherGroups?.includes(group.group);
-            })
-          );
-        });
+    // other groups that have a roadmap that is in the same group
+    const otherGroups = groups.filter((g) => {
+      return (
+        g.group !== group.group &&
+        g.roadmaps.some((roadmap) => {
+          return roadmap.otherGroups?.includes(group.group);
+        })
+      );
+    });
 
-        setVisibleGroups([
-          group,
-          ...otherGroups.map((g) => ({
-            ...g,
-            roadmaps: g.roadmaps.filter((roadmap) =>
-              roadmap.otherGroups?.includes(group.group),
-            ),
-          })),
-        ]);
-      }
-    }
+    setVisibleGroups([
+      group,
+      ...otherGroups.map((g) => ({
+        ...g,
+        roadmaps: g.roadmaps.filter((roadmap) =>
+          roadmap.otherGroups?.includes(group.group),
+        ),
+      })),
+    ]);
   }, [activeGroup]);
 
   return (
diff --git a/src/components/Roadmaps/RoadmapsPageHeader.tsx b/src/components/Roadmaps/RoadmapsPageHeader.tsx
new file mode 100644
index 000000000..a3ab04649
--- /dev/null
+++ b/src/components/Roadmaps/RoadmapsPageHeader.tsx
@@ -0,0 +1,28 @@
+export function RoadmapsPageHeader() {
+  return (
+    <div className="bg-white py-12">
+      <div className="container">
+        <div className="flex flex-col items-center bg-white">
+          <h1 className="text-5xl font-bold">Developer Roadmaps</h1>
+          <p className="my-3 text-lg">
+            Browse ever-growing list of up-to-date, community driven roadmaps
+          </p>
+          <p className="flex flex-row gap-3">
+            <a
+              className="inline-block rounded-md bg-black px-3.5 py-1.5 text-base text-white"
+              href="#"
+            >
+              Draw your own roadmap
+            </a>
+            <a
+              className="inline-block rounded-md bg-gray-300 px-3.5 py-1.5 text-base text-black"
+              href="#"
+            >
+              Generate Roadmap with AI
+            </a>
+          </p>
+        </div>
+      </div>
+    </div>
+  );
+}
diff --git a/src/pages/roadmaps.astro b/src/pages/roadmaps.astro
index c5cd1cdee..7d9df0145 100644
--- a/src/pages/roadmaps.astro
+++ b/src/pages/roadmaps.astro
@@ -1,5 +1,6 @@
 ---
 import { RoadmapsPage } from '../components/Roadmaps/RoadmapsPage';
+import { RoadmapsPageHeader } from '../components/Roadmaps/RoadmapsPageHeader';
 import GridItem from '../components/GridItem.astro';
 import SimplePageHeader from '../components/SimplePageHeader.astro';
 import BaseLayout from '../layouts/BaseLayout.astro';
@@ -11,32 +12,6 @@ import { getRoadmapsByTag } from '../lib/roadmap';
   description={'Step by step guides and paths to learn different tools or technologies'}
   permalink={'/roadmaps'}
 >
-  <div class=''>
-    <div class='bg-white py-12'>
-      <div class='container'>
-        <div class='flex flex-col items-center bg-white'>
-          <h1 class='text-5xl font-bold'>Developer Roadmaps</h1>
-          <p class='my-3 text-lg'>
-            Browse ever-growing list of up-to-date, community driven roadmaps
-          </p>
-          <p class='flex flex-row gap-3'>
-            <a
-              class='inline-block rounded-md bg-black px-3.5 py-1.5 text-base text-white'
-              href='#'
-            >
-              Draw your own roadmap
-            </a>
-            <a
-              class='inline-block rounded-md bg-gray-300 px-3.5 py-1.5 text-base text-black'
-              href='#'
-            >
-              Generate Roadmap with AI
-            </a>
-          </p>
-        </div>
-      </div>
-    </div>
-
-    <RoadmapsPage client:load />
-  </div>
+  <RoadmapsPageHeader client:load />
+  <RoadmapsPage client:load />
 </BaseLayout>