Skip to content

fix: 9월 1주차 QA#233

Merged
heeeeyong merged 9 commits into
developfrom
chore/minor-updates
Sep 10, 2025
Merged

fix: 9월 1주차 QA#233
heeeeyong merged 9 commits into
developfrom
chore/minor-updates

Conversation

@heeeeyong
Copy link
Copy Markdown
Collaborator

@heeeeyong heeeeyong commented Sep 3, 2025

#️⃣연관된 이슈

없음

📝작업 내용

  • 사용자 검색 유저 프로필이미지가 보이지 않는 문제 해결
  • 책 저장 페이지 design 수정
  • 헤더 내 임시 엑세스토큰 제거
  • 모바일에서 더보기 모달 가림현상 해결
image

💬리뷰 요구사항

없음

Summary by CodeRabbit

  • Bug Fixes
    • 피드 로딩 흐름에서 로컬스토리지 기반 토큰 체크 및 조기 종료 제거로 탭 전환 후 콘텐츠 일관성 개선.
  • Refactor
    • 프로필 이미지 필드/프롭명 profileImgUrl → profileImageUrl로 일관화.
  • Style
    • 저장 항목(BookItem) 좌우 여백 축소, 팔로워 빈 상태 컨테이너 테두리 반경 증가, 모달/오버레이에 안전영역(safe-area) 및 뷰포트 높이 대응 개선(--vvh, viewport-fit).
  • Chores
    • 네트워크 요청 설정 정리(자동 쿠키 전송 옵션 제거) 및 불필요 로그·주석 정리, 개발용 포트/호스트 스크립트 추가.

@heeeeyong heeeeyong self-assigned this Sep 3, 2025
@heeeeyong heeeeyong added the 🐞 BugFix Something isn't working label Sep 3, 2025
@vercel
Copy link
Copy Markdown

vercel Bot commented Sep 3, 2025

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

Project Deployment Preview Comments Updated (UTC)
thip Ready Ready Preview Comment Sep 10, 2025 5:40am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Sep 3, 2025

Walkthrough

axios 클라이언트에서 withCredentials 제거, 요청 인터셉터의 로그/주석 정리, 사용자 프로필 필드명 profileImgUrlprofileImageUrl로 일괄 변경, Feed의 로컬스토리지 기반 조기 반환 제거, 일부 CSS(패딩·뷰포트/세이프영역)와 스타일 값 조정.

Changes

Cohort / File(s) Change summary
API 클라이언트 설정/인터셉터
src/api/index.ts
withCredentials: true 제거; 요청 인터셉터의 콘솔 로그/주석 제거(Authorization 헤더 부착 로직 유지).
유저 프로필 필드명 일괄 변경
src/api/users/getUsers.ts, src/components/feed/UserProfileItem.tsx, src/data/userData.ts, src/types/user.ts, src/pages/feed/FollowerListPage.tsx
공개 타입, 컴포넌트 props, 목데이터에서 profileImgUrlprofileImageUrl로 명칭 변경(타입 및 값은 동일).
Feed 로딩/토큰 플로우
src/pages/feed/Feed.tsx
waitForToken 이후 localStorage 토큰 확인 및 조기 반환 로직 제거: 항상 탭에 따라 loadTotalFeeds/loadMyFeeds 실행하도록 변경.
뷰포트/세이프영역 & 모달 스타일
index.html, src/components/common/Modal/MoreMenu.tsx
--vvh 계산 스크립트 및 viewport-fit=cover 추가, 모달 오버레이 inset/height(dvh/100vh/--vvh) 및 safe-area padding/패널 하단 패딩 조정.
스타일/레이아웃 소소한 변경
src/pages/mypage/SavePage.tsx, src/components/feed/FollowList.tsx
BookItem padding 12px 20px12px; EmptyFollowerContainer border-radius 8px → 12px.
패키지 스크립트
package.json
dev:lan 스크립트(vite --host 0.0.0.0 --port 5173) 추가 및 포맷 관련 쉼표 정리.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor U as 사용자
  participant F as Feed.tsx
  participant T as waitForToken
  participant L as loadTotalFeeds / loadMyFeeds
  participant A as apiClient (axios)
  participant S as 서버

  U->>F: 피드 화면 진입/탭 전환
  F->>T: 토큰 대기
  T-->>F: 완료
  note over F: 로컬스토리지 토큰 확인 및 조기 반환 로직 제거
  F->>L: 활성 탭에 따른 로더 호출
  L->>A: 요청 전송
  A->>A: 요청 인터셉터(Authorization 설정, withCredentials 미사용)
  A->>S: API 호출
  S-->>A: 응답
  A-->>L: 데이터 반환
  L-->>F: 렌더링 데이터 전달
