Skip to content

Commit 64e6eba

Browse files
authored
Merge pull request #45 from junotb/feature/2026-02-12
refactor: 로딩 공통화, lib 정리, UI 컴포넌트 개선
2 parents 5780f00 + 41944ed commit 64e6eba

34 files changed

Lines changed: 206 additions & 268 deletions

web/components.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema.json",
3+
"style": "new-york",
4+
"rsc": true,
5+
"tsx": true,
6+
"tailwind": {
7+
"config": "",
8+
"css": "src/app/globals.css",
9+
"baseColor": "neutral",
10+
"cssVariables": true,
11+
"prefix": ""
12+
},
13+
"aliases": {
14+
"components": "@/components",
15+
"utils": "@/lib/utils",
16+
"ui": "@/components/ui",
17+
"lib": "@/lib",
18+
"hooks": "@/hooks"
19+
},
20+
"iconLibrary": "lucide"
21+
}

web/eslint.config.mjs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ const compat = new FlatCompat({
1111

1212
const eslintConfig = [
1313
...compat.extends("next/core-web-vitals", "next/typescript"),
14+
{
15+
rules: {
16+
"@typescript-eslint/no-unused-vars": [
17+
"warn",
18+
{
19+
"argsIgnorePattern": "^_",
20+
"varsIgnorePattern": "^_"
21+
}
22+
]
23+
}
24+
},
1425
{
1526
ignores: [
1627
"node_modules/**",

web/src/app/admin/loading.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
"use client";
2-
3-
import Loader from "@/components/common/Loader";
1+
import LoadingFallback from "@/components/common/LoadingFallback";
42

53
export default function AdminLoading() {
6-
return (
7-
<div className="container mx-auto py-12 px-4 max-w-7xl min-h-[50vh] flex items-center justify-center">
8-
<Loader />
9-
</div>
10-
);
4+
return <LoadingFallback variant="admin" />;
115
}
Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
"use client";
2-
3-
import Loader from "@/components/common/Loader";
1+
import LoadingFallback from "@/components/common/LoadingFallback";
42

53
export default function ClassroomLoading() {
6-
return (
7-
<div className="flex-1 flex items-center justify-center bg-zinc-950 min-h-[60vh]">
8-
<Loader />
9-
</div>
10-
);
4+
return <LoadingFallback variant="classroom" />;
115
}
Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
"use client";
2-
3-
import Loader from "@/components/common/Loader";
1+
import LoadingFallback from "@/components/common/LoadingFallback";
42

53
export default function FeedbackLoading() {
6-
return (
7-
<div className="container max-w-4xl py-12 min-h-[50vh] flex items-center justify-center">
8-
<Loader />
9-
</div>
10-
);
4+
return <LoadingFallback variant="feedback" />;
115
}

web/src/app/study/loading.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
"use client";
2-
3-
import Loader from "@/components/common/Loader";
1+
import LoadingFallback from "@/components/common/LoadingFallback";
42

53
export default function StudyLoading() {
6-
return (
7-
<div className="container mx-auto py-12 px-4 max-w-4xl min-h-[50vh] flex items-center justify-center">
8-
<Loader />
9-
</div>
10-
);
4+
return <LoadingFallback variant="default" />;
115
}

web/src/app/teach/loading.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
"use client";
2-
3-
import Loader from "@/components/common/Loader";
1+
import LoadingFallback from "@/components/common/LoadingFallback";
42

53
export default function TeachLoading() {
6-
return (
7-
<div className="container mx-auto py-12 px-4 max-w-4xl min-h-[50vh] flex items-center justify-center">
8-
<Loader />
9-
</div>
10-
);
4+
return <LoadingFallback variant="default" />;
115
}

web/src/components/admin/StatCard.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
ScheduleStatusSchema,
66
} from "@/schemas/schedule/schedule-status";
77
import { UserRole, UserRoleSchema } from "@/schemas/user/user-role";
8-
import { Users, UserCheck, GraduationCap, Calendar, Clock, CheckCircle2, XCircle, AlertCircle } from "lucide-react";
8+
import { Users, UserCheck, GraduationCap, Calendar, CheckCircle2, XCircle, AlertCircle } from "lucide-react";
99
import type { LucideIcon } from "lucide-react";
1010

1111
interface StatCardProps {
@@ -32,10 +32,10 @@ function getIcon(title: UserRole | ScheduleStatus): LucideIcon {
3232
switch (status) {
3333
case "SCHEDULED":
3434
return Calendar;
35-
case "ONGOING":
36-
return Clock;
37-
case "COMPLETED":
35+
case "ATTENDED":
3836
return CheckCircle2;
37+
case "ABSENT":
38+
return AlertCircle;
3939
case "CANCELLED":
4040
return XCircle;
4141
default:

web/src/components/admin/course/CourseForm.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
CourseCreateRequestSchema,
1414
CourseUpdateRequestSchema,
1515
} from "@/schemas/course/course";
16-
import { CourseStatus, CourseStatusSchema } from "@/schemas/course/course-status";
16+
import { CourseStatus } from "@/schemas/course/course-status";
1717
import { COURSE_STATUS_LABELS } from "@/constants/course";
1818
import InputField from "@/components/common/InputField";
1919
import TextareaField from "@/components/common/TextareaField";
@@ -62,9 +62,9 @@ export default function CourseForm({
6262
onSubmit={handleSubmit((values) => {
6363
if (isCreate) {
6464
const payload: CourseCreateRequest = {
65-
title: values.title,
65+
title: values.title ?? "",
6666
description: values.description || null,
67-
status: values.status,
67+
status: values.status ?? CourseStatus.ACTIVE,
6868
};
6969
onSubmit(payload);
7070
} else {

web/src/components/admin/course/CourseListForm.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type {
55
CourseListFormValues,
66
} from "@/schemas/course/course";
77
import { CourseListRequestSchema } from "@/schemas/course/course";
8-
import { CourseStatus, CourseStatusSchema } from "@/schemas/course/course-status";
8+
import { CourseStatus } from "@/schemas/course/course-status";
99
import { COURSE_STATUS_LABELS } from "@/constants/course";
1010
import { Input } from "@/components/ui/input";
1111
import { Label } from "@/components/ui/label";
@@ -34,8 +34,10 @@ export default function CourseListForm({ onSubmit }: CourseListFormProps) {
3434
});
3535

3636
const handleFormSubmit = (data: CourseListFormValues) => {
37-
// 스키마에서 빈 문자열을 undefined로 변환하므로 그대로 전달
38-
onSubmit(data);
37+
onSubmit({
38+
title: data.title,
39+
status: data.status === "" ? undefined : data.status,
40+
});
3941
};
4042

4143
return (

0 commit comments

Comments
 (0)