Skip to content

feat: 신청 가능한 캠페인 NEW 배지 개설일 5일 이내만 표시 - #38

Open
bmbyeolhae wants to merge 11 commits into
mainfrom
feature/starsun-new-badge-5days
Open

feat: 신청 가능한 캠페인 NEW 배지 개설일 5일 이내만 표시#38
bmbyeolhae wants to merge 11 commits into
mainfrom
feature/starsun-new-badge-5days

Conversation

@bmbyeolhae

@bmbyeolhae bmbyeolhae commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

📝 수정 내역

  • feat: 신청 가능한 캠페인 NEW 배지를 개설일 5일 이내만 표시 (createdAt 저장 + 5일 조건)
  • feat: 홈 배너 설정 화면을 모달에서 페이지(page-banner-settings)로 전환
  • feat: 배너 설정 페이지 — 레이블·메인 텍스트·서브 텍스트·배경 이미지 수정 기능
  • fix: 이미지 업로드 시 임시 변수에 보관 후 저장 시 반영 (취소 시 원복)
  • fix: 이미지 업로드 시 캔버스 리사이즈(max 800px) + localStorage 저장 try/catch 추가
  • fix: home-banner-title innerHTML → textContent + white-space:pre-line (XSS 방지)
  • fix: renderNewCampaigns() 미사용 변수 priceNum 삭제
  • chore: navMap 인덱스 기반 경고 주석 추가

🖥 화면 변경

  • 신규 페이지: 어드민 홈 배너 설정 (page-banner-settings)
  • 영향받는 페이지: 유저 앱 홈 화면 (배너 텍스트 렌더링 방식 변경)

⚙️ 데이터/API 변경

  • localStorage biteme_new_campaigns[].createdAt 필드 추가 (없으면 NEW 배지 미표시)
  • localStorage biteme_home_banner 구조 유지

🧪 테스트 방법

  1. 어드민 → 사이드바 "홈 배너 설정" 클릭 → 페이지로 이동하는지 확인
  2. 텍스트 수정 후 저장 → user.html 홈 배너에 반영되는지 확인
  3. 이미지 업로드 후 취소 → 이미지가 저장되지 않는지 확인
  4. 이미지 업로드 후 저장 → 홈 배너 배경이 바뀌는지 확인
  5. 어드민 → 시딩 개설에서 신규 캠페인 등록 → user.html 홈에서 NEW 배지 표시 확인
  6. 개설일로부터 6일 이상 지난 캠페인에는 NEW 배지 미표시 확인

🔗 Preview URL

https://biteme-wireframes-git-feature-starsun-new-badge-5days-biteme.vercel.app

📎 관련 이슈

Closes #37, #39

@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
biteme-wireframes Ready Ready Preview Jul 31, 2026 1:04am

Request Review

@bmhayoung bmhayoung left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

코드 리뷰 (#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 충돌 해결 과정에서 하드코딩 배너가 되살아날 위험이 큽니다.

bmbyeolhae and others added 11 commits July 31, 2026 09:58
- admin.html: 캠페인 저장 시 createdAt(ISO 날짜) 필드 추가
- user.html: renderNewCampaigns에서 createdAt 기준 5일 이내에만 NEW 배지 렌더링
  (createdAt 없는 기존 캠페인은 NEW 배지 미표시)

Closes #37
- 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 미사용 변수 삭제

@bmhayoung bmhayoung left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

재검증 결과 (리베이스 후)

리베이스 확인했습니다. main(b6e0fdb) 기준으로 깔끔하게 올라와 있고 #41이 만든 카테고리 칩 영역도 그대로 살아 있습니다. 지난번 지적 6건은 전부 반영 확인했어요.

  • 모달 → 페이지(page-banner-settings) 전환 ✅ (breadcrumb·navMap 15번 인덱스도 실제 nav-item 16개와 일치)
  • 이미지 업로드 → _bnImgPending 임시 보관, 취소 시 원복 ✅
  • 캔버스 리사이즈(max 800px) + setItem try/catch ✅
  • home-banner-title textContent + 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-reviewdisplay:none 처리하는 순간 같이 숨겨집니다.

같은 이유로 프로덕션 어드민에서 이미 7개 페이지가 빈 화면입니다 (실측):

페이지 상태
시딩 캠페인 / 콘텐츠 검수 / 시딩·공구 일정 / 공구 파이프라인 정상
신청 관리 · 판매/정산 관리 · 인플루언서 목록 · 셀러 등급 관리 · 셀러 프로필 · 협의 게시판 · VIP 상품관 빈 화면

👉 제안: #review-seeding / #review-gb 닫힘 태그 보충을 이 PR에 포함하거나, #44(이슈 #43)에서 먼저 고치고 이 PR을 리베이스해 주세요. 어느 쪽이든 이게 해결돼야 배너 설정 기능이 실제로 보입니다.

참고로 #44에서 인라인 display:none 4곳만 제거하면 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을 직접 주면 됩니다.


🟡 확인/참고 (머지 차단 아님)

  1. PR 본문에 없는 변경 2건이 섞여 있습니다. ① 캠페인 상세 화면 캠페인명 옆 정사각형 썸네일 제거, ② 캠페인 카드 메타의 협찬가 ₩32,000플랫폼(인스타그램) 교체. 특히 ②는 셀러에게 보이는 정보가 바뀌는 건이라 이슈 #37/#39 어디에도 없는 스코프입니다. 의도한 변경이면 본문 "수정 내역"에 추가해 주시고, 협찬가 노출을 빼는 게 기획 확정 사항인지 한 번 확인 부탁드려요.
  2. 기존 캠페인은 NEW 배지가 영구 미표시됩니다(createdAt 없음). 지금 운영 화면에서 NEW가 달려 있던 카드들이 머지 직후 전부 사라지니, 데모 전에 신규 캠페인 하나 개설해두시는 게 좋습니다.
  3. 공동구매 상품 카드(renderGbCampaigns)의 NEW 배지는 여전히 무조건 노출입니다. 같은 5일 규칙을 적용할지는 별도 이슈로 잡으면 될 것 같아요.
  4. toDataURL('image/jpeg', 0.82) — 투명 PNG를 올리면 투명 영역이 검게 나옵니다. 배너 배경 용도라 실사용엔 무리 없지만 알고는 계시면 좋겠습니다.
  5. 배너 설정 화면의 "취소" 버튼이 진입 경로와 상관없이 항상 page-campaigns로 이동합니다. 사소하지만 뒤로가기 느낌은 아니라 어색할 수 있어요.

정리: NEW 배지·배너 설정 로직 자체는 잘 동작하고 지난 지적도 다 반영됐습니다. 🔴1(빈 화면)만 해결되면 머지하겠습니다. 🟠2는 같이 고쳐주시면 좋고, 🟡는 답만 주셔도 됩니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 신청 가능한 캠페인 NEW 배지 개설일 5일 이내만 표시

2 participants