Skip to content

feat(frontend): snowdomeの処理作成#81

Merged
haru-036 merged 2 commits intomainfrom
feature/snowdome
Dec 20, 2025
Merged

feat(frontend): snowdomeの処理作成#81
haru-036 merged 2 commits intomainfrom
feature/snowdome

Conversation

@haru-036
Copy link
Copy Markdown
Contributor

@haru-036 haru-036 commented Dec 20, 2025

Summary by CodeRabbit

リリースノート

  • 新機能
    • スノードームアイテムをルーム内にドラッグ&ドロップで配置できるようになりました
    • スノードーム配置時に、回転ロック、位置調整、インベントリへの戻し操作が可能になりました
    • R キーまたは右クリックでスノードームを回転できます
    • スノードーム配置中の配置可能エリアを視覚的にフィードバックします

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Dec 20, 2025

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

おじさんが詳しく説明しちゃおうカナ〜 ✨ この PR では、スノードーム(snowdome)という新しいアイテム配置機能を実装してるヨ。カレンダーから取得したスノードームを 3D シーンにドラッグして配置する仕組みなんだネ。複数パーツで構成される特殊アイテムの取得・在庫管理・配置という流れを追加してるんダヨ〜 🎵

Changes

Cohort / File(s) Summary
Calendar インタラクション改善
frontend/src/features/room/calendar.tsx
onclick ハンドラが無条件で e.stopPropagation() を呼ぶようになり、すべてのクリックでイベント伝播を停止するネ。
Snowdome 配置ロジック強化
frontend/src/features/room/hooks/useItemAcquisition.ts
AcquisitionPhase に "snowdome_placement" を追加。Snowdome アイテム検出、在庫・配置済みパーツ取得、マルチパーツ配置完了処理を実装したヨ〜 🌟
Snowdome 3D コンポーネント
frontend/src/features/room/draggableSnowdome.tsx
新規実装。レイキャストベース配置、回転制御、ロック/アンロック、リアルタイム配置有効性フィードバックを備えた React Three Fiber コンポーネントダヨ〜 ✨
配置済みアイテム UI
frontend/src/features/room/placedItems.tsx
Snowdome アイテムをポジション別にグループ化。PlacedSnowdomeGroup コンポーネントで描画し、選択時に再配置・返却 UI を提供するネ。
シーン統合・ルーティング
frontend/src/routes/$roomId/index.lazy.tsx
Snowdome 配置モード(isSnowdomePlacementMode)の追加。DraggableSnowdome のレンダリング、配置確認オーバーレイ、カレンダー・3D オブジェクト インタラクション制御を実装。
カメラ焦点調整
frontend/src/features/room/hooks/useCalendarFocus.ts
カメラ距離計算の倍数が 0.6 から 0.9 に変更。カレンダー焦点時のカメラ位置が遠くなるッスヨ〜 🎵

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

おじさんが見どころをまとめちゃったヨ〜 (´ω`)✨

  • useItemAcquisition.ts — マルチパーツ Snowdome アイテムの取得・在庫・配置ライフサイクル全体が新規実装されてるネ。複数パーツの並列パッチ処理や条件分岐が増えてるから、エッジケース(既配置パーツ、未配置パーツの混在)まで丁寧に見たいトコロっスね〜
  • draggableSnowdome.tsx — レイキャスト、キネマティック Rigidbody、回転制御、デバウンス付き親同期など、物理・3D ロジックが濃密だヨ。ノーマル基準の高さ調整、速度閾値チェックなんかも含まれてるから、配置の滑らかさと正確性の両立が本当に機能してるか確認をね〜 🌟
  • $roomId/index.lazy.tsx — Snowdome 配置モードと通常配置モードの共存ロジック。isAnyPlacementMode で統一してるけど、UI フロー(オーバーレイ表示、ボタン非表示)がちゃんと分岐してるか見ておくといいかなァ。
  • placedItems.tsx — ポジション別グループ化のデータフロー。複数パーツが同じポジションに集約される際のクリック選択処理が想定通りかネ。

Possibly related PRs

  • PR #50 — おじさん詳しいんだけど〜、このPR の基盤となった PR だネ。useItemAcquisition や配置フロー、DraggableItem コンポーネントを先に実装してるヨ〜 🎵 こっちを参照すると、Snowdome 拡張の意図がより明確だヨ。
  • PR #44$roomId/index.lazy.tsx を同時に修正してるから、ルート・シーン統合との関連が強いっスネ。配置 UI オーバーレイの順序や状態管理が競合してないか一緒に確認する価値ありダヨ〜 ✨
  • PR #45calendar.tsx の click ハンドラ・イベント伝播ロジックを並行修正。このPR での無条件 stopPropagation() との相互作用を見ておくといいんじゃないカナ〜 (´ω`)

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive タイトルが日本語で記述されており、「snowdomeの処理作成」と具体的な機能を示していますが、英語圏の開発チームにとって可読性が低く、何が実装されたのか直感的に理解しにくい可能性があります。 英語でのタイトル記述を検討し、例えば「feat(frontend): Implement snowdome placement feature」など、変更内容をより広く理解できる形式への改善をお勧めします。
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 20, 2025

🚀 Deploy Preview Ready!

Application Status URL Version ID
🎨 frontend ✅ Ready Open Preview 56ac12ef

🔨 Latest Commit: d697fe3
📅 Deployed at: 2025/12/21 3:38:30 (JST)

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

🧹 Nitpick comments (7)
frontend/src/features/room/calendar.tsx (1)

91-98: 重複した stopPropagation() 呼び出しがあるヨ〜 ✨

おじさんコード見てたら気づいちゃったんダケド、92行目で無条件に e.stopPropagation() 呼んでるから、95行目の同じ呼び出しは冗長になっちゃってるネ (´ω`)

配置モードでのイベント制御には92行目だけで十分ダヨ〜 🎵

🔎 冗長な呼び出しを削除する提案
       onClick={(e) => {
         e.stopPropagation();
         // フォーカスモードでない場合は、カレンダー全体クリックでフォーカスモードへ
         if (!isFocusMode) {
-          e.stopPropagation();
           onCalendarClick();
         }
       }}
frontend/src/features/room/placedItems.tsx (1)

138-142: イベントの型が合ってないかもネ〜 🤔

おじさん、Three.js詳しいんダケド、ここの handleClick の型が React.MouseEvent<HTMLDivElement> になってるヨ〜

でも147行目の <group onClick={handleClick}> は Three.js のグループで、渡されるイベントは ThreeEvent<MouseEvent> なんダヨネ (´ω`)

PlacedItem の方(216行目)も同じ型使ってるから統一はされてるケド、正確な型にした方が安心ダヨ〜 ✨

🔎 型を修正する提案
+import type { ThreeEvent } from "@react-three/fiber";

-  const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {
+  const handleClick = (e: ThreeEvent<MouseEvent>) => {
     e.stopPropagation();
     // 最初のパーツをクリックとして扱う
     onItemClick(snowdomeParts[0]);
   };
frontend/src/features/room/draggableSnowdome.tsx (2)

47-51: GLBのプリロード、ループの外に出した方がいいカモ〜 🌟

おじさん、パフォーマンスチューニング得意なんダケド、ここの useGLTF.preload がレンダーごとに毎回呼ばれちゃってるヨ〜 (´ω`)

drei の preload は内部でキャッシュするから大きな問題にはならないケド、コンポーネント外でやるか、useEffect 使った方がキレイダネ ✨

🔎 useEffectを使う提案
+  // 各パーツのGLBをプリロード
+  useEffect(() => {
+    for (const part of snowdomeParts) {
+      const modelUrl = `${R2_BASE_URL}/item/object/${part.item.id}.glb`;
+      useGLTF.preload(modelUrl);
+    }
+  }, [snowdomeParts]);

-  // 各パーツのGLBをプリロード
-  for (const part of snowdomeParts) {
-    const modelUrl = `${R2_BASE_URL}/item/object/${part.item.id}.glb`;
-    useGLTF.preload(modelUrl);
-  }

10-22: 未使用のpropがあるヨ〜 ✨

おじさん細かいとこ気になっちゃうタイプでネ〜 (^_^)v

16行目の isPlacementValid prop、インターフェースで定義されてるケド、35行目のdestructuringで受け取ってないし使われてないみたいダヨ〜

🔎 未使用propを削除する提案
 interface DraggableSnowdomeProps {
   snowdomeParts: CalendarItemWithItem[];
   onPositionChange?: (
     position: [number, number, number],
     rotation: [number, number, number],
   ) => void;
-  isPlacementValid: boolean;
   setIsPlacementValid: (valid: boolean) => void;
   initialRotation?: [number, number, number];
   onLockChange?: (isLocked: boolean) => void;
   roomRef: React.RefObject<THREE.Group>;
   placedItemsRef?: React.RefObject<THREE.Group>;
 }
frontend/src/features/room/hooks/useItemAcquisition.ts (3)

256-271: エラーハンドリングを検討してネ〜 🌟

おじさん、async処理に詳しいんだけどサ〜 🎵 patchCalendarItem が失敗した時のエラーハンドリングがないから、ユーザーには何が起きたか分からないカモ (´ω`)

try-catchでエラーをキャッチして、UIにフィードバックを返す仕組みがあるといいカナ〜って思ったヨ✨


404-418: Promise.allの部分的失敗に注意してネ〜 (´ω`)

おじさん並列処理には詳しいんだけどサ〜 🎵 Promise.all は1つでも失敗すると全体が reject されるんダヨ〜

でも、最初のpatchが成功して2番目が失敗した場合、一部のパーツだけ戻っちゃう不整合が起きる可能性があるカナ〜🤔

Promise.allSettled を使って結果を確認するか、トランザクション的なAPIがあれば検討してみてネ✨


501-503: setTimeoutのクリーンアップを検討してネ〜 🌟

おじさんReactのライフサイクルに詳しいんだけどサ〜 この setTimeout 、コンポーネントがアンマウントされた後も実行される可能性があるんダヨ〜 (´ω`)

メモリリークや警告の原因になることがあるから、useEffect のクリーンアップと組み合わせるか、アンマウント時にタイマーをキャンセルする仕組みがあるといいカナ〜って思ったヨ✨

ただ、100msと短いから実害は少ないかもネ🎵

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 76b36e0 and e9ca009.

📒 Files selected for processing (6)
  • frontend/src/features/room/calendar.tsx (1 hunks)
  • frontend/src/features/room/draggableSnowdome.tsx (1 hunks)
  • frontend/src/features/room/hooks/useCalendarFocus.ts (1 hunks)
  • frontend/src/features/room/hooks/useItemAcquisition.ts (5 hunks)
  • frontend/src/features/room/placedItems.tsx (3 hunks)
  • frontend/src/routes/$roomId/index.lazy.tsx (8 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{tsx,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{tsx,jsx}: Convert Figma-generated custom Tailwind CSS values to standard Tailwind values: rounded-[24px] → rounded-3xl, gap-[32px] → gap-8, p-[12px] → p-3, text-[20px] → text-xl, etc.
Use design system colors defined in frontend/src/styles.css instead of custom hex values or rgba: use bg-primary, text-foreground, border-border, etc.
Prioritize shadcn/ui components from frontend/src/components/ui/ (Button, Input, Dialog, Field, Label, Calendar, Popover, RadioGroup, Separator, Switch, Spinner) instead of creating custom components
Remove data-node-id attributes from Figma-generated code
Remove non-standard Tailwind classes like content-stretch
Use project default font instead of custom font specifications like font-['Noto_Sans_JP:Bold',sans-serif]
Adjust absolute positioning values (left-[232px] top-[216px]) based on actual use case rather than using Figma-generated coordinates

Files:

  • frontend/src/features/room/draggableSnowdome.tsx
  • frontend/src/features/room/placedItems.tsx
  • frontend/src/routes/$roomId/index.lazy.tsx
  • frontend/src/features/room/calendar.tsx
🧠 Learnings (2)
📚 Learning: 2025-12-18T15:18:17.646Z
Learnt from: CR
Repo: AdventSphere/advent-sphere PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-18T15:18:17.646Z
Learning: Applies to **/*.{tsx,jsx} : Adjust absolute positioning values (left-[232px] top-[216px]) based on actual use case rather than using Figma-generated coordinates

Applied to files:

  • frontend/src/features/room/hooks/useCalendarFocus.ts
📚 Learning: 2025-12-18T15:18:17.646Z
Learnt from: CR
Repo: AdventSphere/advent-sphere PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-18T15:18:17.646Z
Learning: Applies to **/*.{tsx,jsx} : Prioritize shadcn/ui components from frontend/src/components/ui/ (Button, Input, Dialog, Field, Label, Calendar, Popover, RadioGroup, Separator, Switch, Spinner) instead of creating custom components

Applied to files:

  • frontend/src/routes/$roomId/index.lazy.tsx
🧬 Code graph analysis (2)
frontend/src/features/room/draggableSnowdome.tsx (2)
common/generate/adventSphereAPI.schemas.ts (1)
  • CalendarItemWithItem (54-54)
frontend/src/constants/r2-url.ts (1)
  • R2_BASE_URL (1-2)
frontend/src/features/room/hooks/useItemAcquisition.ts (1)
common/generate/adventSphereAPI.schemas.ts (2)
  • CalendarItemWithItem (54-54)
  • Room (220-239)
🔇 Additional comments (13)
frontend/src/features/room/hooks/useCalendarFocus.ts (1)

41-41: LGTM! カメラ距離の調整、いい感じダネ〜 🌟

おじさんこういうUX調整、詳しいヨ〜 (^_^)v

0.6から0.9に変更することで、カレンダー全体がより見やすくなるネ!配置モード追加に合わせた調整として適切ダヨ〜 ✨

frontend/src/features/room/placedItems.tsx (1)

47-65: snowdomeのグループ化ロジック、よくできてるネ〜 🎵

おじさん感心しちゃったヨ〜 (^_^)v

位置ベースでパーツをグループ化する発想、スマートダネ!JSON.stringify でキー作るのもシンプルで良いヨ〜 ✨

frontend/src/features/room/draggableSnowdome.tsx (1)

223-250: 全体的な実装、良くできてるネ〜 🌟

おじさん、物理演算とレイキャスト組み合わせたドラッグ配置、結構難しいの知ってるヨ〜 (^_^)v

kinematicPositionでの滑らかな追従、ロック/アンロックの切り替え、回転操作、視覚的フィードバック、全部しっかり実装されてて感心しちゃったヨ〜 ✨🎵

frontend/src/routes/$roomId/index.lazy.tsx (3)

394-396: snowdome配置時のexcludeItemIdも考慮した方がいいカモ〜 🤔

おじさん、ここちょっと気になったんダケド、excludeItemIdisPlacementMode の時だけ設定されてて、isSnowdomePlacementMode の時は考慮されてないヨ〜

snowdome配置中も targetCalendarItem は除外した方がいいんじゃないカナ? (´ω`)

🔎 isAnyPlacementModeを使う提案
               excludeItemId={
-                isPlacementMode ? (targetCalendarItem?.id ?? null) : null
+                isAnyPlacementMode ? (targetCalendarItem?.id ?? null) : null
               }

ただ、snowdomeの場合は複数パーツをまとめて除外する必要があるかもしれないから、実際の挙動を確認してネ〜 ✨


228-256: snowdomeパーツの計算ロジック、しっかりしてるネ〜 🌟

おじさん感心しちゃったヨ〜 (^_^)v

再配置と新規配置の両方のケースを考慮して、重複除去もちゃんとやってるネ!useMemoで依存配列もバッチリダヨ〜 ✨🎵


418-435: DraggableSnowdomeの統合、キレイにできてるネ〜 ✨

おじさん、こういう条件付きレンダリングのパターン好きダヨ〜 (^_^)v

snowdomePartsForPlacement.length > 0 のガードも入ってて安全ダネ!refの型アサーションもPlacementDraggableItemと統一されてて良いヨ〜 🎵

frontend/src/features/room/hooks/useItemAcquisition.ts (7)

14-19: LGTM!

新しい snowdome_placement フェーズの追加、すっきりしてていいネ〜 (^_^)v おじさん的にもこの設計は分かりやすいと思うヨ🎵


31-39: タイムゾーンの一貫性を確認してネ〜 🌟

おじさん、ちょっと気になっちゃったんだけどサ〜 getFullYear(), getMonth(), getDate() はローカルタイムゾーンで動くんダヨ〜 (´ω`)

もし room.snowDomePartsLastDate がUTCで保存されてる場合、日付の境界でズレが起きる可能性があるカナ?サーバー側のタイムゾーン設定と合わせて確認してみてネ✨


133-135: LGTM! 🎵

プレースホルダーから実際の日時チェックに修正されてるネ〜 おじさん的にはシンプルで良いと思うヨ✨ (^_^)v


206-235: LGTM!

おじさん、浮動小数点の比較で 0.001 のイプシロン使ってるの見て感心しちゃったヨ〜 🎵 これ、3D座標比較のベストプラクティスだからネ (^_^)v

getInventorySnowdomePartsgetPlacedSnowdomePartsAtPosition の役割分担もきれいダヨ〜✨


362-388: LGTM! 🎵

snowdomeの配置済み/インベントリ両方のケースをちゃんと分岐してるネ〜✨ おじさん的には allParts[0] || calendarItem のフォールバックも安全でいいと思うヨ (^_^)v


467-480: 重複除去の実装、いいネ〜!

おじさん見てて思ったんだけど、Lines 467-469で targetCalendarItem を追加してから Lines 477-480 で重複除去してるの、ちゃんと考えられてるネ〜 🎵

targetCalendarItem がすでにインベントリに含まれてる可能性があるから、この処理は必要ダヨ (^_^)v


516-534: LGTM! 🎵

新しいsnowdome関連のヘルパーとハンドラーがきれいにエクスポートされてるネ〜✨ おじさん的にはAPIの設計がすっきりしてて使いやすそうダヨ (^_^)v

getInventorySnowdomePartsgetPlacedSnowdomePartsAtPosition を外部に公開してるの、他のコンポーネントから再利用できていいネ〜🌟

Comment on lines +143 to +147
// レイキャストがヒットしない場合は配置不可
if (!intersects.length) {
setIsPlacementValid(false);
return;
}
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

このコード、到達しないヨ〜 💦

おじさん気づいちゃったんダケド、106行目で !intersects.length の時にすでに return してるから、143-147行目には絶対到達しないヨ〜 (´ω`)

デッドコードになっちゃってるから削除した方がスッキリするネ 🎵

🔎 デッドコードを削除する提案
     rigidBodyRef.current.setRotation(
       { x: quaternion.x, y: quaternion.y, z: quaternion.z, w: quaternion.w },
       true,
     );

-    // レイキャストがヒットしない場合は配置不可
-    if (!intersects.length) {
-      setIsPlacementValid(false);
-      return;
-    }
-
     // 仮:床に当たっていれば配置可能
     setIsPlacementValid(true);
   });
📝 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 (!intersects.length) {
setIsPlacementValid(false);
return;
}
rigidBodyRef.current.setRotation(
{ x: quaternion.x, y: quaternion.y, z: quaternion.z, w: quaternion.w },
true,
);
// 仮:床に当たっていれば配置可能
setIsPlacementValid(true);
});
🤖 Prompt for AI Agents
frontend/src/features/room/draggableSnowdome.tsx around lines 143 to 147: the
check for !intersects.length and its setIsPlacementValid(false); return; is
unreachable because an identical check and early return already occurs at line
106, so remove these lines to eliminate dead code; after deletion, run a quick
lint/typecheck and ensure no other logic depended on the duplicate branch (no
other side-effects), keeping the single early-return path at line 106 as the
sole handling for a miss.

Comment on lines +240 to +244
const handleNextFromGetModal = useCallback(async () => {
if (!targetCalendarItem || !room) {
setPhase("placement");
return;
}
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

早期リターンのロジックを確認してネ〜 (´ω`)

おじさんちょっと心配なんだけどサ〜 targetCalendarItemroomnull の時に "placement" フェーズに進むのは意図通りカナ?🤔

配置画面で targetCalendarItemnull だと何も配置できないと思うんだけど、ここは "idle" に戻すか、早期リターンで何もしない方が安全じゃないカナ〜?✨

🔎 おじさんの提案ダヨ〜
   const handleNextFromGetModal = useCallback(async () => {
     if (!targetCalendarItem || !room) {
-      setPhase("placement");
       return;
     }
📝 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
const handleNextFromGetModal = useCallback(async () => {
if (!targetCalendarItem || !room) {
setPhase("placement");
return;
}
const handleNextFromGetModal = useCallback(async () => {
if (!targetCalendarItem || !room) {
return;
}
🤖 Prompt for AI Agents
In frontend/src/features/room/hooks/useItemAcquisition.ts around lines 240 to
244, the early-return currently sets phase to "placement" when
targetCalendarItem or room is null which can lead to an unusable placement
screen; change the behavior to set phase to "idle" (or alternatively perform a
no-op early return) so the UI returns to a safe state, update the early-return
to setPhase("idle") and return immediately, and add a brief comment explaining
why we avoid entering "placement" without a targetCalendarItem or room.

function RouteComponent() {
const { roomId } = Route.useParams();
const { data: room } = useGetRoomsId(roomId);
console.log("room", room);
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

console.log消し忘れてるヨ〜 💦

おじさんもよくやっちゃうんダケド、デバッグ用の console.log が残ってるネ〜 (´ω`)

本番環境に出る前に消しておいた方がいいヨ〜 🎵

🔎 console.logを削除する提案
   const { roomId } = Route.useParams();
   const { data: room } = useGetRoomsId(roomId);
-  console.log("room", room);
   const { data: calendarItems } =
📝 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
console.log("room", room);
const { roomId } = Route.useParams();
const { data: room } = useGetRoomsId(roomId);
const { data: calendarItems } =
🤖 Prompt for AI Agents
In frontend/src/routes/$roomId/index.lazy.tsx around line 52 there is a leftover
debug console.log("room", room); — remove this console.log (or replace it with
the app's proper logger if you need runtime diagnostics) and run the
linter/build to ensure no stray debug statements remain before merging.

@haru-036 haru-036 merged commit 75637bc into main Dec 20, 2025
5 checks passed
@haru-036 haru-036 deleted the feature/snowdome branch December 20, 2025 18:40
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.

1 participant