import { I18nManager } from '../utils/I18nManager.js'; /** * 지식 성장 히트맵(Heatmap) 관리 모듈 * 최근 지정된 기간(기본 365일) 동안의 메모 작성 활동량을 시각화합니다. */ export const HeatmapManager = { container: null, data: [], // [{date: 'YYYY-MM-DD', count: N}, ...] currentRange: 365, // 기본 365일 selectedDate: null, onDateSelect: null, init(containerId, onDateSelect) { this.container = document.getElementById(containerId); this.onDateSelect = onDateSelect; if (!this.container) { console.warn('[Heatmap] Container not found:', containerId); return; } // 로컬스토리지에서 이전에 선택한 범위 복구 const savedRange = localStorage.getItem('heatmap_range'); if (savedRange) { this.currentRange = parseInt(savedRange, 10); } }, setSelectedDate(date) { this.selectedDate = date; this.render(); }, /** * 데이터를 서버에서 가져와 렌더링합니다. */ async refresh() { try { const { API } = await import('../api.js'); this.data = await API.fetchHeatmapData(this.currentRange); this.render(); } catch (error) { console.error('[Heatmap] Failed to fetch stats:', error); } }, /** * 히트맵 그리드를 생성합니다. */ render() { if (!this.container) return; const dataMap = new Map(this.data.map(d => [d.date, d.count])); // 날짜 계산 const today = new Date(); today.setHours(0, 0, 0, 0); const startDate = new Date(today); startDate.setDate(today.getDate() - (this.currentRange - 1)); // 요일 맞추기 (일요일 시작 기준) const dayOfWeek = startDate.getDay(); const adjustedStartDate = new Date(startDate); adjustedStartDate.setDate(startDate.getDate() - dayOfWeek); const rangeLabel = I18nManager.t(`heatmap_ranges.${this.currentRange}`) || I18nManager.t('label_select_range'); const heatmapTitle = I18nManager.t('label_heatmap_title'); const rangeOptions = I18nManager.t('heatmap_ranges'); const labelLess = I18nManager.t('label_less'); const labelMore = I18nManager.t('label_more'); let html = `