공지사항 admin ok

This commit is contained in:
2025-11-29 23:57:31 +09:00
parent eb7871133d
commit 109ca05e23
8 changed files with 225 additions and 59 deletions

View File

@@ -8,6 +8,7 @@ import BackArrowSvg from "@/app/svgs/backarrow";
import { getCourses, type Course } from "@/app/admin/courses/mockData";
import CloseXOSvg from "@/app/svgs/closexo";
import apiService from "@/app/lib/apiService";
import NoChangesModal from "@/app/admin/notices/NoChangesModal";
export default function LessonEditPage() {
const params = useParams();
@@ -20,7 +21,6 @@ export default function LessonEditPage() {
const vrFileInputRef = useRef<HTMLInputElement>(null);
const csvFileInputRef = useRef<HTMLInputElement>(null);
const [courses, setCourses] = useState<Course[]>([]);
const [showToast, setShowToast] = useState(false);
// 폼 상태
const [selectedCourse, setSelectedCourse] = useState<string>("");
@@ -49,6 +49,9 @@ export default function LessonEditPage() {
const [pendingFiles, setPendingFiles] = useState<File[]>([]);
const [pendingFileType, setPendingFileType] = useState<'video' | 'vr' | 'csv' | null>(null);
// 변경사항 없음 모달 상태
const [isNoChangesModalOpen, setIsNoChangesModalOpen] = useState(false);
// 원본 데이터 저장 (변경사항 비교용)
const [originalData, setOriginalData] = useState<{
title?: string;
@@ -359,16 +362,6 @@ export default function LessonEditPage() {
};
}, [isDropdownOpen]);
// 토스트 자동 닫기
useEffect(() => {
if (showToast) {
const timer = setTimeout(() => {
setShowToast(false);
}, 3000); // 3초 후 자동 닫기
return () => clearTimeout(timer);
}
}, [showToast]);
const handleBackClick = () => {
router.push(`/admin/lessons/${params.id}`);
@@ -763,7 +756,7 @@ export default function LessonEditPage() {
// 변경사항이 없으면 알림
if (Object.keys(requestBody).length === 0) {
alert('변경된 내용이 없습니다.');
setIsNoChangesModalOpen(true);
setIsSaving(false);
return;
}
@@ -771,13 +764,8 @@ export default function LessonEditPage() {
// 강좌 수정 API 호출 (PATCH /lectures/{id})
await apiService.updateLecture(params.id as string, requestBody);
// 성공 시 토스트 표시
setShowToast(true);
// 토스트 표시 후 상세 페이지로 이동 (새로고침하여 최신 데이터 표시)
setTimeout(() => {
router.push(`/admin/lessons/${params.id}?refresh=${Date.now()}`);
}, 1500);
// 성공 시 강좌 리스트로 이동 (토스트는 리스트 페이지에서 표시)
router.push('/admin/lessons?updated=true');
} catch (error) {
console.error('강좌 수정 실패:', error);
const errorMessage = error instanceof Error ? error.message : '강좌 수정 중 오류가 발생했습니다.';
@@ -1369,7 +1357,7 @@ export default function LessonEditPage() {
</div>
)}
{/* CSV 표 */}
<div className="m-[24px] border border-[#dee1e6] border-solid relative bg-white max-h-[400px] overflow-y-auto">
<div className="m-[24px] border border-[#dee1e6] border-solid relative bg-white max-h-[400px] overflow-y-auto csv-table-scroll">
<div className="content-stretch flex flex-col items-start justify-center relative size-full">
{/* 헤더 */}
<div className="bg-[#f1f8ff] content-stretch flex h-[48px] items-center overflow-clip relative shrink-0 w-full sticky top-0 z-10">
@@ -1455,23 +1443,6 @@ export default function LessonEditPage() {
</div>
</div>
{/* 강좌 수정 완료 토스트 */}
{showToast && (
<div className="fixed right-[60px] bottom-[60px] z-50">
<div className="bg-white border border-[#dee1e6] rounded-[8px] p-4 min-w-[360px] flex gap-[10px] items-center">
<div className="relative shrink-0 w-[16.667px] h-[16.667px]">
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="8.5" cy="8.5" r="8.5" fill="#384FBF"/>
<path d="M5.5 8.5L7.5 10.5L11.5 6.5" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
</svg>
</div>
<p className="text-[15px] font-medium leading-[1.5] text-[#1b2027] text-nowrap">
.
</p>
</div>
</div>
)}
{/* 파일 교체 확인 모달 */}
{isFileReplaceModalOpen && (
<div className="fixed inset-0 z-[60] flex items-center justify-center">
@@ -1517,6 +1488,12 @@ export default function LessonEditPage() {
</div>
</div>
)}
{/* 변경사항 없음 모달 */}
<NoChangesModal
open={isNoChangesModalOpen}
onClose={() => setIsNoChangesModalOpen(false)}
/>
</div>
);
}