뷰포트에 관계없이 백엔드 캐시의 전체 선박을 검색 가능하도록 개선.
- backend: GET /api/vessels/all 엔드포인트 추가 (getAllVessels)
- vesselSignalClient: onAllVessels? 콜백 추가; PollingClient는 3분마다 pollAll(), WS Client는 필터링 전 전송
- useVesselSignals: { vessels, allVessels } 반환, 초기 스냅샷도 allVessels에 반영
- MapView: allVessels prop 추가, VesselSearchBar에 우선 전달
- OilSpillView/HNSView/RescueView/IncidentsView: allVessels 구조분해 후 MapView/VesselSearchBar에 전달
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import { api } from './api';
|
|
import type { VesselPosition, MapBounds } from '@/types/vessel';
|
|
|
|
export async function getVesselsInArea(bounds: MapBounds): Promise<VesselPosition[]> {
|
|
const res = await api.post<VesselPosition[]>('/vessels/in-area', { bounds });
|
|
return res.data;
|
|
}
|
|
|
|
export async function getAllVessels(): Promise<VesselPosition[]> {
|
|
const res = await api.get<VesselPosition[]>('/vessels/all');
|
|
return res.data;
|
|
}
|
|
|
|
/**
|
|
* 로그인/새로고침 직후 1회 호출하는 초기 스냅샷 API.
|
|
* 운영 환경의 별도 REST 서버가 현재 시각 기준 최근 10분치 선박 신호를 반환한다.
|
|
* URL은 VITE_VESSEL_INIT_API_URL 로 주입(운영에서 실제 URL로 교체).
|
|
*/
|
|
export async function getInitialVesselSnapshot(): Promise<VesselPosition[]> {
|
|
const url = import.meta.env.VITE_VESSEL_INIT_API_URL as string | undefined;
|
|
if (!url) return [];
|
|
const res = await fetch(url, { method: 'GET' });
|
|
if (!res.ok) throw new Error(`vessel init snapshot ${res.status}`);
|
|
return (await res.json()) as VesselPosition[];
|
|
}
|
|
|
|
export function isVesselInitEnabled(): boolean {
|
|
return import.meta.env.VITE_VESSEL_INIT_ENABLED === 'true';
|
|
}
|
|
|
|
export interface VesselCacheStatus {
|
|
count: number;
|
|
bangjeCount: number;
|
|
lastUpdated: string | null;
|
|
}
|
|
|
|
export async function getVesselCacheStatus(): Promise<VesselCacheStatus> {
|
|
const res = await api.get<VesselCacheStatus>('/vessels/status');
|
|
return res.data;
|
|
}
|