feat: 신청 가능한 캠페인 NEW 배지 개설일 5일 이내만 표시 - #38
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
bmhayoung
left a comment
There was a problem hiding this comment.
코드 리뷰 (#38)
로직 자체(NEW 배지 5일 조건, createdAt 저장, 하위호환)는 본문 설명대로 정상 동작합니다. 다만 아래 항목 정리 후 머지 부탁드립니다.
🔴 1. PR 하나에 이슈 두 개가 섞여 있습니다
제목·본문은 전부 NEW 배지(#37) 얘기인데, diff의 약 70%가 이슈 #39(홈 배너 어드민 수정) 구현입니다. 본문에 배너 작업 언급이 없고 Closes #37만 있어서, 이대로 머지되면 #39는 구현이 끝났는데도 열린 채로 남습니다.
→ PR을 분리하거나, 최소한 본문에 배너 작업을 추가하고 Closes #37, #39로 수정 부탁드립니다.
🟠 2. #39는 "페이지"를 요구했는데 "모달"로 구현됐습니다
이슈 #39 작업 범위에 page-banner-settings 페이지 추가로 명시돼 있는데, 구현은 사이드바 클릭 → 모달입니다. 기능상 문제는 없지만 기획 의도와 다르니 확인 부탁드립니다.
🟠 3. goPage() 수정 — 이슈와 무관하지만 사실 진짜 버그 픽스입니다
document.querySelectorAll('.page').forEach(p => { …; p.style.display = 'none'; });CSS는 .page.active{display:block}인데 page-home·page-notifications·page-deposit·page-vip 4개에 인라인 style="display:none"이 박혀 있어(admin.html:288, 2149, 2271, 2660) 인라인이 CSS를 이깁니다. 즉 대시보드 홈 / 알림 자동화 / 보증금 관리 메뉴는 지금까지 클릭해도 빈 화면이었고, 이 PR이 그걸 우연히 고치고 있습니다.
다만 근본 수정은 그 인라인 display:none 4개를 지우는 것입니다. 지금 방식은 앞으로 .active만 토글하는 코드가 생기면 인라인이 또 이겨서 동일 버그가 재발합니다. 그리고 이건 별도 이슈 + 별도 PR로 올리는 게 맞습니다.
🟠 4. '취소'가 이미지 변경을 되돌리지 못합니다
bnUploadImg() / bnClearImg()가 저장 버튼을 누르기 전에 곧바로 localStorage에 씁니다. 텍스트는 저장 시점 반영이라, 이미지 바꾸고 취소를 눌러도 이미지만 바뀐 채 남습니다. 임시 변수에 담아뒀다가 saveBannerSettings()에서 함께 커밋해 주세요.
🟡 5. dataURL을 localStorage에 직접 저장
큰 이미지면 QuotaExceededError가 나는데 try/catch가 없어 조용히 실패하고, 같은 스토리지를 쓰는 캠페인 저장까지 함께 실패할 수 있습니다. 캔버스 리사이즈 + try/catch 권장합니다. (캠페인 썸네일 업로드도 같은 패턴이라 함께 손보면 좋습니다.)
🟡 6. 자잘한 것들
function loadBannerSettings() {}— 호출처 없는 빈 함수. 삭제 부탁드립니다.titleEl.innerHTML = (…).replace(/\n/g,'<br>')— 어드민 입력이 HTML로 실행됩니다. 와이어프레임이라 위험도는 낮지만, #36에서desc에 쓰신 방식(textContent+white-space:pre-line) 을 그대로 쓰면 공짜로 해결됩니다.renderNewCampaigns()의priceNum이 '협찬가' 제거로 미사용 변수가 됐습니다.navMap이 위치 인덱스 기반인데 새 nav-item을 맨 끝에 넣으셔서 이번엔 안 밀렸습니다. 다음에 중간 삽입하면 전 메뉴가 어긋나니 경고 주석 한 줄 남겨두면 좋겠습니다.
⚠️ #41과 충돌합니다
#41과 같은 base(user.html 678a801)에서 같은 배너 블록(247~259행) 을 수정하고 있어 충돌이 확정입니다.
#41(레이아웃)을 먼저 머지하고 이 PR을 rebase하는 순서를 권장합니다. 반대로 하면 #41 충돌 해결 과정에서 하드코딩 배너가 되살아날 위험이 큽니다.
- admin.html: 캠페인 저장 시 createdAt(ISO 날짜) 필드 추가 - user.html: renderNewCampaigns에서 createdAt 기준 5일 이내에만 NEW 배지 렌더링 (createdAt 없는 기존 캠페인은 NEW 배지 미표시) Closes #37
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- banner-modal → page-banner-settings(.page) 로 전환, 사이드바에서 goPage()로 진입 - breadcrumbs·navMap에 page-banner-settings 항목 추가 - navMap 인덱스 기반 경고 주석 추가 - loadBannerSettings() 채우기 (기존 빈 함수 제거) - 이미지 업로드 시 임시 변수(_bnImgPending)에 보관 후 저장 시 커밋 (취소 시 되돌아감) - bnUploadImg() 캔버스 리사이즈(max 800px) + saveBannerSettings() try/catch 추가 - openBannerModal() / closeBannerModal() 삭제 - user.html: home-banner-title innerHTML→textContent + white-space:pre-line (XSS 방지) - user.html: renderNewCampaigns() priceNum 미사용 변수 삭제
6f281a0 to
1f47bbc
Compare
bmhayoung
left a comment
There was a problem hiding this comment.
재검증 결과 (리베이스 후)
리베이스 확인했습니다. main(b6e0fdb) 기준으로 깔끔하게 올라와 있고 #41이 만든 카테고리 칩 영역도 그대로 살아 있습니다. 지난번 지적 6건은 전부 반영 확인했어요.
- 모달 → 페이지(
page-banner-settings) 전환 ✅ (breadcrumb·navMap 15번 인덱스도 실제 nav-item 16개와 일치) - 이미지 업로드 →
_bnImgPending임시 보관, 취소 시 원복 ✅ - 캔버스 리사이즈(max 800px) +
setItemtry/catch ✅ home-banner-titletextContent+white-space:pre-line✅- 빈 함수였던
loadBannerSettings()구현 ✅ / 미사용priceNum삭제 ✅ - navMap 인덱스 기반 경고 주석 ✅
프리뷰에서 NEW 배지 로직도 실제 데이터로 확인했습니다 — 오늘 개설 = NEW 표시 / 6일 전 개설 = 미표시 / createdAt 없는 캠페인 = 미표시, 의도대로 동작합니다.
다만 머지 전에 정리가 필요한 게 2건 있습니다.
🔴 1. 홈 배너 설정 페이지가 프리뷰에서 빈 화면입니다 (기능 자체가 동작 안 함)
프리뷰 어드민에서 사이드바 "홈 배너 설정"을 누르면 breadcrumb·nav 활성표시는 바뀌는데 본문이 아무것도 안 나옵니다.
원인은 이 PR의 코드가 아니라 main에 이미 있는 #page-review 안쪽 div 불균형입니다.
#review-seeding(admin.html 1899행~) 블록이 여는<div>18개 / 닫는</div>17개 → 닫힘 태그 1개 부족 (#review-gb도 동일하게 1개 부족)- 그래서 브라우저가 그 뒤에 오는 페이지들을 전부
#review-seeding자식으로 붙여버립니다. 새로 추가한#page-banner-settings도 DOM상#review-seeding안에 들어가 있어서,goPage()가 조상인page-review를display:none처리하는 순간 같이 숨겨집니다.
같은 이유로 프로덕션 어드민에서 이미 7개 페이지가 빈 화면입니다 (실측):
| 페이지 | 상태 |
|---|---|
| 시딩 캠페인 / 콘텐츠 검수 / 시딩·공구 일정 / 공구 파이프라인 | 정상 |
| 신청 관리 · 판매/정산 관리 · 인플루언서 목록 · 셀러 등급 관리 · 셀러 프로필 · 협의 게시판 · VIP 상품관 | 빈 화면 |
👉 제안: #review-seeding / #review-gb 닫힘 태그 보충을 이 PR에 포함하거나, #44(이슈 #43)에서 먼저 고치고 이 PR을 리베이스해 주세요. 어느 쪽이든 이게 해결돼야 배너 설정 기능이 실제로 보입니다.
참고로 #44에서 인라인
display:none4곳만 제거하면page-home만 살아나고page-notifications·page-deposit·page-vip는 위 중첩 때문에 여전히 빈 화면입니다. #44 범위에 태그 균형 수정을 같이 넣는 게 좋아 보입니다.
또 한 가지, 이번 goPage()가 모든 .page에 인라인 display를 직접 찍는 방식인데(p.style.display='none' / target.style.display='block'), 이건 원인(인라인 스타일)을 또 다른 인라인 스타일로 덮는 구조라 #44의 방향(인라인 제거 → CSS .page.active만 사용)과 충돌합니다. #44가 머지되면 goPage()는 클래스 토글만 남기는 쪽으로 정리 부탁드려요.
🟠 2. 유저 홈 배너 좌우 여백이 사라졌습니다 (레이아웃 회귀)
기존 배너를 감싸던 <div style="padding:14px 20px 0;flex-shrink:0"> 래퍼가 없어지면서 #home-banner가 #home-tab-sponsor의 직계 자식이 됐습니다. 결과적으로 배너가 화면 좌우 끝에 붙고 탭바 바로 아래 딱 붙어서, 아래 카테고리 칩(padding:0 20px)·캠페인 리스트와 좌우 정렬이 어긋납니다. border-radius:16px도 좌우가 잘려 안 보이고요.
- 프로덕션: 배너가 좌우 20px 안쪽, 위 14px 여백
- 이 PR 프리뷰: 배너가 화면 끝까지 꽉 참
👉 #home-banner를 기존 패딩 래퍼 안에 다시 넣거나, margin:14px 20px 0 + flex-shrink:0을 직접 주면 됩니다.
🟡 확인/참고 (머지 차단 아님)
- PR 본문에 없는 변경 2건이 섞여 있습니다. ① 캠페인 상세 화면 캠페인명 옆 정사각형 썸네일 제거, ② 캠페인 카드 메타의
협찬가 ₩32,000→플랫폼(인스타그램)교체. 특히 ②는 셀러에게 보이는 정보가 바뀌는 건이라 이슈 #37/#39 어디에도 없는 스코프입니다. 의도한 변경이면 본문 "수정 내역"에 추가해 주시고, 협찬가 노출을 빼는 게 기획 확정 사항인지 한 번 확인 부탁드려요. - 기존 캠페인은 NEW 배지가 영구 미표시됩니다(
createdAt없음). 지금 운영 화면에서 NEW가 달려 있던 카드들이 머지 직후 전부 사라지니, 데모 전에 신규 캠페인 하나 개설해두시는 게 좋습니다. - 공동구매 상품 카드(
renderGbCampaigns)의 NEW 배지는 여전히 무조건 노출입니다. 같은 5일 규칙을 적용할지는 별도 이슈로 잡으면 될 것 같아요. toDataURL('image/jpeg', 0.82)— 투명 PNG를 올리면 투명 영역이 검게 나옵니다. 배너 배경 용도라 실사용엔 무리 없지만 알고는 계시면 좋겠습니다.- 배너 설정 화면의 "취소" 버튼이 진입 경로와 상관없이 항상
page-campaigns로 이동합니다. 사소하지만 뒤로가기 느낌은 아니라 어색할 수 있어요.
정리: NEW 배지·배너 설정 로직 자체는 잘 동작하고 지난 지적도 다 반영됐습니다. 🔴1(빈 화면)만 해결되면 머지하겠습니다. 🟠2는 같이 고쳐주시면 좋고, 🟡는 답만 주셔도 됩니다.
📝 수정 내역
createdAt저장 + 5일 조건)page-banner-settings)로 전환home-banner-titleinnerHTML → textContent + white-space:pre-line (XSS 방지)renderNewCampaigns()미사용 변수priceNum삭제🖥 화면 변경
page-banner-settings)⚙️ 데이터/API 변경
biteme_new_campaigns[].createdAt필드 추가 (없으면 NEW 배지 미표시)biteme_home_banner구조 유지🧪 테스트 방법
🔗 Preview URL
https://biteme-wireframes-git-feature-starsun-new-badge-5days-biteme.vercel.app
📎 관련 이슈
Closes #37, #39