diff --git a/frontend/package.json b/frontend/package.json
index 12dba8f..18c2853 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -15,6 +15,7 @@
"@react-three/fiber": "^9.4.0",
"antd": "^6.0.0",
"axios": "^1.13.2",
+ "html2canvas": "^1.4.1",
"lucide-react": "^0.555.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index fbb3ab0..8196ce5 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -4,6 +4,7 @@
*/
import { useState, useCallback, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
+import { message } from 'antd';
import { useSpaceData } from './hooks/useSpaceData';
import { useHistoricalData } from './hooks/useHistoricalData';
import { useTrajectory } from './hooks/useTrajectory';
@@ -103,6 +104,18 @@ function App() {
setSelectedBody(body);
};
+ // Screenshot handler with auth check
+ const handleScreenshot = useCallback(() => {
+ if (!user) {
+ message.warning('请先登录以拍摄宇宙快照');
+ setShowAuthModal(true);
+ return;
+ }
+ // Use username or full_name or fallback
+ const nickname = user.full_name || user.username || 'Explorer';
+ takeScreenshot(nickname);
+ }, [user, takeScreenshot]);
+
// Auth handlers
const handleLoginSuccess = (userData: any) => {
setUser(userData);
@@ -156,7 +169,7 @@ function App() {
onToggleSound={() => setIsSoundOn(!isSoundOn)}
showDanmaku={showDanmaku}
onToggleDanmaku={() => setShowDanmaku(!showDanmaku)}
- onScreenshot={takeScreenshot}
+ onScreenshot={handleScreenshot}
/>
{/* Auth Modal */}
diff --git a/frontend/src/components/Scene.tsx b/frontend/src/components/Scene.tsx
index 3dcff0c..dbdf797 100644
--- a/frontend/src/components/Scene.tsx
+++ b/frontend/src/components/Scene.tsx
@@ -69,7 +69,7 @@ export function Scene({ bodies, selectedBody, trajectoryPositions = [], showOrbi
}, [selectedBody, bodies]);
return (
-
+