Skip to content

feat: implement contextual skeleton loading states for perceived performance (#403)#418

Open
shoaib050326 wants to merge 1 commit into
rinafcode:mainfrom
shoaib050326:fix/issue-403-skeleton-loading-states
Open

feat: implement contextual skeleton loading states for perceived performance (#403)#418
shoaib050326 wants to merge 1 commit into
rinafcode:mainfrom
shoaib050326:fix/issue-403-skeleton-loading-states

Conversation

@shoaib050326
Copy link
Copy Markdown

Summary

Replaces generic ActivityIndicator spinners with content-aware skeleton screens that match each screen's final UI layout, improving perceived performance per issue #403.

Changes

  • 5 new skeleton components: CourseViewerSkeleton, QuizSkeleton, SettingsSkeleton, SubscriptionSkeleton, DataGridSkeleton — each mirrors its screen's structural layout using the shared Skeleton primitive
  • 4 Suspense fallbacks updated: course-viewer, quiz, settings — now render shapely skeletons instead of spinning circles
  • Profile screen: Suspense fallback set to null since MobileProfile self-handles loading via its isLoading prop + built-in skeleton
  • Component-level loaders: MobileCourseViewer, SubscriptionManager, AdvancedDataGrid now use skeletons instead of ActivityIndicator+text
  • Bug fix: app/quiz.tsx had a duplicate MobileQuizManager declaration and an unimported lazyScreen() call — cleaned up
  • Cleanup: Removed unused ActivityIndicator imports and orphaned centerContent/loadingText/loadingContainer styles
  • Barrel exports: Added new skeletons + CourseCardSkeleton (was used in screens but not exported) to src/components/mobile/index.ts

Testing

  • 8 new tests in tests/components/SkeletonScreens.test.tsx validating all screen skeletons render
  • Updated AdvancedDataGrid.test.tsx loading assertion from ActivityIndicatorAnimated.View
  • All 142 component tests pass; all 502 passing project tests continue to pass

Risk / Rollback

Low risk — purely UI loading states. Rollback: revert to main, the ActivityIndicator paths still exist structurally in LazyScreen.tsx (untouched utility).

Closes #403

…ormance (rinafcode#403)

Replace generic ActivityIndicator spinners with content-aware skeleton
screens that match each screen's final UI layout:
- CourseViewerSkeleton, QuizSkeleton, SettingsSkeleton,
  SubscriptionSkeleton, DataGridSkeleton
- Updated Suspense fallbacks and component-level loaders in
  course-viewer, quiz, settings, profile, MobileCourseViewer,
  SubscriptionManager, AdvancedDataGrid
- Fixed duplicate MobileQuizManager declaration bug in app/quiz.tsx
- Cleaned up unused imports and orphaned styles
- Added 8 new tests in SkeletonScreens.test.tsx

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
@drips-wave
Copy link
Copy Markdown

drips-wave Bot commented May 27, 2026

@shoaib050326 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

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.

Implement contextual empty/loading states for faster perceived performance

1 participant