Skip to content

채팅 이미지 CDN 호스트 타입 처리 및 React19 ref 타입 정합성 수정#430

Merged
manNomi merged 7 commits intomainfrom
feat/chat-image-cdn-hosts
Feb 16, 2026
Merged

채팅 이미지 CDN 호스트 타입 처리 및 React19 ref 타입 정합성 수정#430
manNomi merged 7 commits intomainfrom
feat/chat-image-cdn-hosts

Conversation

@manNomi
Copy link
Contributor

@manNomi manNomi commented Feb 14, 2026

Summary

  • FallbackImagecdnHostType(default/upload) prop을 추가해 상대 경로 이미지 URL을 CDN 호스트 기준으로 정규화하도록 구현했습니다.
  • 채팅 첨부 이미지 렌더링(ChatMessageBox)과 프로필 이미지(ProfileWithBadge)에 upload CDN 호스트 타입을 적용했습니다.
  • pre-commit CI(web ci:check)를 통과하기 위해 React 19 타입 기준 ref 시그니처 불일치 6건(RefObject<T | null> -> RefObject<T>)을 함께 정리했습니다.

Verification

  • pre-commit hook 기준 pnpm --filter @solid-connect/web run ci:check 통과
  • pre-push hook 기준 pnpm --filter @solid-connect/web run build 통과

@vercel
Copy link

vercel bot commented Feb 14, 2026

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

Project Deployment Actions Updated (UTC)
solid-connection-web Error Error Feb 16, 2026 8:38am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
solid-connect-web-admin Skipped Skipped Feb 16, 2026 8:38am

@coderabbitai
Copy link

coderabbitai bot commented Feb 14, 2026

Warning

Rate limit exceeded

@manNomi has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 9 minutes and 52 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

Walkthrough

이 풀 리퀘스트는 프로젝트 전반에 걸쳐 여러 개선 사항을 도입합니다. 다음의 변경 사항들이 포함되어 있습니다:

  1. Husky 훅 업데이트: 관리자 측 검사를 개별 lint/format 단계에서 통합된 ci:check 명령으로 변경하고, 웹 및 관리자 대상별로 사전 검사 실행 추가
  2. 패키지 스크립트 마이그레이션: ESLint/Prettier에서 Biome 기반의 통합 품질 게이트로 이동하여 format, lint, format:check, lint:check 및 ci:check 스크립트 업데이트
  3. TypeScript 참조 타입 정규화: 여러 파일에서 RefObject<T | null>에서 RefObject<T>로 참조 타입을 좁혀 nullable 합집합 제거
  4. CDN 통합: FallbackImage 컴포넌트에 CDN 호스트 타입 지원을 추가하고 URL 해석 논리 구현, ProfileWithBadge에서 cdnHostType 속성 적용
  5. 문서 업데이트: 개발 워크플로우 문서를 npm에서 pnpm으로, ESLint/Prettier에서 Biome으로 업데이트하고 Biome 통합 스킬 문서 추가

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested reviewers

  • wibaek
  • enunsnv
  • khwww
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항을 명확히 반영합니다: CDN 호스트 타입 처리 및 React 19 ref 타입 정합성 수정이 핵심 내용입니다.
Description check ✅ Passed PR 설명이 필수 섹션(작업 내용, 검증)을 포함하고 있으나, 관련 이슈(resolves)와 특이 사항 섹션이 누락되어 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

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

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/chat-image-cdn-hosts

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.

@vercel
Copy link

vercel bot commented Feb 14, 2026

Deployment failed with the following error:

Resource is limited - try again in 20 hours (more than 100, code: "api-deployments-free-per-day").

Learn More: https://vercel.com/mannomis-projects?upgradeToPro=build-rate-limit

@vercel
Copy link

vercel bot commented Feb 14, 2026

Deployment failed with the following error:

Resource is limited - try again in 19 hours (more than 100, code: "api-deployments-free-per-day").

Learn More: https://vercel.com/mannomis-projects?upgradeToPro=build-rate-limit

Copy link

@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

Caution

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

⚠️ Outside diff range comments (1)
.husky/pre-commit (1)

30-34: ⚠️ Potential issue | 🟡 Minor

체크를 건너뛴 경우에도 "✅ CI parity checks passed!" 메시지가 출력됩니다.

RUN_WEB=0 && RUN_ADMIN=0일 때 Line 31에서 "변경 없음" 메시지를 출력한 후, Line 34에서 "체크 통과" 메시지도 함께 출력되어 혼동을 줄 수 있습니다.

