Skip to content

Commit ef6dd0c

Browse files
committed
refactor(ui): 경로 오류를 텍스트 상태로 단순화
공통 EmptyState 대신 콘텐츠 열에 맞는 상태 표식과 텍스트 재시도 행동을 사용합니다.
1 parent 067be31 commit ef6dd0c

2 files changed

Lines changed: 36 additions & 24 deletions

File tree

ui/RouteError.test.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@ import { render, screen } from '@testing-library/react';
33
import RouteError from './RouteState/RouteError';
44

55
describe('RouteError', () => {
6-
it('renders default error copy', () => {
6+
it('renders a route-aligned textual status without an illustration', () => {
77
render(<RouteError />);
88

9-
expect(screen.getByText('문제가 발생했습니다')).toBeInTheDocument();
9+
expect(screen.getByRole('status')).toHaveTextContent('UNAVAILABLE');
10+
expect(
11+
screen.getByRole('heading', { name: '이 페이지를 표시할 수 없습니다' })
12+
).toHaveClass('ark-route-error-title');
1013
expect(screen.getByText('잠시 후 다시 시도해 주세요.')).toBeInTheDocument();
14+
expect(screen.queryByText('⚠️')).not.toBeInTheDocument();
1115
});
1216

13-
it('calls retry callback when action is clicked', async () => {
17+
it('calls retry callback from the text action', async () => {
1418
const onRetry = vi.fn();
1519
const { getByRole } = render(
1620
<RouteError
@@ -22,6 +26,8 @@ describe('RouteError', () => {
2226

2327
await getByRole('button', { name: '다시 시도' }).click();
2428
expect(onRetry).toHaveBeenCalledTimes(1);
29+
expect(getByRole('button', { name: '다시 시도' })).toHaveClass(
30+
'ark-route-error-retry'
31+
);
2532
});
2633
});
27-

ui/RouteState/RouteError.tsx

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use client';
22

33
import { clsx } from 'clsx';
4-
import { EmptyState } from '@/ui/EmptyState';
54

65
interface RouteErrorProps {
76
title?: string;
@@ -11,30 +10,37 @@ interface RouteErrorProps {
1110
}
1211

1312
export default function RouteError({
14-
title = '문제가 발생했습니다',
13+
title = '이 페이지를 표시할 수 없습니다',
1514
description = '잠시 후 다시 시도해 주세요.',
1615
onRetry,
1716
className,
1817
}: RouteErrorProps) {
1918
return (
20-
<div
21-
className={clsx('flex min-h-96 items-center justify-center', className)}
22-
>
23-
<EmptyState
24-
icon={<span className="tossface">⚠️</span>}
25-
title={title}
26-
description={description}
27-
variant="error"
28-
action={
29-
onRetry
30-
? {
31-
label: '다시 시도',
32-
onClick: onRetry,
33-
}
34-
: undefined
35-
}
36-
/>
37-
</div>
19+
<main className={clsx('ark-route-error', className)}>
20+
<section
21+
aria-live="polite"
22+
aria-labelledby="route-error-title"
23+
className="ark-route-error-content"
24+
role="status"
25+
>
26+
<p className="ark-route-error-label">UNAVAILABLE</p>
27+
<h1 id="route-error-title" className="ark-route-error-title">
28+
{title}
29+
</h1>
30+
{description ? (
31+
<p className="ark-route-error-description">{description}</p>
32+
) : null}
33+
{onRetry ? (
34+
<button
35+
className="ark-route-error-retry"
36+
onClick={onRetry}
37+
type="button"
38+
>
39+
다시 시도
40+
</button>
41+
) : null}
42+
</section>
43+
</main>
3844
);
3945
}
4046

0 commit comments

Comments
 (0)