diff --git a/frontend/src/routes/$roomId/index.lazy.tsx b/frontend/src/routes/$roomId/index.lazy.tsx index 8e7c837..554e234 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,27 @@ 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"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } catch (error) { + console.error("Failed to capture photo:", error); + alert("写真の保存に失敗しました。エラーを確認してください。"); + } + }, []); + // 配置モード const { isPlacementValid, @@ -284,6 +306,17 @@ function RouteComponent() { onOpenChange={setIsInventoryDialogOpen} onStartPlacement={startPlacementFromInventory} /> + {!isFocusMode && !isAnyPlacementMode && ( + + )} {isFocusMode && !isAnyPlacementMode && (