From 6a5b6952153fb1238dc23cd6666ef96aefd491b6 Mon Sep 17 00:00:00 2001 From: clyde-yoonjae Date: Sat, 22 Mar 2025 23:11:49 +0900 Subject: [PATCH 01/23] =?UTF-8?q?SortField=20=ED=83=80=EC=9E=85=EC=95=88?= =?UTF-8?q?=EC=A0=95=EC=84=B1=20=ED=99=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/meeting/_features/MeetingList.tsx | 3 ++- src/components/common/Dropdown.tsx | 6 +++-- src/util/searchFilter.ts | 4 +++- type-clyde/common/api.ts | 5 ++++ type-clyde/common/pagination.ts | 29 +++++++++++++++++++++++ type-clyde/meeting/search.ts | 9 +++++++ 6 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 type-clyde/common/api.ts create mode 100644 type-clyde/common/pagination.ts create mode 100644 type-clyde/meeting/search.ts diff --git a/src/app/meeting/_features/MeetingList.tsx b/src/app/meeting/_features/MeetingList.tsx index bc4f6fe1..dcd74143 100644 --- a/src/app/meeting/_features/MeetingList.tsx +++ b/src/app/meeting/_features/MeetingList.tsx @@ -18,8 +18,9 @@ import { keepPreviousData } from '@tanstack/react-query'; import Image from 'next/image'; import { useParams, useRouter } from 'next/navigation'; import { ChangeEvent, useCallback, useState } from 'react'; -import type { IMeetingSearchCondition, SearchMeeting } from 'types/meeting'; +import type { SearchMeeting } from 'types/meeting'; +import { IMeetingSearchCondition } from '../../../../type-clyde/meeting/search'; import MeetingExtraInfo from './MeetingExtraInfo'; import NoResultsMeeting from './NoResultsMeeting'; import MeetingListSkeleton from './skeleton/MeetingListSkeleton'; diff --git a/src/components/common/Dropdown.tsx b/src/components/common/Dropdown.tsx index c981fea5..ea892ce2 100644 --- a/src/components/common/Dropdown.tsx +++ b/src/components/common/Dropdown.tsx @@ -6,15 +6,17 @@ import { ChevronDown, ChevronsUpDown } from 'lucide-react'; import Image from 'next/image'; import * as React from 'react'; +import { SortFieldType } from '../../../type-clyde/common/pagination'; + interface IDropdownOption { - value: string; + value: SortFieldType; label: string; onSelect?: () => void; } interface IDropdownProps { options?: IDropdownOption[]; // 드롭다운에 표시될 옵션들 - onChange?: (value: string) => void; // 선택 변경 시 호출될 콜백 + onChange?: (value: SortFieldType) => void; // 선택 변경 시 호출될 콜백 variant?: 'default' | 'icon' | 'doubleArrow' | 'image'; // 드롭다운 스타일 변형 size?: 's' | 'l'; // 크기 옵션 className?: string; // 트리거 스타일 커스터마이징 diff --git a/src/util/searchFilter.ts b/src/util/searchFilter.ts index eae2f4f3..2ca47acf 100644 --- a/src/util/searchFilter.ts +++ b/src/util/searchFilter.ts @@ -1,6 +1,8 @@ import { CategoryTitle } from 'types/meeting'; -export const filterOptions = [ +import { SortFieldType } from '../../type-clyde/common/pagination'; + +export const filterOptions: Array<{ value: SortFieldType; label: string }> = [ { value: 'CREATED', label: '생성순', diff --git a/type-clyde/common/api.ts b/type-clyde/common/api.ts new file mode 100644 index 00000000..f84858a4 --- /dev/null +++ b/type-clyde/common/api.ts @@ -0,0 +1,5 @@ +export interface ApiResponse { + statusCode: number; + data: T; + timestamp: string; +} diff --git a/type-clyde/common/pagination.ts b/type-clyde/common/pagination.ts new file mode 100644 index 00000000..24d280ef --- /dev/null +++ b/type-clyde/common/pagination.ts @@ -0,0 +1,29 @@ +export type SortFieldType = 'CREATED' | 'OLD' | 'LIKES'; + +export interface Sort { + sorted: boolean; + empty: boolean; + unsorted: boolean; +} + +export interface Pageable { + pageNumber: number; + pageSize: number; + paged: boolean; + offset: number; + sort: Sort; + unpaged: boolean; +} + +export interface Paginated { + pageable: Pageable; + nextCursor: number; + size: number; + content: T[]; + number: number; + sort: Sort; + numberOfElements: number; + first: boolean; + last: boolean; + empty: boolean; +} diff --git a/type-clyde/meeting/search.ts b/type-clyde/meeting/search.ts new file mode 100644 index 00000000..0e7d1ed6 --- /dev/null +++ b/type-clyde/meeting/search.ts @@ -0,0 +1,9 @@ +import { SortFieldType } from '../common/pagination'; + +export interface IMeetingSearchCondition { + keyword: string; + skillArray: string[]; + sortField: SortFieldType; + lastMeetingId: number | null; + size: number; +} From 30ed1c4e198f0da4db12ed5a8cef338b21053991 Mon Sep 17 00:00:00 2001 From: clyde-yoonjae Date: Sun, 23 Mar 2025 03:08:46 +0900 Subject: [PATCH 02/23] =?UTF-8?q?UserPosition=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=95=88=EC=A0=95=EC=84=B1=20=ED=99=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/signup/_features/PositionInput.tsx | 7 +++- src/components/common/PositionSelect.tsx | 43 ++++++++++------------ src/constants/mypage/mypageConstant.tsx | 9 ++++- type-clyde/auth/acount.ts | 12 ++++++ 4 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 type-clyde/auth/acount.ts diff --git a/src/app/signup/_features/PositionInput.tsx b/src/app/signup/_features/PositionInput.tsx index 2314db28..a6479d7f 100644 --- a/src/app/signup/_features/PositionInput.tsx +++ b/src/app/signup/_features/PositionInput.tsx @@ -3,8 +3,10 @@ import { positionValidation } from '@/util/validation'; import { useWatch } from 'react-hook-form'; import { IInputProps, ISignupFormData } from 'types/auth'; +import { UserPosition } from '../../../../type-clyde/auth/acount'; + interface IPositionInputProps extends IInputProps { - handleClickPosition: (value: string) => void; + handleClickPosition: (value: UserPosition) => void; } const PositionInput = ({ @@ -13,7 +15,8 @@ const PositionInput = ({ errors, register, }: IPositionInputProps) => { - const position = useWatch({ control, name: 'position' }); + const position = useWatch({ control, name: 'position' }) as UserPosition; + return (