From 90fbc7e653576d78c167a94b126731913120eef3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 21 Dec 2025 03:01:52 +0000 Subject: [PATCH 1/4] Initial plan From 44f551b406b2647afc244ac40f0a39f02e28a142 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 21 Dec 2025 03:09:22 +0000 Subject: [PATCH 2/4] Add photo capture feature with Camera icon button Co-authored-by: haru-036 <105186692+haru-036@users.noreply.github.com> --- frontend/src/routes/$roomId/index.lazy.tsx | 33 +++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/frontend/src/routes/$roomId/index.lazy.tsx b/frontend/src/routes/$roomId/index.lazy.tsx index 8e7c837..c2f7255 100644 --- a/frontend/src/routes/$roomId/index.lazy.tsx +++ b/frontend/src/routes/$roomId/index.lazy.tsx @@ -5,7 +5,7 @@ import { createLazyFileRoute } from "@tanstack/react-router"; import type { CalendarItemWithItem } from "common/generate/adventSphereAPI.schemas"; import { useGetCalendarItemsRoomIdCalendarItems } from "common/generate/calendar-items/calendar-items"; import { useGetRoomsId } from "common/generate/room/room"; -import { X } from "lucide-react"; +import { Camera, X } from "lucide-react"; import { Suspense, useCallback, useMemo, useRef, useState } from "react"; import type * as THREE from "three"; import InventoryIcon from "@/components/icons/inventory"; @@ -63,6 +63,7 @@ function RouteComponent() { const roomRef = useRef(null); const placedItemsRef = useRef(null); const tableRef = useRef(null); + const canvasRef = useRef(null); // アイテム取得フロー const { phase, @@ -120,6 +121,24 @@ function RouteComponent() { setSelectedPlacedItem(null); }, []); + // 写真撮影 + const handleTakePhoto = useCallback(() => { + if (!canvasRef.current) return; + + try { + // Canvas要素からBase64データURLを取得 + const dataURL = canvasRef.current.toDataURL("image/png"); + + // ダウンロードリンクを作成 + const link = document.createElement("a"); + link.href = dataURL; + link.download = "screenshot.png"; + link.click(); + } catch (error) { + console.error("Failed to capture photo:", error); + } + }, []); + // 配置モード const { isPlacementValid, @@ -284,6 +303,17 @@ function RouteComponent() { onOpenChange={setIsInventoryDialogOpen} onStartPlacement={startPlacementFromInventory} /> + {!isFocusMode && !isAnyPlacementMode && ( + + )} {isFocusMode && !isAnyPlacementMode && (