🔧 제안: 성공 메시지를 조건부로 변경
 if [ "$RUN_WEB" -eq 0 ] && [ "$RUN_ADMIN" -eq 0 ]; then
   echo "ℹ️ No CI-targeted changes detected; skipping parity checks."
+else
+  echo "✅ CI parity checks passed!"
 fi
-
-echo "✅ CI parity checks passed!"
🤖 Fix all issues with AI agents
In @.husky/pre-push:
- Around line 45-49: The current pre-push script prints "CI parity checks
passed!" unconditionally even when both RUN_WEB and RUN_ADMIN are 0; update the
conditional so the success message is only printed when parity checks actually
ran. Concretely, adjust the if/else around the existing block that checks
RUN_WEB and RUN_ADMIN (the shell variables RUN_WEB and RUN_ADMIN and the echo
"ℹ️ No CI-targeted changes detected; skipping parity builds.") so that the echo
"✅ CI parity checks passed!" is emitted in the branch where checks were executed
(i.e., when either RUN_WEB or RUN_ADMIN is non-zero), mirroring the conditional
behavior used in the pre-commit hook.

In `@docs/skills/biome-unification-ci-skill.md`:
- Around line 10-15: Update the Web type-check command in the docs: replace the
CI-only script `pnpm --filter `@solid-connect/web` run typecheck:ci` with the
local/dev-friendly `pnpm --filter `@solid-connect/web` run typecheck` (so it
matches the recommended `typecheck` script used for local pre-push checks and
aligns with Admin). Target the Web section entry that currently lists
`typecheck:ci` and change it to `typecheck`.
🧹 Nitpick comments (1)
apps/web/src/app/(home)/_ui/NewsSection/_hooks/useSectionHadnler.ts (1)

1-38: 참고: 파일명 오타 useSectionHadnler.tsuseSectionHandler.ts

기존부터 존재하는 오타이지만, 추후 리네이밍을 고려해 보셔도 좋을 것 같습니다. 이번 PR 범위 밖이라 급하지는 않습니다. 😊

Comment on lines 45 to +49
if [ "$RUN_WEB" -eq 0 ] && [ "$RUN_ADMIN" -eq 0 ]; then
echo "ℹ️ No CI-targeted changes detected; skipping parity builds."
fi

echo "✅ CI parity builds passed!"
echo "✅ CI parity checks passed!"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

pre-commit과 동일한 문제: 체크 미실행 시에도 성공 메시지가 출력됩니다.

Line 46에서 "skipping parity builds"를 출력하고, Line 49에서 "CI parity checks passed!"도 출력됩니다. pre-commit 훅과 동일하게 조건부 처리를 권장합니다.

🔧 제안
 if [ "$RUN_WEB" -eq 0 ] && [ "$RUN_ADMIN" -eq 0 ]; then
   echo "ℹ️ No CI-targeted changes detected; skipping parity builds."
+else
+  echo "✅ CI parity checks passed!"
 fi
-
-echo "✅ CI parity checks passed!"
📝 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
if [ "$RUN_WEB" -eq 0 ] && [ "$RUN_ADMIN" -eq 0 ]; then
echo "ℹ️ No CI-targeted changes detected; skipping parity builds."
fi
echo "✅ CI parity builds passed!"
echo "✅ CI parity checks passed!"
if [ "$RUN_WEB" -eq 0 ] && [ "$RUN_ADMIN" -eq 0 ]; then
echo "ℹ️ No CI-targeted changes detected; skipping parity builds."
else
echo "✅ CI parity checks passed!"
fi
🤖 Prompt for AI Agents
In @.husky/pre-push around lines 45 - 49, The current pre-push script prints "CI
parity checks passed!" unconditionally even when both RUN_WEB and RUN_ADMIN are
0; update the conditional so the success message is only printed when parity
checks actually ran. Concretely, adjust the if/else around the existing block
that checks RUN_WEB and RUN_ADMIN (the shell variables RUN_WEB and RUN_ADMIN and
the echo "ℹ️ No CI-targeted changes detected; skipping parity builds.") so that
the echo "✅ CI parity checks passed!" is emitted in the branch where checks were
executed (i.e., when either RUN_WEB or RUN_ADMIN is non-zero), mirroring the
conditional behavior used in the pre-commit hook.

Comment on lines +10 to +15
### Web

