Skip to content

feat: add skeleton loading UI for tracker data#246

Open
KunjalVanra wants to merge 1 commit into
GitMetricsLab:mainfrom
KunjalVanra:feature/skeleton-loading-ui
Open

feat: add skeleton loading UI for tracker data#246
KunjalVanra wants to merge 1 commit into
GitMetricsLab:mainfrom
KunjalVanra:feature/skeleton-loading-ui

Conversation

@KunjalVanra
Copy link
Copy Markdown

@KunjalVanra KunjalVanra commented May 15, 2026

✨ Changes Added

  • Replaced CircularProgress spinner with skeleton loading UI
  • Added animated shimmer table placeholders
  • Improved user experience during GitHub API fetching
  • Maintained stable table layout while loading
  • Added responsive loading placeholders using MUI Skeleton

🧪 Tested

  • Tested with Slow 3G network throttling
  • Verified loading placeholders render correctly
  • Confirmed real GitHub data replaces skeleton UI properly

📸 Preview

Screenshot (47)

@netlify
Copy link
Copy Markdown

netlify Bot commented May 15, 2026

Deploy Preview for github-spy ready!

Name Link
🔨 Latest commit d8cfba5
🔍 Latest deploy log https://app.netlify.com/projects/github-spy/deploys/6a06bc6c26bb8500087252b7
😎 Deploy Preview https://deploy-preview-246--github-spy.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
Copy Markdown
Contributor

coderabbitai Bot commented May 15, 2026

📝 Walkthrough

Walkthrough

The Tracker component's loading state UI is replaced with a skeletonized table structure. The Skeleton component is imported from Material UI, and the loading conditional renders a table paper, header, and mapped skeleton rows instead of a centered spinner.

Changes

Loading State UX Enhancement

Layer / File(s) Summary
Skeleton table loading placeholder
src/pages/Tracker/Tracker.tsx
Skeleton component is imported and integrated. The loading state conditional now renders a skeleton table (Paper container, table head with existing structure, and multiple skeleton rows) instead of a centered CircularProgress spinner.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related issues

Poem

A spinner once spun round and round,
But now a skeleton's been found!
With table rows that shimmer bright,
The loader's dressed in cleaner sight! ✨📋
Loading feels less long and sore,
When skeletons dance before! 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The PR description includes changes, testing details, and a screenshot, but does not follow the required template structure with sections like Related Issue, How Has This Been Tested, and Type of Change checkboxes. Restructure the description to follow the template: add Related Issue section (closes #XXX), separate Description section with more context, properly formatted How Has This Been Tested section, and Type of Change checkboxes to indicate this is a New feature.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: replacing the loading UI with skeleton placeholders for the tracker component.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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
Copy Markdown

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

🎉 Thank you @KunjalVanra for your contribution. Please make sure your PR follows https://github.com/GitMetricsLab/github_tracker/blob/main/CONTRIBUTING.md#-pull-request-guidelines

Copy link
Copy Markdown
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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/pages/Tracker/Tracker.tsx`:
- Around line 283-348: The loading branch that renders the placeholder rows (the
[...Array(6)].map(...) block inside TableContainer) must include the same scroll
wrapper and pagination area used in the loaded branch so layout doesn't shift;
wrap the TableContainer or the Table in the same scroll container component (the
same Box/div with the scrolling styles) and add a stub pagination component or
placeholder element matching the real pagination (e.g., same height and
structure as the TablePagination used when data is loaded) so spacing is
identical between loading and loaded states. Ensure you modify the loading
branch where TableContainer and the skeleton rows are rendered to reuse the same
scroll wrapper and pagination placeholders as the loaded branch.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3f8f2268-05e8-418d-aba2-5436863f000e

📥 Commits

Reviewing files that changed from the base of the PR and between 56e17a3 and d8cfba5.

📒 Files selected for processing (1)
  • src/pages/Tracker/Tracker.tsx

Comment on lines +283 to +348
<TableContainer component={Paper}>
<Table size="small">
<TableHead>
<TableRow>
<TableCell>Title</TableCell>
<TableCell align="center">Repository</TableCell>
<TableCell align="center">State</TableCell>
<TableCell>Created</TableCell>
</TableRow>
</TableHead>

<TableBody>
{[...Array(6)].map((_, index) => (
<TableRow key={index}>
<TableCell>
<Box display="flex" alignItems="center" gap={1}>
<Skeleton
variant="circular"
width={20}
height={20}
animation="wave"
/>

<Skeleton
variant="text"
width="80%"
height={30}
animation="wave"
/>
</Box>
</TableCell>

<TableCell align="center">
<Skeleton
variant="text"
width={100}
height={25}
animation="wave"
sx={{ mx: "auto" }}
/>
</TableCell>

<TableCell align="center">
<Skeleton
variant="rounded"
width={70}
height={25}
animation="wave"
sx={{ mx: "auto" }}
/>
</TableCell>

<TableCell>
<Skeleton
variant="text"
width={90}
height={25}
animation="wave"
/>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
) : (
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Keep loading and loaded table containers structurally consistent.

The loading branch omits the scroll wrapper and pagination area used in the loaded branch, so the page height shifts when data arrives. Add matching container/pagination placeholders to keep layout stable.

Proposed patch
-      {loading ? (
-  <TableContainer component={Paper}>
+      {loading ? (
+  <Box sx={{ maxHeight: "400px", overflowY: "auto" }}>
+  <TableContainer component={Paper}>
     <Table size="small">
@@
       <TableBody>
@@
       </TableBody>
     </Table>
+    <TablePagination
+      component="div"
+      count={0}
+      page={0}
+      onPageChange={() => {}}
+      rowsPerPage={ROWS_PER_PAGE}
+      rowsPerPageOptions={[ROWS_PER_PAGE]}
+      labelDisplayedRows={() => " "}
+      backIconButtonProps={{ disabled: true }}
+      nextIconButtonProps={{ disabled: true }}
+    />
   </TableContainer>
+  </Box>
 ) : (
📝 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
<TableContainer component={Paper}>
<Table size="small">
<TableHead>
<TableRow>
<TableCell>Title</TableCell>
<TableCell align="center">Repository</TableCell>
<TableCell align="center">State</TableCell>
<TableCell>Created</TableCell>
</TableRow>
</TableHead>
<TableBody>
{[...Array(6)].map((_, index) => (
<TableRow key={index}>
<TableCell>
<Box display="flex" alignItems="center" gap={1}>
<Skeleton
variant="circular"
width={20}
height={20}
animation="wave"
/>
<Skeleton
variant="text"
width="80%"
height={30}
animation="wave"
/>
</Box>
</TableCell>
<TableCell align="center">
<Skeleton
variant="text"
width={100}
height={25}
animation="wave"
sx={{ mx: "auto" }}
/>
</TableCell>
<TableCell align="center">
<Skeleton
variant="rounded"
width={70}
height={25}
animation="wave"
sx={{ mx: "auto" }}
/>
</TableCell>
<TableCell>
<Skeleton
variant="text"
width={90}
height={25}
animation="wave"
/>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
) : (
<Box sx={{ maxHeight: "400px", overflowY: "auto" }}>
<TableContainer component={Paper}>
<Table size="small">
<TableHead>
<TableRow>
<TableCell>Title</TableCell>
<TableCell align="center">Repository</TableCell>
<TableCell align="center">State</TableCell>
<TableCell>Created</TableCell>
</TableRow>
</TableHead>
<TableBody>
{[...Array(6)].map((_, index) => (
<TableRow key={index}>
<TableCell>
<Box display="flex" alignItems="center" gap={1}>
<Skeleton
variant="circular"
width={20}
height={20}
animation="wave"
/>
<Skeleton
variant="text"
width="80%"
height={30}
animation="wave"
/>
</Box>
</TableCell>
<TableCell align="center">
<Skeleton
variant="text"
width={100}
height={25}
animation="wave"
sx={{ mx: "auto" }}
/>
</TableCell>
<TableCell align="center">
<Skeleton
variant="rounded"
width={70}
height={25}
animation="wave"
sx={{ mx: "auto" }}
/>
</TableCell>
<TableCell>
<Skeleton
variant="text"
width={90}
height={25}
animation="wave"
/>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
<TablePagination
component="div"
count={0}
page={0}
onPageChange={() => {}}
rowsPerPage={ROWS_PER_PAGE}
rowsPerPageOptions={[ROWS_PER_PAGE]}
labelDisplayedRows={() => " "}
backIconButtonProps={{ disabled: true }}
nextIconButtonProps={{ disabled: true }}
/>
</TableContainer>
</Box>
) : (
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/Tracker/Tracker.tsx` around lines 283 - 348, The loading branch
that renders the placeholder rows (the [...Array(6)].map(...) block inside
TableContainer) must include the same scroll wrapper and pagination area used in
the loaded branch so layout doesn't shift; wrap the TableContainer or the Table
in the same scroll container component (the same Box/div with the scrolling
styles) and add a stub pagination component or placeholder element matching the
real pagination (e.g., same height and structure as the TablePagination used
when data is loaded) so spacing is identical between loading and loaded states.
Ensure you modify the loading branch where TableContainer and the skeleton rows
are rendered to reuse the same scroll wrapper and pagination placeholders as the
loaded branch.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant