/** 매매 시그널 알림 — 그리드형 n×n 레이아웃 프리셋 (TradingView 스타일) */ export type TradeNotificationGridPresetId = | '1x1' | '2x1' | '1x2' | '3x1' | '1x3' | '2x1-31' | '2x2' | '4x1' | '1x4' | '2x1-211' | '5x1' | '3x2' | '2x3' | '4x2' | '2x4'; export interface TradeNotificationGridPreset { id: TradeNotificationGridPresetId; /** 스크롤 목록에 적용할 열 수 */ cols: number; /** 팝업 그룹 라벨 (패널 수) */ group: number; /** 짧은 표기 (2×2 등) */ label: string; } export const TRADE_NOTIFICATION_GRID_PRESETS: TradeNotificationGridPreset[] = [ { id: '1x1', cols: 1, group: 1, label: '1×1' }, { id: '2x1', cols: 2, group: 2, label: '2×1' }, { id: '1x2', cols: 1, group: 2, label: '1×2' }, { id: '3x1', cols: 3, group: 3, label: '3×1' }, { id: '1x3', cols: 1, group: 3, label: '1×3' }, { id: '2x1-31', cols: 2, group: 3, label: '2+1' }, { id: '2x2', cols: 2, group: 4, label: '2×2' }, { id: '4x1', cols: 4, group: 4, label: '4×1' }, { id: '1x4', cols: 1, group: 4, label: '1×4' }, { id: '2x1-211', cols: 2, group: 4, label: '2+2' }, { id: '5x1', cols: 5, group: 5, label: '5×1' }, { id: '3x2', cols: 3, group: 6, label: '3×2' }, { id: '2x3', cols: 2, group: 6, label: '2×3' }, { id: '4x2', cols: 4, group: 8, label: '4×2' }, { id: '2x4', cols: 2, group: 8, label: '2×4' }, ]; const PRESET_MAP = new Map( TRADE_NOTIFICATION_GRID_PRESETS.map(p => [p.id, p]), ); export const DEFAULT_TRADE_NOTIFICATION_GRID_PRESET: TradeNotificationGridPresetId = '2x2'; export function getTradeNotificationGridPreset( id: string | undefined | null, ): TradeNotificationGridPreset { const preset = id ? PRESET_MAP.get(id as TradeNotificationGridPresetId) : undefined; return preset ?? PRESET_MAP.get(DEFAULT_TRADE_NOTIFICATION_GRID_PRESET)!; } export function normalizeTradeNotificationGridPreset( id: string | undefined | null, ): TradeNotificationGridPresetId { return getTradeNotificationGridPreset(id).id; } /** 그룹별 프리셋 (팝업 행 구성) */ export function gridPresetsByGroup(): Map { const map = new Map(); for (const p of TRADE_NOTIFICATION_GRID_PRESETS) { const list = map.get(p.group) ?? []; list.push(p); map.set(p.group, list); } return map; }