Loading
sequenceDiagram
  autonumber
  participant C as 호출자
  participant A as apiClient
  participant I as 요청 인터셉터
  participant S as 서버

  C->>A: axios 요청
  A->>I: 인터셉트
  I-->>A: 토큰 존재 시 Authorization 헤더 설정
  note right of I: withCredentials 설정 제거됨
  A->>S: 요청 전송
  S-->>A: 응답
  A-->>C: 응답 반환
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

🎨 Html&css, 📬 API

Pre-merge checks (2 passed, 1 inconclusive)

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title Check ❓ Inconclusive 현재 PR 제목 “fix: QA”는 주요 변경 사항을 요약하기에는 너무 일반적이고 모호하여 PR 내용이 무엇인지 파악하기 어렵습니다. PR 제목을 ‘fix: 사용자 프로필 이미지 표시 오류 수정 및 저장 페이지 디자인 개선’과 같이 주요 변경 사항을 구체적으로 반영하도록 수정해 주세요.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

Poem

깡총깡총 새 이름 달고 왔네 🐇
쿠키는 내려놓고 헤더로만 인사해요
탭 따라 피드는 멈추지 않고 흐르고
패딩 한 칸 줄여 가볍게 점프하네
오늘도 토끼는 코드에 당근을 꽂아요 ✨

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/minor-updates

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.

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: 1

🧹 Nitpick comments (3)
src/pages/mypage/SavePage.tsx (1)

356-362: 패딩 축소에 따른 터치 타깃 축소 가능성 점검

BookItem 패딩을 12px로 축소하면 우측 Save 아이콘(24x24)의 실제 탭 가능한 영역이 작아져(권장 최소 44px) 오터치가 늘 수 있습니다. 디자인 의도 유지하면서 아이콘의 히트 에어리어만 확장하는 방안을 고려해주세요(예: SaveIcon에 padding 추가 또는 ::after로 클릭 영역 확장).

예시(선택 적용, 변경 범위 외 참고용):

const SaveIcon = styled.div`
  width: 24px;
  height: 24px;
  padding: 10px; /* 히트 에어리어 44x44 근접 */
  margin: -10px; /* 레이아웃 영향 최소화 */
  cursor: pointer;
`;
src/components/feed/UserProfileItem.tsx (2)

10-21: prop 이름 변경 OK — 기본 아바타 기본값 지정 제안

네트워크 오류/누락 대비해 profileImageUrl에 기본값(플레이스홀더)을 두면 UX가 안정적입니다.

-const UserProfileItem = ({
-  profileImageUrl,
+const UserProfileItem = ({
+  profileImageUrl = defaultAvatar,
   nickname,

참고: 상단에 기본 아바타 import 추가 필요

import defaultAvatar from '@/assets/common/defaultAvatar.png';

62-62: img 접근성/성능 개선: alt/width/height/lazy 및 폴백 적용

대체 텍스트와 고정 크기, 지연 로딩을 추가하고 onError 폴백을 연결하는 것을 권장합니다.

-          <img src={profileImageUrl} />
+          <img
+            src={profileImageUrl}
+            alt={`${nickname}님의 프로필 이미지`}
+            width={36}
+            height={36}
+            loading="lazy"
+            decoding="async"
+            onError={(e) => { (e.currentTarget as HTMLImageElement).src = defaultAvatar; }}
+          />
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between bba8dc8 and 3dd456d.

📒 Files selected for processing (7)
  • src/api/index.ts (0 hunks)
  • src/api/users/getUsers.ts (1 hunks)
  • src/components/feed/UserProfileItem.tsx (2 hunks)
  • src/data/userData.ts (4 hunks)
  • src/pages/feed/Feed.tsx (0 hunks)
  • src/pages/mypage/SavePage.tsx (1 hunks)
  • src/types/user.ts (1 hunks)
💤 Files with no reviewable changes (2)
  • src/api/index.ts
  • src/pages/feed/Feed.tsx
🔇 Additional comments (2)
src/data/userData.ts (1)

5-5: 목데이터 키(profileImageUrl)로의 일관된 변경 확인

모든 항목이 새 키로 정리되어 있어 타입과 컴포넌트 사용과의 정합성이 맞습니다. 별도 이슈 없습니다.

Also applies to: 14-14, 23-23, 32-32

src/api/users/getUsers.ts (1)

3-10: 백엔드 반환 필드(profileImageUrl) 일치 여부 확인
src/api/users/getUsers.ts에 profileImgUrl 사용 흔적이 없으므로, 백엔드가 실제로 profileImageUrl을 반환하는지 확인해 주세요. 여전히 레거시 profileImgUrl을 반환한다면, 하위호환 맵핑(응답 변환 또는 인터페이스 선택적 필드 추가) 로 정규화 처리해야 합니다.

Comment thread src/types/user.ts
Comment on lines 3 to 5
export interface UserProfileItemProps {
profileImgUrl: string;
profileImageUrl: string;
nickname: string;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

프로필 이미지 필드명 변경 LGTM — 잔존 참조 스캔 권장

UI/타입 일치가 핵심이라서 레거시 키(profileImgUrl) 잔존 여부를 전체 코드베이스에서 한 번 스캔해 주세요.


🏁 Script executed:

#!/bin/bash
# 레거시 키 사용 흔적 확인
rg -nP '\bprofileImgUrl\b' -C2 --hidden -g '!**/node_modules/**'
# 혹시 문자열 키로 남아있는 경우까지
rg -nP '"profileImgUrl"\s*:' -C2 --hidden -g '!**/node_modules/**'

Length of output: 517


src/pages/feed/FollowerListPage.tsx:129 — 프로필 이미지 prop 이름 수정 필요
여전히 profileImgUrl={user.profileImageUrl}로 전달되고 있으니 profileImageUrl로 변경하세요.

🤖 Prompt for AI Agents
In src/types/user.ts around lines 3-5, the UserProfileItemProps defines
profileImageUrl but the component usage in src/pages/feed/FollowerListPage.tsx
(around line 129) still passes profileImgUrl; update the prop passed to
profileImageUrl={user.profileImageUrl}. Search for any other usages of
profileImgUrl and rename them to profileImageUrl to match the type definition
and ensure props align.

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: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/pages/feed/FollowerListPage.tsx (4)

2-2: 무한 스크롤 중 중복 API 호출 가능성 — useRef로 동시 요청 가드 필요(1/4: import)

useCallback/스크롤 리스너가 loading의 오래된 값을 캡처합니다. 동시 호출 방지를 useRef로 처리하세요.

-import { useState, useEffect, useCallback } from 'react';
+import { useState, useEffect, useCallback, useRef } from 'react';

17-24: 무한 스크롤 동시 요청 가드 추가(2/4: ref 선언)

렌더링과 무관한 진행 상태는 ref로 추적하는 것이 안전합니다.

   const [isLast, setIsLast] = useState(false);
 
+  // 동시 요청 가드 (state 대신 ref 사용해 최신 값 유지)
+  const isFetchingRef = useRef(false);

31-36: 로딩 가드 교체 및 finally 복원(3/4: 가드/해제 시점 수정)

if (loading) return;는 stale 클로저로 무력화될 수 있습니다. ref 기반 가드로 교체하고 try/finally에서 ref를 정확히 토글하세요.

-    async (cursor?: string) => {
-      if (loading) return;
+    async (cursor?: string) => {
+      if (isFetchingRef.current) return;
 
       try {
-        setLoading(true);
+        setLoading(true);
+        isFetchingRef.current = true;
         setError(null);
         let response;
@@
       } finally {
-        setLoading(false);
+        setLoading(false);
+        isFetchingRef.current = false;
       }

Also applies to: 87-89


95-101: 스크롤 가드에 ref 반영(4/4: 중복 트리거 방지)

진행 중일 때 추가 호출을 막습니다.

-      if (loading || isLast || error || retryCount >= 3 || !nextCursor) {
+      if (loading || isFetchingRef.current || isLast || error || retryCount >= 3 || !nextCursor) {
         console.log('스크롤 요청 차단:', { loading, isLast, error, retryCount, nextCursor });
         return;
       }
🧹 Nitpick comments (2)
src/pages/feed/FollowerListPage.tsx (2)

60-62: 콘솔 로그는 프로덕션에서 억제

디버그 로그는 개발 환경에서만 출력되도록 가드하는 편이 좋습니다.

-        console.log('API 응답:', response);
-        console.log('추출된 사용자 데이터:', userData);
+        if (process.env.NODE_ENV !== 'production') {
+          console.log('API 응답:', response);
+          console.log('추출된 사용자 데이터:', userData);
+        }

123-123: 접근성: 아이콘 대체 텍스트 추가

아이콘 img에 alt를 지정해 스크린리더 친화도를 개선하세요.

-      <TitleHeader leftIcon={<img src={leftArrow} />} onLeftClick={handleBackClick} title={title} />
+      <TitleHeader leftIcon={<img src={leftArrow} alt="뒤로가기" />} onLeftClick={handleBackClick} title={title} />
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 3dd456d and c8c7851.

📒 Files selected for processing (1)
  • src/pages/feed/FollowerListPage.tsx (1 hunks)
🔇 Additional comments (1)
src/pages/feed/FollowerListPage.tsx (1)

127-135: 프로필 이미지 prop 리네임 일관성 확인됨

profileImgUrl 사용 흔적이 제거되었고, FollowData 및 관련 타입·API 응답 모두 profileImageUrl로 정상 정의·매핑되어 있습니다.

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: 2

🧹 Nitpick comments (6)
package.json (1)

12-13: LAN 노출 스크립트 보안·안전성 보완 제안

--host 0.0.0.0로 개발 서버가 동일 네트워크 모든 단말에 노출됩니다. 의도된 사용이라면 좋습니다만, 다음 옵션을 함께 두는 걸 권장합니다:

  • 고정 포트 실패 시 종료: --strictPort
  • 필요 시만 실행하도록 분리(이미 dev:lan로 분리된 점은 👍)

예시 수정:

-    "dev:lan": "vite --host 0.0.0.0 --port 5173"
+    "dev:lan": "vite --host 0.0.0.0 --port 5173 --strictPort"

또한 조직 정책상 공용/카페 와이파이 사용을 금지하는 안내를 README에 한줄 추가하면 사고 예방에 도움이 됩니다.

index.html (4)

19-27: touchstart 리스너는 passive: true로

preventDefault를 호출하지 않으므로 passive: true가 성능 경고를 줄이고 스크롤 지연 가능성을 낮춥니다.

-      document.addEventListener(
+      document.addEventListener(
         'touchstart',
         function (e) {
           startX = e.touches[0].clientX;
           startY = e.touches[0].clientY;
         },
-        { passive: false },
+        { passive: true },
       );

48-55: touchend도 passive: true 권장

기본 동작을 막지 않으므로 passive로 바꿔도 안전합니다.

-        { passive: false },
+        { passive: true },

57-64: touchcancel도 passive: true 권장

동일한 이유로 passive: true가 적절합니다.

-        { passive: false },
+        { passive: true },

117-125: --vvh 업데이트 이벤트 추가 제안(키보드/주소바 변화 대응 강화)

주소바 축소/확대·가상키보드 등장 시 visualViewportscroll/resize, 윈도우 orientationchange에 반응하게 해두면 더 견고합니다. 또한 DOMContentLoaded 시점 보장도 추천.

   function applyVv() {
     const vv = window.visualViewport;
     const h = vv ? vv.height : window.innerHeight;
     document.documentElement.style.setProperty('--vvh', `${h}px`);
   }
-  applyVv();
-  (window.visualViewport || window).addEventListener('resize', applyVv);
+  // 초기화
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', applyVv, { once: true });
+  } else {
+    applyVv();
+  }
+  // 변화 대응
+  const vv = window.visualViewport;
+  vv?.addEventListener('resize', applyVv);
+  vv?.addEventListener('scroll', applyVv, { passive: true });
+  window.addEventListener('resize', applyVv);
+  window.addEventListener('orientationchange', applyVv);
src/components/common/Modal/MoreMenu.tsx (1)

54-71: inset: 0와 height 동시 지정은 중복/혼동 유발 — 하나로 통일

position: fixed에서 topbottom이 동시에 지정되면 height는 무시됩니다. 현재 inset: 0 때문에 아래의 height: 100vh/100dvh/var(--vvh)는 실효성이 없습니다. 의도(동적 뷰포트 대응)가 --vvh라면, bottom을 제거하고 height를 살리는 쪽이 명확합니다. 또한 width: 100vwinset: 0과 중복으로 일부 브라우저에서 수평 스크롤을 유발할 수 있습니다.

정리 예시:

-  inset: 0;
+  top: 0;
+  left: 0;
+  right: 0;
@@
-  height: 100vh;
-  @supports (height: 100dvh) {
-    height: 100dvh;
-  }
-  /* JS 폴백 변수 */
-  height: var(--vvh, 100dvh);
+  /* 동적 뷰포트 높이(visualViewport → --vvh, 미지원시 100dvh) */
+  height: var(--vvh, 100dvh);
@@
-  width: 100vw;
+  /* inset-inline으로 폭은 이미 고정됨: width 제거 */
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between c8c7851 and 54f0955.

📒 Files selected for processing (4)
  • index.html (4 hunks)
  • package.json (1 hunks)
  • src/components/common/Modal/MoreMenu.tsx (2 hunks)
  • src/components/feed/FollowList.tsx (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/components/feed/FollowList.tsx
🔇 Additional comments (2)
index.html (1)

28-46: [index_scripts]

#!/bin/bash
# index.html 경로 확인
INDEX_PATH=$(fd index.html | head -n 1)
echo "index.html 경로: $INDEX_PATH"

# touchmove 이벤트 리스너 위치 출력
rg -n "touchmove" -C3 "$INDEX_PATH"
src/components/common/Modal/MoreMenu.tsx (1)

86-86: 안전영역 패딩 추가는 👍

하단 홈바 겹침 방지에 효과적입니다. 유지 추천합니다.

Comment thread index.html
{ passive: 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.

💡 Verification agent

🧩 Analysis chain

iOS 전용 gesture 차단은 핀치 줌까지 막아 접근성 이슈 유발*

gesturestart/change/end에서 preventDefault()를 호출하면 iOS Safari에서 핀치 줌이 차단되어 WCAG 확대 요건을 침해할 수 있습니다. 필요 구간(예: 풀스크린 모달 활성화 시)에만 조건부로 차단하거나, 전역 차단을 제거하는 방향을 권장합니다.

옵션 A(전역 제거):

-      document.addEventListener(
-        'gesturestart',
-        function (e) {
-          e.preventDefault();
-        },
-        { passive: false },
-      );
-      document.addEventListener(
-        'gesturechange',
-        function (e) {
-          e.preventDefault();
-        },
-        { passive: false },
-      );
-      document.addEventListener(
-        'gestureend',
-        function (e) {
-          e.preventDefault();
-        },
-        { passive: false },
-      );

옵션 B(조건부 차단):

-        function (e) {
-          e.preventDefault();
-        },
+        function (e) {
+          // 예: 모달/드로어가 열렸을 때만 차단
+          if (document.documentElement.hasAttribute('data-block-gestures')) {
+            e.preventDefault();
+          }
+        },

Also applies to: 68-89


아래 스크립트로 index.htmlgesturestart/gesturechange/gestureend 이벤트 리스너와 preventDefault() 호출이 실제로 존재하는지 확인해 주세요.


🏁 Script executed:

#!/bin/bash
# index.html에서 gesture 이벤트 리스너 위치 확인
rg -nP "addEventListener\(\s*['\"]gesture(start|change|end)['\"]" -C2 index.html

# index.html에서 preventDefault() 호출 위치 확인
rg -n "preventDefault" -C2 index.html

Length of output: 582


iOS Safari 전역 gesture 이벤트 차단으로 핀치 줌이 막혀 WCAG 확대 요건 위배
index.html 68~89줄의 gesturestart/change/end 리스너 전부에서 전역 e.preventDefault() 호출을 제거하고, 풀스크린 모달 등 실제 필요 시점에만 다음과 같이 조건부로 차단하도록 수정하세요.

  • 전역 제거
    해당 범위 전체 리스너 삭제
  • 조건부 적용
    function onGesture(e) {
      if (document.documentElement.hasAttribute('data-block-gestures')) {
        e.preventDefault();
      }
    }
    // …  
    document.addEventListener('gesturestart', onGesture, { passive: false });
    document.addEventListener('gesturechange', onGesture, { passive: false });
    document.addEventListener('gestureend',   onGesture, { passive: false });
🤖 Prompt for AI Agents
In index.html around line 66 (originally 68–89), the global gesture event
listeners call e.preventDefault() unconditionally which blocks iOS Safari
pinch-zoom and violates WCAG; remove those global listeners and instead add a
single shared onGesture handler that only calls e.preventDefault() when a page
state indicates gestures must be blocked (for example when
document.documentElement has a data-block-gestures attribute), then register
that handler for gesturestart/gesturechange/gestureend with { passive: false }
so the prevention works when needed.

Comment thread index.html
<meta property="og:description" content="커뮤니티형 독서 기록 플랫폼. 띱. THIP." />
<meta property="og:image" content="https://thip.co.kr/assets/thumbnail.jpeg" />
<meta property="og:url" content="https://thip.co.kr" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=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.

💡 Verification agent

🧩 Analysis chain

viewport 메타 태그 중복 정의 정리

<meta name="viewport" ...>가 두 번 선언되어 있습니다. 하나만 남기고 통합하세요. 아래처럼 viewport-fit=cover를 포함한 한 줄로 정리하는 걸 권장합니다.

-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- 단일 선언 권장: viewport-fit 포함 -->
+    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />

그리고 위 변경과 함께 기존 중복 라인(초반의 viewport 메타, 현재 128라인)은 제거해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "<meta name=\"viewport\"" index.html

Length of output: 179


viewport 메타 태그 중복 제거 및 통합

  • index.html 128라인의 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 삭제
  • 134라인의 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> 한 줄로 유지
🤖 Prompt for AI Agents
In index.html around lines 128 and 134, remove the duplicate viewport meta at
line 128 (<meta name="viewport" content="width=device-width, initial-scale=1.0"
/>) and keep the single unified tag at line 134 (<meta name="viewport"
content="width=device-width, initial-scale=1, viewport-fit=cover" />); ensure
only the line-134 meta remains in the head so there is no duplicate viewport
meta tag.

@heeeeyong heeeeyong merged commit 8881134 into develop Sep 10, 2025
3 checks passed
@heeeeyong heeeeyong changed the title fix: QA fix: 9월 1주차 QA Sep 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐞 BugFix Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant