改用数据模式 Router

This commit is contained in:
CrescentLeaf
2025-12-13 12:32:48 +08:00
parent bf1551c6c3
commit a6ddb9025a

View File

@@ -3,7 +3,7 @@ import useEventListener from "../utils/useEventListener.ts"
import AvatarMySelf from "./AvatarMySelf.tsx" import AvatarMySelf from "./AvatarMySelf.tsx"
import MainSharedContext from './MainSharedContext.ts' import MainSharedContext from './MainSharedContext.ts'
import * as React from 'react' import * as React from 'react'
import { BrowserRouter, Link, Outlet, Route, Routes, useNavigate } from "react-router" import { BrowserRouter, createBrowserRouter, Link, Outlet, Route, RouterProvider, Routes } from "react-router"
import LoginDialog from "./main-page/LoginDialog.tsx" import LoginDialog from "./main-page/LoginDialog.tsx"
import useAsyncEffect from "../utils/useAsyncEffect.ts" import useAsyncEffect from "../utils/useAsyncEffect.ts"
import performAuth from "../performAuth.ts" import performAuth from "../performAuth.ts"
@@ -18,24 +18,7 @@ import AllChatsList from "./main-page/AllChatsList.tsx"
import FavouriteChatsList from "./main-page/FavouriteChatsList.tsx" import FavouriteChatsList from "./main-page/FavouriteChatsList.tsx"
import AddFavourtieChatDialog from "./main-page/AddFavourtieChatDialog.tsx" import AddFavourtieChatDialog from "./main-page/AddFavourtieChatDialog.tsx"
import RecentChatsList from "./main-page/RecentChatsList.tsx" import RecentChatsList from "./main-page/RecentChatsList.tsx"
import ChatInfoDialog from "./routers/ChatInfoDialog.tsx" import UserOrChatInfoDialog from "./routers/UserOrChatInfoDialog.tsx"
function Test() {
const nav = useNavigate()
const dialogRef = React.useRef<Dialog>()
useAsyncEffect(async () => {
await sleep(10)
dialogRef.current!.open = true
dialogRef.current!.addEventListener('overlay-click', () => {
dialogRef.current!.open = false
})
dialogRef.current!.addEventListener('closed', async () => {
await sleep(100)
nav(-1)
})
}, [])
return <mdui-dialog ref={dialogRef}></mdui-dialog>
}
export default function Main() { export default function Main() {
const [myProfileCache, setMyProfileCache] = React.useState<UserMySelf>() const [myProfileCache, setMyProfileCache] = React.useState<UserMySelf>()
@@ -111,133 +94,132 @@ export default function Main() {
waitingForAuth.open = false waitingForAuth.open = false
}) })
return ( const Root = (
<BrowserRouter> <MainSharedContext.Provider value={sharedContext}>
<MainSharedContext.Provider value={sharedContext}> <div style={{
<Routes> display: "flex",
<Route path="/" element={( position: 'relative',
<div style={{ flexDirection: isMobileUI() ? 'column' : 'row',
display: "flex", width: `calc(var(--whitesilk-window-width))${isMobileUI() ? '' : ' - 80px'}`,
position: 'relative', height: 'var(--whitesilk-window-height)',
flexDirection: isMobileUI() ? 'column' : 'row', }}>
width: `calc(var(--whitesilk-window-width))${isMobileUI() ? '' : ' - 80px'}`, {
height: 'var(--whitesilk-window-height)', // 将子路由渲染到此处
}}> <Outlet />
{ }
// 将子路由渲染到此处 <LoginDialog open={showLoginDialog} />
<Outlet /> <RegisterDialog open={showRegisterDialog} />
} <AddFavourtieChatDialog open={showAddFavourtieChatDialog} />
<LoginDialog open={showLoginDialog} /> <mdui-navigation-drawer ref={drawerRef} modal close-on-esc close-on-overlay-click>
<RegisterDialog open={showRegisterDialog} /> <mdui-list style={{
<AddFavourtieChatDialog open={showAddFavourtieChatDialog} /> padding: '10px',
<mdui-navigation-drawer ref={drawerRef} modal close-on-esc close-on-overlay-click> }}>
<mdui-list style={{ <mdui-list-item rounded>
padding: '10px', <span>{myProfileCache?.getNickName()}</span>
}}> <AvatarMySelf slot="icon" />
<mdui-list-item rounded> </mdui-list-item>
<span>{myProfileCache?.getNickName()}</span> <mdui-list-item rounded icon="manage_accounts"></mdui-list-item>
<AvatarMySelf slot="icon" /> <mdui-divider style={{
</mdui-list-item> margin: '10px',
<mdui-list-item rounded icon="manage_accounts"></mdui-list-item> }}></mdui-divider>
<mdui-divider style={{ <mdui-list-item rounded icon="person_add"></mdui-list-item>
margin: '10px', <mdui-list-item rounded icon="group_add"></mdui-list-item>
}}></mdui-divider> <Link to="/info/user?id=0960bd15-4527-4000-97a8-73110160296f"><mdui-list-item rounded icon="group_add"></mdui-list-item></Link>
<mdui-list-item rounded icon="person_add"></mdui-list-item> <Link to="/info/chat?id=priv_0960bd15_4527_4000_97a8_73110160296f__0960bd15_4527_4000_97a8_73110160296f"><mdui-list-item rounded icon="group_add">2</mdui-list-item></Link>
<mdui-list-item rounded icon="group_add"></mdui-list-item> </mdui-list>
<Link to="/info/user?id=0960bd15-4527-4000-97a8-73110160296f"><mdui-list-item rounded icon="group_add"></mdui-list-item></Link> <div style={{
<Link to="/info/chat?id=priv_0960bd15_4527_4000_97a8_73110160296f__0960bd15_4527_4000_97a8_73110160296f"><mdui-list-item rounded icon="group_add">2</mdui-list-item></Link> flexGrow: 1,
</mdui-list> }}></div>
<div style={{ <span style={{
flexGrow: 1, padding: '10px',
}}></div> fontSize: 'small',
<span style={{ }}>
padding: '10px', LingChair Web v{__APP_VERSION__}<br />
fontSize: 'small', Build: <a href={`https://codeberg.org/CrescentLeaf/LingChair/src/commit/${__GIT_HASH_FULL__}`}>{__GIT_HASH__}</a> ({__BUILD_TIME__})<br />
}}> Codeberg <a href="https://codeberg.org/CrescentLeaf/LingChair"></a>
LingChair Web v{__APP_VERSION__}<br /> </span>
Build: <a href={`https://codeberg.org/CrescentLeaf/LingChair/src/commit/${__GIT_HASH_FULL__}`}>{__GIT_HASH__}</a> ({__BUILD_TIME__})<br /> </mdui-navigation-drawer>
Codeberg <a href="https://codeberg.org/CrescentLeaf/LingChair"></a> {
</span> /**
</mdui-navigation-drawer> * Default: 侧边列表提供列表切换
{ */
/** !isMobileUI() ?
* Default: 侧边列表提供列表切换 <mdui-navigation-rail ref={navigationRef} contained value="Recents">
*/ <mdui-button-icon slot="top" icon="menu" onClick={() => drawerRef.current!.open = true}></mdui-button-icon>
!isMobileUI() ?
<mdui-navigation-rail ref={navigationRef} contained value="Recents">
<mdui-button-icon slot="top" icon="menu" onClick={() => drawerRef.current!.open = true}></mdui-button-icon>
<mdui-navigation-rail-item icon="watch_later--outlined" active-icon="watch_later--filled" value="Recents"></mdui-navigation-rail-item> <mdui-navigation-rail-item icon="watch_later--outlined" active-icon="watch_later--filled" value="Recents"></mdui-navigation-rail-item>
<mdui-navigation-rail-item icon="favorite_border" active-icon="favorite" value="Favourites"></mdui-navigation-rail-item> <mdui-navigation-rail-item icon="favorite_border" active-icon="favorite" value="Favourites"></mdui-navigation-rail-item>
<mdui-navigation-rail-item icon="chat--outlined" active-icon="chat--filled" value="AllChats"></mdui-navigation-rail-item> <mdui-navigation-rail-item icon="chat--outlined" active-icon="chat--filled" value="AllChats"></mdui-navigation-rail-item>
</mdui-navigation-rail> </mdui-navigation-rail>
/** /**
* Mobile: 底部导航栏提供列表切换 * Mobile: 底部导航栏提供列表切换
*/ */
: <mdui-top-app-bar style={{ : <mdui-top-app-bar style={{
position: 'sticky', position: 'sticky',
marginTop: '3px', marginTop: '3px',
marginRight: '6px', marginRight: '6px',
marginLeft: '15px', marginLeft: '15px',
top: '0px', top: '0px',
}}> }}>
<mdui-button-icon icon="menu" onClick={() => drawerRef.current!.open = true}></mdui-button-icon> <mdui-button-icon icon="menu" onClick={() => drawerRef.current!.open = true}></mdui-button-icon>
<mdui-top-app-bar-title>{ <mdui-top-app-bar-title>{
({ ({
Recents: "最近对话", Recents: "最近对话",
Favourites: "收藏对话", Favourites: "收藏对话",
AllChats: "所有对话", AllChats: "所有对话",
})[currentShowPage] })[currentShowPage]
}</mdui-top-app-bar-title> }</mdui-top-app-bar-title>
<div style={{ <div style={{
flexGrow: 1, flexGrow: 1,
}}></div> }}></div>
</mdui-top-app-bar> </mdui-top-app-bar>
} }
{ {
/** /**
* Mobile: 指定高度的容器 * Mobile: 指定高度的容器
* Default: 侧边列表 * Default: 侧边列表
*/ */
<div style={isMobileUI() ? { <div style={isMobileUI() ? {
display: 'flex', display: 'flex',
height: 'calc(100% - 80px - 67px)', height: 'calc(100% - 80px - 67px)',
width: '100%', width: '100%',
} : {}} id="SideBar"> } : {}} id="SideBar">
<RecentChatsList style={{ <RecentChatsList style={{
display: currentShowPage == 'Recents' ? undefined : 'none' display: currentShowPage == 'Recents' ? undefined : 'none'
}} /> }} />
<FavouriteChatsList style={{ <FavouriteChatsList style={{
display: currentShowPage == 'Favourites' ? undefined : 'none' display: currentShowPage == 'Favourites' ? undefined : 'none'
}} /> }} />
<AllChatsList style={{ <AllChatsList style={{
display: currentShowPage == 'AllChats' ? undefined : 'none' display: currentShowPage == 'AllChats' ? undefined : 'none'
}} /> }} />
</div> </div>
} }
{ {
/** /**
* Mobile: 底部导航栏提供列表切换 * Mobile: 底部导航栏提供列表切换
* Default: 侧边列表提供列表切换 * Default: 侧边列表提供列表切换
*/ */
isMobileUI() && <mdui-navigation-bar ref={navigationRef} label-visibility="selected" value="Recents" style={{ isMobileUI() && <mdui-navigation-bar ref={navigationRef} label-visibility="selected" value="Recents" style={{
position: 'sticky', position: 'sticky',
bottom: '0', bottom: '0',
}}> }}>
<mdui-navigation-bar-item icon="watch_later--outlined" active-icon="watch_later--filled" value="Recents"></mdui-navigation-bar-item> <mdui-navigation-bar-item icon="watch_later--outlined" active-icon="watch_later--filled" value="Recents"></mdui-navigation-bar-item>
<mdui-navigation-bar-item icon="favorite_border" active-icon="favorite" value="Favourites"></mdui-navigation-bar-item> <mdui-navigation-bar-item icon="favorite_border" active-icon="favorite" value="Favourites"></mdui-navigation-bar-item>
<mdui-navigation-bar-item icon="chat--outlined" active-icon="chat--filled" value="AllChats"></mdui-navigation-bar-item> <mdui-navigation-bar-item icon="chat--outlined" active-icon="chat--filled" value="AllChats"></mdui-navigation-bar-item>
</mdui-navigation-bar> </mdui-navigation-bar>
} }
</div> </div>
)}> </MainSharedContext.Provider>
<Route path="info">
<Route path="chat" element={<Test />} />
<Route path="user" element={<ChatInfoDialog />} />
</Route>
</Route>
</Routes>
</MainSharedContext.Provider>
</BrowserRouter>
) )
const router = createBrowserRouter([{
path: "/",
element: Root,
children: [
{ path: 'info/:type', Component: UserOrChatInfoDialog, },
],
}])
return <RouterProvider router={router} />
} }