diff --git a/src/domains/club/introduction/api/useClubIntro.ts b/src/domains/club/introduction/api/club-info.queries.ts similarity index 63% rename from src/domains/club/introduction/api/useClubIntro.ts rename to src/domains/club/introduction/api/club-info.queries.ts index edafc770..17c8057a 100644 --- a/src/domains/club/introduction/api/useClubIntro.ts +++ b/src/domains/club/introduction/api/club-info.queries.ts @@ -1,36 +1,19 @@ import { apiRequest } from '@/api/apiRequest'; +import { + ClubDetailResponse, + ClubRecruitmentResponse, + ClubScheduleResponse, +} from '@/api/data-contracts'; import { useQuery } from '@tanstack/react-query'; import { useParams } from 'react-router-dom'; -interface ApiClubIntroductionResponse { - introduction: string; - activity: string; -} - -type Schedule = { - month: string; - content: string; -}; - -interface ApiClubScheduleResponse { - schedules: Schedule[]; -} - -export interface ApiClubInfoResponse { - leaderName: string; - leaderEmail: string; - leaderPhone: string; - activities: string; - membershipFee: string; - snsUrl: string; -} - interface UseClubApiOptions { - clubId: string; + clubId?: string; isPreview: boolean; - endpoint: string; + endpoint?: string; errorMessage: string; } + export const useClubApi = ({ clubId, isPreview, @@ -44,7 +27,9 @@ export const useClubApi = ({ ? `/api/clubs/club-admin/${clubId}` : `/api/clubs/${clubId}`; const suffix = isPreview ? '/draft' : ''; - const requestUrl = `${baseUrl}/${endpoint}${suffix}`; + const requestUrl = endpoint + ? `${baseUrl}/${endpoint}${suffix}` + : `${baseUrl}${suffix}`; const response = await apiRequest({ url: requestUrl, @@ -69,26 +54,34 @@ export const useIsPreview = () => { return { nowUrl, id, isPreview }; }; -export const useClubIntroduction = (clubId: string, isPreview: boolean) => - useClubApi({ - clubId, - isPreview, - endpoint: 'introduction', - errorMessage: '동아리 소개 조회 실패', - }); +interface ClubDetailHookProps { + clubId?: string; + isPreview: boolean; +} -export const useClubSchedules = (clubId: string, isPreview: boolean) => - useClubApi({ +export const useClubSchedules = ({ clubId, isPreview }: ClubDetailHookProps) => + useClubApi({ clubId, isPreview, endpoint: 'schedules', errorMessage: '동아리 스케줄 조회 실패', }); -export const useClubInfo = (clubId: string, isPreview: boolean) => - useClubApi({ +export const useClubInfo = ({ clubId, isPreview }: ClubDetailHookProps) => + useClubApi({ clubId, isPreview, endpoint: 'info', errorMessage: '동아리 정보 조회 실패', }); + +export const useClubRecruitment = ({ + clubId, + isPreview, +}: ClubDetailHookProps) => + useClubApi({ + clubId, + isPreview, + endpoint: 'recruitment', + errorMessage: '동아리 모집 상태 불러오기 실패', + }); diff --git a/src/domains/club/introduction/constants/club-info.constants.tsx b/src/domains/club/introduction/constants/club-info.constants.tsx new file mode 100644 index 00000000..8e9324e7 --- /dev/null +++ b/src/domains/club/introduction/constants/club-info.constants.tsx @@ -0,0 +1,37 @@ +import Sns from '@/assets/common/sns.svg?react'; +import Jjang from '@/assets/common/jjang.svg?react'; +import Card from '@/assets/common/card.svg?react'; +import Phone from '@/assets/common/phone.svg?react'; +import Label from '@/assets/common/label.svg?react'; +import { ClubInfoKey, InfoMeta } from '../types/club-info.types'; + +export const DISPLAY_ORDER: ClubInfoKey[] = [ + 'leaderName', + 'contactEmail', + 'leaderPhone', + 'membershipFee', + 'snsAccount', +] as const; + +export const CLUB_INFO_META: Record = { + leaderName: { + icon: , + label: '대표', + }, + contactEmail: { + icon: