Skip to content

[jules] enhance: Add complete skeleton loading for GroupDetails page#297

Open
Devasy wants to merge 1 commit intomainfrom
enhance/group-details-skeleton-5677304916246418878
Open

[jules] enhance: Add complete skeleton loading for GroupDetails page#297
Devasy wants to merge 1 commit intomainfrom
enhance/group-details-skeleton-5677304916246418878

Conversation

@Devasy
Copy link
Owner

@Devasy Devasy commented Mar 6, 2026

Implemented a comprehensive skeleton loading state for the GroupDetails page to replace the generic PageLoader. This prevents jarring layout shifts and provides a more polished user experience during data fetching.

Key Features:

  • Replaced simple PageLoader with a full skeleton layout matching the page's exact structure (Hero, summary cards, navigation tabs, and expenses list).
  • Full dual-theme support seamlessly adapting to both Glassmorphism and Neobrutalism UI modes.
  • Added smooth, synchronized framer-motion pulsing animations.
  • Verified correct implementation via Playwright frontend test artificially delaying API responses.
  • Updated project tracking files (todo.md, changelog.md, knowledge.md) with completion details and patterns.

PR created automatically by Jules for task 5677304916246418878 started by @Devasy23

Summary by CodeRabbit

  • New Features
    • Implemented skeleton loading for the group details page with smooth animations, providing a better visual experience during content loading.
    • Added theme-aware design support, ensuring skeleton loading works seamlessly with both available themes.

Co-authored-by: Devasy23 <110348311+Devasy23@users.noreply.github.com>
@Devasy Devasy requested a review from vrajpatelll as a code owner March 6, 2026 20:01
@google-labs-jules
Copy link
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@netlify
Copy link

netlify bot commented Mar 6, 2026

Deploy Preview for split-but-wiser ready!

Name Link
🔨 Latest commit dcb88ed
🔍 Latest deploy log https://app.netlify.com/projects/split-but-wiser/deploys/69ab328082573900081b693c
😎 Deploy Preview https://deploy-preview-297--split-but-wiser.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 Mar 6, 2026

Walkthrough

This pull request introduces skeleton loading for the GroupDetails page. A new GroupDetailsSkeleton component is created with framer-motion animations and dual-theme support, integrated into GroupDetails.tsx to replace the basic loading placeholder, and documented in the knowledge base and changelog.

Changes

Cohort / File(s) Summary
Documentation Updates
.Jules/changelog.md, .Jules/knowledge.md, .Jules/todo.md
Added Web Skeleton Loading entry to changelog, documented the complete skeleton loading pattern implementation in knowledge base, and recorded the completed UX task for GroupDetails skeleton loading.
Skeleton Loading Implementation
web/components/skeletons/GroupDetailsSkeleton.tsx
New React component implementing skeleton UI for GroupDetails with multi-section structure (hero, totals cards, navigation pills, content area), framer-motion animations, and conditional theming (NEOBRUTALISM vs default).
Page Integration
web/pages/GroupDetails.tsx
Updated to import and utilize GroupDetailsSkeleton component, replacing basic Skeleton placeholder during data loading state.

Suggested reviewers

  • vrajpatelll
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding complete skeleton loading for the GroupDetails page, which is the primary focus of all modifications across multiple files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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


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.

@codecov
Copy link

codecov bot commented Mar 6, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (main@9404621). Learn more about missing BASE report.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #297   +/-   ##
=======================================
  Coverage        ?   63.55%           
=======================================
  Files           ?       21           
  Lines           ?     2456           
  Branches        ?      254           
=======================================
  Hits            ?     1561           
  Misses          ?      831           
  Partials        ?       64           
