Skip to content

Commit cceb8d1

Browse files
fix: fix vim-chaser
1 parent cfa3fba commit cceb8d1

File tree

8 files changed

+219
-20
lines changed

8 files changed

+219
-20
lines changed

apps/vim-chaser/package-lock.json

Lines changed: 97 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/vim-chaser/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
"preview": "vite preview"
1010
},
1111
"dependencies": {
12+
"@tanstack/react-query": "^5.91.2",
1213
"react": "^19.1.0",
13-
"react-dom": "^19.1.0"
14+
"react-dom": "^19.1.0",
15+
"react-router-dom": "^7.13.1",
16+
"sonner": "^2.0.7"
1417
},
1518
"devDependencies": {
1619
"@types/react": "^19.1.0",

apps/vim-chaser/src/App.tsx

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,85 @@
11
import { useState } from 'react';
2+
import {
3+
BrowserRouter,
4+
Routes,
5+
Route,
6+
Navigate,
7+
useNavigate,
8+
useLocation
9+
} from 'react-router-dom';
10+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
11+
import { TooltipProvider } from '@/components/ui/tooltip';
12+
import { Toaster } from '@/components/ui/toaster';
13+
import { Toaster as Sonner } from '@/components/ui/sonner';
214
import { Home } from '@/pages/Home';
315
import { Adventure } from '@/modes/Adventure';
416
import { SpeedRun } from '@/modes/SpeedRun';
517
import { ChallengeMode } from '@/modes/Challenge';
18+
import NotFound from '@/pages/NotFound';
619

7-
type Page = 'home' | 'adventure' | 'speedrun' | 'challenge';
20+
// 创建 QueryClient 实例
21+
const queryClient = new QueryClient({
22+
defaultOptions: {
23+
queries: {
24+
staleTime: 60 * 1000,
25+
refetchOnWindowFocus: false,
26+
},
27+
},
28+
});
829

9-
function App() {
10-
const [page, setPage] = useState<Page>('home');
30+
// 包装 Home 组件,注入导航功能
31+
const HomePage = () => {
32+
const navigate = useNavigate();
33+
return (
34+
<Home
35+
onNavigate={(page) => {
36+
const routeMap: Record<string, string> = {
37+
'adventure': '/adventure',
38+
'speedrun': '/speedrun',
39+
'challenge': '/challenge'
40+
};
41+
navigate(routeMap[page] || '/');
42+
}}
43+
/>
44+
);
45+
};
46+
47+
// 包装各个模式组件,注入返回功能
48+
const AdventurePage = () => {
49+
const navigate = useNavigate();
50+
return <Adventure onBack={() => navigate('/')} />;
51+
};
52+
53+
const SpeedRunPage = () => {
54+
const navigate = useNavigate();
55+
return <SpeedRun onBack={() => navigate('/')} />;
56+
};
1157

12-
switch (page) {
13-
case 'adventure':
14-
return <Adventure onBack={() => setPage('home')} />;
15-
case 'speedrun':
16-
return <SpeedRun onBack={() => setPage('home')} />;
17-
case 'challenge':
18-
return <ChallengeMode onBack={() => setPage('home')} />;
19-
default:
20-
return <Home onNavigate={(p) => setPage(p)} />;
21-
}
58+
const ChallengePage = () => {
59+
const navigate = useNavigate();
60+
return <ChallengeMode onBack={() => navigate('/')} />;
61+
};
62+
63+
// 主应用组件
64+
function App() {
65+
return (
66+
<QueryClientProvider client={queryClient}>
67+
<TooltipProvider>
68+
<Toaster />
69+
<Sonner />
70+
<BrowserRouter basename={import.meta.env.BASE_URL}>
71+
<Routes>
72+
<Route path="/" element={<HomePage />} />
73+
<Route path="/adventure" element={<AdventurePage />} />
74+
<Route path="/speedrun" element={<SpeedRunPage />} />
75+
<Route path="/challenge" element={<ChallengePage />} />
76+
{/* 兜底路由 */}
77+
<Route path="*" element={<NotFound />} />
78+
</Routes>
79+
</BrowserRouter>
80+
</TooltipProvider>
81+
</QueryClientProvider>
82+
);
2283
}
2384

24-
export default App;
85+
export default App;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from 'react';
2+
3+
export const Toaster: React.FC = () => {
4+
return null;
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from 'react';
2+
3+
export const Toaster: React.FC = () => {
4+
return null;
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from 'react';
2+
3+
export const TooltipProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
4+
return <>{children}</>;
5+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { useNavigate } from 'react-router-dom';
2+
3+
const NotFound = () => {
4+
const navigate = useNavigate();
5+
return (
6+
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100vh', color: '#fff', background: '#0a0a0a' }}>
7+
<h1 style={{ fontSize: '4rem', marginBottom: '1rem' }}>404</h1>
8+
<p style={{ fontSize: '1.2rem', marginBottom: '2rem' }}>Page not found</p>
9+
<button onClick={() => navigate('/')} style={{ padding: '0.5rem 1.5rem', fontSize: '1rem', cursor: 'pointer', background: '#333', color: '#fff', border: '1px solid #555', borderRadius: '4px' }}>
10+
Back to Home
11+
</button>
12+
</div>
13+
);
14+
};
15+
16+
export default NotFound;

apps/vim-chaser/vite.config.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,20 @@ import { defineConfig } from 'vite'
22
import react from '@vitejs/plugin-react'
33
import path from 'path'
44

5-
export default defineConfig({
5+
export default defineConfig(({ mode }) => ({
66
base: process.env.NODE_ENV === 'production' ? '/weekly-vibe-coding/vim-chaser/' : '/',
7-
plugins: [react()],
7+
server: {
8+
host: "::",
9+
port: 8080,
10+
historyApiFallback: true
11+
},
12+
plugins: [
13+
react(),
14+
],
815
resolve: {
916
alias: {
10-
'@': path.resolve(__dirname, './src'),
17+
"@": path.resolve(__dirname, "./src"),
1118
},
1219
},
13-
})
20+
}));
21+

0 commit comments

Comments
 (0)