Skip to content

Commit 4ddcc16

Browse files
authored
Merge pull request #1224 from marvs8/feat/campaign-dashboard-skeleton-loading
feat(ui): add skeleton loading states to CampaignDashboard
2 parents 481d82d + acf72e2 commit 4ddcc16

2 files changed

Lines changed: 33 additions & 7 deletions

File tree

frontend/src/components/BuybackCampaign/CampaignDashboard.tsx

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { BuybackCampaignModel } from '../../types/campaign';
66
import { useProjectionRefresh } from '../../hooks/useProjectionRefresh';
77
import { campaignApi } from '../../services/campaignApi';
88
import { getTxUrl } from '../../utils/explorer';
9+
import { Skeleton } from '../UI/Skeleton';
910

1011
const BACKEND_URL = import.meta.env.VITE_BACKEND_URL ?? '';
1112

@@ -68,12 +69,37 @@ export const CampaignDashboard: React.FC<CampaignDashboardProps> = ({
6869

6970
if (loading) {
7071
return (
71-
<div className="flex items-center justify-center p-8">
72-
<div
73-
role="status"
74-
aria-label="Loading"
75-
className="animate-spin rounded-full h-12 w-12 border-b-2 border-purple-600"
76-
/>
72+
<div className="max-w-4xl mx-auto p-6 space-y-6" aria-label="Loading campaign">
73+
<div className="bg-white rounded-lg shadow-lg p-6">
74+
{/* Header row */}
75+
<div className="flex items-center justify-between mb-6">
76+
<Skeleton className="h-8" width="40%" />
77+
<Skeleton variant="rectangular" width={80} height={32} />
78+
</div>
79+
{/* Meta grid */}
80+
<div className="grid grid-cols-2 gap-4 mb-6">
81+
{[...Array(4)].map((_, i) => (
82+
<div key={i}>
83+
<Skeleton className="mb-1 h-3" width="50%" />
84+
<Skeleton width="70%" />
85+
</div>
86+
))}
87+
</div>
88+
{/* Progress bar area */}
89+
<div className="mb-6">
90+
<div className="flex justify-between mb-2">
91+
<Skeleton width={60} />
92+
<Skeleton width={30} />
93+
</div>
94+
<Skeleton variant="rectangular" height={12} />
95+
</div>
96+
{/* Steps list */}
97+
<div className="space-y-3">
98+
{[...Array(3)].map((_, i) => (
99+
<Skeleton key={i} variant="rectangular" height={64} />
100+
))}
101+
</div>
102+
</div>
77103
</div>
78104
);
79105
}

frontend/src/components/BuybackCampaign/__tests__/CampaignDashboard.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ describe('CampaignDashboard Integration Tests', () => {
8080

8181
render(<CampaignDashboard campaignId={1} />);
8282

83-
expect(screen.getByRole('status', { hidden: true })).toBeInTheDocument();
83+
expect(screen.getByLabelText('Loading campaign')).toBeInTheDocument();
8484
});
8585

8686
it('should handle fetch errors', async () => {

0 commit comments

Comments
 (0)