Skip to content

Release v1.0.3#363

Merged
ViktorSvertoka merged 11 commits intomainfrom
develop
Feb 23, 2026
Merged

Release v1.0.3#363
ViktorSvertoka merged 11 commits intomainfrom
develop

Conversation

@ViktorSvertoka
Copy link
Member

@ViktorSvertoka ViktorSvertoka commented Feb 23, 2026

DevLovers v1.0.3 - Hotfix Release

Fixed

  • Restored Sanity blog images not rendering on Vercel production
  • Resolved SSR hydration mismatch in AchievementBadge
  • Fixed header locale inconsistencies and hardcoded strings
  • Improved notification rendering stability

Summary by CodeRabbit

  • New Features

    • Localized notification UI with locale-aware timestamps and improved notification types.
    • Scroll watcher enabling scroll-aware scrollbar visuals.
  • Bug Fixes

    • Blog image serving improved for specific remote sources.
    • More reliable GitHub avatar validation.
    • Addressed SSR hydration and notification rendering issues.
  • Performance & Stability

    • Smoother client-side initialization and rendering gating.
  • Documentation

    • Added v1.0.3 entry to the changelog.

ViktorSvertoka and others added 10 commits February 23, 2026 02:16
  - Translate all hardcoded header strings across en/uk/pl:
     - NotificationBell: title, markAllRead, syncing, empty state, justNow, type labels
     - LanguageSwitcher: title
     - UserNavDropdown: "My Account" label
     - Intl.RelativeTimeFormat now uses actual user locale (was hardcoded 'en')
   - Add notification translations to actions (quiz achievement, profile name/password change)
   - Fix AchievementBadge hydration mismatch: replace direct document.documentElement check
     with useState(false) + useEffect + MutationObserver (eliminates SSR/client mismatch)
   - Dashboard cards: unify all cards to use dashboard-card CSS class for consistent hover
   - ProfileCard: make stat items clickable (Quizzes→quiz results, Points→stats, Rank→leaderboard)
     with smooth scrollIntoView behavior
   - CartButton: restyle to match LanguageSwitcher/NotificationBell minimal icon button
feat: header translations, dashboard UX polish & hydration fix
fix(blog,qa): restore Sanity images on Vercel and strengthen Git tab …
@ViktorSvertoka ViktorSvertoka self-assigned this Feb 23, 2026
@ViktorSvertoka ViktorSvertoka added the bug Something isn't working label Feb 23, 2026
@vercel
Copy link
Contributor

vercel bot commented Feb 23, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
devlovers-net Ready Ready Preview, Comment Feb 23, 2026 9:49pm

@netlify
Copy link

netlify bot commented Feb 23, 2026

Deploy Preview for develop-devlovers ready!

Name Link
🔨 Latest commit 2b33396
🔍 Latest deploy log https://app.netlify.com/projects/develop-devlovers/deploys/699ccae57c2ed000084a0702
😎 Deploy Preview https://deploy-preview-363--develop-devlovers.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 23, 2026

📝 Walkthrough

Walkthrough

Adds v1.0.3 release notes and multiple frontend changes: Sanity image optimization bypass helpers and Next.js config update, ScrollWatcher + CSS scrollbar dynamics, localization for notifications and UI, UI/styling tweaks across dashboard/header/components, client-hydration adjustments, and assorted import/refactor edits.

Changes

Cohort / File(s) Summary
Release & Versioning
CHANGELOG.md, frontend/package.json, studio/package.json
Bump to v1.0.3 and append changelog entries describing fixes, localization, and stability notes.
Blog image optimization
frontend/lib/blog/image.ts, frontend/next.config.ts, frontend/app/[locale]/blog/[slug]/PostDetails.tsx, frontend/app/[locale]/blog/category/[category]/page.tsx, frontend/components/blog/BlogCard.tsx, frontend/components/blog/BlogFilters.tsx
Add isSanityAssetUrl / shouldBypassImageOptimization; apply unoptimized={shouldBypassImageOptimization(url)} to multiple Next/Image uses; broaden cdn.sanity.io remotePatterns.
Scroll watcher & globals
frontend/components/shared/ScrollWatcher.tsx, frontend/app/[locale]/layout.tsx, frontend/app/globals.css
New ScrollWatcher client component toggles html.is-scrolling; inject <ScrollWatcher /> into LocaleLayout; introduce --scroll-thumb-alpha CSS property, transitions, and .perspective-midrange utility.
Dashboard page & components
frontend/app/[locale]/dashboard/page.tsx, frontend/components/dashboard/*.tsx
Add id="stats"/scroll-mt-8; multiple UI/styling updates across AchievementBadge, AchievementsSection, ActivityHeatmapCard, ExplainedTermsCard, ProfileCard, QuizResultsSection, StatsCard (hover effects removed, icon imports adjusted, ProfileCard interactivity/role label changes, heatmap localization, key change in ExplainedTermsCard).
Header / Notifications / Nav
frontend/components/header/NotificationBell.tsx, frontend/components/header/AppMobileMenu.tsx, frontend/components/header/DesktopActions.tsx, frontend/components/header/MobileActions.tsx, frontend/components/header/UserNavDropdown.tsx, frontend/components/shop/header/CartButton.tsx, frontend/components/shared/LanguageSwitcher.tsx
Localize notification UI and relative time (Intl.RelativeTimeFormat + locale), sanitize notification types, wire NotificationBell into mobile actions, remove redundant click utility, replace HeaderButton with Link in CartButton, and replace hardcoded labels with translation keys.
Client hydration & mount gating
frontend/components/home/FloatingCode.tsx, frontend/components/theme/ThemeToggle.tsx
Replace local isMounted effects with useSyncExternalStore-based gating for client-only rendering.
Leaderboard & avatar validation
frontend/app/[locale]/leaderboard/page.tsx, frontend/components/leaderboard/AchievementPips.tsx
Stricter GitHub avatar detection via URL hostname parsing; expanded/reordered icon imports for achievement pips.
Notifications & quiz actions
frontend/actions/notifications.ts, frontend/actions/quiz.ts
Minor import reorder; quiz achievement notification message now stores achievement ID as the notification message (and added explanatory comments).
Localization files
frontend/messages/en.json, frontend/messages/pl.json, frontend/messages/uk.json
Add notification UI keys, achievement messages, language switcher and myAccount labels, dashboard profile roles, heatmap strings, and quiz labels across en/pl/uk.
Misc: imports, schema, styling, data
frontend/db/schema/index.ts, frontend/lib/user-stats.ts, frontend/data/categoryStyles.ts, various small component import reorderings
Reordered exports/imports, adjusted git category color values, and multiple small import/formatting tweaks across components.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • AM1007

"🐰
I hopped through code with nimble paws,
Touched images, scroll, and translation laws;
Notifications sing, the dashboard gleams,
ScrollWatcher guards our scrolling dreams.
v1.0.3—hip hop hooray!"

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Release v1.0.3' directly matches the PR's primary objective of releasing version 1.0.3, clearly identifying the main change across the entire changeset.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
frontend/components/dashboard/ProfileCard.tsx (1)

67-70: Hardcoded English strings in toast error messages.

The fallback strings ('Failed to update name', 'Something went wrong', 'Failed to update password') are not localized. Given this PR addresses hardcoded strings elsewhere, consider using translation keys for consistency.

♻️ Suggested localization for toast messages
-      toast.error(result.error || 'Failed to update name');
+      toast.error(result.error || t('nameUpdateError'));
     }
-  } catch {
-    toast.error('Something went wrong');
+  } catch {
+    toast.error(t('genericError'));

(Similar for handleUpdatePassword)

Also applies to: 86-89

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/components/dashboard/ProfileCard.tsx` around lines 67 - 70, Replace
hardcoded English toast messages in ProfileCard.tsx with localized translation
keys: use the existing i18n hook (e.g., useTranslation to get t) and call
toast.error(t('profile.updateNameFailed')) in handleUpdateName and
toast.error(t('profile.somethingWentWrong')) in the catch block; do the same in
handleUpdatePassword (replace its `'Failed to update password'` and catch
message with appropriate t('profile.updatePasswordFailed') /
t('profile.somethingWentWrong') keys). Ensure the file imports/uses
useTranslation and that the translation keys are added to the locale files so
the messages are not hardcoded.
frontend/components/shared/ScrollWatcher.tsx (1)

7-14: Optional: annotate timeout as | undefined and extract the debounce delay as a named constant.

let timeout: ReturnType<typeof setTimeout> is uninitialized; clearTimeout(timeout) on the very first scroll event (and during cleanup before any scroll) silently passes undefined, which works at runtime but can trip up TypeScript's strict definite-assignment analysis (TS2454). Naming the delay also makes the intent self-documenting.

♻️ Proposed refinement
+const SCROLL_DEBOUNCE_MS = 800;
+
 export function ScrollWatcher() {
   useEffect(() => {
-    let timeout: ReturnType<typeof setTimeout>;
+    let timeout: ReturnType<typeof setTimeout> | undefined;

     const onScroll = () => {
       document.documentElement.classList.add('is-scrolling');
       clearTimeout(timeout);
       timeout = setTimeout(() => {
         document.documentElement.classList.remove('is-scrolling');
-      }, 800);
+      }, SCROLL_DEBOUNCE_MS);
     };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/components/shared/ScrollWatcher.tsx` around lines 7 - 14, The
timeout variable declared in ScrollWatcher.tsx ("timeout") is uninitialized and
should be typed as possibly undefined to avoid TypeScript definite-assignment
issues; update its declaration to include "| undefined" and ensure clearTimeout
is only called with a possibly undefined value (current pattern is fine once
typed). Also extract the hard-coded 800ms into a named constant (e.g.,
SCROLL_DEBOUNCE_MS) near the top and use that constant inside the onScroll
debounce setTimeout so the delay is self-documenting; references: timeout,
onScroll, and the new SCROLL_DEBOUNCE_MS constant.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@CHANGELOG.md`:
- Around line 688-715: The CHANGELOG entry for "## [1.0.3] - 2026-02-23"
contains two separate "### Fixed" headings which should be merged; consolidate
the second "### Fixed" block (containing items like "SSR hydration mismatch in
AchievementBadge", "Header hardcoded locale issues", and "Notification rendering
consistency") into the first "### Fixed" list so there is a single "Fixed"
section under that release, preserving list ordering and Markdown formatting for
lint MD024 compliance and easier scanning.

In `@frontend/lib/user-stats.ts`:
- Line 3: Fix the import spacing in frontend/lib/user-stats.ts by updating the
named import line that references getAllSponsors and getSponsors so there is a
space after the comma (the import currently reads "import {
getAllSponsors,getSponsors } from '@/lib/about/github-sponsors';"); modify the
import for readability to separate the identifiers with a space while keeping
the same module path and names.

---

Nitpick comments:
In `@frontend/components/dashboard/ProfileCard.tsx`:
- Around line 67-70: Replace hardcoded English toast messages in ProfileCard.tsx
with localized translation keys: use the existing i18n hook (e.g.,
useTranslation to get t) and call toast.error(t('profile.updateNameFailed')) in
handleUpdateName and toast.error(t('profile.somethingWentWrong')) in the catch
block; do the same in handleUpdatePassword (replace its `'Failed to update
password'` and catch message with appropriate t('profile.updatePasswordFailed')
/ t('profile.somethingWentWrong') keys). Ensure the file imports/uses
useTranslation and that the translation keys are added to the locale files so
the messages are not hardcoded.

In `@frontend/components/shared/ScrollWatcher.tsx`:
- Around line 7-14: The timeout variable declared in ScrollWatcher.tsx
("timeout") is uninitialized and should be typed as possibly undefined to avoid
TypeScript definite-assignment issues; update its declaration to include "|
undefined" and ensure clearTimeout is only called with a possibly undefined
value (current pattern is fine once typed). Also extract the hard-coded 800ms
into a named constant (e.g., SCROLL_DEBOUNCE_MS) near the top and use that
constant inside the onScroll debounce setTimeout so the delay is
self-documenting; references: timeout, onScroll, and the new SCROLL_DEBOUNCE_MS
constant.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 16b2297 and c911e14.

⛔ Files ignored due to path filters (8)
  • assets/01-screencapture.png is excluded by !**/*.png
  • assets/02-screencapture.png is excluded by !**/*.png
  • assets/03-screencapture.png is excluded by !**/*.png
  • assets/04-screencapture.png is excluded by !**/*.png
  • assets/05-screencapture.png is excluded by !**/*.png
  • assets/08-screencapture.png is excluded by !**/*.png
  • frontend/package-lock.json is excluded by !**/package-lock.json
  • studio/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (39)
  • CHANGELOG.md
  • frontend/actions/notifications.ts
  • frontend/actions/quiz.ts
  • frontend/app/[locale]/blog/[slug]/PostDetails.tsx
  • frontend/app/[locale]/blog/category/[category]/page.tsx
  • frontend/app/[locale]/dashboard/page.tsx
  • frontend/app/[locale]/layout.tsx
  • frontend/app/[locale]/leaderboard/page.tsx
  • frontend/app/globals.css
  • frontend/components/blog/BlogCard.tsx
  • frontend/components/blog/BlogFilters.tsx
  • frontend/components/dashboard/AchievementBadge.tsx
  • frontend/components/dashboard/AchievementsSection.tsx
  • frontend/components/dashboard/ActivityHeatmapCard.tsx
  • frontend/components/dashboard/ExplainedTermsCard.tsx
  • frontend/components/dashboard/ProfileCard.tsx
  • frontend/components/dashboard/QuizResultsSection.tsx
  • frontend/components/dashboard/StatsCard.tsx
  • frontend/components/header/AppMobileMenu.tsx
  • frontend/components/header/DesktopActions.tsx
  • frontend/components/header/MobileActions.tsx
  • frontend/components/header/NotificationBell.tsx
  • frontend/components/header/UserNavDropdown.tsx
  • frontend/components/home/FloatingCode.tsx
  • frontend/components/leaderboard/AchievementPips.tsx
  • frontend/components/shared/LanguageSwitcher.tsx
  • frontend/components/shared/ScrollWatcher.tsx
  • frontend/components/shop/header/CartButton.tsx
  • frontend/components/theme/ThemeToggle.tsx
  • frontend/data/categoryStyles.ts
  • frontend/db/schema/index.ts
  • frontend/lib/blog/image.ts
  • frontend/lib/user-stats.ts
  • frontend/messages/en.json
  • frontend/messages/pl.json
  • frontend/messages/uk.json
  • frontend/next.config.ts
  • frontend/package.json
  • studio/package.json
💤 Files with no reviewable changes (1)
  • frontend/components/header/AppMobileMenu.tsx

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
CHANGELOG.md (1)

701-712: Extra blank lines between subsections in ### Changed are inconsistent with the rest of the file.

Every other ### Changed block in this changelog (e.g., v1.0.2, v1.0.1) lists subsections without blank-line separators. The blank lines between "Q&A UI", "Header & Localization", and "Dashboard UX" here are a minor inconsistency.

📝 Proposed edit
 ### Changed
 
 - Q&A UI:
   - Updated Git category tab color for stronger visual distinction from HTML
-
 - Header & Localization:
   - Translated all header UI strings (en / uk / pl)
   - Notifications now fully localized with locale-aware relative time
   - LanguageSwitcher and User menu labels localized
-
 - Dashboard UX:
   - Unified dashboard cards styling using shared `dashboard-card` class
   - Clickable profile stats with smooth scroll navigation
   - Improved avatar detection logic
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` around lines 701 - 712, The `### Changed` block contains extra
blank lines between subsections "Q&A UI", "Header & Localization", and
"Dashboard UX" that break consistency; remove the blank-line separators so each
subsection follows immediately after the previous line (matching other `###
Changed` blocks like v1.0.2/v1.0.1) while keeping the subsection headings and
their bullet lists unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@CHANGELOG.md`:
- Around line 692-697: The changelog entry lists "Improved image optimization
across blog pages and components" under the Bug Fixes section; move that bullet
from the "Fixed" list under "Blog (Sanity):" into the "### Changed" section (or
create a "Changed" subsection if one doesn't exist) so it reads as an
enhancement; locate the exact bullet "- Improved image optimization across blog
pages and components" and remove it from the "Fixed" block and add it under
"Changed" to follow Keep a Changelog conventions.

---

Nitpick comments:
In `@CHANGELOG.md`:
- Around line 701-712: The `### Changed` block contains extra blank lines
between subsections "Q&A UI", "Header & Localization", and "Dashboard UX" that
break consistency; remove the blank-line separators so each subsection follows
immediately after the previous line (matching other `### Changed` blocks like
v1.0.2/v1.0.1) while keeping the subsection headings and their bullet lists
unchanged.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c911e14 and 2b33396.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • frontend/lib/user-stats.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/lib/user-stats.ts

Comment on lines +692 to +697
- Blog (Sanity):
- Fixed images not rendering on Vercel production
- Improved image optimization across blog pages and components
- SSR hydration mismatch in AchievementBadge (client/server state sync)
- Header hardcoded locale issues
- Notification rendering consistency
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

"Improved image optimization" is an enhancement, not a bug fix — move it to ### Changed.

Per Keep a Changelog conventions (which this file explicitly follows at line 5), Fixed is exclusively for bug fixes. "Improved image optimization across blog pages and components" describes a capability improvement and belongs under ### Changed.

📝 Proposed edit
 - Blog (Sanity):
   - Fixed images not rendering on Vercel production
-  - Improved image optimization across blog pages and components
 ### Changed
 
+- Blog (Sanity):
+  - Improved image optimization across blog pages and components
+
 - Q&A UI:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Blog (Sanity):
- Fixed images not rendering on Vercel production
- Improved image optimization across blog pages and components
- SSR hydration mismatch in AchievementBadge (client/server state sync)
- Header hardcoded locale issues
- Notification rendering consistency
### Fixed
- Blog (Sanity):
- Fixed images not rendering on Vercel production
- SSR hydration mismatch in AchievementBadge (client/server state sync)
- Header hardcoded locale issues
- Notification rendering consistency
### Changed
- Blog (Sanity):
- Improved image optimization across blog pages and components
- Q&A UI:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` around lines 692 - 697, The changelog entry lists "Improved
image optimization across blog pages and components" under the Bug Fixes
section; move that bullet from the "Fixed" list under "Blog (Sanity):" into the
"### Changed" section (or create a "Changed" subsection if one doesn't exist) so
it reads as an enhancement; locate the exact bullet "- Improved image
optimization across blog pages and components" and remove it from the "Fixed"
block and add it under "Changed" to follow Keep a Changelog conventions.

@ViktorSvertoka ViktorSvertoka merged commit b90a96a into main Feb 23, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants