From e7829baf1bbcda3faa1b8b2f13bf93fe4240490e Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 12:41:39 +0900 Subject: [PATCH 01/23] =?UTF-8?q?style:=20RiskAnalysisSummarySection?= =?UTF-8?q?=EC=9D=98=20=EB=A7=88=EC=A7=84=20=EB=B0=8F=20=ED=8C=A8=EB=94=A9?= =?UTF-8?q?=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/ui/RiskAnalysisSummarySection.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/main/ui/RiskAnalysisSummarySection.tsx b/src/features/main/ui/RiskAnalysisSummarySection.tsx index 67a8987..32f2183 100644 --- a/src/features/main/ui/RiskAnalysisSummarySection.tsx +++ b/src/features/main/ui/RiskAnalysisSummarySection.tsx @@ -6,9 +6,9 @@ export const RiskAnalysisSummarySection = () => { const currentData = DEFAULT_RISK_ANALYSIS_DATA; // 사진과 일치하는 기본 데이터 return ( -
+
{/* 메인 위험도 분석 섹션 */} -
+
{/* 왼쪽: 위험도 게이지 */} Date: Fri, 22 Aug 2025 13:08:19 +0900 Subject: [PATCH 02/23] =?UTF-8?q?style:=20RiskFactorsBox=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=9D=98=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=83=89=EC=83=81=20=EB=B0=8F=20=ED=8F=B0=ED=8A=B8?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/components/features/chart/RiskFactorsBox.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/features/main/components/features/chart/RiskFactorsBox.tsx b/src/features/main/components/features/chart/RiskFactorsBox.tsx index 3788324..c27e213 100644 --- a/src/features/main/components/features/chart/RiskFactorsBox.tsx +++ b/src/features/main/components/features/chart/RiskFactorsBox.tsx @@ -13,9 +13,9 @@ export const RiskFactorsBox = ({ riskFactors }: Props) => {
- {factor.name} -
- {factor.percent} + {factor.name} +
+ {factor.percent} %
From efa86192e3f9484e64a2e26cccf4246feb222c3f Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:08:35 +0900 Subject: [PATCH 03/23] =?UTF-8?q?feat:=20=EC=A3=BC=EC=86=8C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=ED=95=84=EB=93=9C=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(=EC=A3=BC=EC=86=8C,=20=EC=83=81=EC=84=B8=20=EC=A3=BC=EC=86=8C,?= =?UTF-8?q?=20=EC=98=88=EC=B9=98=EA=B8=88,=20=EC=A3=BC=ED=83=9D=20?= =?UTF-8?q?=EC=9C=A0=ED=98=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/components/common/AddressField.tsx | 23 ++++++++++ .../main/components/common/DepositField.tsx | 43 +++++++++++++++++++ .../components/common/DetailAddressField.tsx | 23 ++++++++++ .../main/components/common/HouseTypeField.tsx | 23 ++++++++++ 4 files changed, 112 insertions(+) create mode 100644 src/features/main/components/common/AddressField.tsx create mode 100644 src/features/main/components/common/DepositField.tsx create mode 100644 src/features/main/components/common/DetailAddressField.tsx create mode 100644 src/features/main/components/common/HouseTypeField.tsx diff --git a/src/features/main/components/common/AddressField.tsx b/src/features/main/components/common/AddressField.tsx new file mode 100644 index 0000000..9dfc80e --- /dev/null +++ b/src/features/main/components/common/AddressField.tsx @@ -0,0 +1,23 @@ +import { useFormContext } from 'react-hook-form'; + +import { FormField, FormItem, FormLabel, FormMessage, Input } from '@/shared'; + +import { FORM_FIELDS, LABEL_TEXTS, PLACEHOLDER_TEXTS } from '../../constants'; +import { type SearchAddressType } from '../../model'; + +export const AddressField = () => { + const form = useFormContext(); + return ( + ( + + {LABEL_TEXTS.ADDRESS} + + + + )} + /> + ); +}; diff --git a/src/features/main/components/common/DepositField.tsx b/src/features/main/components/common/DepositField.tsx new file mode 100644 index 0000000..d06f59f --- /dev/null +++ b/src/features/main/components/common/DepositField.tsx @@ -0,0 +1,43 @@ +import { useFormContext } from 'react-hook-form'; + +import { FormField, FormItem, FormMessage, Input } from '@/shared'; + +import { PLACEHOLDER_TEXTS } from '../../constants'; +import type { SearchAddressType } from '../../model'; + +export const DepositField = () => { + const form = useFormContext(); + + const convertToNumber = (value: string, onChange: (value: number) => void) => { + const numValue = value === '' ? 0 : Number(value); + const safeValue = isNaN(numValue) ? 0 : numValue; + onChange(safeValue); + }; + + const getDisplayValue = (value: number) => { + return value === 0 ? '' : String(value); + }; + + return ( + ( + +
+ convertToNumber(e.target.value, field.onChange)} + value={getDisplayValue(field.value)} + /> + + 원 + +
+ +
+ )} + /> + ); +}; diff --git a/src/features/main/components/common/DetailAddressField.tsx b/src/features/main/components/common/DetailAddressField.tsx new file mode 100644 index 0000000..170098e --- /dev/null +++ b/src/features/main/components/common/DetailAddressField.tsx @@ -0,0 +1,23 @@ +import { useFormContext } from 'react-hook-form'; + +import { FormField, FormItem, FormLabel, FormMessage, Input } from '@/shared'; + +import { FORM_FIELDS, LABEL_TEXTS, PLACEHOLDER_TEXTS } from '../../constants'; +import type { SearchAddressType } from '../../model'; + +export const DetailAddressField = () => { + const form = useFormContext(); + return ( + ( + + {LABEL_TEXTS.DETAIL_ADDRESS} + + + + )} + /> + ); +}; diff --git a/src/features/main/components/common/HouseTypeField.tsx b/src/features/main/components/common/HouseTypeField.tsx new file mode 100644 index 0000000..a1be8d2 --- /dev/null +++ b/src/features/main/components/common/HouseTypeField.tsx @@ -0,0 +1,23 @@ +import { useFormContext } from 'react-hook-form'; + +import { FormField, FormItem, FormLabel, FormMessage, Input } from '@/shared'; + +import { FORM_FIELDS, LABEL_TEXTS, PLACEHOLDER_TEXTS } from '../../constants'; +import type { SearchAddressType } from '../../model'; + +export const HouseTypeField = () => { + const form = useFormContext(); + return ( + ( + + {LABEL_TEXTS.HOUSE_TYPE} + + + + )} + /> + ); +}; From 0afc278e2ed29818d968c697726c97a0792b201c Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:08:51 +0900 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20=EC=9E=84=EB=8C=80=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EC=84=A0=ED=83=9D=20=ED=95=84=EB=93=9C=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/components/common/RentTypeField.tsx | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/features/main/components/common/RentTypeField.tsx diff --git a/src/features/main/components/common/RentTypeField.tsx b/src/features/main/components/common/RentTypeField.tsx new file mode 100644 index 0000000..526528c --- /dev/null +++ b/src/features/main/components/common/RentTypeField.tsx @@ -0,0 +1,22 @@ +import { Label, RadioGroup, RadioGroupItem } from '@/shared'; + +export const RentTypeField = () => { + return ( +
+ + +
+ + +
+
+
+ ); +}; From 3a18633926bbf1628b068dca382ae441d228477a Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:09:28 +0900 Subject: [PATCH 05/23] =?UTF-8?q?refactor:=20RENT=5FTYPES=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/types/house-types.type.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/features/main/types/house-types.type.ts b/src/features/main/types/house-types.type.ts index 6eb235e..d32357e 100644 --- a/src/features/main/types/house-types.type.ts +++ b/src/features/main/types/house-types.type.ts @@ -1,5 +1,4 @@ -import type { FORM_FIELDS, HOUSE_TYPES, RENT_TYPES } from '../constants'; +import type { FORM_FIELDS, HOUSE_TYPES } from '../constants'; -export type RentType = (typeof RENT_TYPES)[keyof typeof RENT_TYPES]; export type HouseType = (typeof HOUSE_TYPES)[number]; export type FormField = (typeof FORM_FIELDS)[keyof typeof FORM_FIELDS]; From b2a22e983889289011dab7e2116d9656c380ff89 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:11:45 +0900 Subject: [PATCH 06/23] =?UTF-8?q?feat:=20=EC=A3=BC=EC=86=8C=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EC=8A=A4=ED=82=A4=EB=A7=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(=EC=A3=BC=EC=86=8C,=20=EC=A3=BC=EA=B1=B0?= =?UTF-8?q?=ED=98=95=ED=83=9C,=20=EC=83=81=EC=84=B8=EC=A3=BC=EC=86=8C,=20?= =?UTF-8?q?=EB=B3=B4=EC=A6=9D=EA=B8=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/model/schema/search-address.schema.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/features/main/model/schema/search-address.schema.ts diff --git a/src/features/main/model/schema/search-address.schema.ts b/src/features/main/model/schema/search-address.schema.ts new file mode 100644 index 0000000..550dbf5 --- /dev/null +++ b/src/features/main/model/schema/search-address.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; + +export const searchAddressSchema = z.object({ + address: z.string().min(1, { message: '주소를 입력해주세요.' }), + houseType: z.string().min(1, { message: '주거형태를 선택해주세요.' }), + detailAddress: z.string().min(1, { message: '상세주소를 입력해주세요.' }), + deposit: z.number().min(1, { message: '보증금을 입력해주세요.' }), +}); + +export type SearchAddressType = z.infer; From fee954798c74553c6cf6a0faa6bdf1b5cb2613c6 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:12:14 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat:=20@radix-ui/react-select=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?pnpm-lock.yaml=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 396 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 395 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index de24366..0aa46f2 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.3", "@tailwindcss/vite": "^4.1.12", "@tanstack/react-query": "^5.85.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c49edd5..e67a427 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: '@radix-ui/react-radio-group': specifier: ^1.3.8 version: 1.3.8(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-slot': specifier: ^1.2.3 version: 1.2.3(@types/react@19.1.10)(react@19.1.1) @@ -409,6 +412,21 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@hookform/resolvers@5.2.1': resolution: {integrity: sha512-u0+6X58gkjMcxur1wRWokA7XsiiBJ6aK17aPZxhkoYiK5J+HcTx0Vhu9ovXe6H+dVpO6cjrn2FkJTryXEMlryQ==} peerDependencies: @@ -473,9 +491,25 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-avatar@1.1.10': resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} peerDependencies: @@ -542,6 +576,41 @@ packages: '@types/react': optional: true + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: @@ -564,6 +633,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: @@ -616,6 +711,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -652,6 +760,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-is-hydrated@0.1.0': resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} peerDependencies: @@ -679,6 +796,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-size@1.1.1': resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} peerDependencies: @@ -688,6 +814,22 @@ packages: '@types/react': optional: true + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@reduxjs/toolkit@2.8.2': resolution: {integrity: sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==} peerDependencies: @@ -1254,6 +1396,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1501,6 +1647,9 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1807,6 +1956,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2467,6 +2620,26 @@ packages: redux: optional: true + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-router-dom@7.8.1: resolution: {integrity: sha512-NkgBCF3sVgCiAWIlSt89GR2PLaksMpoo3HDCorpRfnCEfdtRPLiuTf+CNXvqZMI5SJLZCLpVCvcZrTdtGW64xQ==} engines: {node: '>=20.0.0'} @@ -2484,6 +2657,16 @@ packages: react-dom: optional: true + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react@19.1.1: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} @@ -2788,6 +2971,26 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.5.0: resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: @@ -3070,6 +3273,23 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@floating-ui/utils@0.2.10': {} + '@hookform/resolvers@5.2.1(react-hook-form@7.62.0(react@19.1.1))': dependencies: '@standard-schema/utils': 0.3.0 @@ -3132,8 +3352,19 @@ snapshots: '@pkgr/core@0.2.9': {} + '@radix-ui/number@1.1.1': {} + '@radix-ui/primitive@1.1.3': {} + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/react-context': 1.1.2(@types/react@19.1.10)(react@19.1.1) @@ -3193,6 +3424,36 @@ snapshots: optionalDependencies: '@types/react': 19.1.10 + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.10)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.10)(react@19.1.1)': + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.10 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.10)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@radix-ui/react-id@1.1.1(@types/react@19.1.10)(react@19.1.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.10)(react@19.1.1) @@ -3209,6 +3470,34 @@ snapshots: '@types/react': 19.1.10 '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/rect': 1.1.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.10)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.10)(react@19.1.1) @@ -3263,6 +3552,35 @@ snapshots: '@types/react': 19.1.10 '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@radix-ui/react-select@2.2.6(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.10)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.10)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@radix-ui/react-slot@1.2.3(@types/react@19.1.10)(react@19.1.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.10)(react@19.1.1) @@ -3291,6 +3609,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.10 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.10)(react@19.1.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.10)(react@19.1.1) + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.10 + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.10)(react@19.1.1)': dependencies: react: 19.1.1 @@ -3310,6 +3635,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.10 + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.10)(react@19.1.1)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.10 + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.10)(react@19.1.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.10)(react@19.1.1) @@ -3317,6 +3649,17 @@ snapshots: optionalDependencies: '@types/react': 19.1.10 + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) + + '@radix-ui/rect@1.1.1': {} + '@reduxjs/toolkit@2.8.2(react-redux@9.2.0(@types/react@19.1.10)(react@19.1.1)(redux@5.0.1))(react@19.1.1)': dependencies: '@standard-schema/spec': 1.0.0 @@ -3783,6 +4126,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -4044,6 +4391,8 @@ snapshots: detect-libc@2.0.4: {} + detect-node-es@1.1.0: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -4497,6 +4846,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -5053,6 +5404,25 @@ snapshots: '@types/react': 19.1.10 redux: 5.0.1 + react-remove-scroll-bar@2.3.8(@types/react@19.1.10)(react@19.1.1): + dependencies: + react: 19.1.1 + react-style-singleton: 2.2.3(@types/react@19.1.10)(react@19.1.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.10 + + react-remove-scroll@2.7.1(@types/react@19.1.10)(react@19.1.1): + dependencies: + react: 19.1.1 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.10)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.10)(react@19.1.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.10)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.10)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.10 + react-router-dom@7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 @@ -5067,6 +5437,14 @@ snapshots: optionalDependencies: react-dom: 19.1.1(react@19.1.1) + react-style-singleton@2.2.3(@types/react@19.1.10)(react@19.1.1): + dependencies: + get-nonce: 1.0.1 + react: 19.1.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.10 + react@19.1.1: {} recharts@3.1.2(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react-is@16.13.1)(react@19.1.1)(redux@5.0.1): @@ -5398,8 +5776,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.8.1: - optional: true + tslib@2.8.1: {} tw-animate-css@1.3.7: {} @@ -5490,6 +5867,21 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.1.10)(react@19.1.1): + dependencies: + react: 19.1.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.10 + + use-sidecar@1.1.3(@types/react@19.1.10)(react@19.1.1): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.10 + use-sync-external-store@1.5.0(react@19.1.1): dependencies: react: 19.1.1 From fddbd15ec698ec8da9c8dba0b932f4ff37a6bff4 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:12:48 +0900 Subject: [PATCH 08/23] =?UTF-8?q?feat:=20=EC=8A=A4=ED=82=A4=EB=A7=88=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=9D=B8?= =?UTF-8?q?=EB=8D=B1=EC=8A=A4=20=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/model/index.ts | 1 + src/features/main/model/schema/index.ts | 1 + 2 files changed, 2 insertions(+) create mode 100644 src/features/main/model/schema/index.ts diff --git a/src/features/main/model/index.ts b/src/features/main/model/index.ts index 3707679..c31145d 100644 --- a/src/features/main/model/index.ts +++ b/src/features/main/model/index.ts @@ -1 +1,2 @@ export * from './data'; +export * from './schema'; diff --git a/src/features/main/model/schema/index.ts b/src/features/main/model/schema/index.ts new file mode 100644 index 0000000..9e65f73 --- /dev/null +++ b/src/features/main/model/schema/index.ts @@ -0,0 +1 @@ +export * from './search-address.schema'; From 5cd0c3e278c445da7abf0cb1c9779d7e52c7eac7 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:13:13 +0900 Subject: [PATCH 09/23] =?UTF-8?q?refactor:=20RENT=5FTYPES=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=83=81=EC=88=98=20=EC=A0=9C=EA=B1=B0,?= =?UTF-8?q?=20=EB=B3=B4=EC=A6=9D=EA=B8=88=20=EA=B4=80=EB=A0=A8=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/constants/form-type.ts | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/features/main/constants/form-type.ts b/src/features/main/constants/form-type.ts index 0019fd6..fba620c 100644 --- a/src/features/main/constants/form-type.ts +++ b/src/features/main/constants/form-type.ts @@ -1,15 +1,8 @@ -// 임대 유형 상수 -export const RENT_TYPES = { - JEONSE: 'jeonse', - MONTHLY: 'monthly', -} as const; - // 폼 필드 상수 export const FORM_FIELDS = { ADDRESS: 'address', HOUSE_TYPE: 'house-type', DETAIL_ADDRESS: 'detail-address', - RENT_AMOUNT: 'rent-amount', } as const; // 플레이스홀더 텍스트 상수 @@ -17,8 +10,7 @@ export const PLACEHOLDER_TEXTS = { ADDRESS: '주소를 알려주세요', HOUSE_TYPE: '주택유형을 알려주세요', DETAIL_ADDRESS: '상세주소를 알려주세요.', - JEONSE_AMOUNT: '전세금액', - MONTHLY_AMOUNT: '월세금액', + DEPOSIT: '전세금액', } as const; // 라벨 텍스트 상수 @@ -27,18 +19,4 @@ export const LABEL_TEXTS = { HOUSE_TYPE: '주택유형', DETAIL_ADDRESS: '상세주소', DEPOSIT: '보증금', - JEONSE: '전세', - MONTHLY: '월세', -} as const; - -// 임대 유형별 설정 객체 -export const RENT_TYPE_CONFIG = { - [RENT_TYPES.JEONSE]: { - label: LABEL_TEXTS.JEONSE, - placeholder: PLACEHOLDER_TEXTS.JEONSE_AMOUNT, - }, - [RENT_TYPES.MONTHLY]: { - label: LABEL_TEXTS.MONTHLY, - placeholder: PLACEHOLDER_TEXTS.MONTHLY_AMOUNT, - }, } as const; From 1e71aa9a342b703cf31c1922c277213e7b9ca55b Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:25:11 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20Select=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=ED=95=98?= =?UTF-8?q?=EC=9C=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/components/ui/select.tsx | 169 ++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 src/shared/components/ui/select.tsx diff --git a/src/shared/components/ui/select.tsx b/src/shared/components/ui/select.tsx new file mode 100644 index 0000000..d302189 --- /dev/null +++ b/src/shared/components/ui/select.tsx @@ -0,0 +1,169 @@ +import * as React from 'react'; + +import * as SelectPrimitive from '@radix-ui/react-select'; +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'; + +import { cn } from '../../utils'; + +function Select({ ...props }: React.ComponentProps) { + return ; +} + +function SelectGroup({ ...props }: React.ComponentProps) { + return ; +} + +function SelectValue({ ...props }: React.ComponentProps) { + return ; +} + +function SelectTrigger({ + className, + size = 'default', + children, + ...props +}: React.ComponentProps & { + size?: 'sm' | 'default'; +}) { + return ( + + {children} + + + + + ); +} + +function SelectContent({ + className, + children, + position = 'popper', + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ); +} + +function SelectLabel({ className, ...props }: React.ComponentProps) { + return ( + + ); +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ); +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +}; From ecd59a6256824acd08fb4aa9b8d3e3173d25a33c Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:26:16 +0900 Subject: [PATCH 11/23] =?UTF-8?q?style:=20RiskChartBox=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EC=9D=98=20=ED=8C=A8=EB=94=A9=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/components/features/chart/RiskChartBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/main/components/features/chart/RiskChartBox.tsx b/src/features/main/components/features/chart/RiskChartBox.tsx index 3ba5f26..802fad8 100644 --- a/src/features/main/components/features/chart/RiskChartBox.tsx +++ b/src/features/main/components/features/chart/RiskChartBox.tsx @@ -24,7 +24,7 @@ export const RiskChartBox = ({ riskScore, title }: Props) => { const needleAngle = getGaugeAngle(riskScore); return ( -
+

{title}

위험 점수 : From 6add21880dd66d2725246a36cacaa096b0db73f8 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:26:48 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=EC=A7=84=EB=8B=A8=20=ED=8F=BC=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=B0=8F=20react-hook-form=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/form/DiagnosticForm.tsx | 103 +++++++----------- 1 file changed, 40 insertions(+), 63 deletions(-) diff --git a/src/features/main/components/features/form/DiagnosticForm.tsx b/src/features/main/components/features/form/DiagnosticForm.tsx index 548c1a5..afc0af9 100644 --- a/src/features/main/components/features/form/DiagnosticForm.tsx +++ b/src/features/main/components/features/form/DiagnosticForm.tsx @@ -1,78 +1,55 @@ -import { useState } from 'react'; +import { useForm } from 'react-hook-form'; -import { Button, Input, Label, RadioGroup, RadioGroupItem } from '@/shared'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { Button, Form } from '@/shared'; + +import { type SearchAddressType, searchAddressSchema } from '../../../model'; import { - FORM_FIELDS, - LABEL_TEXTS, - PLACEHOLDER_TEXTS, - RENT_TYPES, - RENT_TYPE_CONFIG, -} from '../../../constants'; -import type { RentType } from '../../../types'; + AddressField, + DepositField, + DetailAddressField, + HouseTypeField, + RentTypeField, +} from '../../common'; export const DiagnosticForm = () => { - const [rentType, setRentType] = useState(RENT_TYPES.JEONSE); + const form = useForm({ + resolver: zodResolver(searchAddressSchema), + defaultValues: { + address: '', + houseType: '', + detailAddress: '', + deposit: 0, + }, + }); - const handleRentTypeChange = (value: string) => { - setRentType(value as RentType); + const onSubmit = (data: SearchAddressType) => { + console.log(data); }; - const currentRentConfig = RENT_TYPE_CONFIG[rentType]; - //TODO: 추후 Form 컴포넌트로 리팩토링 return ( -

-
-
-
- - -
-
- - +
+ e.preventDefault()} + className='mt-10 flex w-full flex-col items-center gap-2' + > +
+
+ + + + +
-
- - +
+
-
- - - {Object.entries(RENT_TYPE_CONFIG).map(([value, config]) => ( -
- - -
- ))} -
-
-
-
- - - 원 - -
-
-
-
-
-
-
+ + ); }; From efb776fee32d4e551d88cfef87c866683a2d77c7 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:27:15 +0900 Subject: [PATCH 13/23] =?UTF-8?q?style:=20ReasonBox=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=9D=98=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/components/features/reliability/ReasonBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/main/components/features/reliability/ReasonBox.tsx b/src/features/main/components/features/reliability/ReasonBox.tsx index 63adbdd..c424909 100644 --- a/src/features/main/components/features/reliability/ReasonBox.tsx +++ b/src/features/main/components/features/reliability/ReasonBox.tsx @@ -11,7 +11,7 @@ export const ReasonBox = () => { >
- {reason.name} + {reason.name}
{reason.percent} % From d6c1f7c296c0774ac0c2f7959a5deeaad22c5b9c Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 13:27:32 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat:=20=EC=A3=BC=EC=86=8C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=95=84=EB=93=9C=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20(=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=ED=95=84=EB=93=9C,=20=EC=A3=BC=EA=B1=B0=ED=98=95=ED=83=9C=20?= =?UTF-8?q?=ED=95=84=EB=93=9C,=20=EC=83=81=EC=84=B8=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=ED=95=84=EB=93=9C,=20=EB=B3=B4=EC=A6=9D=EA=B8=88=20=ED=95=84?= =?UTF-8?q?=EB=93=9C,=20=EC=9E=84=EB=8C=80=20=EC=9C=A0=ED=98=95=20?= =?UTF-8?q?=ED=95=84=EB=93=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/components/common/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/features/main/components/common/index.ts b/src/features/main/components/common/index.ts index b4699d7..6fe07fb 100644 --- a/src/features/main/components/common/index.ts +++ b/src/features/main/components/common/index.ts @@ -4,3 +4,8 @@ export * from './ChartLineItem'; export * from './LegendLine'; export * from './Needle'; export * from './Pagination'; +export * from './AddressField'; +export * from './HouseTypeField'; +export * from './DetailAddressField'; +export * from './DepositField'; +export * from './RentTypeField'; From 96ea36759ee8111ca2ecb7c6aa106bef296f74fd Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 14:05:00 +0900 Subject: [PATCH 15/23] =?UTF-8?q?feat:=20Select=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=97=90=20=EC=84=A0=ED=83=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/components/ui/index.ts | 1 + src/shared/components/ui/select.tsx | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/shared/components/ui/index.ts b/src/shared/components/ui/index.ts index 74b9191..f25fb2f 100644 --- a/src/shared/components/ui/index.ts +++ b/src/shared/components/ui/index.ts @@ -6,3 +6,4 @@ export * from './form'; export * from './label'; export * from './avatar'; export * from './radio-group'; +export * from './select'; diff --git a/src/shared/components/ui/select.tsx b/src/shared/components/ui/select.tsx index d302189..2ef3388 100644 --- a/src/shared/components/ui/select.tsx +++ b/src/shared/components/ui/select.tsx @@ -30,7 +30,13 @@ function SelectTrigger({ data-slot='select-trigger' data-size={size} className={cn( - "flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", + 'flex h-9 w-full min-w-0 rounded-full bg-transparent py-1 pr-3 pl-5 text-base shadow-[0px_4px_30px_0px_#0000001A] transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-input-placeholder-gray disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30', + 'focus-visible:border-lighthouse-blue focus-visible:shadow-lighthouse-blue-shadow', + 'aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40', + 'flex items-center justify-between gap-2', + 'data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8', + '*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2', + '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*="size-"])]:size-4 [&_svg:not([class*="text-"])]:text-muted-foreground', className, )} {...props} From 8980aca53fd8c43e1f991561d764309d1f3d1b62 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 14:05:18 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat:=20=EC=A3=BC=ED=83=9D=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EC=83=81=EC=88=98=EC=97=90=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/constants/house-type.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/features/main/constants/house-type.ts b/src/features/main/constants/house-type.ts index c4cb14d..f153be9 100644 --- a/src/features/main/constants/house-type.ts +++ b/src/features/main/constants/house-type.ts @@ -1,2 +1,10 @@ // 주택 유형 상수 export const HOUSE_TYPES = ['원룸', '투룸', '오피스텔', '아파트', '복층'] as const; + +export const HOUSE_TYPE_OPTIONS = [ + { value: 'ONEROOM', label: '원룸' }, + { value: 'TWOROOM', label: '투룸' }, + { value: 'OFFICETEL', label: '오피스텔' }, + { value: 'APARTMENT', label: '아파트' }, + { value: 'DUPLEX', label: '복층' }, +] as const; From 0635573580c42222c6155084f2eaba9bb33be8a8 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 14:06:01 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat:=20=EC=A3=BC=ED=83=9D=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=ED=95=84=EB=93=9C=EC=97=90=20Select=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/components/common/HouseTypeField.tsx | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/features/main/components/common/HouseTypeField.tsx b/src/features/main/components/common/HouseTypeField.tsx index a1be8d2..593578d 100644 --- a/src/features/main/components/common/HouseTypeField.tsx +++ b/src/features/main/components/common/HouseTypeField.tsx @@ -1,20 +1,50 @@ import { useFormContext } from 'react-hook-form'; -import { FormField, FormItem, FormLabel, FormMessage, Input } from '@/shared'; +import { + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from '@/shared'; -import { FORM_FIELDS, LABEL_TEXTS, PLACEHOLDER_TEXTS } from '../../constants'; +import { HOUSE_TYPE_OPTIONS, LABEL_TEXTS } from '../../constants'; import type { SearchAddressType } from '../../model'; export const HouseTypeField = () => { const form = useFormContext(); + return ( ( - {LABEL_TEXTS.HOUSE_TYPE} - + {LABEL_TEXTS.HOUSE_TYPE} + )} From f476d68eaf99dd0fc13638804f5fbba09a7e1d77 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 14:30:41 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat:=20=EC=A7=84=EB=8B=A8=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=9A=94=EC=B2=AD=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/apis/diagnosis.api.ts | 28 +++++++++++++++++++++++++ src/features/main/apis/index.ts | 1 + 2 files changed, 29 insertions(+) create mode 100644 src/features/main/apis/diagnosis.api.ts diff --git a/src/features/main/apis/diagnosis.api.ts b/src/features/main/apis/diagnosis.api.ts new file mode 100644 index 0000000..6448de0 --- /dev/null +++ b/src/features/main/apis/diagnosis.api.ts @@ -0,0 +1,28 @@ +import { fetchInstance } from '@/shared'; + +import type { HouseType } from '../types'; + +export const DIAGNOSIS_API_PATH = '/api/diagnosis'; + +interface DiagnosisApiResponse { + address: string; + addressDetail: string; + houseType: HouseType; + deposit: number; +} + +export const diagnosisApi = async ({ + address, + addressDetail, + houseType, + deposit, +}: DiagnosisApiResponse) => { + const response = await fetchInstance.post(DIAGNOSIS_API_PATH, { + address, + addressDetail, + houseType, + deposit, + }); + + return response.data; +}; diff --git a/src/features/main/apis/index.ts b/src/features/main/apis/index.ts index e69de29..af484f6 100644 --- a/src/features/main/apis/index.ts +++ b/src/features/main/apis/index.ts @@ -0,0 +1 @@ +export * from './diagnosis.api'; From 89304cca2d325d8624f96a594e5364b92bc77831 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 14:43:36 +0900 Subject: [PATCH 19/23] =?UTF-8?q?feat:=20=EC=A7=84=EB=8B=A8=20=ED=8F=BC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20API=20=EC=9A=94=EC=B2=AD=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EB=AE=A4=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=A0=9C=EC=B6=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/features/form/DiagnosticForm.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/features/main/components/features/form/DiagnosticForm.tsx b/src/features/main/components/features/form/DiagnosticForm.tsx index afc0af9..6c65e9a 100644 --- a/src/features/main/components/features/form/DiagnosticForm.tsx +++ b/src/features/main/components/features/form/DiagnosticForm.tsx @@ -1,10 +1,13 @@ import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; +import { useMutation } from '@tanstack/react-query'; import { Button, Form } from '@/shared'; +import { diagnosisApi } from '../../../apis'; import { type SearchAddressType, searchAddressSchema } from '../../../model'; +import type { HouseType } from '../../../types'; import { AddressField, DepositField, @@ -24,8 +27,18 @@ export const DiagnosticForm = () => { }, }); + const { mutate: diagnosisMutate } = useMutation({ + mutationFn: (data: SearchAddressType) => + diagnosisApi({ + address: data.address, + addressDetail: data.detailAddress, + houseType: data.houseType as HouseType, + deposit: data.deposit, + }), + }); + const onSubmit = (data: SearchAddressType) => { - console.log(data); + diagnosisMutate(data); }; //TODO: 추후 Form 컴포넌트로 리팩토링 From 763da62b00f26352d93cdb58f94d916174e7dad3 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 14:43:54 +0900 Subject: [PATCH 20/23] =?UTF-8?q?feat:=20=EC=A3=BC=ED=83=9D=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EC=83=81=EC=88=98=EC=97=90=EC=84=9C=20HOUSE=5FTYPE?= =?UTF-8?q?S=EB=A5=BC=20HOUSE=5FTYPE=5FOPTIONS=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20HouseType=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/types/house-types.type.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/features/main/types/house-types.type.ts b/src/features/main/types/house-types.type.ts index d32357e..62902dc 100644 --- a/src/features/main/types/house-types.type.ts +++ b/src/features/main/types/house-types.type.ts @@ -1,4 +1,5 @@ -import type { FORM_FIELDS, HOUSE_TYPES } from '../constants'; +import type { FORM_FIELDS, HOUSE_TYPE_OPTIONS } from '../constants'; + +export type HouseType = (typeof HOUSE_TYPE_OPTIONS)[number]['value']; -export type HouseType = (typeof HOUSE_TYPES)[number]; export type FormField = (typeof FORM_FIELDS)[keyof typeof FORM_FIELDS]; From 5029270eda0d1f5816ad30eeff6cf5c836d6fa84 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 15:01:35 +0900 Subject: [PATCH 21/23] =?UTF-8?q?feat:=20=EC=A3=BC=ED=83=9D=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EC=83=81=EC=88=98=EC=97=90=EC=84=9C=20'=EB=B3=B5?= =?UTF-8?q?=EC=B8=B5'=EC=9D=84=20'=EA=B8=B0=ED=83=80'=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20HOUSE=5FTYPE=5FOPTIONS=EC=9D=98=20?= =?UTF-8?q?=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/constants/house-type.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/features/main/constants/house-type.ts b/src/features/main/constants/house-type.ts index f153be9..8b5091a 100644 --- a/src/features/main/constants/house-type.ts +++ b/src/features/main/constants/house-type.ts @@ -1,10 +1,10 @@ // 주택 유형 상수 -export const HOUSE_TYPES = ['원룸', '투룸', '오피스텔', '아파트', '복층'] as const; +export const HOUSE_TYPES = ['원룸', '투룸', '오피스텔', '아파트', '기타'] as const; export const HOUSE_TYPE_OPTIONS = [ - { value: 'ONEROOM', label: '원룸' }, - { value: 'TWOROOM', label: '투룸' }, + { value: 'ONE_ROOM', label: '원룸' }, + { value: 'TWO_ROOM', label: '투룸' }, { value: 'OFFICETEL', label: '오피스텔' }, { value: 'APARTMENT', label: '아파트' }, - { value: 'DUPLEX', label: '복층' }, + { value: 'ETC', label: '기타' }, ] as const; From db8ee24e1229623dcecad0eba4ab3c15ece87748 Mon Sep 17 00:00:00 2001 From: Dobbymin Date: Fri, 22 Aug 2025 15:03:06 +0900 Subject: [PATCH 22/23] =?UTF-8?q?feat:=20=EC=A7=84=EB=8B=A8=20=ED=8F=BC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/components/features/form/DiagnosticForm.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/features/main/components/features/form/DiagnosticForm.tsx b/src/features/main/components/features/form/DiagnosticForm.tsx index 6c65e9a..8e9919a 100644 --- a/src/features/main/components/features/form/DiagnosticForm.tsx +++ b/src/features/main/components/features/form/DiagnosticForm.tsx @@ -41,7 +41,6 @@ export const DiagnosticForm = () => { diagnosisMutate(data); }; - //TODO: 추후 Form 컴포넌트로 리팩토링 return (
Date: Fri, 22 Aug 2025 15:10:25 +0900 Subject: [PATCH 23/23] =?UTF-8?q?style:=20AlternativeSection,=20LandlordPr?= =?UTF-8?q?opertySection,=20LandlordReliabilitySection=EC=9D=98=20?= =?UTF-8?q?=ED=8C=A8=EB=94=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/main/ui/AlternativeSection.tsx | 2 +- src/features/main/ui/LandlordPropertySection.tsx | 2 +- src/features/main/ui/LandlordReliabilitySection.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/features/main/ui/AlternativeSection.tsx b/src/features/main/ui/AlternativeSection.tsx index 891bfe8..dbf5cea 100644 --- a/src/features/main/ui/AlternativeSection.tsx +++ b/src/features/main/ui/AlternativeSection.tsx @@ -9,7 +9,7 @@ export const AlternativeSection = () => { const riskScore = 70; return ( -
+
{/* 왼쪽: 임대인 소유 매물 조회 */} diff --git a/src/features/main/ui/LandlordPropertySection.tsx b/src/features/main/ui/LandlordPropertySection.tsx index e038893..88a917d 100644 --- a/src/features/main/ui/LandlordPropertySection.tsx +++ b/src/features/main/ui/LandlordPropertySection.tsx @@ -6,7 +6,7 @@ export const LandlordPropertySection = () => { const riskScore = 70; return ( -
+
{/* 왼쪽: 임대인 소유 매물 조회 */} diff --git a/src/features/main/ui/LandlordReliabilitySection.tsx b/src/features/main/ui/LandlordReliabilitySection.tsx index 5e4c80e..b049c0e 100644 --- a/src/features/main/ui/LandlordReliabilitySection.tsx +++ b/src/features/main/ui/LandlordReliabilitySection.tsx @@ -2,7 +2,7 @@ import { GradeBox, MultiHouseBox, ReasonBox, SubrogationPaymentBox } from '../co export const LandlordReliabilitySection = () => { return ( -
+