From 43928022982b85adf8825ddd9247405e1dc0c498 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Thu, 15 May 2025 14:45:20 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A7=80=EB=B6=95=EC=9E=AC=20=EC=A0=81?= =?UTF-8?q?=ED=95=A9=EC=84=B1=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=95=84?= =?UTF-8?q?=EC=BD=94=EB=94=94=EC=96=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=A0=81=ED=95=A9=EC=84=B1=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/suitable/Suitable.tsx | 21 ++++++-- src/components/suitable/SuitableList.tsx | 68 +++++++++++++++--------- src/hooks/useSuitable.ts | 12 +++++ 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/src/components/suitable/Suitable.tsx b/src/components/suitable/Suitable.tsx index f8ebb3e..8a2989c 100644 --- a/src/components/suitable/Suitable.tsx +++ b/src/components/suitable/Suitable.tsx @@ -1,5 +1,6 @@ 'use client' +import Image from 'next/image' import { useEffect, useState } from 'react' import SuitableList from './SuitableList' import { useSuitable } from '@/hooks/useSuitable' @@ -77,22 +78,34 @@ export default function Suitable() { diff --git a/src/components/suitable/SuitableList.tsx b/src/components/suitable/SuitableList.tsx index ce7485c..9a3ec85 100644 --- a/src/components/suitable/SuitableList.tsx +++ b/src/components/suitable/SuitableList.tsx @@ -1,71 +1,87 @@ 'use client' +import Image from 'next/image' +import { useState } from 'react' import SuitableNoData from './SuitableNoData' import { useSuitable } from '@/hooks/useSuitable' import { useSuitableStore } from '@/store/useSuitableStore' import { SUITABLE_HEAD_CODE, type SuitableMain, type SuitableDetail } from '@/types/Suitable' export default function SuitableList() { - const { toCodeName, suitableSearchResults, isSearchLoading } = useSuitable() + const { toCodeName, suitableSearchResults, isSearchLoading, filterSuitableDetail } = useSuitable() const { selectedItems, addSelectedItem, removeSelectedItem } = useSuitableStore() + const [openItems, setOpenItems] = useState>(new Set()) const handleItemClick = (itemId: number) => { selectedItems.some((selected) => selected === itemId) ? removeSelectedItem(itemId) : addSelectedItem(itemId) } + const toggleItemOpen = (itemId: number) => { + setOpenItems((prev) => { + const newOpenItems = new Set(prev) + newOpenItems.has(itemId) ? newOpenItems.delete(itemId) : newOpenItems.add(itemId) + return newOpenItems + }) + } + // TODO: 추후 지붕재 적합성 데이터 CUD 구현 시 ×, ー 데이터 관리 필요 const suitableCheck = (value: string) => { if (value === '×') { - return + return ( +
+ +
+ ) } else if (value === 'ー') { - return + return ( +
+ +
+ ) } else { - return + return ( +
+ +
+ ) } } - const filterSuitableDetail = (mainId: number): SuitableDetail[] | undefined => { - const result: SuitableDetail[] = [] - for (const subItem of suitableSearchResults?.suitableDetail ?? []) { - if (subItem.MAIN_ID > mainId) break - if (subItem.MAIN_ID === mainId) { - result.push(subItem) - } - } - return result - } - return ( <> {isSearchLoading ? (
Loading...
) : suitableSearchResults && suitableSearchResults.suitable.length > 0 ? ( suitableSearchResults.suitable.map((item: SuitableMain) => ( -
+
-
- +
+ handleItemClick(item.ID)} />
- +
    -
  • - {filterSuitableDetail(item.ID)?.map((subItem: SuitableDetail) => ( -
    -
    + {filterSuitableDetail(item.ID)?.map((subItem: SuitableDetail) => ( +
  • +
    +
    {suitableCheck(subItem.TRESTLE_MANUFACTURER_PRODUCT_NAME)} - {subItem.MEMO && } + {subItem.MEMO && ( +
    + +
    + )}
    - ))} -
  • + + ))}
)) diff --git a/src/hooks/useSuitable.ts b/src/hooks/useSuitable.ts index 0be29a4..36c1b3f 100644 --- a/src/hooks/useSuitable.ts +++ b/src/hooks/useSuitable.ts @@ -82,6 +82,17 @@ export function useSuitable() { enabled: true, }) + const filterSuitableDetail = (mainId: number): SuitableDetail[] | undefined => { + const result: SuitableDetail[] = [] + for (const subItem of suitableSearchResults?.suitableDetail ?? []) { + if (subItem.MAIN_ID > mainId) break + if (subItem.MAIN_ID === mainId) { + result.push(subItem) + } + } + return result + } + return { getSuitables, getSuitableCommCode, @@ -91,5 +102,6 @@ export function useSuitable() { suitableSearchResults, refetchBySearch, isSearchLoading, + filterSuitableDetail, } }