Skip to content

[Feat] WTH-372: Sanity 팝업 연동 추가#110

Merged
JIN921 merged 5 commits into
developfrom
feat/WTH-372-sainty-추가하기
May 11, 2026

Hidden character warning

The head ref may contain hidden characters: "feat/WTH-372-sainty-\ucd94\uac00\ud558\uae30"
Merged

[Feat] WTH-372: Sanity 팝업 연동 추가#110
JIN921 merged 5 commits into
developfrom
feat/WTH-372-sainty-추가하기

Conversation

@JIN921
Copy link
Copy Markdown
Collaborator

@JIN921 JIN921 commented May 10, 2026

✅ PR 유형

어떤 변경 사항이 있었나요?

  • 새로운 기능 추가
  • 버그 수정
  • 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
  • 코드 리팩토링
  • 주석 추가 및 수정
  • 문서 수정
  • 빌드 부분 혹은 패키지 매니저 수정
  • 파일 혹은 폴더명 수정
  • 파일 혹은 폴더 삭제

📌 관련 이슈번호

  • Closed #372

✅ Key Changes

  • @sanity/client 패키지 설치 및 클라이언트 설정 (src/lib/sanity/client.ts)
  • Sanity GROQ 쿼리 함수 추가 (src/lib/apis/popup.ts) — weeth_v4 대상 활성 팝업 조회
  • NoticePopup 컴포넌트 구현 (src/components/home/NoticePopup.tsx)
    • 홈 페이지(/{clubId}/home)에서만 렌더링
    • 모바일: 상단 중앙 고정 / 데스크탑: 우측 하단 고정
    • 다중 페이지 페이지네이션 지원
    • 24시간 숨기기 (localStorage 기반)
    • useDefaultImage 플래그로 기본 이미지(popup_default_img_1.png) 폴백
  • HomePageEntryNoticePopup 마운트

📸 스크린샷 or 실행영상

image 여기서 프로덕트 설정만 추가된거예용 image 공지 띄우면 이렇게 보여용 기존 디자인 그대로 썻습니당! ---

🎸 기타 사항 or 추가 코멘트

  • Sanity Studio(studio-weeth)에 product 필드 추가 및 재배포 완료
    • 팝업 생성 시 weeth_v3 / weeth_v4 선택으로 프로덕트별 노출 구분 가능

기존 sainty studio는 그대로 재사용하되, 위드 버전 필드를 구분해 어느 버전에 공지를 띄울지 설정할 수 있도록 했습니다!

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능
    • 홈 페이지에 공지 팝업이 추가되었습니다.
    • 팝업은 여러 페이지를 지원하며 이전/다음 네비게이션으로 이동할 수 있습니다.
    • 팝업을 닫거나 24시간 동안 숨길 수 있습니다.
    • 콘텐츠 관리 시스템을 통해 팝업 내용을 동적으로 관리할 수 있습니다.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 10, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 521921a0-1f1a-40b5-8dc4-b33683212f0e

📥 Commits

Reviewing files that changed from the base of the PR and between 37defd5 and c796bf5.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (2)
  • .claude/settings.local.json
  • package.json
✅ Files skipped from review due to trivial changes (2)
  • .claude/settings.local.json
  • package.json

📝 Walkthrough

Walkthrough

Sanity 기반 공지 팝업을 추가합니다: Sanity 클라이언트와 API를 추가하고, NoticePopup React 컴포넌트를 통해 홈 페이지에서 팝업을 표시하며 로컬 설정 파일의 permissions.allow 항목을 확장합니다.

변경 사항

공지 팝업 기능

레이어 / 파일 설명
의존성 추가
package.json
@sanity/client@^7.22.0 라이브러리 추가
Sanity 클라이언트 설정
src/lib/sanity/client.ts
프로젝트 ID tn0j01pf, 데이터셋 production, API 버전 2024-01-20으로 Sanity 클라이언트 인스턴스 초기화
팝업 데이터 스키마
src/lib/apis/popup.ts
PopupPage(제목, 콘텐츠, 이미지Url, 링크, useDefaultImage) 및 PopupDocument(headerLabel?, pages: PopupPage[]) 인터페이스 정의
팝업 조회 구현
src/lib/apis/popup.ts
GROQ 쿼리로 제품/대상/환경 및 날짜 범위 필터링, getActivePopup()로 Sanity에서 활성 팝업 조회(useCdn: false)
공지 팝업 컴포넌트
src/components/home/NoticePopup.tsx
클라이언트 컴포넌트로 /home 경로에서만 렌더링, localStorage 기반 24시간 숨김, 페이지네이션, 닫기 및 UI 렌더링 구현
홈페이지 통합
src/components/home/HomePageEntry.tsx, src/components/home/index.ts
HomePageEntry에 <NoticePopup /> 삽입 및 export * from './NoticePopup' 추가

로컬 Claude 설정

레이어 / 파일 설명
권한/명령 허용 목록 확장
.claude/settings.local.json
permissions.allow에 MCP/Figma/Chrome 권한 및 PDF 도구 관련 쉘 명령 등 항목 추가

코드 리뷰 난이도

🎯 3 (보통) | ⏱️ ~20분

공지 팝업 나타나네
산티 CMS 속으로
로컬스토리지 숨김처럼
24시간 조용하게
홈페이지 반짝이고 ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항(Sanity 팝업 연동 추가)을 명확하게 요약하고 있으며, 이슈 번호(WTH-372)도 포함되어 있습니다.
Description check ✅ Passed PR 설명이 템플릿의 모든 주요 섹션을 완료했으며, PR 유형, 관련 이슈번호, Key Changes, 스크린샷, 추가 코멘트를 포함하고 있습니다.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/WTH-372-sainty-추가하기

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 and usage tips.

@github-actions
Copy link
Copy Markdown

PR 검증 결과

⏭️ TypeScript: 건너뜀
⏭️ ESLint: 건너뜀
⏭️ Prettier: 건너뜀
⏭️ Build: 건너뜀

⚠️ 일부 검증에 실패했습니다. 확인 후 수정해주세요.

@github-actions
Copy link
Copy Markdown

PR 테스트 결과

⏭️ Jest: 건너뜀

⚠️ 테스트에 실패했습니다. 확인 후 수정해주세요.

@JIN921 JIN921 changed the title feat: Sanity 팝업 연동 추가 (WTH-372) [Feat] WTH-372: Sanity 팝업 연동 추가 May 10, 2026
@JIN921 JIN921 requested review from dalzzy, nabbang6 and woneeeee and removed request for dalzzy and woneeeee May 10, 2026 17:33
@JIN921 JIN921 self-assigned this May 10, 2026
@JIN921 JIN921 requested a review from woneeeee May 10, 2026 17:33
@github-actions
Copy link
Copy Markdown

구현한 기능 Preview: https://weeth-7q1fv4o6m-weethsite-4975s-projects.vercel.app

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 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 `@src/components/home/NoticePopup.tsx`:
- Line 12: HIDE_KEY is a global constant that causes hide state to be shared
across clubs; change it to be per-club/path by building a dynamic key (e.g.,
`${HIDE_KEY}_${clubId}` or `${HIDE_KEY}_${pathname}`) and update all usages (the
constant declaration for HIDE_KEY and the get/set logic around where you
read/write the hide-until value — the code near HIDE_KEY and the code paths at
the usage site around lines 45-49) to use this composed key so each club/path
has its own localStorage entry.
- Around line 67-79: The NoticePopup component contains many hardcoded Tailwind
arbitrary values (e.g., pt-[60px], w-[320px], max-w-[calc(100vw-32px)],
text-[18px], underline-offset-[3px], shadow-[...]) used directly inside the
cn(...) className calls; refactor these styles into a cva-based style object
(e.g., create cva variants like noticePopupContainer and popupCard) and replace
the arbitrary classes with design-token-first utility classes (or agreed token
names) inside the cva definitions; ensure all occurrences referenced in the diff
(the cn(...) wrapper and the popup card div) are updated, and do not add new
tokens without confirmation—ask the designer/product owner if a new token is
required before introducing one.
- Around line 120-136: The pagination buttons rendering the symbols ‹ and ›
(inside the buttons handled by handlePrev and handleNext, with state
currentIndex and popup.pages) lack screen-reader labels; add descriptive
aria-label attributes to both buttons (for example "Previous page" and "Next
page" or include dynamic context like "Previous page, page X of Y" / "Next page,
page X of Y") so assistive tech can convey their purpose and state; ensure the
labels update using currentIndex and popup.pages.length and keep existing
disabled behavior intact.
- Around line 97-106: The Image in NoticePopup.tsx is loading Sanity-hosted
images via currentPage.imageUrl but next.config.ts lacks the cdn.sanity.io
remotePatterns entry; open next.config.ts and add an entry to the
images.remotePatterns array with protocol: 'https' and hostname: 'cdn.sanity.io'
so next/image can load currentPage.imageUrl at runtime.

In `@src/lib/apis/popup.ts`:
- Around line 27-29: The environment-detection in getActivePopup relies on URL
pattern matching and can misclassify; change it to read an explicit env var
(e.g., NEXT_PUBLIC_APP_ENV) and validate its value is either 'dev' or
'production' before passing to sanityClient.fetch. Update the currentEnv
assignment in getActivePopup to use process.env.NEXT_PUBLIC_APP_ENV, default to
'production' only if the value is missing or invalid, and consider adding a
small warning log when falling back so misconfiguration is visible.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dc783def-53d5-4ca3-a343-75166e689192

📥 Commits

Reviewing files that changed from the base of the PR and between ea38f85 and 37defd5.

⛔ Files ignored due to path filters (2)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • src/assets/image/popup_default_img_1.png is excluded by !**/*.png
📒 Files selected for processing (6)
  • package.json
  • src/components/home/HomePageEntry.tsx
  • src/components/home/NoticePopup.tsx
  • src/components/home/index.ts
  • src/lib/apis/popup.ts
  • src/lib/sanity/client.ts

import { getActivePopup, type PopupDocument } from '@/lib/apis/popup';
import DefaultPopupImg from '@/assets/image/popup_default_img_1.png';

const HIDE_KEY = 'popup_hide_until';
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

24시간 숨김 키를 클럽 단위로 분리하는 게 안전합니다.

Line 12의 고정 키(popup_hide_until)는 클럽 간 상태가 섞일 수 있습니다. clubId 또는 pathname을 포함해 키를 분리하면 의도치 않은 교차 숨김을 막을 수 있습니다.

Also applies to: 45-49

🤖 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 `@src/components/home/NoticePopup.tsx` at line 12, HIDE_KEY is a global
constant that causes hide state to be shared across clubs; change it to be
per-club/path by building a dynamic key (e.g., `${HIDE_KEY}_${clubId}` or
`${HIDE_KEY}_${pathname}`) and update all usages (the constant declaration for
HIDE_KEY and the get/set logic around where you read/write the hide-until value
— the code near HIDE_KEY and the code paths at the usage site around lines
45-49) to use this composed key so each club/path has its own localStorage
entry.

Comment on lines +67 to +79
className={cn(
'pointer-events-none fixed inset-0 z-50 flex flex-col',
'items-center justify-start pt-[60px]',
'desktop:items-end desktop:justify-end desktop:p-600',
)}
>
<div className="pointer-events-auto flex flex-col" onClick={(e) => e.stopPropagation()}>
{/* 팝업 카드 */}
<div
className={cn(
'bg-container-neutral flex w-[320px] max-w-[calc(100vw-32px)] flex-col overflow-hidden',
'rounded-lg border border-[var(--color-line,#e5e7eb)] shadow-[0px_0px_10px_8px_rgba(0,0,0,0.3)]',
)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy lift

디자인 토큰 우선 규칙과 cva 스타일 구조를 맞춰주세요.

현재 구간에 임의값 클래스(pt-[60px], w-[320px], max-w-[calc(...)], text-[18px], underline-offset-[3px], shadow-[...] 등)가 다수 포함되어 있어 토큰 우선 원칙과 어긋납니다. 이 컴포넌트 스타일은 cva 기반으로 정리하고, 필요한 토큰은 먼저 합의 후 추가하는 편이 좋습니다.

As per coding guidelines Use Tailwind CSS v4 with class-variance-authority (cva) for stylingAlways use design token classes first; no hardcoded values. Ask user before adding new tokens.

Also applies to: 123-123, 133-133, 145-145, 157-157

🤖 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 `@src/components/home/NoticePopup.tsx` around lines 67 - 79, The NoticePopup
component contains many hardcoded Tailwind arbitrary values (e.g., pt-[60px],
w-[320px], max-w-[calc(100vw-32px)], text-[18px], underline-offset-[3px],
shadow-[...]) used directly inside the cn(...) className calls; refactor these
styles into a cva-based style object (e.g., create cva variants like
noticePopupContainer and popupCard) and replace the arbitrary classes with
design-token-first utility classes (or agreed token names) inside the cva
definitions; ensure all occurrences referenced in the diff (the cn(...) wrapper
and the popup card div) are updated, and do not add new tokens without
confirmation—ask the designer/product owner if a new token is required before
introducing one.

Comment on lines +97 to +106
<Image
src={
currentPage.useDefaultImage || !currentPage.imageUrl
? DefaultPopupImg
: currentPage.imageUrl
}
alt={currentPage.title}
fill
className="object-cover"
/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "[1] next.config 파일 탐색"
fd -HI '^next\.config\.(js|mjs|cjs|ts)$'

echo "[2] 이미지 도메인 허용 설정 확인"
rg -n --iglob 'next.config.*' 'images|remotePatterns|domains|cdn\.sanity\.io'

Repository: Team-Weeth/weeth-client

Length of output: 193


🏁 Script executed:

cat -n next.config.ts

Repository: Team-Weeth/weeth-client

Length of output: 595


🏁 Script executed:

cat -n src/components/home/NoticePopup.tsx

Repository: Team-Weeth/weeth-client

Length of output: 6872


🏁 Script executed:

find . -name 'popup.ts' -o -name 'popup.js' | head -5

Repository: Team-Weeth/weeth-client

Length of output: 91


🏁 Script executed:

cat -n src/lib/apis/popup.ts

Repository: Team-Weeth/weeth-client

Length of output: 1136


Sanity CDN 도메인을 next.config.tsremotePatterns에 추가하세요.

라인 97-106에서 Sanity 이미지 에셋(currentPage.imageUrl)을 next/image에 전달하고 있으나, next.config.tsremotePatternscdn.sanity.io 도메인이 없어 런타임에서 이미지 렌더링이 실패합니다. remotePatterns 배열에 다음을 추가하세요:

{
  protocol: 'https',
  hostname: 'cdn.sanity.io',
}
🤖 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 `@src/components/home/NoticePopup.tsx` around lines 97 - 106, The Image in
NoticePopup.tsx is loading Sanity-hosted images via currentPage.imageUrl but
next.config.ts lacks the cdn.sanity.io remotePatterns entry; open next.config.ts
and add an entry to the images.remotePatterns array with protocol: 'https' and
hostname: 'cdn.sanity.io' so next/image can load currentPage.imageUrl at
runtime.

Comment on lines +120 to +136
<button
onClick={handlePrev}
disabled={currentIndex === 0}
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
<span className="typo-caption1 text-text-normal">
{currentIndex + 1} / {popup.pages.length}
</span>
<button
onClick={handleNext}
disabled={currentIndex === popup.pages.length - 1}
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

페이지네이션 버튼에 접근성 레이블을 추가해 주세요.

Line 125/135의 기호(, )만으로는 스크린리더 의미 전달이 부족합니다. aria-label을 명시해 조작 의도를 전달하는 게 안전합니다.

수정 예시
                 <button
                   onClick={handlePrev}
                   disabled={currentIndex === 0}
+                  aria-label="이전 팝업 페이지"
                   className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
                 >
                   ‹
                 </button>
@@
                 <button
                   onClick={handleNext}
                   disabled={currentIndex === popup.pages.length - 1}
+                  aria-label="다음 팝업 페이지"
                   className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
                 >
                   ›
                 </button>
📝 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
<button
onClick={handlePrev}
disabled={currentIndex === 0}
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
<span className="typo-caption1 text-text-normal">
{currentIndex + 1} / {popup.pages.length}
</span>
<button
onClick={handleNext}
disabled={currentIndex === popup.pages.length - 1}
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
<button
onClick={handlePrev}
disabled={currentIndex === 0}
aria-label="이전 팝업 페이지"
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
<span className="typo-caption1 text-text-normal">
{currentIndex + 1} / {popup.pages.length}
</span>
<button
onClick={handleNext}
disabled={currentIndex === popup.pages.length - 1}
aria-label="다음 팝업 페이지"
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
🤖 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 `@src/components/home/NoticePopup.tsx` around lines 120 - 136, The pagination
buttons rendering the symbols ‹ and › (inside the buttons handled by handlePrev
and handleNext, with state currentIndex and popup.pages) lack screen-reader
labels; add descriptive aria-label attributes to both buttons (for example
"Previous page" and "Next page" or include dynamic context like "Previous page,
page X of Y" / "Next page, page X of Y") so assistive tech can convey their
purpose and state; ensure the labels update using currentIndex and
popup.pages.length and keep existing disabled behavior intact.

Comment thread src/lib/apis/popup.ts
Comment on lines +27 to +29
export async function getActivePopup(): Promise<PopupDocument | null> {
const currentEnv = process.env.NEXT_PUBLIC_API_URL?.includes('dev') ? 'dev' : 'production';
return sanityClient.fetch(QUERY, { currentEnv }, { useCdn: false });
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

환경 판별 로직이 오탐될 수 있습니다.

Line 28은 URL 문자열 패턴에 의존해서 currentEnv를 결정하므로, 환경변수 누락/도메인 변경 시 production으로 잘못 고정될 수 있습니다. NEXT_PUBLIC_APP_ENV 같은 명시적 env 키(허용값: dev | production)로 분리하는 쪽이 안전합니다.

🤖 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 `@src/lib/apis/popup.ts` around lines 27 - 29, The environment-detection in
getActivePopup relies on URL pattern matching and can misclassify; change it to
read an explicit env var (e.g., NEXT_PUBLIC_APP_ENV) and validate its value is
either 'dev' or 'production' before passing to sanityClient.fetch. Update the
currentEnv assignment in getActivePopup to use process.env.NEXT_PUBLIC_APP_ENV,
default to 'production' only if the value is missing or invalid, and consider
adding a small warning log when falling back so misconfiguration is visible.

@JIN921 JIN921 added the ✨ Feature 기능 개발 label May 10, 2026
Copy link
Copy Markdown
Member

@woneeeee woneeeee left a comment

Choose a reason for hiding this comment

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

확인했습니당!! 수고하셨오요!!

setIsVisible(true);
}
} catch {
// 팝업 로딩 실패 시 조용히 무시
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
Collaborator

@nabbang6 nabbang6 left a comment

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

@dalzzy dalzzy left a comment

Choose a reason for hiding this comment

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

화긴했습니다~~~ 수고하셨습니당!!

Comment on lines +120 to +135
<button
onClick={handlePrev}
disabled={currentIndex === 0}
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
</button>
<span className="typo-caption1 text-text-normal">
{currentIndex + 1} / {popup.pages.length}
</span>
<button
onClick={handleNext}
disabled={currentIndex === popup.pages.length - 1}
className="text-text-normal cursor-pointer border-none bg-transparent text-[18px] disabled:cursor-default disabled:opacity-20"
>
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.

페이지네이션버튼 제가 온보딩모달 만들 때 만들어둔 컴포넌트가 있는데 이걸로 재사용하는 건 어떨까요,,,
한번 PaginationButton.tsx 봐주시고 조금 수정해서 쓰면 좋을 듯 합니다!!

JIN921 and others added 2 commits May 11, 2026 20:16
@sanity/client(현재 브랜치) + @sentry/nextjs(develop) 동시 유지

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

PR 검증 결과

⏭️ TypeScript: 건너뜀
⏭️ ESLint: 건너뜀
⏭️ Prettier: 건너뜀
⏭️ Build: 건너뜀

⚠️ 일부 검증에 실패했습니다. 확인 후 수정해주세요.

@github-actions
Copy link
Copy Markdown

PR 테스트 결과

⏭️ Jest: 건너뜀

⚠️ 테스트에 실패했습니다. 확인 후 수정해주세요.

@JIN921 JIN921 merged commit aaa4649 into develop May 11, 2026
1 of 4 checks passed
@JIN921 JIN921 deleted the feat/WTH-372-sainty-추가하기 branch May 11, 2026 11:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants