From 0c9cb9b27c4a745fe0aa09fdfa7e698cbab18e5e Mon Sep 17 00:00:00 2001 From: suhyun113 <163711629+suhyun113@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:23:56 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EC=95=B1=20=EB=B2=84=EC=A0=80?= =?UTF-8?q?=EB=8B=9D=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=9B=B9=EB=B7=B0=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=8A=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: 김준서 Junseo Kim --- frontend/src/App.tsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 9feac9a3d..eb0b615f2 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -15,6 +15,7 @@ import ApplicationFormPage from './pages/ApplicationFormPage/ApplicationFormPage import ClubUnionPage from './pages/ClubUnionPage/ClubUnionPage'; import IntroducePage from './pages/IntroducePage/IntroducePage'; import 'swiper/css'; +import LegacyClubDetailPage from './pages/ClubDetailPage/LegacyClubDetailPage'; const queryClient = new QueryClient({ defaultOptions: { @@ -47,8 +48,27 @@ const App = () => { } /> + {/*기존 웹 & 안드로이드 url (android: v1.1.0)*/} + + + } + /> + {/*웹 유저에게 신규 상세페이지 보유주기 위한 임시 url*/} + + + + } + /> + {/*새로 빌드해서 배포할 앱 주소 url*/} + From 715e246bcf84810448e5bcb37da7b0944cc506ce Mon Sep 17 00:00:00 2001 From: suhyun113 <163711629+suhyun113@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:24:44 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=95=B1=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=EB=B2=84=EC=A0=84=20=EC=83=81=EC=84=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: 김준서 Junseo Kim --- .../ClubDetailPage/LegacyClubDetailPage.tsx | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 frontend/src/pages/ClubDetailPage/LegacyClubDetailPage.tsx diff --git a/frontend/src/pages/ClubDetailPage/LegacyClubDetailPage.tsx b/frontend/src/pages/ClubDetailPage/LegacyClubDetailPage.tsx new file mode 100644 index 000000000..af4d69c3d --- /dev/null +++ b/frontend/src/pages/ClubDetailPage/LegacyClubDetailPage.tsx @@ -0,0 +1,112 @@ +import { useCallback } from 'react'; +import { useParams, useSearchParams } from 'react-router-dom'; +import Footer from '@/components/common/Footer/Footer'; +import Header from '@/components/common/Header/Header'; +import { PAGE_VIEW, USER_EVENT } from '@/constants/eventName'; +import useMixpanelTrack from '@/hooks/Mixpanel/useMixpanelTrack'; +import useTrackPageView from '@/hooks/Mixpanel/useTrackPageView'; +import { useGetClubDetail } from '@/hooks/Queries/useClub'; +import useDevice from '@/hooks/useDevice'; +import ClubFeed from '@/pages/ClubDetailPage/components/ClubFeed/ClubFeed'; +import ClubIntroContent from '@/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent'; +import ClubProfileCard from '@/pages/ClubDetailPage/components/ClubProfileCard/ClubProfileCard'; +import * as Styled from './ClubDetailPage.styles'; +import ClubDetailFooter from './components/ClubDetailFooter/ClubDetailFooter'; + +export const TAB_TYPE = { + INTRO: 'intro', + PHOTOS: 'photos', +} as const; + +type TabType = (typeof TAB_TYPE)[keyof typeof TAB_TYPE]; + +const LegacyClubDetailPage = () => { + const trackEvent = useMixpanelTrack(); + + const [searchParams, setSearchParams] = useSearchParams(); + const tabParam = searchParams.get('tab') as TabType | null; + + const activeTab: TabType = + tabParam && Object.values(TAB_TYPE).includes(tabParam) + ? tabParam + : TAB_TYPE.INTRO; + + const { clubId } = useParams<{ clubId: string }>(); + const { isMobile, isTablet, isLaptop, isDesktop } = useDevice(); + + const { data: clubDetail, error } = useGetClubDetail(clubId || ''); + + useTrackPageView(PAGE_VIEW.CLUB_DETAIL_PAGE, clubDetail?.name, !clubDetail); + + const handleTabClick = useCallback( + (tabKey: TabType) => { + setSearchParams({ tab: tabKey }, { replace: true }); + trackEvent( + tabKey === TAB_TYPE.INTRO + ? USER_EVENT.CLUB_INTRO_TAB_CLICKED + : USER_EVENT.CLUB_FEED_TAB_CLICKED + ); + }, + [setSearchParams, trackEvent] + ); + + if (error) { + return
동아리 정보를 불러오는데 실패했습니다.
; + } + + if (!clubDetail) { + return null; + } + + return ( + <> +
+ + + + + + + handleTabClick(TAB_TYPE.INTRO)} + > + 소개 내용 + + handleTabClick(TAB_TYPE.PHOTOS)} + > + 활동사진 + + + + +
+ +
+
+ +
+
+
+
+
+