Skip to content

Commit 925b61d

Browse files
committed
design: 로딩스피너 추가
1 parent a773baf commit 925b61d

File tree

6 files changed

+73
-14
lines changed

6 files changed

+73
-14
lines changed

src/components/addTask/taskbar.module.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
.add_btn {
2727
width: 168px;
2828
background-color: var(--slate-200);
29+
color: var(--slate-900);
2930
border: 2px solid var(--slate-900);
3031
border-radius: 24px;
3132
box-shadow: 4px 3px var(--slate-900);

src/components/addTask/taskbar.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { ChangeEvent, useActionState, useEffect, useState } from "react";
66
import plus from "../../../public/plus.svg";
77
import plusWhite from "../../../public/plus_white.svg";
88
import addTaskAction from "@/actions/add-task.action";
9+
import Spinner from "../loading/spinner";
910

1011
export default function Taskbar() {
1112
const [task, setTask] = useState("");
@@ -40,13 +41,19 @@ export default function Taskbar() {
4041
}
4142
disabled={isPending ? true : false}
4243
>
43-
<Image
44-
src={task !== "" ? plusWhite : plus}
45-
width={16}
46-
height={16}
47-
alt="추가이미지"
48-
/>{" "}
49-
추가하기
44+
{task && isPending ? (
45+
<Spinner />
46+
) : (
47+
<>
48+
<Image
49+
src={task !== "" ? plusWhite : plus}
50+
width={16}
51+
height={16}
52+
alt="추가이미지"
53+
/>
54+
추가하기
55+
</>
56+
)}
5057
</button>
5158
</div>
5259
</form>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
.spinnerContainer {
2+
display: flex;
3+
justify-content: center;
4+
align-items: center;
5+
width: 100%;
6+
height: 100%;
7+
}
8+
9+
.spinner {
10+
/* 원형 모양을 만들기 위해 border-radius를 50%로 설정 */
11+
border-radius: 50%;
12+
13+
/* 테두리 두께와 스타일 설정 */
14+
border-width: 4px;
15+
border-style: solid;
16+
17+
/* spin이라는 이름의 애니메이션을 1초 동안, 선형으로, 무한 반복 */
18+
animation: spin 1s linear infinite;
19+
}
20+
21+
/* 회전 애니메이션 정의 */
22+
@keyframes spin {
23+
from {
24+
transform: rotate(0deg);
25+
}
26+
to {
27+
transform: rotate(360deg);
28+
}
29+
}

src/components/loading/spinner.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import styles from "./spinner.module.css";
2+
3+
/**
4+
* 로딩 스피너 컴포넌트
5+
* @param {string} size - 스피너의 크기 (e.g., '50px')
6+
* @param {string} color - 스피너의 색상 (e.g., '#007bff')
7+
*/
8+
export default function Spinner({ size = "30px", color = "#7c3aed" }) {
9+
// 인라인 스타일을 사용하여 props로 받은 크기와 색상을 적용
10+
const spinnerStyle = {
11+
width: size,
12+
height: size,
13+
// 테두리의 기본 색상은 연한 회색으로 설정
14+
borderColor: "#e0e0e0",
15+
// 회전하는 부분의 색상을 props로 받은 color로 설정
16+
borderTopColor: color,
17+
};
18+
19+
return (
20+
<div className={styles.spinnerContainer}>
21+
<div className={styles.spinner} style={spinnerStyle}></div>
22+
</div>
23+
);
24+
}

src/components/todo/check-list.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1+
"use client";
2+
13
import Image from "next/image";
24
import styles from "./check-list.module.css";
35
import notCheck from "../../../public/not_check.svg";
46
import checkedIcon from "../../../public/checked.svg";
57

68
export default function CheckList({
9+
id,
710
name,
811
isCompleted,
912
}: {
13+
id: number;
1014
name: string;
1115
isCompleted: boolean;
1216
}) {

src/components/todo/todo-section.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@ export default function TodoSection({
1414
<>
1515
<Image src={img} width={101} height={36} alt={imgAlt} />
1616
{list.length > 0 ? (
17-
list.map((todo) => (
18-
<CheckList
19-
key={todo.id}
20-
name={todo.name}
21-
isCompleted={todo.isCompleted}
22-
/>
23-
))
17+
list.map((todo) => <CheckList key={todo.id} {...todo} />)
2418
) : (
2519
<div className={styles.empty}>
2620
<Image src={emptyImg} width={240} height={240} alt="리스트 없음" />

0 commit comments

Comments
 (0)