Skip to content

[refactor] 어드민 텍스트 필드 글자수 제한 상수화 및 자동 높이 적용 - #1822

Merged
suhyun113 merged 9 commits into
feature/#1802-club-intro-edit-tab-mobile-MOA-1018from
refactor/admin-text-field-MOA-1034
Jul 12, 2026
Merged

[refactor] 어드민 텍스트 필드 글자수 제한 상수화 및 자동 높이 적용#1822
suhyun113 merged 9 commits into
feature/#1802-club-intro-edit-tab-mobile-MOA-1018from
refactor/admin-text-field-MOA-1034

Conversation

@suhyun113

@suhyun113 suhyun113 commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

#1805
위 PR에서 받은 리뷰에서의 수정입니다.

  • src/constants/adminFieldLimits.ts 생성하여 어드민 탭 전체 텍스트 필드 maxLength를 한 곳에서 관리
  • ClubInfo, ClubIntro, FAQ, Recruit, Account 탭의 매직넘버를 상수로 교체, 데스크톱/모바일 간 글자수 제한 통일
  • ClubIntroEditTabMobile textarea에 useAutoGrow 적용으로 입력량에 따라 필드 높이 자동 확장
  • FAQEditor(desktop) AnswerTextAreauseAutoGrow 적용, FAQItemEditor 서브 컴포넌트로 분리

Jira

MOA-1034

Test plan

  • 어드민 소개 정보 수정 모바일에서 텍스트 입력 시 필드 높이 자동 확장 확인
  • 데스크톱 FAQ 답변 입력 시 높이 자동 확장 확인
  • 모바일/데스크톱 글자수 카운터가 동일한 기준으로 표시되는지 확인

Summary by CodeRabbit

  • 개선 사항
    • 관리자 입력 화면의 글자 수 제한과 안내 문구를 일관된 기준으로 적용했습니다.
    • 클럽 정보, 소개, 태그, FAQ, 모집 대상, 비밀번호 입력 필드의 입력 제한을 명확히 했습니다.
    • 데스크톱과 모바일 화면에서 동일한 placeholder와 글자 수 표시를 제공합니다.
    • FAQ 입력 UI를 개선해 질문·답변 작성과 항목 관리를 더 일관되게 지원합니다.

@vercel

vercel Bot commented Jul 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
moadong Ready Ready Preview, Comment Jul 12, 2026 2:05pm

@coderabbitai

coderabbitai Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@suhyun113, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 53 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7abeaf55-8eb6-408f-a9f3-eba3c2476444

📥 Commits

Reviewing files that changed from the base of the PR and between 1c11024 and 7efb6a1.

📒 Files selected for processing (1)
  • frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTabMobile.tsx

Walkthrough

어드민 입력 필드의 최대 길이와 placeholder를 공통 상수로 분리하고, 클럽 정보·소개·FAQ·모집·계정 관리 화면의 데스크톱 및 모바일 입력 컴포넌트에 적용했습니다. 모바일 소개 입력에는 공통 변경 핸들러와 자동 확장 ref가 추가되었습니다.

Changes

어드민 입력 필드 상수화