Components Coverage Δ
Authentication System 71.35% <ø> (?)
Expense Management 70.15% <ø> (?)
Group Management 73.78% <ø> (?)
User Management 97.16% <ø> (?)
Backend Core 70.78% <ø> (?)
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.Jules/todo.md:
- Around line 60-66: The completed skeleton loading task for the web should be
moved out of the "### Mobile" section into the "### Web" section; locate the
checklist entry referencing web/pages/GroupDetails.tsx and
web/components/skeletons/GroupDetailsSkeleton.tsx (the lines showing "- [x]
**[ux]** Complete skeleton loading for GroupDetails page" and its metadata) and
cut/paste it so it appears with the other completed Web tasks (place it after
the last completed Web task and before the "### Mobile" header) to keep
platform-specific tasks grouped correctly.

In `@web/components/skeletons/GroupDetailsSkeleton.tsx`:
- Around line 31-38: The skeleton currently renders 6 avatar placeholders (five
in the map plus one extra) which doesn't match GroupDetails hero; update the JSX
in GroupDetailsSkeleton.tsx so it renders the same elements as the real hero:
five member avatar Skeletons (the existing map), one overflow indicator
Skeleton, and one Settings-button Skeleton (total 7). Keep the same Skeleton
component, className logic and THEMES.NEOBRUTALISM conditional for border color
so the placeholders visually match the real UI.
- Line 1: Remove the unused React import from GroupDetailsSkeleton by deleting
the top-level "import React from 'react';" statement in the GroupDetailsSkeleton
component file; ensure there are no other direct React.* references (hooks or
types) in the file—if there are, keep or replace them with named imports (e.g.,
import { useState } from 'react')—otherwise remove the import to rely on the new
JSX transform.
- Around line 13-18: The skeleton's hero in GroupDetailsSkeleton.tsx uses fixed
heights (h-48 / h-64 on the motion.div) which don't match the content-driven
Immersive Header in GroupDetails.tsx (large text sizes text-5xl/text-7xl and
padding p-8/p-12), causing layout shift; fix by either removing the fixed
h-48/h-64 from the motion.div and making it content-driven (use h-auto/min-h
plus matching padding/typography spacing) so it mirrors the Immersive Header
rendering, or apply the same fixed height/padding/typography constraints to the
Immersive Header container so both components (GroupDetailsSkeleton's motion.div
and the Immersive Header in GroupDetails.tsx) share identical sizing and
spacing.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 771e0628-5bae-473a-a88b-a6acf13ad4fc

📥 Commits

Reviewing files that changed from the base of the PR and between 9404621 and dcb88ed.

⛔ Files ignored due to path filters (1)
  • web/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (5)
  • .Jules/changelog.md
  • .Jules/knowledge.md
  • .Jules/todo.md
  • web/components/skeletons/GroupDetailsSkeleton.tsx
  • web/pages/GroupDetails.tsx

Comment on lines +60 to +66
- [x] **[ux]** Complete skeleton loading for GroupDetails page
- Completed: 2026-03-06
- Files modified: `web/pages/GroupDetails.tsx`, `web/components/skeletons/GroupDetailsSkeleton.tsx`
- Context: Replace ActivityIndicator with skeleton layout matching content
- Impact: Better loading experience, less jarring layout shift
- Size: ~120 lines

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

Task entry placed under wrong section.

This Web skeleton loading task is placed under the "### Mobile" section (which starts at line 51), but the affected files are in web/. It should be placed under the "### Web" section (starting at line 11) with the other completed web tasks.

📝 Suggested fix: Move entry under Web section

Move lines 60-66 to after line 49 (after the last completed Web task) and before the "### Mobile" section.

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

In @.Jules/todo.md around lines 60 - 66, The completed skeleton loading task for
the web should be moved out of the "### Mobile" section into the "### Web"
section; locate the checklist entry referencing web/pages/GroupDetails.tsx and
web/components/skeletons/GroupDetailsSkeleton.tsx (the lines showing "- [x]
**[ux]** Complete skeleton loading for GroupDetails page" and its metadata) and
cut/paste it so it appears with the other completed Web tasks (place it after
the last completed Web task and before the "### Mobile" header) to keep
platform-specific tasks grouped correctly.

@@ -0,0 +1,136 @@
import React from 'react';
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Unused React import.

With React 19 and the new JSX transform, the React import is no longer necessary when you're only using JSX without explicit React.* calls.

♻️ Suggested cleanup
-import React from 'react';
 import { useTheme } from '../../contexts/ThemeContext';
📝 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
import React from 'react';
import { useTheme } from '../../contexts/ThemeContext';
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/components/skeletons/GroupDetailsSkeleton.tsx` at line 1, Remove the
unused React import from GroupDetailsSkeleton by deleting the top-level "import
React from 'react';" statement in the GroupDetailsSkeleton component file;
ensure there are no other direct React.* references (hooks or types) in the
file—if there are, keep or replace them with named imports (e.g., import {
useState } from 'react')—otherwise remove the import to rely on the new JSX
transform.

Comment on lines +13 to +18
<motion.div
initial={{ y: -20, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
className={`relative overflow-hidden rounded-3xl h-48 md:h-64 ${
style === THEMES.NEOBRUTALISM ? 'border-2 border-black shadow-[8px_8px_0px_0px_rgba(0,0,0,1)]' : 'border border-white/10 shadow-2xl'
}`}
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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify the actual hero section's height constraints in GroupDetails.tsx
rg -n 'Immersive Header|motion\.div' web/pages/GroupDetails.tsx | head -20
# Check for h-48, h-64, or min-h classes in the hero section
sed -n '571,624p' web/pages/GroupDetails.tsx | rg 'h-\d+|min-h'

Repository: Devasy/splitwiser

Length of output: 1467


🏁 Script executed:

# Read the full Immersive Header section
sed -n '570,625p' web/pages/GroupDetails.tsx

Repository: Devasy/splitwiser

Length of output: 4108


🏁 Script executed:

# Also read the GroupDetailsSkeleton file to see the skeleton structure
cat -n web/components/skeletons/GroupDetailsSkeleton.tsx

Repository: Devasy/splitwiser

Length of output: 8068


Hero skeleton height (h-48/h-64) does not match actual component height, causing potential layout shift.

The skeleton constrains the hero to fixed heights with h-full, but the actual Immersive Header in GroupDetails.tsx (lines 571-624) is content-driven with no height constraints. Given the large text (text-5xl md:text-7xl), padding (p-8 md:p-12), and avatars, the actual component will likely exceed these fixed dimensions when content loads, creating visible layout shift.

Consider either:

  1. Adding matching height constraints to the actual hero section, or
  2. Making the skeleton height content-driven to match the actual component
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/components/skeletons/GroupDetailsSkeleton.tsx` around lines 13 - 18, The
skeleton's hero in GroupDetailsSkeleton.tsx uses fixed heights (h-48 / h-64 on
the motion.div) which don't match the content-driven Immersive Header in
GroupDetails.tsx (large text sizes text-5xl/text-7xl and padding p-8/p-12),
causing layout shift; fix by either removing the fixed h-48/h-64 from the
motion.div and making it content-driven (use h-auto/min-h plus matching
padding/typography spacing) so it mirrors the Immersive Header rendering, or
apply the same fixed height/padding/typography constraints to the Immersive
Header container so both components (GroupDetailsSkeleton's motion.div and the
Immersive Header in GroupDetails.tsx) share identical sizing and spacing.

Comment on lines +31 to +38
{[1, 2, 3, 4, 5].map((i) => (
<Skeleton
key={i}
className={`w-12 h-12 rounded-full border-4 ${style === THEMES.NEOBRUTALISM ? 'border-black' : 'border-indigo-600'}`}
/>
))}
<Skeleton className={`w-12 h-12 rounded-full border-4 ${style === THEMES.NEOBRUTALISM ? 'border-black' : 'border-indigo-600'}`} />
</div>
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Minor: Avatar count mismatch with actual UI.

The skeleton renders 6 avatar placeholders (5 in loop + 1 outside), but the actual GroupDetails hero renders up to 5 member avatars + an overflow indicator + a Settings button (potentially 7 elements). This is a minor visual discrepancy during the skeleton-to-content transition.

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

In `@web/components/skeletons/GroupDetailsSkeleton.tsx` around lines 31 - 38, The
skeleton currently renders 6 avatar placeholders (five in the map plus one
extra) which doesn't match GroupDetails hero; update the JSX in
GroupDetailsSkeleton.tsx so it renders the same elements as the real hero: five
member avatar Skeletons (the existing map), one overflow indicator Skeleton, and
one Settings-button Skeleton (total 7). Keep the same Skeleton component,
className logic and THEMES.NEOBRUTALISM conditional for border color so the
placeholders visually match the real UI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant