From 5ecda580f7102739658d9774c183863c4dc63d58 Mon Sep 17 00:00:00 2001 From: gahusb Date: Thu, 9 Jul 2026 23:57:57 +0900 Subject: [PATCH] =?UTF-8?q?refactor(realestate):=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=A1=9C=EC=A7=81=20useComplexes=20=ED=9B=85=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C=20=E2=86=92=20RealEstate=20shell=20=EC=B6=95?= =?UTF-8?q?=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01UHXzpsZQxKG9hQmNRfZjRS --- src/pages/realestate/RealEstate.jsx | 32 +++++++-------------- src/pages/realestate/hooks/useComplexes.js | 33 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 src/pages/realestate/hooks/useComplexes.js diff --git a/src/pages/realestate/RealEstate.jsx b/src/pages/realestate/RealEstate.jsx index 5754e66..ec35421 100644 --- a/src/pages/realestate/RealEstate.jsx +++ b/src/pages/realestate/RealEstate.jsx @@ -1,9 +1,9 @@ -import React, { useState, useEffect, useMemo } from 'react'; +import React, { useState, useMemo } from 'react'; import { Link } from 'react-router-dom'; -import { apiGet, apiPost, apiPut, apiDelete } from '../../api'; import { - SAMPLE_COMPLEXES, STATUS_CONFIG, TABS, + 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'; @@ -14,41 +14,29 @@ import './RealEstate.css'; // ── 메인 컴포넌트 ────────────────────────────────────────────────────────────── const RealEstate = () => { - const [complexes, setComplexes] = useState(SAMPLE_COMPLEXES); + 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); - useEffect(() => { - apiGet('/api/realestate/complexes') - .then((data) => { - if (Array.isArray(data) && data.length > 0) setComplexes(data); - }) - .catch(() => {}); - }, []); - - const handleAdd = async (data) => { - const newComplex = { ...data, id: Date.now() }; - setComplexes((prev) => [...prev, newComplex]); + const handleAdd = (data) => { + addComplex(data); setShowModal(false); - try { await apiPost('/api/realestate/complexes', data); } catch {} }; - const handleUpdate = async (data) => { - setComplexes((prev) => prev.map((c) => (c.id === data.id ? data : c))); + const handleUpdate = (data) => { + updateComplex(data); if (selectedComplex?.id === data.id) setSelectedComplex(data); setEditingComplex(null); setShowModal(false); - try { await apiPut(`/api/realestate/complexes/${data.id}`, data); } catch {} }; - const handleDelete = async (id) => { + const handleDelete = (id) => { if (!confirm('삭제하시겠습니까?')) return; - setComplexes((prev) => prev.filter((c) => c.id !== id)); + deleteComplex(id); if (selectedComplex?.id === id) setSelectedComplex(null); - try { await apiDelete(`/api/realestate/complexes/${id}`); } catch {} }; const handleModalSave = (data) => { diff --git a/src/pages/realestate/hooks/useComplexes.js b/src/pages/realestate/hooks/useComplexes.js new file mode 100644 index 0000000..591fd43 --- /dev/null +++ b/src/pages/realestate/hooks/useComplexes.js @@ -0,0 +1,33 @@ +import { useState, useEffect } from 'react'; +import { apiGet, apiPost, apiPut, apiDelete } from '../../../api'; +import { SAMPLE_COMPLEXES } from '../realEstateUtils'; + +export default function useComplexes() { + const [complexes, setComplexes] = useState(SAMPLE_COMPLEXES); + + useEffect(() => { + apiGet('/api/realestate/complexes') + .then((data) => { + if (Array.isArray(data) && data.length > 0) setComplexes(data); + }) + .catch(() => {}); + }, []); + + const addComplex = async (data) => { + const newComplex = { ...data, id: Date.now() }; + setComplexes((prev) => [...prev, newComplex]); + try { await apiPost('/api/realestate/complexes', data); } catch { /* noop */ } + }; + + const updateComplex = async (data) => { + setComplexes((prev) => prev.map((c) => (c.id === data.id ? data : c))); + try { await apiPut(`/api/realestate/complexes/${data.id}`, data); } catch { /* noop */ } + }; + + const deleteComplex = async (id) => { + setComplexes((prev) => prev.filter((c) => c.id !== id)); + try { await apiDelete(`/api/realestate/complexes/${id}`); } catch { /* noop */ } + }; + + return { complexes, addComplex, updateComplex, deleteComplex }; +}