From f48e677685a9269a2eb4e9abab59733f7af59d39 Mon Sep 17 00:00:00 2001
From: Balint Lendvai
Date: Thu, 20 Nov 2025 12:10:00 +0100
Subject: [PATCH 1/8] feat(api): implement external API mock handlers and
update routing
- Added externalHandlers.js to simulate external API responses for posts and comments.
- Updated routes to include new external API mock routes.
- Refactored postHandlers to call the new external API endpoints.
- Adjusted server.js to export base URL for easier configuration.
- Enhanced test setup to mock external API calls correctly.
Resolves: no-ticket
Signed-off-by: [Balint Lendvai]
---
src/api/message.js | 18 +++-
src/pages/welcome/Welcome.jsx | 62 +++++++-----
src/pages/welcome/post/PostComponent.jsx | 71 ++++++++++++++
src/routes/routes.js | 26 +++--
src/server.js | 6 +-
src/service/externalHandlers.js | 120 +++++++++++++++++++++++
src/service/postHandlers.js | 77 +++++++++++++++
src/test/server.js | 37 ++++++-
8 files changed, 375 insertions(+), 42 deletions(-)
create mode 100644 src/pages/welcome/post/PostComponent.jsx
create mode 100644 src/service/externalHandlers.js
create mode 100644 src/service/postHandlers.js
diff --git a/src/api/message.js b/src/api/message.js
index 953f24f..21cec60 100644
--- a/src/api/message.js
+++ b/src/api/message.js
@@ -9,12 +9,20 @@
* This file contains client-side API functions that call our express.js backend routes
*/
-export const getMessage = async () => {
+export const getPost = async (postId) => {
try {
- const response = await fetch('/api/message');
- const data = await response.json();
- return data.message;
+ const response = await fetch(`/api/post/${postId}`);
+ return await response.json();
} catch (error) {
- throw new Error('Failed to load message: ', error);
+ throw new Error('Failed to load post: ', error);
+ }
+};
+
+export const getComments = async (postId) => {
+ try {
+ const response = await fetch(`/api/comments?postId=${postId}`);
+ return await response.json();
+ } catch (error) {
+ throw new Error('Failed to load comments: ', error);
}
};
diff --git a/src/pages/welcome/Welcome.jsx b/src/pages/welcome/Welcome.jsx
index 389012c..80109ec 100644
--- a/src/pages/welcome/Welcome.jsx
+++ b/src/pages/welcome/Welcome.jsx
@@ -11,35 +11,23 @@ import {
Grid,
Heading,
Tile,
+ UnorderedList,
+ ListItem,
Section,
+ Stack,
} from '@carbon/react';
-import { useEffect, useState } from 'react';
+import { Suspense } from 'react';
-import { getMessage } from '../../api/message.js';
import { Footer } from '../../components/footer/Footer';
import { WelcomeHeader } from './WelcomeHeader.jsx';
import { PageLayout } from '../../layouts/page-layout.jsx';
+import PostComponent from './post/PostComponent.jsx';
// The styles are imported into index.scss by default.
// Do the same unless you have a good reason not to.
// import './welcome.scss';
const Welcome = () => {
- const [message, setMessage] = useState('');
-
- useEffect(() => {
- const loadMessage = async () => {
- try {
- const msg = await getMessage();
- setMessage(msg);
- } catch {
- setMessage('Failed to load message');
- }
- };
-
- loadMessage();
- }, []);
-
return (
{
lg={12}
className="cs--welcome__dynamic-message"
>
-
- Below is a dynamically fetched message from an external API
- endpoint. This showcases how to perform data fetching while
- keeping components clean and separating network logic.
-
-
- Message: {message || 'Loading...'}
-
+
+
+ Below is a dynamically fetched message from an external API
+ endpoint. This showcases how to perform data fetching while
+ keeping components clean and separating network logic. Here is
+ how it works:
+
+
+
+ UI Layer - PostComponent.jsx manages React
+ state and renders the data using Carbon Design components
+
+
+ API Layer - Client-side functions in{' '}
+ api/message.js handle HTTP requests to our
+ Express backend
+
+
+ Service Layer - Server-side handlers in{' '}
+ service/postHandlers.js proxy requests to
+ external APIs.
+
+
+
+ This pattern keeps your components focused on presentation
+ while centralizing data fetching logic for reusability and
+ testability.
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default PostComponent;
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 49043e5..597166f 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -4,12 +4,11 @@
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
-
-import { getMessage } from '../service/message.js';
-
-export const routeHandlers = {
- getMessage,
-};
+import { getPost, getComments } from '../service/postHandlers.js';
+import {
+ getExternalPost,
+ getExternalComments,
+} from '../service/externalHandlers.js';
/**
* Registers all API routes on the given Express app instance.
@@ -18,7 +17,18 @@ export const routeHandlers = {
* and allows swapping out route handlers for mocks if needed.
* @param app - Express app instance OR msw router in case of unit testing
* @param handlers - Route handlers (can be mocked for testing)
+ * @param externalHandlers - External API mock handlers (can be mocked for testing)
*/
-export const getRoutes = (app, handlers = routeHandlers) => {
- app.get('/api/message', handlers.getMessage);
+export const getRoutes = (
+ app,
+ handlers = { getPost, getComments },
+ externalHandlers = { getExternalPost, getExternalComments },
+) => {
+ // Client-facing API routes (these call the external routes below)
+ app.get('/api/post/:id', handlers.getPost);
+ app.get('/api/comments', handlers.getComments);
+
+ // Mock "external" API routes (simulate external services)
+ app.get('/api/external/post/:id', externalHandlers.getExternalPost);
+ app.get('/api/external/comments', externalHandlers.getExternalComments);
};
diff --git a/src/server.js b/src/server.js
index 52d52ec..2d79cb7 100644
--- a/src/server.js
+++ b/src/server.js
@@ -12,8 +12,8 @@ import { getRoutes } from './routes/routes.js';
// Constants
const isProduction = process.env.NODE_ENV === 'production';
-const port = process.env.PORT || 5173;
-const base = process.env.BASE || '/';
+export const port = process.env.PORT || 5173;
+export const base = process.env.BASE || 'http://localhost';
const ABORT_DELAY = 10000;
// Create http server
@@ -109,5 +109,5 @@ app.use('*all', async (req, res) => {
// Start http server
app.listen(port, () => {
- console.log(`Server started at http://localhost:${port}`);
+ console.log(`Server started at: ${base}:${port}`);
});
diff --git a/src/service/externalHandlers.js b/src/service/externalHandlers.js
new file mode 100644
index 0000000..f1694cb
--- /dev/null
+++ b/src/service/externalHandlers.js
@@ -0,0 +1,120 @@
+/**
+ * Copyright IBM Corp. 2025
+ *
+ * This source code is licensed under the Apache-2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * This file contains mock "external" API handlers that simulate external services.
+ * These are called by the main API handlers to demonstrate API-to-API communication.
+ * Just for demonstration purposes.
+ * You can remove/replace these with actual external API handlers in your actual application.
+ */
+
+// Mock database for posts
+const mockPosts = {
+ 1: {
+ id: 1,
+ title: 'Introduction to Carbon Design System',
+ body: `
+ This is just a sample post. Carbon is IBM's open source design system for products and digital experiences.
+ With the IBM Design Language as its foundation, the system consists of working code, design tools and resources,
+ human interface guidelines, and a vibrant community of contributors.`,
+ userId: 1,
+ },
+ 2: {
+ id: 2,
+ title: 'Getting Started with React Router',
+ body: 'This is just a sample post. React Router is a standard library for routing in React applications.',
+ userId: 1,
+ },
+ 3: {
+ id: 3,
+ title: 'Building Modern Web Applications',
+ body: 'This is just a sample post. Modern web development requires understanding of various tools and frameworks.',
+ userId: 2,
+ },
+};
+
+// Mock database for comments
+const mockComments = {
+ 1: [
+ {
+ id: 1,
+ postId: 1,
+ name: 'Great introduction!',
+ email: 'user1@example.com',
+ body: 'This is a really helpful overview of Carbon.',
+ },
+ {
+ id: 2,
+ postId: 1,
+ name: 'Thanks for sharing',
+ email: 'user2@example.com',
+ body: 'Looking forward to learning more about Carbon.',
+ },
+ ],
+ 2: [
+ {
+ id: 3,
+ postId: 2,
+ name: 'Router questions',
+ email: 'user3@example.com',
+ body: 'How does this compare to other routing libraries?',
+ },
+ ],
+ 3: [
+ {
+ id: 4,
+ postId: 3,
+ name: 'Excellent article',
+ email: 'user4@example.com',
+ body: 'Very comprehensive guide to modern web development.',
+ },
+ ],
+};
+
+/**
+ * Mock external API handler for fetching a single post
+ * Simulates an external service response
+ */
+export const getExternalPost = async ({ params: { id } }, res) => {
+ // Validate that id is a positive integer
+ if (!/^\d+$/.test(id)) {
+ return res.status(400).json({ message: 'Invalid post id' });
+ }
+
+ // Simulated network delay
+ await new Promise((resolve) => setTimeout(resolve, 100));
+ const post = mockPosts[id];
+
+ if (!post) {
+ return res.status(404).json({ message: 'Post not found' });
+ }
+
+ res.json(post);
+};
+
+/**
+ * Mock external API handler for fetching comments for a post
+ * Simulates an external service response
+ */
+export const getExternalComments = async ({ query: { postId } }, res) => {
+ // Validate that postId is provided and is a positive integer
+ if (!postId || !/^\d+$/.test(postId)) {
+ return res.status(400).json({ message: 'Invalid or missing postId' });
+ }
+
+ // Simulate network delay
+ await new Promise((resolve) => setTimeout(resolve, 100));
+
+ const comments = mockComments[postId] || [];
+
+ res.json(comments);
+};
+
+export default {
+ getExternalComments,
+ getExternalPost,
+};
diff --git a/src/service/postHandlers.js b/src/service/postHandlers.js
new file mode 100644
index 0000000..c18151c
--- /dev/null
+++ b/src/service/postHandlers.js
@@ -0,0 +1,77 @@
+/**
+ * Copyright IBM Corp. 2025
+ *
+ * This source code is licensed under the Apache-2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * This file contains the functions that do async network requests
+ * These handlers call our "external" API routes to simulate API-to-API communication
+ */
+
+/**
+ * Get the base URL for the server
+ * In production, this would be configured via environment variables
+ */
+import { base, port } from '../server.js';
+
+const getBaseUrl = () => {
+ return `${base}:${port}`;
+};
+
+export const getPost = async ({ params: { id } }, res) => {
+ // Validate that id is a positive integer
+ if (!/^\d+$/.test(id)) {
+ return res.status(400).json({ message: 'Invalid post id' });
+ }
+
+ try {
+ // Call our mock "external" API endpoint
+ const response = await fetch(`${getBaseUrl()}/api/external/post/${id}`);
+
+ if (!response.ok) {
+ const error = await response.json();
+ return res.status(response.status).json(error);
+ }
+
+ const blogpost = await response.json();
+
+ // Return the blogpost
+ res.json(blogpost);
+ } catch (error) {
+ console.error('Error fetching post:', error);
+ res.status(500).json({ message: 'Failed to fetch post' });
+ }
+};
+
+export const getComments = async ({ query: { postId } }, res) => {
+ if (!postId) {
+ return res.status(400).json({ message: 'Missing postId parameter' });
+ }
+
+ try {
+ // Call our mock "external" API endpoint
+ const response = await fetch(
+ `${getBaseUrl()}/api/external/comments?postId=${postId}`,
+ );
+
+ if (!response.ok) {
+ const error = await response.json();
+ return res.status(response.status).json(error);
+ }
+
+ const comments = await response.json();
+
+ // Return the comments
+ return res.json(comments);
+ } catch (error) {
+ console.error('Error fetching comments:', error);
+ return res.status(500).json({ message: 'Failed to fetch comments' });
+ }
+};
+
+export default {
+ getComments,
+ getPost,
+};
diff --git a/src/test/server.js b/src/test/server.js
index 6405567..81f9a0b 100644
--- a/src/test/server.js
+++ b/src/test/server.js
@@ -6,6 +6,7 @@
*/
import { setupServer } from 'msw/node';
+import { http } from 'msw';
import { getNetworking } from './networking';
import { getRouter } from './router';
import { getRoutes } from '../routes/routes';
@@ -14,9 +15,43 @@ const _setupServer = (...args) => {
const mocks = [];
const networking = getNetworking();
+ // Set up internal API routes (including external mock routes)
getRoutes(getRouter(mocks, networking));
- const server = setupServer(...mocks, ...args);
+ // Mock external API calls from postHandlers to our local external endpoints
+ // These intercept the fetch calls made by postHandlers.js
+ const externalMocks = [
+ http.get('http://localhost:5173/api/external/post/:id', ({ params }) => {
+ return Response.json({
+ id: params.id,
+ title: 'Test Post Title',
+ body: 'Test post body content',
+ userId: 1,
+ });
+ }),
+ http.get('http://localhost:5173/api/external/comments', ({ request }) => {
+ const url = new URL(request.url);
+ const postId = url.searchParams.get('postId');
+ return Response.json([
+ {
+ id: 1,
+ postId: parseInt(postId),
+ name: 'Test Comment 1',
+ email: 'test1@example.com',
+ body: 'Test comment 1 body',
+ },
+ {
+ id: 2,
+ postId: parseInt(postId),
+ name: 'Test Comment 2',
+ email: 'test2@example.com',
+ body: 'Test comment 2 body',
+ },
+ ]);
+ }),
+ ];
+
+ const server = setupServer(...mocks, ...externalMocks, ...args);
server.networking = networking;
return server;
};
From 6df9feaef448e31105e0c872892bb0312bee96e7 Mon Sep 17 00:00:00 2001
From: Balint Lendvai
Date: Thu, 20 Nov 2025 14:22:24 +0100
Subject: [PATCH 2/8] refactor(server): extract server configuration to a
separate module
- Moved server configuration constants (port and base) from server.js to a new config/server-config.js file for better organization and testability.
- Updated imports in postHandlers.js and test files to reflect the new configuration module.
- Adjusted response handling in tests to use HttpResponse from msw.
Resolves: no-ticket
---
src/config/server-config.js | 11 +++++++++++
src/server.js | 3 +--
src/service/postHandlers.js | 2 +-
src/test/router.js | 4 ++--
src/test/server.js | 6 +++---
5 files changed, 18 insertions(+), 8 deletions(-)
create mode 100644 src/config/server-config.js
diff --git a/src/config/server-config.js b/src/config/server-config.js
new file mode 100644
index 0000000..af20359
--- /dev/null
+++ b/src/config/server-config.js
@@ -0,0 +1,11 @@
+/**
+ * Copyright IBM Corp. 2025
+ *
+ * This source code is licensed under the Apache-2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Server configuration constants
+// Extracted to avoid importing the full server during tests
+export const port = process.env.PORT || 5173;
+export const base = process.env.BASE || 'http://localhost';
diff --git a/src/server.js b/src/server.js
index 2d79cb7..fff0164 100644
--- a/src/server.js
+++ b/src/server.js
@@ -9,11 +9,10 @@ import fs from 'node:fs/promises';
import express from 'express';
import { Transform } from 'node:stream';
import { getRoutes } from './routes/routes.js';
+import { port, base } from './config/server-config.js';
// Constants
const isProduction = process.env.NODE_ENV === 'production';
-export const port = process.env.PORT || 5173;
-export const base = process.env.BASE || 'http://localhost';
const ABORT_DELAY = 10000;
// Create http server
diff --git a/src/service/postHandlers.js b/src/service/postHandlers.js
index c18151c..fca5d6c 100644
--- a/src/service/postHandlers.js
+++ b/src/service/postHandlers.js
@@ -14,7 +14,7 @@
* Get the base URL for the server
* In production, this would be configured via environment variables
*/
-import { base, port } from '../server.js';
+import { base, port } from '../config/server-config.js';
const getBaseUrl = () => {
return `${base}:${port}`;
diff --git a/src/test/router.js b/src/test/router.js
index 6b9f9a7..24672bd 100644
--- a/src/test/router.js
+++ b/src/test/router.js
@@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree.
*/
-import { http } from 'msw';
+import { http, HttpResponse } from 'msw';
export const getRouter = (mocks, networking) => {
const apiRoute = (verb, path, handler) => {
@@ -18,7 +18,7 @@ export const getRouter = (mocks, networking) => {
const res = {
json: (data) => {
networking.removeRequest(path);
- return Response.json(data);
+ return HttpResponse.json(data);
},
};
diff --git a/src/test/server.js b/src/test/server.js
index 81f9a0b..6c2b243 100644
--- a/src/test/server.js
+++ b/src/test/server.js
@@ -5,8 +5,8 @@
* LICENSE file in the root directory of this source tree.
*/
+import { http, HttpResponse } from 'msw';
import { setupServer } from 'msw/node';
-import { http } from 'msw';
import { getNetworking } from './networking';
import { getRouter } from './router';
import { getRoutes } from '../routes/routes';
@@ -22,7 +22,7 @@ const _setupServer = (...args) => {
// These intercept the fetch calls made by postHandlers.js
const externalMocks = [
http.get('http://localhost:5173/api/external/post/:id', ({ params }) => {
- return Response.json({
+ return HttpResponse.json({
id: params.id,
title: 'Test Post Title',
body: 'Test post body content',
@@ -32,7 +32,7 @@ const _setupServer = (...args) => {
http.get('http://localhost:5173/api/external/comments', ({ request }) => {
const url = new URL(request.url);
const postId = url.searchParams.get('postId');
- return Response.json([
+ return HttpResponse.json([
{
id: 1,
postId: parseInt(postId),
From 65bbac46657f23fa6df35646765a398d2c9d4bc0 Mon Sep 17 00:00:00 2001
From: Balint Lendvai
Date: Thu, 20 Nov 2025 15:45:24 +0100
Subject: [PATCH 3/8] feat(nav, dashboard): enhance navigation and dashboard
with dynamic routing and parameter handling
- Added a utility function to determine active menu items based on current path, supporting dynamic routes.
- Updated NavHeaderItems to utilize the new active path logic.
- Enhanced Dashboard component to access and display URL path and query parameters.
- Configured routing to support dynamic dashboard paths with parameters.
Resolves: no-ticket
---
src/components/nav/NavHeaderItems.jsx | 16 +++++++--
src/pages/dashboard/Dashboard.jsx | 52 ++++++++++++++++++++++++++-
src/routes/config.js | 7 ++++
3 files changed, 72 insertions(+), 3 deletions(-)
diff --git a/src/components/nav/NavHeaderItems.jsx b/src/components/nav/NavHeaderItems.jsx
index 90d4d9d..8138d1b 100644
--- a/src/components/nav/NavHeaderItems.jsx
+++ b/src/components/nav/NavHeaderItems.jsx
@@ -1,6 +1,18 @@
import { HeaderMenu, HeaderMenuItem } from '@carbon/react';
import { Link as RouterLink } from 'react-router';
+/**
+ * Check if a menu path should be active based on the current path
+ * Handles both exact matches and dynamic route segments
+ */
+const isPathActive = (menuPath, currentPath) => {
+ if (!menuPath || !currentPath) return false;
+ // Exact match
+ if (menuPath === currentPath) return true;
+ // Match dynamic routes: /dashboard should be active for /dashboard/123
+ return currentPath.startsWith(`${menuPath}/`);
+};
+
export const NavHeaderItems = ({ routesInHeader, currentPath }) => (
<>
{routesInHeader.map(({ path, carbon }) =>
@@ -16,7 +28,7 @@ export const NavHeaderItems = ({ routesInHeader, currentPath }) => (
as={RouterLink}
to={subRoute.path}
key={subRoute.path}
- isActive={subRoute.path === currentPath}
+ isActive={isPathActive(subRoute.path, currentPath)}
>
{subRoute.carbon.label}
@@ -27,7 +39,7 @@ export const NavHeaderItems = ({ routesInHeader, currentPath }) => (
as={RouterLink}
key={path}
to={path}
- isActive={path === currentPath}
+ isActive={isPathActive(path, currentPath)}
>
{carbon?.label}
diff --git a/src/pages/dashboard/Dashboard.jsx b/src/pages/dashboard/Dashboard.jsx
index 586bdd4..da7f98c 100644
--- a/src/pages/dashboard/Dashboard.jsx
+++ b/src/pages/dashboard/Dashboard.jsx
@@ -5,8 +5,9 @@
* LICENSE file in the root directory of this source tree.
*/
-import { Column, Grid, Tile } from '@carbon/react';
+import { Column, Grid, Link, Tile, Stack, Tag } from '@carbon/react';
import { useState } from 'react';
+import { useParams, useSearchParams } from 'react-router';
import { Footer } from '../../components/footer/Footer';
import { PageLayout } from '../../layouts/page-layout';
@@ -31,6 +32,15 @@ const NumberTile = () => {
};
const Dashboard = () => {
+ // Access path parameters (e.g., /dashboard/1234 -> id = "1234")
+ const params = useParams();
+ const { id } = params;
+
+ // Access query parameters (e.g., /dashboard/1234?q=xxx&name=John -> q = "xxx", name = "John")
+ const [searchParams] = useSearchParams();
+ const queryParam = searchParams.get('q');
+ const nameParam = searchParams.get('name');
+
return (
{
+ {/* Example: Display URL parameters when present */}
+
+
+
+ URL Parameters Example
+ {nameParam && (
+
Hello {nameParam}! 👋
+ )}
+
+ This demonstrates how to access both path parameters and query
+ parameters from the URL.
+ Try accessing:{' '}
+
+ /dashboard/1234?q=xxx&name=Anne
+
+
+
+ {id && (
+
+ Path Parameter (id):{' '}
+ {id}
+
+ )}
+ {queryParam && (
+
+ Query Parameter (q):{' '}
+ {queryParam}
+
+ )}
+ {nameParam && (
+
+ Query Parameter (name):{' '}
+ {nameParam}
+
+ )}
+
+
+
+
+
diff --git a/src/routes/config.js b/src/routes/config.js
index 1a0b0c5..86b529e 100644
--- a/src/routes/config.js
+++ b/src/routes/config.js
@@ -44,6 +44,10 @@ export const routes = [
inHeader: true,
},
},
+ {
+ path: '/dashboard/:id',
+ element: Dashboard,
+ },
{
path: '/link-1',
element: Placeholder,
@@ -154,6 +158,9 @@ const routesProcessed = routes.map((route) => {
const path = route.path || route.carbon.virtualPath;
const subMenu = routes.filter((subRoute) => {
+ // Only include routes with carbon config in navigation menus
+ if (!subRoute.carbon) return false;
+
const subPath = subRoute.path || subRoute.carbon.virtualPath;
const childPath = new RegExp(`^${path}/[^/]+$`); // match direct parent only
From 537d382b3db90ecdf236d14b60e3e5b900e64001 Mon Sep 17 00:00:00 2001
From: Balint Lendvai
Date: Thu, 20 Nov 2025 17:28:15 +0100
Subject: [PATCH 4/8] fix: query param typo fix
---
src/pages/dashboard/Dashboard.jsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/pages/dashboard/Dashboard.jsx b/src/pages/dashboard/Dashboard.jsx
index da7f98c..72bace1 100644
--- a/src/pages/dashboard/Dashboard.jsx
+++ b/src/pages/dashboard/Dashboard.jsx
@@ -62,8 +62,8 @@ const Dashboard = () => {
This demonstrates how to access both path parameters and query
parameters from the URL.
Try accessing:{' '}
-
- /dashboard/1234?q=xxx&name=Anne
+
+ /dashboard/1234?q=xyz&name=Anne
From 927aa7508e26a5d12c61b51c455d22e3873eb5f9 Mon Sep 17 00:00:00 2001
From: Balint Lendvai
Date: Fri, 21 Nov 2025 13:28:21 +0100
Subject: [PATCH 5/8] fix: sentence case fixes and some pollishing
Resolves: no-ticket
---
src/pages/dashboard/Dashboard.jsx | 32 +++++++++++++++----------------
src/pages/welcome/Welcome.jsx | 6 +++---
src/service/externalHandlers.js | 4 ++--
src/test/server.js | 11 ++++++-----
4 files changed, 27 insertions(+), 26 deletions(-)
diff --git a/src/pages/dashboard/Dashboard.jsx b/src/pages/dashboard/Dashboard.jsx
index 72bace1..2c00aba 100644
--- a/src/pages/dashboard/Dashboard.jsx
+++ b/src/pages/dashboard/Dashboard.jsx
@@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree.
*/
-import { Column, Grid, Link, Tile, Stack, Tag } from '@carbon/react';
+import { Column, Grid, Link, Tile, Stack } from '@carbon/react';
import { useState } from 'react';
import { useParams, useSearchParams } from 'react-router';
@@ -54,7 +54,7 @@ const Dashboard = () => {
- URL Parameters Example
+ URL parameters example
{nameParam && (