Files
xrlms/src/app/instructor/courses/page.tsx
2025-11-28 21:54:39 +09:00

750 lines
30 KiB
TypeScript

'use client';
import { useEffect, useState, useMemo } from 'react';
import { useRouter } from 'next/navigation';
import ChevronDownSvg from '../../svgs/chevrondownsvg';
// 드롭다운 아이콘 컴포넌트
function ArrowDownIcon({ className }: { className?: string }) {
return (
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path
d="M4 6L8 10L12 6"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
// 검색 아이콘 컴포넌트
function SearchIcon({ className }: { className?: string }) {
return (
<svg
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path
d="M9 17C13.4183 17 17 13.4183 17 9C17 4.58172 13.4183 1 9 1C4.58172 1 1 4.58172 1 9C1 13.4183 4.58172 17 9 17Z"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M19 19L14.65 14.65"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
// 태그 컴포넌트
function StatusTag({ text, type = 'default', color = 'primary' }: { text: string; type?: 'default' | 'emphasis'; color?: 'primary' | 'gray' }) {
if (type === 'default' && color === 'primary') {
return (
<div className="inline-flex items-center justify-center h-[20px] px-[4px] rounded-[4px] bg-[#ecf0ff]">
<span className="text-[13px] font-semibold leading-[1.4] text-[#384fbf] whitespace-nowrap">
{text}
</span>
</div>
);
}
if (type === 'default' && color === 'gray') {
return (
<div className="inline-flex items-center justify-center h-[20px] px-[4px] rounded-[4px] bg-[#f1f3f5]">
<span className="text-[13px] font-semibold leading-[1.4] text-[#4c5561] whitespace-nowrap">
{text}
</span>
</div>
);
}
return (
<div className="inline-flex items-center justify-center h-[20px] px-[4px] rounded-[4px] bg-[#ecf0ff]">
<span className="text-[13px] font-semibold leading-[1.4] text-[#384fbf] whitespace-nowrap">
{text}
</span>
</div>
);
}
type LearnerProgress = {
id: string;
courseName: string;
lessonName: string;
learnerName: string;
enrollmentDate: string;
lastStudyDate: string;
progressRate: number;
hasSubmitted: boolean;
score: number | null;
isCompleted: boolean;
};
export default function InstructorCoursesPage() {
const router = useRouter();
const [userRole, setUserRole] = useState<string>('');
const [isLoading, setIsLoading] = useState(true);
const [currentPage, setCurrentPage] = useState(1);
// 필터 상태
const [selectedCourse, setSelectedCourse] = useState<string>('all');
const [selectedSubmissionStatus, setSelectedSubmissionStatus] = useState<string>('all');
const [selectedCompletionStatus, setSelectedCompletionStatus] = useState<string>('all');
const [searchQuery, setSearchQuery] = useState<string>('');
// 드롭다운 열림 상태
const [isCourseDropdownOpen, setIsCourseDropdownOpen] = useState(false);
const [isSubmissionDropdownOpen, setIsSubmissionDropdownOpen] = useState(false);
const [isCompletionDropdownOpen, setIsCompletionDropdownOpen] = useState(false);
// 데이터
const [courses, setCourses] = useState<{ id: string; name: string }[]>([]);
const [learnerProgress, setLearnerProgress] = useState<LearnerProgress[]>([]);
const ITEMS_PER_PAGE = 10;
// 사용자 정보 및 권한 확인
useEffect(() => {
let isMounted = true;
async function fetchUserInfo() {
try {
const localStorageToken = localStorage.getItem('token');
const cookieToken = document.cookie
.split('; ')
.find(row => row.startsWith('token='))
?.split('=')[1];
const token = localStorageToken || cookieToken;
if (!token) {
router.push('/login');
return;
}
const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL
? `${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/me`
: 'https://hrdi.coconutmeet.net/auth/me';
const response = await fetch(apiUrl, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
});
if (!response.ok) {
if (response.status === 401) {
localStorage.removeItem('token');
document.cookie = 'token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
if (isMounted) {
router.push('/login');
}
}
return;
}
const data = await response.json();
if (isMounted) {
const role = data.role || data.userRole || '';
setUserRole(role);
// admin이 아니면 접근 불가
if (role !== 'ADMIN' && role !== 'admin') {
router.push('/');
return;
}
}
} catch (error) {
console.error('사용자 정보 조회 오류:', error);
if (isMounted) {
router.push('/login');
}
}
}
fetchUserInfo();
return () => {
isMounted = false;
};
}, [router]);
// 교육 과정 목록 가져오기
useEffect(() => {
async function fetchCourses() {
try {
const token = localStorage.getItem('token') || document.cookie
.split('; ')
.find(row => row.startsWith('token='))
?.split('=')[1];
const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL
? `${process.env.NEXT_PUBLIC_API_BASE_URL}/subjects`
: 'https://hrdi.coconutmeet.net/subjects';
const response = await fetch(apiUrl, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
...(token && { Authorization: `Bearer ${token}` }),
},
});
if (response.ok) {
const data = await response.json();
const coursesArray = Array.isArray(data) ? data : (data.items || data.courses || data.data || []);
setCourses(coursesArray.map((item: any) => ({
id: String(item.id || item.subjectId || ''),
name: item.courseName || item.name || item.subjectName || '',
})));
}
} catch (error) {
console.error('교육 과정 목록 조회 오류:', error);
}
}
fetchCourses();
}, []);
// 학습자 진행 상황 데이터 (더미 데이터 - 실제 API로 교체 필요)
useEffect(() => {
async function fetchLearnerProgress() {
try {
setIsLoading(true);
// TODO: 실제 API 호출로 교체
// 현재는 더미 데이터 사용
const dummyData: LearnerProgress[] = [
{
id: '1',
courseName: '방사선 관리',
lessonName: '{강좌명}',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: true,
score: 100,
isCompleted: true,
},
{
id: '2',
courseName: '방사선 관리',
lessonName: '{강좌명}',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: true,
score: 100,
isCompleted: true,
},
{
id: '3',
courseName: '방사선 관리',
lessonName: '{강좌명}',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: true,
score: 100,
isCompleted: true,
},
{
id: '4',
courseName: '원자로 운전 및 계통',
lessonName: '6. 원자로 시동, 운전 및 정지 절차',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: true,
score: 60,
isCompleted: true,
},
{
id: '5',
courseName: '방사선 관리',
lessonName: '{강좌명}',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: true,
score: 30,
isCompleted: false,
},
{
id: '6',
courseName: '방사선 관리',
lessonName: '{강좌명}',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: true,
score: 30,
isCompleted: false,
},
{
id: '7',
courseName: '방사선 관리',
lessonName: '{강좌명}',
learnerName: '김하늘',
enrollmentDate: '2025-09-10',
lastStudyDate: '2025-09-10',
progressRate: 100,
hasSubmitted: false,
score: null,
isCompleted: false,
},
];
setLearnerProgress(dummyData);
} catch (error) {
console.error('학습자 진행 상황 조회 오류:', error);
} finally {
setIsLoading(false);
}
}
fetchLearnerProgress();
}, []);
// 필터링된 데이터
const filteredData = useMemo(() => {
return learnerProgress.filter((item) => {
// 교육 과정 필터
if (selectedCourse !== 'all' && item.courseName !== selectedCourse) {
return false;
}
// 문제 제출 여부 필터
if (selectedSubmissionStatus === 'submitted' && !item.hasSubmitted) {
return false;
}
if (selectedSubmissionStatus === 'not-submitted' && item.hasSubmitted) {
return false;
}
// 수료 여부 필터
if (selectedCompletionStatus === 'completed' && !item.isCompleted) {
return false;
}
if (selectedCompletionStatus === 'not-completed' && item.isCompleted) {
return false;
}
// 검색어 필터
if (searchQuery && !item.learnerName.toLowerCase().includes(searchQuery.toLowerCase())) {
return false;
}
return true;
});
}, [learnerProgress, selectedCourse, selectedSubmissionStatus, selectedCompletionStatus, searchQuery]);
// 페이지네이션
const totalPages = Math.ceil(filteredData.length / ITEMS_PER_PAGE);
const paginatedData = useMemo(() => {
const startIndex = (currentPage - 1) * ITEMS_PER_PAGE;
const endIndex = startIndex + ITEMS_PER_PAGE;
return filteredData.slice(startIndex, endIndex);
}, [filteredData, currentPage]);
// 드롭다운 외부 클릭 감지
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
const target = event.target as HTMLElement;
if (!target.closest('.dropdown-container')) {
setIsCourseDropdownOpen(false);
setIsSubmissionDropdownOpen(false);
setIsCompletionDropdownOpen(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
return (
<div className="bg-white min-h-screen flex flex-col">
<div className="flex-1 max-w-[1440px] w-full mx-auto px-0">
<div className="flex flex-col gap-[10px] h-[100px] items-start px-[32px]">
<h1 className="text-[24px] font-bold leading-[1.5] text-[#1b2027]">
</h1>
</div>
<div className="flex flex-col gap-[16px] px-[32px] py-[32px]">
{/* 필터 및 검색 영역 */}
<div className="flex items-end justify-between gap-[16px]">
<div className="flex gap-[8px] items-end">
{/* 교육 과정 드롭다운 */}
<div className="flex flex-col gap-[4px] relative dropdown-container">
<label className="text-[14px] font-semibold leading-[1.5] text-[#6c7682]">
</label>
<div className="relative">
<button
type="button"
onClick={() => {
setIsCourseDropdownOpen(!isCourseDropdownOpen);
setIsSubmissionDropdownOpen(false);
setIsCompletionDropdownOpen(false);
}}
className="bg-white border border-[#dee1e6] rounded-[8px] h-[40px] px-[12px] py-[6px] flex items-center justify-between gap-[8px] w-[400px]"
>
<span className="text-[15px] font-normal leading-[1.5] text-[#6c7682] flex-1 text-left">
{selectedCourse === 'all' ? '선택 안함' : courses.find(c => c.id === selectedCourse)?.name || '선택 안함'}
</span>
<ArrowDownIcon className="size-[16px] text-[#6c7682] shrink-0" />
</button>
{isCourseDropdownOpen && (
<div className="absolute top-full left-0 mt-1 bg-white border border-[#dee1e6] rounded-[8px] shadow-lg z-50 w-[400px] max-h-[200px] overflow-y-auto">
<button
type="button"
onClick={() => {
setSelectedCourse('all');
setIsCourseDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
{courses.map((course) => (
<button
key={course.id}
type="button"
onClick={() => {
setSelectedCourse(course.name);
setIsCourseDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
{course.name}
</button>
))}
</div>
)}
</div>
</div>
{/* 문제 제출 여부 드롭다운 */}
<div className="flex flex-col gap-[4px] relative dropdown-container">
<label className="text-[14px] font-semibold leading-[1.5] text-[#6c7682]">
</label>
<div className="relative">
<button
type="button"
onClick={() => {
setIsSubmissionDropdownOpen(!isSubmissionDropdownOpen);
setIsCourseDropdownOpen(false);
setIsCompletionDropdownOpen(false);
}}
className="bg-white border border-[#dee1e6] rounded-[8px] h-[40px] px-[12px] py-[6px] flex items-center justify-between gap-[8px] w-[190px]"
>
<span className="text-[15px] font-normal leading-[1.5] text-[#6c7682] flex-1 text-left">
{selectedSubmissionStatus === 'all' ? '모든 상태' : selectedSubmissionStatus === 'submitted' ? '제출' : '미제출'}
</span>
<ArrowDownIcon className="size-[16px] text-[#6c7682] shrink-0" />
</button>
{isSubmissionDropdownOpen && (
<div className="absolute top-full left-0 mt-1 bg-white border border-[#dee1e6] rounded-[8px] shadow-lg z-50 w-[190px]">
<button
type="button"
onClick={() => {
setSelectedSubmissionStatus('all');
setIsSubmissionDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
<button
type="button"
onClick={() => {
setSelectedSubmissionStatus('submitted');
setIsSubmissionDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
<button
type="button"
onClick={() => {
setSelectedSubmissionStatus('not-submitted');
setIsSubmissionDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
</div>
)}
</div>
</div>
{/* 수료 여부 드롭다운 */}
<div className="flex flex-col gap-[4px] relative dropdown-container">
<label className="text-[14px] font-semibold leading-[1.5] text-[#6c7682]">
</label>
<div className="relative">
<button
type="button"
onClick={() => {
setIsCompletionDropdownOpen(!isCompletionDropdownOpen);
setIsCourseDropdownOpen(false);
setIsSubmissionDropdownOpen(false);
}}
className="bg-white border border-[#dee1e6] rounded-[8px] h-[40px] px-[12px] py-[6px] flex items-center justify-between gap-[8px] w-[190px]"
>
<span className="text-[15px] font-normal leading-[1.5] text-[#6c7682] flex-1 text-left">
{selectedCompletionStatus === 'all' ? '모든 상태' : selectedCompletionStatus === 'completed' ? '완료' : '미완료'}
</span>
<ArrowDownIcon className="size-[16px] text-[#6c7682] shrink-0" />
</button>
{isCompletionDropdownOpen && (
<div className="absolute top-full left-0 mt-1 bg-white border border-[#dee1e6] rounded-[8px] shadow-lg z-50 w-[190px]">
<button
type="button"
onClick={() => {
setSelectedCompletionStatus('all');
setIsCompletionDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
<button
type="button"
onClick={() => {
setSelectedCompletionStatus('completed');
setIsCompletionDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
<button
type="button"
onClick={() => {
setSelectedCompletionStatus('not-completed');
setIsCompletionDropdownOpen(false);
}}
className="w-full px-[12px] py-[8px] text-left text-[15px] font-normal leading-[1.5] text-[#1b2027] hover:bg-[#f1f3f5]"
>
</button>
</div>
)}
</div>
</div>
</div>
{/* 검색바 */}
<div className="bg-white border border-[#dee1e6] rounded-[8px] h-[40px] px-[12px] py-[8px] flex items-center gap-[10px] w-[240px]">
<input
type="text"
placeholder="학습자명으로 검색"
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
className="flex-1 text-[16px] font-normal leading-[1.5] text-[#b1b8c0] outline-none placeholder:text-[#b1b8c0]"
/>
<SearchIcon className="size-[20px] text-[#b1b8c0] shrink-0" />
</div>
</div>
{/* 테이블 영역 */}
<div className="border border-[#dee1e6] rounded-[8px] overflow-hidden">
{isLoading ? (
<div className="min-h-[400px] flex items-center justify-center">
<p className="text-[16px] font-medium text-[#333c47]"> ...</p>
</div>
) : filteredData.length === 0 ? (
<div className="min-h-[400px] flex items-center justify-center">
<p className="text-[16px] font-medium text-[#333c47]"> .</p>
</div>
) : (
<>
{/* 테이블 헤더 */}
<div className="bg-gray-50 h-[48px] flex items-center border-b border-[#dee1e6]">
<div className="flex-1 border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"> </span>
</div>
<div className="flex-1 border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"></span>
</div>
<div className="w-[140px] border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"></span>
</div>
<div className="w-[140px] border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"></span>
</div>
<div className="w-[140px] border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"> </span>
</div>
<div className="w-[76px] border-r border-[#dee1e6] px-[16px] py-[12px] text-center">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"></span>
</div>
<div className="w-[112px] border-r border-[#dee1e6] px-[16px] py-[12px] text-center">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"> </span>
</div>
<div className="w-[84px] border-r border-[#dee1e6] px-[16px] py-[12px] text-center">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"> </span>
</div>
<div className="w-[84px] px-[16px] py-[12px] text-center">
<span className="text-[14px] font-semibold leading-[1.5] text-[#4c5561]"> </span>
</div>
</div>
{/* 테이블 바디 */}
<div className="bg-white">
{paginatedData.map((item) => (
<div
key={item.id}
className="h-[48px] flex items-center border-b border-[#dee1e6] last:border-b-0"
>
<div className="flex-1 border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">{item.courseName}</span>
</div>
<div className="flex-1 border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">{item.lessonName}</span>
</div>
<div className="w-[140px] border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">{item.learnerName}</span>
</div>
<div className="w-[140px] border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">{item.enrollmentDate}</span>
</div>
<div className="w-[140px] border-r border-[#dee1e6] px-[16px] py-[12px]">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">{item.lastStudyDate}</span>
</div>
<div className="w-[76px] border-r border-[#dee1e6] px-[16px] py-[12px] text-center">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">{item.progressRate}%</span>
</div>
<div className="w-[112px] border-r border-[#dee1e6] px-[16px] py-[12px] text-center">
{item.hasSubmitted ? (
<StatusTag text="제출" type="default" color="primary" />
) : (
<StatusTag text="미제출" type="default" color="gray" />
)}
</div>
<div className="w-[84px] border-r border-[#dee1e6] px-[16px] py-[12px] text-center">
<span className="text-[15px] font-medium leading-[1.5] text-[#1b2027]">
{item.score !== null ? `${item.score}` : '-'}
</span>
</div>
<div className="w-[84px] px-[16px] py-[12px] text-center">
{item.isCompleted ? (
<StatusTag text="완료" type="default" color="primary" />
) : (
<StatusTag text="미완료" type="default" color="gray" />
)}
</div>
</div>
))}
</div>
</>
)}
</div>
{/* 페이지네이션 */}
{filteredData.length > ITEMS_PER_PAGE && (
<div className="flex items-center justify-center gap-[8px] pt-[32px]">
{/* First */}
<button
type="button"
onClick={() => setCurrentPage(1)}
disabled={currentPage === 1}
className="flex items-center justify-center rounded-full size-[32px] p-[8.615px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
>
<div className="relative flex items-center justify-center w-full h-full">
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90 absolute left-[2px]" />
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90 absolute right-[2px]" />
</div>
</button>
{/* Prev */}
<button
type="button"
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
disabled={currentPage === 1}
className="flex items-center justify-center rounded-full size-[32px] p-[8.615px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
>
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
</button>
{/* Page Numbers */}
{Array.from({ length: Math.min(10, totalPages) }, (_, i) => {
const pageNum = i + 1;
const isActive = pageNum === currentPage;
return (
<button
key={pageNum}
type="button"
onClick={() => setCurrentPage(pageNum)}
className={`flex items-center justify-center rounded-full size-[32px] text-[16px] leading-[1.4] text-[#333c47] cursor-pointer ${
isActive ? 'bg-[#ecf0ff]' : 'bg-white'
}`}
>
{pageNum}
</button>
);
})}
{/* Next */}
<button
type="button"
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
disabled={currentPage === totalPages}
className="flex items-center justify-center rounded-full size-[32px] p-[8.615px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
>
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
</button>
{/* Last */}
<button
type="button"
onClick={() => setCurrentPage(totalPages)}
disabled={currentPage === totalPages}
className="flex items-center justify-center rounded-full size-[32px] p-[8.615px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
>
<div className="relative flex items-center justify-center w-full h-full">
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90 absolute left-[2px]" />
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90 absolute right-[2px]" />
</div>
</button>
</div>
)}
</div>
</div>
</div>
);
}