From 00e7a3e70a7b9c6831da424a9eb5c42760bc48d0 Mon Sep 17 00:00:00 2001 From: Nan Kyung Lee Date: Tue, 17 Mar 2026 10:16:31 +0900 Subject: [PATCH] =?UTF-8?q?feat(aerial):=20=EC=9C=84=EC=84=B1=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=B7=A8=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SatRequest status에 '취소' 상태 추가 - 필터 탭에 '취소' 추가 - 대기/촬영중 상태 모두 취소 가능 (confirm 팝업) - 취소된 요청은 빨간 ✕ 배지 + 투명도 60% - satRequests를 상태(state)로 관리하여 실시간 상태 변경 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../aerial/components/SatelliteRequest.tsx | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/frontend/src/tabs/aerial/components/SatelliteRequest.tsx b/frontend/src/tabs/aerial/components/SatelliteRequest.tsx index 7494de1..2edead9 100644 --- a/frontend/src/tabs/aerial/components/SatelliteRequest.tsx +++ b/frontend/src/tabs/aerial/components/SatelliteRequest.tsx @@ -14,7 +14,7 @@ interface SatRequest { requestDate: string expectedReceive: string resolution: string - status: '촬영중' | '대기' | '완료' + status: '촬영중' | '대기' | '완료' | '취소' provider?: string purpose?: string requester?: string @@ -85,6 +85,7 @@ const SAT_MAP_STYLE: StyleSpecification = { type SatModalPhase = 'none' | 'provider' | 'blacksky' | 'up42' export function SatelliteRequest() { + const [requests, setRequests] = useState(satRequests) const [statusFilter, setStatusFilter] = useState('전체') const [modalPhase, setModalPhase] = useState('none') const [selectedRequest, setSelectedRequest] = useState(null) @@ -125,13 +126,14 @@ export function SatelliteRequest() { if (modalPhase === 'up42') loadSatPasses() }, [modalPhase, loadSatPasses]) - const allRequests = showMoreCompleted ? satRequests : satRequests.filter(r => r.status !== '완료' || r.id === 'SAT-003') + const allRequests = showMoreCompleted ? requests : requests.filter(r => (r.status !== '완료' && r.status !== '취소') || r.id === 'SAT-003') const filtered = allRequests.filter(r => { if (statusFilter === '전체') return true if (statusFilter === '대기') return r.status === '대기' if (statusFilter === '진행') return r.status === '촬영중' if (statusFilter === '완료') return r.status === '완료' + if (statusFilter === '취소') return r.status === '취소' return true }) @@ -144,6 +146,9 @@ export function SatelliteRequest() { if (s === '대기') return ( ⏳ 대기 ) + if (s === '취소') return ( + ✕ 취소 + ) return ( ✅ 완료 ) @@ -156,7 +161,7 @@ export function SatelliteRequest() { { value: '0.5m', label: '최고 해상도', color: 'var(--cyan)' }, ] - const filters = ['전체', '대기', '진행', '완료'] + const filters = ['전체', '대기', '진행', '완료', '취소'] const up42Filtered = up42Satellites.filter(s => s.type === up42SubTab) @@ -231,7 +236,7 @@ export function SatelliteRequest() { gridTemplateColumns: '60px 1fr 100px 100px 120px 80px 90px', borderColor: 'rgba(255,255,255,.04)', background: selectedRequest?.id === r.id ? 'rgba(99,102,241,.06)' : r.status === '촬영중' ? 'rgba(234,179,8,.03)' : 'transparent', - opacity: r.status === '완료' ? 0.7 : 1, + opacity: (r.status === '완료' || r.status === '취소') ? 0.6 : 1, }} >
{r.id}
@@ -266,8 +271,18 @@ export function SatelliteRequest() { {r.status === '완료' && ( )} - {r.status === '대기' && ( - + {(r.status === '대기' || r.status === '촬영중') && ( + )}