import React, { useState, useMemo } from 'react'; import { Link } from 'react-router-dom'; import { STATUS_CONFIG, TABS, } from './realEstateUtils'; import useComplexes from './hooks/useComplexes'; import ComplexCard from './components/ComplexCard'; import RightPanel from './components/RightPanel'; import ScheduleView from './components/ScheduleView'; import PriceAnalysis from './components/PriceAnalysis'; import ComplexModal from './components/ComplexModal'; import 'leaflet/dist/leaflet.css'; import './RealEstate.css'; // ── 메인 컴포넌트 ────────────────────────────────────────────────────────────── const RealEstate = () => { const { complexes, addComplex, updateComplex, deleteComplex } = useComplexes(); const [selectedComplex, setSelectedComplex] = useState(null); const [activeTab, setActiveTab] = useState('목록'); const [filterStatus, setFilterStatus] = useState('전체'); const [showModal, setShowModal] = useState(false); const [editingComplex, setEditingComplex] = useState(null); const handleAdd = (data) => { addComplex(data); setShowModal(false); }; const handleUpdate = (data) => { updateComplex(data); if (selectedComplex?.id === data.id) setSelectedComplex(data); setEditingComplex(null); setShowModal(false); }; const handleDelete = (id) => { if (!confirm('삭제하시겠습니까?')) return; deleteComplex(id); if (selectedComplex?.id === id) setSelectedComplex(null); }; const handleModalSave = (data) => { if (editingComplex) { handleUpdate({ ...editingComplex, ...data }); } else { handleAdd(data); } }; const filteredComplexes = useMemo(() => { if (filterStatus === '전체') return complexes; return complexes.filter((c) => c.status === filterStatus); }, [complexes, filterStatus]); const stats = useMemo(() => ({ total: complexes.length, upcoming: complexes.filter((c) => c.status === '청약예정').length, active: complexes.filter((c) => c.status === '청약중').length, avgPrice: complexes.length ? Math.round(complexes.reduce((s, c) => s + c.avgPricePerPyeong, 0) / complexes.length) : 0, }), [complexes]); return (
{stats.total}
관심 단지
{stats.upcoming}
청약 예정
{stats.active}
청약 중
{stats.avgPrice.toLocaleString()}만
평균 평당가
등록된 단지가 없습니다.
) : ( filteredComplexes.map((c) => (캘린더
청약 시작·마감·당첨 발표일을 타임라인으로 확인합니다.