kcg-monitoring/frontend/src/hooks/useStaticDeckLayers.ts
htlee 44aa449b03 feat: 지도 글꼴 크기 커스텀 시스템 (4개 그룹 슬라이더)
- FontScaleContext + FontScalePanel: 시설/선박/분석/지역 4그룹 × 0.5~2.0 범위
- LAYERS 패널 하단 슬라이더 UI, localStorage 영속화
- Korea static 14개 + Iran 4개 + 분석 3개 + KoreaMap 5개 TextLayer 적용
- MapLibre 선박 라벨/국가명 실시간 반영
- 모든 useMemo deps + updateTriggers에 fontScale 포함
2026-03-24 09:27:11 +09:00

89 lines
2.6 KiB
TypeScript

import { useMemo } from 'react';
import type { Layer } from '@deck.gl/core';
import type { PowerFacility } from '../services/infra';
import type { HazardType } from '../data/hazardFacilities';
import { useFontScale } from './useFontScale';
// Re-export types for consumers
export type { StaticPickedObject, StaticLayerKind, StaticPickInfo } from './layers/types';
import { createPortLayers } from './layers/createPortLayers';
import { createNavigationLayers } from './layers/createNavigationLayers';
import { createMilitaryLayers } from './layers/createMilitaryLayers';
import { createFacilityLayers } from './layers/createFacilityLayers';
interface StaticLayerConfig {
ports: boolean;
coastGuard: boolean;
windFarm: boolean;
militaryBases: boolean;
govBuildings: boolean;
airports: boolean;
navWarning: boolean;
nkLaunch: boolean;
nkMissile: boolean;
piracy: boolean;
infra: boolean;
infraFacilities: PowerFacility[];
hazardTypes: HazardType[];
cnPower: boolean;
cnMilitary: boolean;
jpPower: boolean;
jpMilitary: boolean;
onPick: (info: import('./layers/types').StaticPickInfo) => void;
sizeScale?: number;
}
export function useStaticDeckLayers(config: StaticLayerConfig): Layer[] {
const { fontScale } = useFontScale();
return useMemo(() => {
const fc = { sc: config.sizeScale ?? 1.0, fs: fontScale.facility, onPick: config.onPick };
return [
...createPortLayers({ ports: config.ports, windFarm: config.windFarm }, fc),
...createNavigationLayers({
coastGuard: config.coastGuard,
airports: config.airports,
navWarning: config.navWarning,
piracy: config.piracy,
}, fc),
...createMilitaryLayers({
militaryBases: config.militaryBases,
govBuildings: config.govBuildings,
nkLaunch: config.nkLaunch,
nkMissile: config.nkMissile,
}, fc),
...createFacilityLayers({
infra: config.infra,
infraFacilities: config.infraFacilities,
hazardTypes: config.hazardTypes,
cnPower: config.cnPower,
cnMilitary: config.cnMilitary,
jpPower: config.jpPower,
jpMilitary: config.jpMilitary,
}, fc),
];
}, [
config.ports,
config.windFarm,
config.coastGuard,
config.airports,
config.navWarning,
config.piracy,
config.militaryBases,
config.govBuildings,
config.nkLaunch,
config.nkMissile,
config.infra,
config.infraFacilities,
config.hazardTypes,
config.cnPower,
config.cnMilitary,
config.jpPower,
config.jpMilitary,
config.onPick,
config.sizeScale,
fontScale.facility,
]);
}