- 자동 수정: `pnpm --filter @solid-connect/web run lint`
- 체크 전용: `pnpm --filter @solid-connect/web run lint:check`
- 타입 체크: `pnpm --filter @solid-connect/web run typecheck:ci`
- CI 체크: `pnpm --filter @solid-connect/web run ci:check`
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== Checking Web package.json for typecheck scripts ==="
fd -t f 'package.json' apps/web --max-depth 1 -x jq -r '.scripts | to_entries[] | select(.key | test("typecheck")) | "\(.key): \(.value)"' {}

echo ""
echo "=== Checking Admin package.json for typecheck scripts ==="
fd -t f 'package.json' apps/admin --max-depth 1 -x jq -r '.scripts | to_entries[] | select(.key | test("typecheck")) | "\(.key): \(.value)"' {}

Repository: solid-connection/solid-connect-web

Length of output: 287


Web 타입 체크 명령어를 typecheck로 수정하세요.

Web package.json에는 typecheck:ci 스크립트가 실제로 존재하여 문서는 기술적으로 정확합니다. 다만:

  1. 현재 상황: typecheck:ci는 CI 환경용 전용 스크립트로 tsconfig.ci.json을 사용합니다
  2. 권장 사항: 로컬 개발 및 사전 푸시 검사에는 typecheck 스크립트를 사용해야 합니다
  3. 문서 수정 필요: Line 14를 pnpm --filter @solid-connect/web run typecheck로 변경하여 Admin과의 일관성을 유지하세요
🤖 Prompt for AI Agents
In `@docs/skills/biome-unification-ci-skill.md` around lines 10 - 15, Update the
Web type-check command in the docs: replace the CI-only script `pnpm --filter
`@solid-connect/web` run typecheck:ci` with the local/dev-friendly `pnpm --filter
`@solid-connect/web` run typecheck` (so it matches the recommended `typecheck`
script used for local pre-push checks and aligns with Admin). Target the Web
section entry that currently lists `typecheck:ci` and change it to `typecheck`.

@manNomi manNomi force-pushed the feat/chat-image-cdn-hosts branch from c89664c to 98b4988 Compare February 14, 2026 14:12
Copy link

@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

Caution

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

⚠️ Outside diff range comments (3)
docs/development-workflow.md (1)

89-94: ⚠️ Potential issue | 🟡 Minor

pre-push 섹션에 ci:check 실행 내용이 누락되었습니다.

실제 .husky/pre-push 훅에서는 빌드 전에 ci:check도 실행하도록 변경되었는데, 이 문서의 pre-push 설명에는 빌드 명령만 기재되어 있습니다. pre-commit 섹션(Line 86-87)에서 ci:check을 잘 안내하고 있으니, pre-push 섹션도 동일하게 맞춰주면 좋겠습니다.

📝 제안: pre-push 설명에 ci:check 추가
 #### pre-push

-- 푸시 전 GitHub CI 빌드 단계와 동일한 빌드를 실행합니다.
+- 푸시 전 GitHub CI와 동일한 품질 검사 및 빌드를 실행합니다.
 - 실행 명령:
+  - `pnpm --filter `@solid-connect/web` run ci:check`
   - `pnpm --filter `@solid-connect/web` run build`
+  - `pnpm --filter `@solid-connect/admin` run ci:check`
   - `pnpm --filter `@solid-connect/admin` run build`
apps/web/src/components/ui/BottomSheet/hooks/useHandleModal.ts (2)

1-1: ⚠️ Potential issue | 🔴 Critical

CI 실패 원인: RefObject 임포트가 누락되었습니다.

  1. Line 9에서 RefObject<HTMLDivElement>를 사용하고 있지만, Line 1의 import 목록에 RefObject가 포함되어 있지 않습니다.
  2. 파이프라인 에러 메시지(TS2552: Cannot find name 'RefObject')가 이를 정확히 가리키고 있습니다.
🐛 수정 제안
-import { type MutableRefObject, useCallback, useEffect, useMemo, useRef, useState } from "react";
+import { type MutableRefObject, type RefObject, useCallback, useEffect, useMemo, useRef, useState } from "react";

Also applies to: 8-9


117-125: ⚠️ Potential issue | 🔴 Critical

