Fix 404 layout
This commit is contained in:
@@ -11,6 +11,7 @@ import { fetchArticles, reset_identity_token, getSiteNotice, type Article } from
|
|||||||
import { useLayout } from './context/LayoutContext';
|
import { useLayout } from './context/LayoutContext';
|
||||||
import './App.css';
|
import './App.css';
|
||||||
import { Eye24Regular, EyeOff24Regular, Copy24Regular } from '@fluentui/react-icons';
|
import { Eye24Regular, EyeOff24Regular, Copy24Regular } from '@fluentui/react-icons';
|
||||||
|
import NotFound from './components/NotFound';
|
||||||
import NoticeModal from './components/NoticeModal';
|
import NoticeModal from './components/NoticeModal';
|
||||||
import type { NoticeData } from './components/NoticeModal';
|
import type { NoticeData } from './components/NoticeModal';
|
||||||
|
|
||||||
@@ -153,8 +154,6 @@ const Home: React.FC<{ onPreviewImage: (src: string, alt?: string) => void }> =
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const NotFound = () => <h1>404 Not Found</h1>;
|
|
||||||
|
|
||||||
const NoticeOverlay: React.FC = () => {
|
const NoticeOverlay: React.FC = () => {
|
||||||
const { settings } = useLayout();
|
const { settings } = useLayout();
|
||||||
const [noticeData, setNoticeData] = useState<NoticeData | null>(null);
|
const [noticeData, setNoticeData] = useState<NoticeData | null>(null);
|
||||||
@@ -316,8 +315,8 @@ function App() {
|
|||||||
<Route path="create" element={<CreatePost />} />
|
<Route path="create" element={<CreatePost />} />
|
||||||
<Route path="panel" element={<Panel />} />
|
<Route path="panel" element={<Panel />} />
|
||||||
<Route path="about" element={<About />} />
|
<Route path="about" element={<About />} />
|
||||||
<Route path="*" element={<NotFound />} />
|
|
||||||
</Route>
|
</Route>
|
||||||
|
<Route path="*" element={<NotFound />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
);
|
);
|
||||||
|
|||||||
86
front/src/components/NotFound.tsx
Normal file
86
front/src/components/NotFound.tsx
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { makeStyles, tokens, Card, CardHeader, CardPreview, Text, Button, Title1, Subtitle1, FluentProvider, webLightTheme } from '@fluentui/react-components';
|
||||||
|
import { ArrowLeft24Regular, Home24Regular } from '@fluentui/react-icons';
|
||||||
|
|
||||||
|
const useStyles = makeStyles({
|
||||||
|
page: {
|
||||||
|
position: 'fixed',
|
||||||
|
inset: 0,
|
||||||
|
width: '100vw',
|
||||||
|
height: '100vh',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
backgroundColor: tokens.colorNeutralBackground3,
|
||||||
|
padding: tokens.spacingHorizontalXL,
|
||||||
|
overflow: 'auto',
|
||||||
|
boxSizing: 'border-box',
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
width: 'min(720px, 92vw)',
|
||||||
|
borderRadius: tokens.borderRadiusLarge,
|
||||||
|
overflow: 'hidden',
|
||||||
|
boxShadow: tokens.shadow8,
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
paddingLeft: tokens.spacingHorizontalXL,
|
||||||
|
paddingRight: tokens.spacingHorizontalXL,
|
||||||
|
paddingTop: tokens.spacingVerticalM,
|
||||||
|
paddingBottom: tokens.spacingVerticalM,
|
||||||
|
},
|
||||||
|
preview: {
|
||||||
|
height: '140px',
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
background: `linear-gradient(135deg, ${tokens.colorBrandBackground} 0%, ${tokens.colorBrandBackground2} 50%, ${tokens.colorPaletteBlueBackground2} 100%)`,
|
||||||
|
color: tokens.colorNeutralForegroundOnBrand,
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
paddingLeft: tokens.spacingHorizontalXL,
|
||||||
|
paddingRight: tokens.spacingHorizontalXL,
|
||||||
|
paddingTop: tokens.spacingVerticalL,
|
||||||
|
paddingBottom: tokens.spacingVerticalL,
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
gap: tokens.spacingVerticalM,
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
display: 'flex',
|
||||||
|
gap: tokens.spacingHorizontalM,
|
||||||
|
marginTop: tokens.spacingVerticalL,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const NotFound: React.FC = () => {
|
||||||
|
const styles = useStyles();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FluentProvider theme={webLightTheme}>
|
||||||
|
<div className={styles.page}>
|
||||||
|
<Card className={styles.card}>
|
||||||
|
<CardHeader className={styles.header} header={<Title1 style={{ margin: 0 }}>😕 404 Not Found</Title1>} />
|
||||||
|
<CardPreview>
|
||||||
|
<div className={styles.preview} />
|
||||||
|
</CardPreview>
|
||||||
|
<div className={styles.content}>
|
||||||
|
<Subtitle1>页面被当成小鱼干吃掉了喵😭</Subtitle1>
|
||||||
|
<Text>请检查链接是否正确,或者点击下方按钮继续浏览</Text>
|
||||||
|
<div className={styles.actions}>
|
||||||
|
<Button appearance="primary" icon={<ArrowLeft24Regular />} onClick={() => navigate(-1)}>
|
||||||
|
返回上一页
|
||||||
|
</Button>
|
||||||
|
<Button appearance="secondary" icon={<Home24Regular />} onClick={() => navigate('/') }>
|
||||||
|
返回首页
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
</FluentProvider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NotFound;
|
||||||
Reference in New Issue
Block a user