Skip to content

Commit 42be31b

Browse files
authored
Merge pull request #21 from filecoin-project/bp/card-component
[UXIT-3441] Card component
2 parents 524e6f7 + 8895a7b commit 42be31b

File tree

3 files changed

+60
-56
lines changed

3 files changed

+60
-56
lines changed

src/components/ui/card.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { UploadProgress } from '../upload/upload-progress.tsx'
2+
import { BadgeStatus } from './badge-status.tsx'
3+
4+
type CardWrapperProps = {
5+
children: React.ReactNode
6+
}
7+
8+
type CardHeaderProps = {
9+
title: string
10+
status: UploadProgress['status']
11+
estimatedTime?: string
12+
}
13+
14+
type CardContentProps = {
15+
children: React.ReactNode
16+
}
17+
18+
function CardWrapper({ children }: CardWrapperProps) {
19+
return <div className="bg-zinc-900 p-6 rounded-lg">{children}</div>
20+
}
21+
22+
function CardHeader({ title, status }: CardHeaderProps) {
23+
return (
24+
<div className="flex items-center justify-between">
25+
<h3 className="font-medium">{title}</h3>
26+
{status !== 'in-progress' && <BadgeStatus status={status} />}
27+
</div>
28+
)
29+
}
30+
31+
function CardContent({ children }: CardContentProps) {
32+
return <div className="p-6 border border-zinc-800 rounded-md">{children}</div>
33+
}
34+
35+
export { CardWrapper, CardHeader, CardContent }

src/components/upload/upload-progress.tsx

Lines changed: 21 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useCallback } from 'react'
22
import './upload-progress.css'
3+
import { CardHeader, CardWrapper } from '../ui/card.tsx'
34

45
export interface UploadProgress {
56
step: 'creating-car' | 'uploading-car' | 'checking-readiness' | 'announcing-cids' | 'finalizing-transaction'
@@ -105,32 +106,6 @@ export default function UploadProgress({
105106
}
106107
}
107108

108-
const getStepIcon = (step: UploadProgress['step']) => {
109-
switch (step) {
110-
case 'creating-car':
111-
case 'checking-readiness':
112-
case 'uploading-car':
113-
return 'C'
114-
case 'announcing-cids':
115-
return 'I'
116-
case 'finalizing-transaction':
117-
return 'R'
118-
}
119-
}
120-
121-
const getStatusBadge = (status: UploadProgress['status']) => {
122-
switch (status) {
123-
case 'pending':
124-
return <span className="status-badge pending">Pending</span>
125-
case 'in-progress':
126-
return <span className="status-badge in-progress">In progress</span>
127-
case 'completed':
128-
return <span className="status-badge completed">Completed</span>
129-
case 'error':
130-
return <span className="status-badge error">Error</span>
131-
}
132-
}
133-
134109
return (
135110
<div className="upload-progress-container">
136111
<div className="upload-header">
@@ -157,13 +132,9 @@ export default function UploadProgress({
157132
<div className="progress-steps">
158133
{/* Combined first stage: creating-car + checking-readiness + uploading-car */}
159134
{progress.find((p) => p.step === 'creating-car') && (
160-
<div className={`progress-step ${getCombinedFirstStageStatus()}`} key="combined-upload">
161-
<div className="step-icon">{getStepIcon('creating-car')}</div>
135+
<CardWrapper>
162136
<div className="step-content">
163-
<div className="step-header">
164-
<span className="step-label">{getStepLabel('creating-car')}</span>
165-
{getStatusBadge(getCombinedFirstStageStatus())}
166-
</div>
137+
<CardHeader status={getCombinedFirstStageStatus()} title={getStepLabel('creating-car')} />
167138
{getCombinedFirstStageStatus() === 'in-progress' && (
168139
<div className="progress-bar-container">
169140
<div className="progress-bar">
@@ -173,7 +144,7 @@ export default function UploadProgress({
173144
</div>
174145
)}
175146
</div>
176-
</div>
147+
</CardWrapper>
177148
)}
178149

179150
{/* Show remaining steps individually */}
@@ -182,26 +153,24 @@ export default function UploadProgress({
182153
(step) =>
183154
step.step !== 'creating-car' && step.step !== 'checking-readiness' && step.step !== 'uploading-car'
184155
)
185-
.map((step) => (
186-
<div className={`progress-step ${step.status}`} key={step.step}>
187-
<div className="step-icon">{getStepIcon(step.step)}</div>
188-
<div className="step-content">
189-
<div className="step-header">
190-
<span className="step-label">{getStepLabel(step.step)}</span>
191-
{getStatusBadge(step.status)}
192-
</div>
193-
{step.status === 'in-progress' && (
194-
<div className="progress-bar-container">
195-
<div className="progress-bar">
196-
<div className="progress-fill" style={{ width: `${step.progress}%` }} />
156+
.map((step) => {
157+
return (
158+
<CardWrapper key={step.step}>
159+
<div className="step-content">
160+
<CardHeader status={step.status} title={getStepLabel(step.step)} />
161+
{step.status === 'in-progress' && (
162+
<div className="progress-bar-container">
163+
<div className="progress-bar">
164+
<div className="progress-fill" style={{ width: `${step.progress}%` }} />
165+
</div>
166+
<span className="progress-text">{step.progress}%</span>
197167
</div>
198-
<span className="progress-text">{step.progress}%</span>
199-
</div>
200-
)}
201-
{step.error && <div className="error-message">{step.error}</div>}
202-
</div>
203-
</div>
204-
))}
168+
)}
169+
{step.error && <div className="error-message">{step.error}</div>}
170+
</div>
171+
</CardWrapper>
172+
)
173+
})}
205174
</div>
206175
)}
207176
</div>

src/index.css

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
--color-button-brand: #086dc5;
99
--color-button-brand-disabled: #005280;
1010

11-
--color-badge-in-progress: #3b1400;
12-
--color-badge-in-progress-text: #ff8c3b;
11+
--color-badge-in-progress: #3B1400;
12+
--color-badge-in-progress-text: #FF8C3B;
1313
--color-badge-in-progress-border: #662100;
14-
15-
--color-badge-success: #001d3b;
14+
15+
--color-badge-success: #001D3B;
1616
--color-badge-success-border: #003669;
1717
}
1818

0 commit comments

Comments
 (0)