인터페이스에 선언된 elementRef가 반환 객체에 누락되었습니다.

  1. UseHandleModalReturn 인터페이스(Line 9)에 elementRef: RefObject<HTMLDivElement>가 선언되어 있습니다.
  2. Line 26에서 elementRef를 생성하고 있지만, 반환 객체(Line 117-125)에는 포함되지 않았습니다.
  3. 이 상태로는 TypeScript가 반환 타입 불일치 에러를 발생시킬 수 있으며, 소비 측에서 elementRef에 접근할 수 없습니다.
🐛 수정 제안
   return {
+    elementRef,
     isVisible,
     translateY,
     isDraggingRef,
     handleClose,
     handleTouchStart,
     handleTouchMove,
     handleTouchEnd,
   };
🤖 Fix all issues with AI agents
In `@apps/web/src/app/university/application/ScorePageContent.tsx`:
- Line 25: The non-null assertion on searchRef (const searchRef =
useRef<HTMLInputElement>(null!)) is a workaround for a React/@types version
mismatch; fix by aligning React runtime and types (either downgrade `@types/react`
to 18.x or upgrade react/react-dom to 19.x) and make the ref type-safe: change
the ref declaration to useRef<HTMLInputElement | null>(null) in ScorePageContent
(symbol: searchRef) and update any usages to handle possible null (optional
chaining or null checks) instead of relying on null!.
🧹 Nitpick comments (1)
apps/web/src/app/(home)/_ui/NewsSection/_hooks/useSectionHadnler.ts (1)

1-1: 참고(nit): 파일명에 오타가 있습니다.

useSectionHadnler.tsuseSectionHandler.ts로 보입니다. 이번 PR 범위는 아닐 수 있지만, 추후 정리 시 참고해 주세요.

const ScorePageContent = () => {
const router = useRouter();
const searchRef = useRef<HTMLInputElement | null>(null);
const searchRef = useRef<HTMLInputElement>(null!);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# apps/web/package.json에서 React와 `@types/react` 버전 확인
find apps/web -maxdepth 2 -name "package.json" -type f -exec sh -c 'echo "=== {} ===" && cat "$1" | jq -r ".dependencies.react, .devDependencies[\"@types/react\"], .dependencies[\"react\"]" ' _ {} \;

Repository: solid-connection/solid-connect-web

Length of output: 123


🏁 Script executed:

# apps/web/COMPONENTS.md 확인
cat apps/web/COMPONENTS.md 2>/dev/null || echo "File not found"

Repository: solid-connection/solid-connect-web

Length of output: 9064


🏁 Script executed:

# ScorePageContent.tsx의 searchRef 사용 전체 확인
sed -n '20,160p' apps/web/src/app/university/application/ScorePageContent.tsx | cat -n

Repository: solid-connection/solid-connect-web

Length of output: 6029


React 버전 불일치 해결이 필요합니다.

현재 프로젝트의 의존성 구성에 다음과 같은 버전 불일치가 있습니다:

  1. Runtime과 Type 정의 버전 불일치

    • React 실행 환경: ^18 (React 18.x)
    • React 타입 정의: 19.2.10 (@types/react 19.x)
  2. null! 패턴의 원인

    • useRef<HTMLInputElement>(null!)의 non-null assertion은 React 18 타입과 React 19 타입의 불일치를 우회하기 위한 임시 해결책입니다.
    • React 19 타입에서는 RefObject<T>의 타입 정의가 변경되어 이러한 workaround가 필요합니다.
  3. 권장 해결 방안

    • @types/react를 18.x로 downgrade하여 런타임 버전과 일치시키거나
    • React를 19.x로 upgrade하여 타입 정의와 일치시키세요.
    • 현재 코드는 optional chaining과 null check로 안전하게 동작하지만, 타입 시스템의 일관성을 위해 버전 정렬이 필요합니다.
🤖 Prompt for AI Agents
In `@apps/web/src/app/university/application/ScorePageContent.tsx` at line 25, The
non-null assertion on searchRef (const searchRef =
useRef<HTMLInputElement>(null!)) is a workaround for a React/@types version
mismatch; fix by aligning React runtime and types (either downgrade `@types/react`
to 18.x or upgrade react/react-dom to 19.x) and make the ref type-safe: change
the ref declaration to useRef<HTMLInputElement | null>(null) in ScorePageContent
(symbol: searchRef) and update any usages to handle possible null (optional
chaining or null checks) instead of relying on null!.

@vercel vercel bot temporarily deployed to Preview – solid-connect-web-admin February 16, 2026 08:36 Inactive
@manNomi manNomi merged commit efeab65 into main Feb 16, 2026
9 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments