import { useState, useEffect } from 'react'; import { FileText, Search, RefreshCw, Calendar, Edit3, User } from 'lucide-react'; import { comms } from '@/communication'; import { BoardItem } from '@/types'; export function PatchList() { const [boardList, setBoardList] = useState([]); const [loading, setLoading] = useState(false); const [searchKey, setSearchKey] = useState(''); const [selectedItem, setSelectedItem] = useState(null); const [showModal, setShowModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [editFormData, setEditFormData] = useState(null); const [userLevel, setUserLevel] = useState(0); const [userId, setUserId] = useState(''); useEffect(() => { loadUserInfo(); loadData(); }, []); const loadUserInfo = async () => { try { const response = await comms.checkLoginStatus(); if (response.Success && response.User) { setUserLevel(response.User.Level); setUserId(response.User.Id); } } catch (error) { console.error('사용자 정보 로드 오류:', error); } }; const loadData = async () => { setLoading(true); try { console.log('패치내역 조회:', { bidx: 5, searchKey }); const response = await comms.getBoardList(5, searchKey); // bidx=5: 패치내역 console.log('패치내역 응답:', response); if (response.Success && response.Data) { setBoardList(response.Data); } else { console.warn('패치내역 없음:', response.Message); setBoardList([]); } } catch (error) { console.error('패치내역 로드 오류:', error); alert('데이터를 불러오는 중 오류가 발생했습니다.'); } finally { setLoading(false); } }; const handleSearch = () => { loadData(); }; const handleRowClick = async (item: BoardItem) => { try { const response = await comms.getBoardDetail(item.idx); if (response.Success && response.Data) { setSelectedItem(response.Data); // 개발자(레벨 >= 9) 또는 사번 395552이면 바로 편집 모드 if (userLevel >= 9 || userId === '395552') { setEditFormData(response.Data); setShowEditModal(true); } else { setShowModal(true); } } } catch (error) { console.error('상세 조회 오류:', error); alert('데이터를 불러오는 중 오류가 발생했습니다.'); } }; const handleEditClick = () => { if (selectedItem) { setEditFormData(selectedItem); setShowModal(false); setShowEditModal(true); } }; const handleEditSave = async () => { if (!editFormData) return; try { // TODO: Board_Edit API 구현 필요 alert('게시판 수정 API가 아직 구현되지 않았습니다.'); console.log('수정할 데이터:', editFormData); } catch (error) { console.error('저장 오류:', error); alert('저장 중 오류가 발생했습니다.'); } }; const formatDate = (dateStr: string | null) => { if (!dateStr) return '-'; try { const date = new Date(dateStr); const yy = String(date.getFullYear()).slice(-2); const mm = String(date.getMonth() + 1).padStart(2, '0'); const dd = String(date.getDate()).padStart(2, '0'); return `${yy}.${mm}.${dd}`; } catch { return dateStr; } }; return (
{/* 검색 필터 */}
setSearchKey(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} placeholder="제목, 내용, 작성자 등" className="flex-1 h-10 bg-white/20 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400" />
{/* 패치내역 목록 */}

패치 내역

{boardList.length}건
{loading ? (
데이터를 불러오는 중...
) : boardList.length === 0 ? (

조회된 데이터가 없습니다.

) : ( boardList.map((item) => (
handleRowClick(item)} >
{item.header && ( {item.header} )} {item.cate && ( {item.cate} )}

{item.title}

{formatDate(item.wdate)}
)) )}
{/* 상세 모달 */} {showModal && selectedItem && (
{selectedItem.header && ( {selectedItem.header} )} {selectedItem.cate && ( {selectedItem.cate} )}

{selectedItem.title}

{selectedItem.wuid_name || selectedItem.wuid}
{formatDate(selectedItem.wdate)}
{selectedItem.contents}
{(userLevel >= 9 || userId === '395552') && ( )}
)} {/* 편집 모달 */} {showEditModal && editFormData && (

패치내역 편집

setEditFormData({ ...editFormData, header: e.target.value })} className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400" placeholder="예: v2.0.0" />
setEditFormData({ ...editFormData, cate: e.target.value })} className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400" placeholder="예: 기능개선" />
setEditFormData({ ...editFormData, title: e.target.value })} className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400" placeholder="패치 제목" />