From 0621ceeca7cda54cc12ea73de43facc07bd1836c Mon Sep 17 00:00:00 2001
From: ashish200729
Date: Sun, 7 Jun 2026 08:19:28 +0530
Subject: [PATCH] Fix portfolio footer responsiveness and username unavailable
feedback.
Make the info icon sit inline with the branding pill on all screen sizes, return a clear error when a username is taken, and show that message in the selection UI.
---
backend/src/routes/auth.js | 10 ++++++++-
frontend/src/pages/UsernameSelection.jsx | 17 ++++++++++++---
frontend/src/portfolio/components/Footer.jsx | 22 ++++++++++----------
3 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/backend/src/routes/auth.js b/backend/src/routes/auth.js
index b92fe2f..a2c5be7 100644
--- a/backend/src/routes/auth.js
+++ b/backend/src/routes/auth.js
@@ -33,8 +33,16 @@ router.get('/check-username', async (req, res) => {
const existingUser = await User.findOne({ username: username.toLowerCase() });
+ if (existingUser) {
+ return res.json({
+ available: false,
+ username: username.toLowerCase(),
+ error: 'Username is not available'
+ });
+ }
+
res.json({
- available: !existingUser,
+ available: true,
username: username.toLowerCase()
});
} catch (error) {
diff --git a/frontend/src/pages/UsernameSelection.jsx b/frontend/src/pages/UsernameSelection.jsx
index cca12ef..24c69aa 100644
--- a/frontend/src/pages/UsernameSelection.jsx
+++ b/frontend/src/pages/UsernameSelection.jsx
@@ -54,15 +54,19 @@ function UsernameSelection() {
useEffect(() => {
if (!username || username.length < 3) {
setIsAvailable(null)
+ setError('')
return
}
const timer = setTimeout(async () => {
setIsChecking(true)
+ setError('')
try {
const { data } = await checkUsername(username)
setIsAvailable(data.available)
- setError(data.error || '')
+ setError(
+ data.error || (data.available === false ? 'Username is not available' : '')
+ )
} catch (err) {
setError(err.response?.data?.error || 'Failed to check username')
setIsAvailable(false)
@@ -99,6 +103,8 @@ function UsernameSelection() {
const value = e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, '')
if (value.length <= MAX_USERNAME_LENGTH) {
setUsername(value)
+ setIsAvailable(null)
+ setError('')
}
}
@@ -154,7 +160,7 @@ function UsernameSelection() {
)}
{!isChecking && isAvailable === false && (
-
+
)}
@@ -175,7 +181,12 @@ function UsernameSelection() {
✓ Username is available!
)}
- {error && (
+ {isAvailable === false && !isChecking && (
+
+ ✗ {error || 'Username is not available'}
+
+ )}
+ {error && isAvailable !== false && (
{error}
diff --git a/frontend/src/portfolio/components/Footer.jsx b/frontend/src/portfolio/components/Footer.jsx
index 72955f4..5718748 100644
--- a/frontend/src/portfolio/components/Footer.jsx
+++ b/frontend/src/portfolio/components/Footer.jsx
@@ -26,7 +26,7 @@ function Footer({ profile, compact = false }) {
const customBranding = profile?.customBranding
return (
-