From a515df97038456ed4723ec1ac58f719172738832 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 13:50:40 +0900 Subject: [PATCH 01/11] =?UTF-8?q?refactor:=20divisions,=20categories=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=9C=84=EC=B9=98=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=B0=94=EA=B9=A5=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tabs/ClubInfoEditTab/ClubInfoEditTab.tsx | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx b/frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx index bf9b26ad9..e748b6168 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx @@ -23,9 +23,32 @@ const DIVISION_LABELS: Record = { 과동: '과동아리', }; +const divisions = [ + { + value: '중동', + label: DIVISION_LABELS['중동'], + color: TAG_COLORS['중동'], + }, + { + value: '과동', + label: DIVISION_LABELS['과동'], + color: TAG_COLORS['과동'], + }, +]; + +const categories = [ + { value: '봉사', label: '봉사', color: TAG_COLORS['봉사'] }, + { value: '종교', label: '종교', color: TAG_COLORS['종교'] }, + { value: '취미교양', label: '취미교양', color: TAG_COLORS['취미교양'] }, + { value: '학술', label: '학술', color: TAG_COLORS['학술'] }, + { value: '운동', label: '운동', color: TAG_COLORS['운동'] }, + { value: '공연', label: '공연', color: TAG_COLORS['공연'] }, +]; + const ClubInfoEditTab = () => { const trackEvent = useMixpanelTrack(); useTrackPageView(PAGE_VIEW.CLUB_INFO_EDIT_PAGE); + const queryClient = useQueryClient(); const clubDetail = useOutletContext(); const { mutate: updateClub } = useUpdateClubDetail(); @@ -49,28 +72,6 @@ const ClubInfoEditTab = () => { x: '', }); - const queryClient = useQueryClient(); - const divisions = [ - { - value: '중동', - label: DIVISION_LABELS['중동'], - color: TAG_COLORS['중동'], - }, - { - value: '과동', - label: DIVISION_LABELS['과동'], - color: TAG_COLORS['과동'], - }, - ]; - const categories = [ - { value: '봉사', label: '봉사', color: TAG_COLORS['봉사'] }, - { value: '종교', label: '종교', color: TAG_COLORS['종교'] }, - { value: '취미교양', label: '취미교양', color: TAG_COLORS['취미교양'] }, - { value: '학술', label: '학술', color: TAG_COLORS['학술'] }, - { value: '운동', label: '운동', color: TAG_COLORS['운동'] }, - { value: '공연', label: '공연', color: TAG_COLORS['공연'] }, - ]; - useEffect(() => { if (clubDetail) { setClubName(clubDetail.name); From 8ae4163efc5b5cdb4e2de9ad58ab919155ee37a0 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 13:52:11 +0900 Subject: [PATCH 02/11] =?UTF-8?q?refactor:=20clubIntroTab=EC=97=90?= =?UTF-8?q?=EC=84=9C=20clubIntroEditTab=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AdminPage/AdminRoutes.tsx | 4 ++-- .../ClubIntroEditTab.styles.ts} | 0 .../ClubIntroEditTab.tsx} | 2 +- .../components/AwardEditor/AwardEditor.styles.ts | 0 .../components/AwardEditor/AwardEditor.tsx | 2 +- .../components/FAQEditor/FAQEditor.styles.ts | 0 .../components/FAQEditor/FAQEditor.tsx | 2 +- 7 files changed, 5 insertions(+), 5 deletions(-) rename frontend/src/pages/AdminPage/tabs/{ClubIntroTab/ClubIntroTab.styles.ts => ClubIntroEditTab/ClubIntroEditTab.styles.ts} (100%) rename frontend/src/pages/AdminPage/tabs/{ClubIntroTab/ClubIntroTab.tsx => ClubIntroEditTab/ClubIntroEditTab.tsx} (98%) rename frontend/src/pages/AdminPage/tabs/{ClubIntroTab => ClubIntroEditTab}/components/AwardEditor/AwardEditor.styles.ts (100%) rename frontend/src/pages/AdminPage/tabs/{ClubIntroTab => ClubIntroEditTab}/components/AwardEditor/AwardEditor.tsx (99%) rename frontend/src/pages/AdminPage/tabs/{ClubIntroTab => ClubIntroEditTab}/components/FAQEditor/FAQEditor.styles.ts (100%) rename frontend/src/pages/AdminPage/tabs/{ClubIntroTab => ClubIntroEditTab}/components/FAQEditor/FAQEditor.tsx (98%) diff --git a/frontend/src/pages/AdminPage/AdminRoutes.tsx b/frontend/src/pages/AdminPage/AdminRoutes.tsx index 758c047e4..8c5c7e687 100644 --- a/frontend/src/pages/AdminPage/AdminRoutes.tsx +++ b/frontend/src/pages/AdminPage/AdminRoutes.tsx @@ -9,7 +9,7 @@ import ClubInfoEditTab from '@/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEdit import PhotoEditTab from '@/pages/AdminPage/tabs/PhotoEditTab/PhotoEditTab'; import RecruitEditTab from '@/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab'; import ApplicantsTab from './tabs/ApplicantsTab/ApplicantsTab'; -import ClubIntroTab from './tabs/ClubIntroTab/ClubIntroTab'; +import ClubIntroEditTab from './tabs/ClubIntroEditTab/ClubIntroEditTab'; export default function AdminRoutes() { return ( @@ -35,7 +35,7 @@ export default function AdminRoutes() { path='applicants-list/:applicationFormId/:questionId' element={} /> - } /> + } /> ); diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/ClubIntroTab.styles.ts b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.styles.ts similarity index 100% rename from frontend/src/pages/AdminPage/tabs/ClubIntroTab/ClubIntroTab.styles.ts rename to frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.styles.ts diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/ClubIntroTab.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx similarity index 98% rename from frontend/src/pages/AdminPage/tabs/ClubIntroTab/ClubIntroTab.tsx rename to frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx index 60274a4d4..5e17667e4 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/ClubIntroTab.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx @@ -9,7 +9,7 @@ import useMixpanelTrack from '@/hooks/useMixpanelTrack'; import useTrackPageView from '@/hooks/useTrackPageView'; import { ContentSection } from '@/pages/AdminPage/components/ContentSection/ContentSection'; import { Award, ClubDetail, FAQ, IdealCandidate } from '@/types/club'; -import * as Styled from './ClubIntroTab.styles'; +import * as Styled from './ClubIntroEditTab.styles'; import AwardEditor from './components/AwardEditor/AwardEditor'; import FAQEditor from './components/FAQEditor/FAQEditor'; diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/AwardEditor/AwardEditor.styles.ts b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.styles.ts similarity index 100% rename from frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/AwardEditor/AwardEditor.styles.ts rename to frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.styles.ts diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/AwardEditor/AwardEditor.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx similarity index 99% rename from frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/AwardEditor/AwardEditor.tsx rename to frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx index 8e172511b..5dae10430 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/AwardEditor/AwardEditor.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react'; import deleteButton from '@/assets/images/icons/delete_button_icon.svg'; import selectIcon from '@/assets/images/icons/selectArrow.svg'; import { CustomDropDown } from '@/components/common/CustomDropDown/CustomDropDown'; -import { Award } from '../../ClubIntroTab'; +import { Award } from '../../ClubIntroEditTab'; import * as Styled from './AwardEditor.styles'; interface AwardEditorProps { diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/FAQEditor/FAQEditor.styles.ts b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.styles.ts similarity index 100% rename from frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/FAQEditor/FAQEditor.styles.ts rename to frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.styles.ts diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/FAQEditor/FAQEditor.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx similarity index 98% rename from frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/FAQEditor/FAQEditor.tsx rename to frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx index 805963cea..3a40e68ec 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroTab/components/FAQEditor/FAQEditor.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react'; import deleteButton from '@/assets/images/icons/delete_button_icon.svg'; -import { FAQ } from '../../ClubIntroTab'; +import { FAQ } from '../../ClubIntroEditTab'; import * as Styled from './FAQEditor.styles'; interface FAQEditorProps { From 5b53bdc9e6b3983d747a163d19aadd194be51139 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:03:44 +0900 Subject: [PATCH 03/11] =?UTF-8?q?refactor:=20=EC=95=84=EC=9D=B4=EC=BD=98?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tabs/ClubIntroEditTab/ClubIntroEditTab.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx index 5e17667e4..e8db4a1bd 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx @@ -13,7 +13,7 @@ import * as Styled from './ClubIntroEditTab.styles'; import AwardEditor from './components/AwardEditor/AwardEditor'; import FAQEditor from './components/FAQEditor/FAQEditor'; -const ClubIntroTab = () => { +const ClubIntroEditTab = () => { const trackEvent = useMixpanelTrack(); useTrackPageView(PAGE_VIEW.CLUB_INFO_EDIT_PAGE); @@ -99,7 +99,7 @@ const ClubIntroTab = () => { setIntroDescription(e.target.value)} @@ -108,7 +108,7 @@ const ClubIntroTab = () => { /> setActivityDescription(e.target.value)} @@ -119,7 +119,7 @@ const ClubIntroTab = () => { @@ -130,7 +130,7 @@ const ClubIntroTab = () => { /> setBenefits(e.target.value)} @@ -145,4 +145,4 @@ const ClubIntroTab = () => { ); }; -export default ClubIntroTab; +export default ClubIntroEditTab; From 2c7efbf5f0979367ab4b03f49df8705cd4099d9f Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:05:18 +0900 Subject: [PATCH 04/11] =?UTF-8?q?refactor:=20AwardEditor=20import=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EB=9D=BC?= =?UTF-8?q?=EB=B2=A8=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Award 타입 import를 상대 경로에서 @/types/club으로 변경 - 라벨에서 이모지(🏆) 제거하여 일관성 유지 --- .../ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx index 5dae10430..9737129b0 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react'; import deleteButton from '@/assets/images/icons/delete_button_icon.svg'; import selectIcon from '@/assets/images/icons/selectArrow.svg'; import { CustomDropDown } from '@/components/common/CustomDropDown/CustomDropDown'; -import { Award } from '../../ClubIntroEditTab'; +import { Award } from '@/types/club'; import * as Styled from './AwardEditor.styles'; interface AwardEditorProps { @@ -140,7 +140,7 @@ const AwardEditor = ({ awards, onChange }: AwardEditorProps) => { return ( - 🏆 이런 상을 받았어요 + 이런 상을 받았어요 Date: Mon, 12 Jan 2026 14:05:54 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20FAQEditor=EC=97=90=20ID=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=ED=83=80=EC=9E=85=20=EC=95=88=EC=A0=95=EC=84=B1=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FAQ 타입 import를 상대 경로에서 @/types/club으로 변경 - 서버에서 받아온 FAQ에 자동으로 ID 생성하는 로직 추가 - Type predicate를 사용하여 필터링 후 타입 안정성 보장 - 불필요한 null 체크 제거로 코드 간결화 - 라벨에서 이모지(❓) 제거하여 일관성 유지 --- .../components/FAQEditor/FAQEditor.tsx | 90 +++++++++++-------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx index 3a40e68ec..edfaf6ec0 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/FAQEditor/FAQEditor.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react'; import deleteButton from '@/assets/images/icons/delete_button_icon.svg'; -import { FAQ } from '../../ClubIntroEditTab'; +import { FAQ } from '@/types/club'; import * as Styled from './FAQEditor.styles'; interface FAQEditorProps { @@ -12,6 +12,17 @@ const FAQEditor = ({ faqs, onChange }: FAQEditorProps) => { const [shouldFocusLast, setShouldFocusLast] = useState(false); const questionInputRefs = useRef>({}); + useEffect(() => { + const hasAnyMissingId = faqs.some((faq) => !faq.id); + if (hasAnyMissingId) { + const faqsWithIds = faqs.map((faq) => ({ + ...faq, + id: faq.id || `faq-${Date.now()}-${Math.random()}`, + })); + onChange(faqsWithIds); + } + }, [faqs, onChange]); + const handleAddFAQ = () => { const newFAQ: FAQ = { id: `faq-${Date.now()}-${Math.random()}`, @@ -43,9 +54,11 @@ const FAQEditor = ({ faqs, onChange }: FAQEditorProps) => { useEffect(() => { if (shouldFocusLast && faqs.length > 0) { const lastFAQ = faqs[faqs.length - 1]; - const inputRef = questionInputRefs.current[lastFAQ.id]; - if (inputRef) { - inputRef.focus(); + if (lastFAQ.id) { + const inputRef = questionInputRefs.current[lastFAQ.id]; + if (inputRef) { + inputRef.focus(); + } } setShouldFocusLast(false); } @@ -53,7 +66,7 @@ const FAQEditor = ({ faqs, onChange }: FAQEditorProps) => { return ( - ❓ 자주 묻는 질문 (FAQ) + 자주 묻는 질문 (FAQ) + FAQ 추가 @@ -63,41 +76,44 @@ const FAQEditor = ({ faqs, onChange }: FAQEditorProps) => { ) : ( - {faqs.map((faq, index) => ( - - - Q{index + 1} - handleRemoveFAQ(faq.id)}> - 삭제 - - + {faqs + .filter((faq): faq is FAQ & { id: string } => !!faq.id) + .map((faq, index) => ( + + + Q{index + 1} + handleRemoveFAQ(faq.id)}> + 삭제 + + - { - questionInputRefs.current[faq.id] = element; - }} - placeholder='질문을 입력하세요' - value={faq.question} - onChange={(event) => - handleUpdateQuestion(faq.id, event.target.value) - } - maxLength={100} - /> + { + questionInputRefs.current[faq.id] = element; + }} + placeholder='질문을 입력하세요' + value={faq.question} + onChange={(event) => + handleUpdateQuestion(faq.id, event.target.value) + } + maxLength={100} + /> - - handleUpdateAnswer(faq.id, event.target.value) - } - maxLength={300} - /> + + handleUpdateAnswer(faq.id, event.target.value) + } + maxLength={300} + /> - - 질문: {faq.question.length}/100 | 답변: {faq.answer.length}/300 - - - ))} + + 질문: {faq.question.length}/100 | 답변: {faq.answer.length} + /300 + + + ))} )} From d580fce84d724279b76cd1e7c00b6097dec911a1 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:06:19 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20FAQ=20=ED=83=80=EC=9E=85=EC=97=90?= =?UTF-8?q?=20id=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FAQ 인터페이스에 optional id 필드 추가하여 클라이언트 측 리스트 관리 지원 - RecruitmentStatus 타입 포맷 정리 --- frontend/src/types/club.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/frontend/src/types/club.ts b/frontend/src/types/club.ts index d38e5c3be..37f1e69b8 100644 --- a/frontend/src/types/club.ts +++ b/frontend/src/types/club.ts @@ -1,10 +1,6 @@ import { SNS_CONFIG } from '@/constants/snsConfig'; -export type RecruitmentStatus = - | 'OPEN' - | 'CLOSED' - | 'UPCOMING' - | 'ALWAYS'; +export type RecruitmentStatus = 'OPEN' | 'CLOSED' | 'UPCOMING' | 'ALWAYS'; export interface Club { id: string; @@ -56,6 +52,7 @@ export interface IdealCandidate { } export interface FAQ { + id?: string; question: string; answer: string; } From 59be4318d7050ca2eb9cb5954f9fe57a1367851f Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:23:38 +0900 Subject: [PATCH 07/11] =?UTF-8?q?refactor:=20=EC=83=81=EC=84=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=83=81=20=EC=9D=B4=EB=AA=A8?= =?UTF-8?q?=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ClubIntroContent/ClubIntroContent.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx b/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx index d6d1ab702..5c9232128 100644 --- a/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx +++ b/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx @@ -61,9 +61,10 @@ const ClubIntroContent = ({ )} + \ {awards && awards.length > 0 && ( - 🏆 동아리 성과 + 동아리 성과 {awards.map((award) => ( @@ -80,7 +81,6 @@ const ClubIntroContent = ({ )} - {idealCandidate?.content?.trim() && ( 이런 사람이 오면 좋아요 @@ -89,7 +89,6 @@ const ClubIntroContent = ({ )} - {benefits?.trim() && ( 동아리 부원이 가지는 혜택 @@ -98,7 +97,6 @@ const ClubIntroContent = ({ )} - {faqs && faqs.length > 0 && ( FAQ From b5fe0609a366f9caf16be3fb85a7ea6418e56e5a Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:25:10 +0900 Subject: [PATCH 08/11] =?UTF-8?q?fix:=20\=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ClubIntroContent/ClubIntroContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx b/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx index 5c9232128..a3ad1ab13 100644 --- a/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx +++ b/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.tsx @@ -61,7 +61,7 @@ const ClubIntroContent = ({ )} - \ + {awards && awards.length > 0 && ( 동아리 성과 From 35b0104c69b340e5e9665b87f9af07de7c25b64f Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:50:11 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20FAQ=20=EB=8B=B5=EB=B3=80=20?= =?UTF-8?q?=EC=A4=84=EB=B0=94=EA=BF=88=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ClubIntroContent/ClubIntroContent.styles.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.styles.ts b/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.styles.ts index dfaf2af63..655515ca5 100644 --- a/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.styles.ts +++ b/frontend/src/pages/ClubDetailPage/components/ClubIntroContent/ClubIntroContent.styles.ts @@ -210,6 +210,7 @@ export const AnswerBox = styled.div` ${setTypography(typography.paragraph.p3)}; color: ${colors.gray[800]}; line-height: 1.5; + white-space: pre-line; display: flex; gap: 8px; From 3474c4960f59a983cd327f42a6add20facff8e11 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 12 Jan 2026 14:58:17 +0900 Subject: [PATCH 10/11] =?UTF-8?q?feat:=20=EC=97=90=EB=B8=8C=EB=A6=AC?= =?UTF-8?q?=ED=83=80=EC=9E=84=20=EB=A7=81=ED=81=AC=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApplicationEditTab/ApplicationEditTab.tsx | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/frontend/src/pages/AdminPage/tabs/ApplicationEditTab/ApplicationEditTab.tsx b/frontend/src/pages/AdminPage/tabs/ApplicationEditTab/ApplicationEditTab.tsx index 37249bbae..b9b06f27d 100644 --- a/frontend/src/pages/AdminPage/tabs/ApplicationEditTab/ApplicationEditTab.tsx +++ b/frontend/src/pages/AdminPage/tabs/ApplicationEditTab/ApplicationEditTab.tsx @@ -20,9 +20,17 @@ import { import * as Styled from './ApplicationEditTab.styles'; import { QuestionDivider } from './ApplicationEditTab.styles'; +const externalApplicationUrlAllowed = [ + 'https://forms.gle', + 'https://docs.google.com/forms', + 'https://form.naver.com', + 'https://naver.me', + 'https://everytime.kr', +]; + const ApplicationEditTab = () => { - const navigate = useNavigate(); const queryClient = useQueryClient(); + const navigate = useNavigate(); const { applicationFormId: formId } = useParams<{ applicationFormId?: string; }>(); @@ -37,12 +45,9 @@ const ApplicationEditTab = () => { const [formData, setFormData] = useState(INITIAL_FORM_DATA); - const [nextId, setNextId] = useState(1); - const [applicationFormMode, setApplicationFormMode] = useState(ApplicationFormMode.INTERNAL); - const [externalApplicationUrl, setExternalApplicationUrl] = useState(''); useEffect(() => { @@ -129,20 +134,13 @@ const ApplicationEditTab = () => { if (applicationFormMode === ApplicationFormMode.INTERNAL) { payload.questions = reorderedQuestions; } else if (applicationFormMode === ApplicationFormMode.EXTERNAL) { - const externalApplicationUrlAllowed = [ - 'https://forms.gle', - 'https://docs.google.com/forms', - 'https://form.naver.com', - 'https://naver.me', - ]; - const isValidUrl = externalApplicationUrlAllowed.some((url) => externalApplicationUrl.startsWith(url), ); if (!isValidUrl) { alert( - '외부 지원서 링크는 Google Forms 또는 Naver Form 링크여야 합니다.', + '외부 지원서 링크는 Google Forms, Naver Form 또는 Everytime 링크여야 합니다.', ); return; } @@ -368,7 +366,7 @@ const ExternalApplicationComponent = ({ /> - 현재 구글폼, 네이버폼 링크만 제출가능합니다. + 현재 구글폼, 네이버폼, 에브리타임 링크만 제출가능합니다. ); From 7f7496398a9cb7a3511cef1f98deb7eb8c9eed22 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Tue, 13 Jan 2026 11:27:27 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat:=20=EC=86=8C=EA=B0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/constants/eventName.ts | 1 + .../pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/constants/eventName.ts b/frontend/src/constants/eventName.ts index 0fd757188..f5d8a8774 100644 --- a/frontend/src/constants/eventName.ts +++ b/frontend/src/constants/eventName.ts @@ -97,6 +97,7 @@ export const PAGE_VIEW = { // 관리자 LOGIN_PAGE: '로그인페이지', + CLUB_INTRO_EDIT_PAGE: '동아리 소개 수정 페이지', CLUB_INFO_EDIT_PAGE: '동아리 기본 정보 수정 페이지', RECRUITMENT_INFO_EDIT_PAGE: '동아리 모집 정보 수정 페이지', PHOTO_EDIT_PAGE: '동아리 활동 사진 수정 페이지', diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx index e8db4a1bd..09b58222c 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx @@ -15,7 +15,7 @@ import FAQEditor from './components/FAQEditor/FAQEditor'; const ClubIntroEditTab = () => { const trackEvent = useMixpanelTrack(); - useTrackPageView(PAGE_VIEW.CLUB_INFO_EDIT_PAGE); + useTrackPageView(PAGE_VIEW.CLUB_INTRO_EDIT_PAGE); const clubDetail = useOutletContext(); const { mutate: updateClub } = useUpdateClubDetail();