Layer / File(s) Summary
공통 입력 상수 정의
frontend/src/constants/*
어드민 입력 필드별 최대 길이와 placeholder 상수를 추가하고 중앙 관리 문서에 등록했습니다.
클럽 기본 정보 입력 적용
frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/...
클럽명, 한줄소개, 태그 입력이 공통 maxLength와 placeholder 상수를 사용하도록 변경했습니다.
소개 정보 입력 흐름 정리
frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab*
소개 입력의 제한값과 placeholder를 통일하고, 모바일 입력에 공통 변경 핸들러와 useAutoGrow ref를 적용했습니다.
FAQ 입력 컴포넌트 적용
frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/{desktop, mobile}/...
데스크톱 FAQ 항목을 FAQItemEditor로 분리하고 질문·답변 입력의 제한값, placeholder, 글자 수 표시를 공통 상수로 변경했습니다.
계정·모집 입력 적용
frontend/src/pages/AdminPage/tabs/{AccountEditTab,RecruitEditTab}/...
비밀번호와 모집 대상 입력의 하드코딩된 최대 길이를 공통 상수로 교체했습니다.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related issues

Possibly related PRs

  • Moadong/moadong#1024 — 동일한 FAQ 편집 영역의 항목 ID 및 질문·답변 업데이트 흐름을 수정합니다.
  • Moadong/moadong#1784 — 모바일 FAQSectionuseAutoGrow 기반 입력 경로를 추가해 해당 코드와 직접 연결됩니다.
  • Moadong/moadong#1796 — 모바일 클럽명·한줄소개 입력에 최대 길이를 적용한 변경과 직접 연결됩니다.

Suggested labels: ✨ Feature

Suggested reviewers: seongwon030, oesnuj

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 어드민 텍스트 필드의 글자수 제한 상수화와 일부 입력의 자동 높이 적용을 정확히 요약합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/admin-text-field-MOA-1034

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@reviewer-harry

reviewer-harry Bot commented Jul 12, 2026

Copy link
Copy Markdown

Claude finished @suhyun113's task in 2m 11s —— View job


harry 리뷰 결과 ✅

  • 리뷰 기준(.github/harry-review-rules.md) 확인
  • PR 전체 변경사항 diff 분석
  • 세부 파일 리뷰 및 인라인 코멘트 작성
  • 총평 작성

총평

전체적으로 깔끔한 상수화 리팩터링이에요 👍 매직넘버를 adminFieldLimits.ts 한 곳으로 모으고, constants/CLAUDE.md 인덱스까지 함께 갱신한 점이 컨벤션에 잘 맞아요. 데스크톱 FAQ의 useAutoGrow는 훅을 루프에서 못 부르니 FAQItemEditor 서브컴포넌트로 분리한 접근도 적절하고, 모바일 FAQSection의 기존 패턴과 네이밍(FAQItemEditor)도 일관돼요.

리뷰 기준(수동 메모이제이션 남용 / 불필요한 useEffect / API 위치 / 공통 UI 중복 등) 관점에서는 위반이 없어요.

  • useAutoGrowuseEffectscrollHeight 측정용 DOM 부작용이라 파생 상태로 대체 불가 → 정상이에요.
  • 핸들러 분리(handleIntroChange 등)는 수동 useCallback 없이 일반 함수라 React Compiler 전제와도 잘 맞아요.

딱 한 가지, 모바일 소개 문구 한도가 300 → 200으로 축소되는 부분만 인라인으로 확인 요청 남겼어요. 백엔드에 길이 검증(@Size)이 없어 프론트 한도가 유일한 가드라, 의도된 정책인지만 짚어봐 주세요.

수고하셨어요! 🙌

export const CLUB_TAG_MAX = 5;

// 소개 정보 수정 (ClubIntroEditTab)
export const INTRO_DESCRIPTION_MAX = 200;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

데스크톱/모바일 글자수를 데스크톱 기준으로 통일하면서, 모바일 소개 문구 한도가 기존 INTRO_MAX = 300에서 200으로 줄어드는 점만 한 번 확인해 주세요. 나머지 활동/인재상/혜택은 300 → 500으로 늘어나 안전한데, 소개만 한도가 축소돼요.

백엔드 club description 필드에 @Size 검증이 없어서 프론트 한도가 유일한 가드인데, 예전 모바일에서 200~300자로 저장해 둔 동아리는 이 화면에서 재저장하려면 문구를 줄여야 하는 상황이 생길 수 있어요. 의도한 정책이면 그대로 두셔도 좋아요 👍

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request centralizes text field character limits across various admin tabs (ClubInfo, ClubIntro, Recruit, and Account) into a new adminFieldLimits.ts constant file, replacing hardcoded magic numbers. It also refactors the FAQ editor by extracting FAQItemEditor and integrates the useAutoGrow hook for mobile textareas. The review feedback suggests further simplifying the input change handlers in ClubIntroEditTabMobile.tsx and FAQSection.tsx by leveraging the native HTML maxLength attribute on the textarea elements instead of manually checking string lengths in JavaScript.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +54 to +76
const handleIntroChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
if (e.target.value.length <= INTRO_DESCRIPTION_MAX) {
setIntroDescription(e.target.value);
}
};

const handleActivityChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
if (e.target.value.length <= ACTIVITY_DESCRIPTION_MAX) {
setActivityDescription(e.target.value);
}
};

const handleIdealChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
if (e.target.value.length <= IDEAL_CANDIDATE_MAX) {
setIdealCandidate({ ...idealCandidate, content: e.target.value });
}
};

const handleBenefitsChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
if (e.target.value.length <= BENEFITS_MAX) {
setBenefits(e.target.value);
}
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

데스크톱 버전(ClubIntroEditTab.tsx)과 동일하게 HTML <textarea> 엘리먼트에 maxLength 속성을 직접 부여하면, 브라우저가 네이티브하게 글자 수를 제한하므로 JS 레벨에서 매번 글자 수를 체크하는 조건문(if (e.target.value.length <= ..._MAX))을 제거하여 코드를 단순화할 수 있습니다.

이 변경사항을 적용한 후, 아래의 각 Styled.TextArea 컴포넌트에도 대응하는 maxLength 속성(예: maxLength={INTRO_DESCRIPTION_MAX})을 추가해 주세요.

  const handleIntroChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
    setIntroDescription(e.target.value);
  };

  const handleActivityChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
    setActivityDescription(e.target.value);
  };

  const handleIdealChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
    setIdealCandidate({ ...idealCandidate, content: e.target.value });
  };

  const handleBenefitsChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
    setBenefits(e.target.value);
  };

Comment on lines 23 to 27
const handleAnswerChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
if (e.target.value.length <= ANSWER_MAX_LENGTH) {
if (e.target.value.length <= FAQ_ANSWER_MAX) {
onChange(index, 'answer', e.target.value);
}
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

마찬가지로 모바일 FAQ 답변 입력란에서도 HTML <textarea> 엘리먼트에 maxLength={FAQ_ANSWER_MAX} 속성을 직접 부여하고, JS 레벨의 수동 글자 수 체크 로직을 제거하여 데스크톱 버전(FAQEditor.tsx)과 일관성을 맞추는 것이 좋습니다.

이 변경사항을 적용한 후, Styled.AnswerTextarea 컴포넌트(47번 라인 부근)에 maxLength={FAQ_ANSWER_MAX} 속성을 추가해 주세요.

  const handleAnswerChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
    onChange(index, 'answer', e.target.value);
  };

@seongwon030 seongwon030 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

훅분리와 상수분리로 더 깔끔해졌네요 수고하셨습니다

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상수관리 정말 좋네요

…holders-MOA-1034-MOA-1036

[refactor] 어드민 텍스트 필드 placeholder 상수화
@reviewer-harry

reviewer-harry Bot commented Jul 12, 2026

Copy link
Copy Markdown

Claude finished @suhyun113's task in 1m 34s —— View job


harry 리뷰 결과 🚨

  • 리뷰 기준(.github/harry-review-rules.md) 확인
  • 직전 리뷰 이후 새 커밋 변경분(1c11024d..7efb6a13) 분석
  • 세부 파일 리뷰 및 인라인 코멘트 작성
  • 총평 작성

총평

이번 push에서 추가된 변경분은 ClubIntroEditTabMobile.tsx 한 파일이에요. 그런데 머지 충돌 해결 과정에서 문제가 하나 생겼어요.

handleIntroChange·handleActivityChange·handleIdealChange·handleBenefitsChange 핸들러 4개가 중복 선언됐고(6082줄 + 84106줄), 두 번째 블록은 존재하지 않는 상수 INTRO_MAX·ACTIVITY_MAX·IDEAL_MAX를 참조해요. 이대로면 Cannot redeclare block-scoped variable + 미정의 심볼로 타입체크/빌드가 깨져요. 예전 브랜치 코드가 머지 때 다시 딸려 들어온 걸로 보여요.

👉 해당 인라인 코멘트대로 중복 블록(84~106줄)을 삭제하고 npm run typecheck로 확인해 주세요. 그 외 상수화/useAutoGrow 리팩터링 자체는 이전 리뷰에서 짚은 대로 깔끔해요. 이 한 가지만 정리되면 좋겠어요 🙌

};

const handleIntroChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
if (e.target.value.length <= INTRO_MAX) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 머지 커밋에서 핸들러 4개(handleIntroChange·handleActivityChange·handleIdealChange·handleBenefitsChange)가 중복 선언됐어요. 위쪽(6082줄)에 이미 같은 이름의 핸들러가 있어서, 이 84106줄 블록은 Cannot redeclare block-scoped variable 컴파일 에러를 내요.

게다가 이 블록은 INTRO_MAX·ACTIVITY_MAX·IDEAL_MAX를 참조하는데, adminFieldLimits.ts에는 이런 상수가 없어요(올바른 이름은 INTRO_DESCRIPTION_MAX·ACTIVITY_DESCRIPTION_MAX·IDEAL_CANDIDATE_MAX예요). 머지 충돌 해결 과정에서 예전 코드가 다시 딸려 들어온 것 같아요.

이 중복 블록(84~106줄) 전체를 삭제하고, 삭제 후 npm run typecheck로 한 번 확인해 주세요. 지금 상태로는 빌드가 깨져요 🙏

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx (1)

7-7: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

placeholder 문자열도 상수로 중앙 관리해야 합니다.

maxLengthRECRUIT_TARGET_MAX 상수로 잘 교체되었으나, 168행의 placeholder='모집대상을 입력해주세요'는 여전히 하드코딩되어 있습니다. CLAUDE.md에 명시된 "문자열 하드코딩 금지" 원칙에 따라 adminFieldPlaceholders.ts에 추가하는 것이 좋습니다.

🔧 제안하는 수정

frontend/src/constants/adminFieldPlaceholders.ts에 상수 추가:

 export const FAQ_ANSWER_PLACEHOLDER = '답변을 입력해주세요';
+
+// 모집 정보 수정 (RecruitEditTab)
+export const RECRUIT_TARGET_PLACEHOLDER = '모집대상을 입력해주세요';

RecruitEditTab.tsx에 import 및 적용:

 import { RECRUIT_TARGET_MAX } from '`@/constants/adminFieldLimits`';
+import { RECRUIT_TARGET_PLACEHOLDER } from '`@/constants/adminFieldPlaceholders`';
-            placeholder='모집대상을 입력해주세요'
+            placeholder={RECRUIT_TARGET_PLACEHOLDER}

Also applies to: 173-173

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx` at line
7, Move the hardcoded recruitment-target placeholder strings in RecruitEditTab
to a named constant in adminFieldPlaceholders.ts, then import and use that
constant at both the target input placeholder locations around the existing
RECRUIT_TARGET_MAX usage.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/desktop/MakeTags/MakeTags.tsx`:
- Around line 52-54: Update the label text in the MakeTags component to derive
its character limit from CLUB_TAG_MAX instead of the hardcoded number 5, keeping
the label synchronized with the input maxLength value.

---

Nitpick comments:
In `@frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx`:
- Line 7: Move the hardcoded recruitment-target placeholder strings in
RecruitEditTab to a named constant in adminFieldPlaceholders.ts, then import and
use that constant at both the target input placeholder locations around the
existing RECRUIT_TARGET_MAX usage.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 12a3895f-5d55-4e55-b9c0-b5fe578fdaa8

📥 Commits

Reviewing files that changed from the base of the PR and between 6173115 and 1c11024.

📒 Files selected for processing (13)
  • frontend/src/constants/CLAUDE.md
  • frontend/src/constants/adminFieldLimits.ts
  • frontend/src/constants/adminFieldPlaceholders.ts
  • frontend/src/pages/AdminPage/tabs/AccountEditTab/AccountEditTab.tsx
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTab.tsx
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/ClubInfoEditTabMobile.tsx
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/desktop/MakeTags/MakeTags.tsx
  • frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/mobile/FreeTagEditPage/FreeTagEditPage.tsx
  • frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTab.tsx
  • frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/ClubIntroEditTabMobile.tsx
  • frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/desktop/FAQEditor/FAQEditor.tsx
  • frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/mobile/FAQSection/FAQSection.tsx
  • frontend/src/pages/AdminPage/tabs/RecruitEditTab/RecruitEditTab.tsx

Comment on lines +52 to +54
maxLength={CLUB_TAG_MAX}
onChange={(e) => updateTag(index, e.target.value)}
placeholder={`자유 태그 ${index + 1}`}
placeholder={CLUB_TAG_PLACEHOLDER}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

라벨 텍스트의 하드코딩된 숫자 5CLUB_TAG_MAX 상수로 통일해야 합니다.

maxLengthCLUB_TAG_MAX 상수로 변경되었지만, 45행 라벨 텍스트 "자유태그 (5자 이내)"에는 여전히 매직 넘버 5가 하드코딩되어 있습니다. CLUB_TAG_MAX 값이 변경될 경우 라벨과 실제 제한 값이 불일치하게 됩니다.

🔧 제안하는 수정
-        <Styled.Label>자유태그 (5자 이내)</Styled.Label>
+        <Styled.Label>자유태그 ({CLUB_TAG_MAX}자 이내)</Styled.Label>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
maxLength={CLUB_TAG_MAX}
onChange={(e) => updateTag(index, e.target.value)}
placeholder={`자유 태그 ${index + 1}`}
placeholder={CLUB_TAG_PLACEHOLDER}
<Styled.Label>자유태그 ({CLUB_TAG_MAX}자 이내)</Styled.Label>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/pages/AdminPage/tabs/ClubInfoEditTab/components/desktop/MakeTags/MakeTags.tsx`
around lines 52 - 54, Update the label text in the MakeTags component to derive
its character limit from CLUB_TAG_MAX instead of the hardcoded number 5, keeping
the label synchronized with the input maxLength value.

@reviewer-harry

reviewer-harry Bot commented Jul 12, 2026

Copy link
Copy Markdown

Claude finished @suhyun113's task in 37s —— View job


harry 리뷰 결과 ✅

  • 리뷰 기준(.github/harry-review-rules.md) 확인
  • 직전 리뷰 이후 새 커밋 변경분(7efb6a13..fbe3ad7a) 분석
  • 세부 파일 리뷰 및 총평 작성

총평

이번 커밋(fix(admin): ClubIntroEditTabMobile 핸들러 중복 선언 제거)은 직전 리뷰에서 짚었던 핸들러 중복 선언 문제를 정확히 해결했어요 👍

  • 중복됐던 두 번째 블록(84~106줄)이 깔끔하게 삭제됐고,
  • 남은 핸들러 4개(handleIntroChange·handleActivityChange·handleIdealChange·handleBenefitsChange)는 존재하는 올바른 상수(INTRO_DESCRIPTION_MAX·ACTIVITY_DESCRIPTION_MAX·IDEAL_CANDIDATE_MAX·BENEFITS_MAX)를 참조하고 있어요.

이제 Cannot redeclare / 미정의 심볼 문제가 사라져 빌드가 정상화됐어요. 리뷰 기준(수동 메모이제이션 / 불필요한 useEffect / 네이밍 / API 위치 / 공통 UI 중복 등) 관점에서도 이번 변경분에 추가 위반은 없어요.

깔끔하게 정리해 주셨네요, 수고하셨어요! 🙌

@suhyun113
suhyun113 merged commit 4271b1a into feature/#1802-club-intro-edit-tab-mobile-MOA-1018 Jul 12, 2026
5 checks passed
@suhyun113
suhyun113 deleted the refactor/admin-text-field-MOA-1034 branch July 12, 2026 14:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💻 FE Frontend 🔨 Refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants