import Client from "../api/Client.ts" import data from "../Data.ts" import ChatFragment from "./chat/ChatFragment.tsx" import useEventListener from './useEventListener.ts' import User from "../api/client_data/User.ts" import RecentChat from "../api/client_data/RecentChat.ts" import Avatar from "./Avatar.tsx" import * as React from 'react' import { Dialog, NavigationBar, TextField } from "mdui" import 'mdui/jsx.zh-cn.d.ts' import { checkApiSuccessOrSncakbar } from "./snackbar.ts" import RegisterDialog from "./dialog/RegisterDialog.tsx" import LoginDialog from "./dialog/LoginDialog.tsx" import MyProfileDialog from "./dialog/MyProfileDialog.tsx" import ContactsList from "./main/ContactsList.tsx" import RecentsList from "./main/RecentsList.tsx" import useAsyncEffect from "./useAsyncEffect.ts" import ChatInfoDialog from "./dialog/ChatInfoDialog.tsx" import Chat from "../api/client_data/Chat.ts" import AddContactDialog from './dialog/AddContactDialog.tsx' import UserProfileDialog from "./dialog/UserProfileDialog.tsx" import DataCaches from "../api/DataCaches.ts" declare global { namespace React { namespace JSX { interface IntrinsicAttributes { id?: string slot?: string } } } } export default function AppMobile() { const [navigationItemSelected, setNavigationItemSelected] = React.useState('Recents') const navigationBarRef = React.useRef(null) useEventListener(navigationBarRef, 'change', (event) => { setNavigationItemSelected((event.target as HTMLElement as NavigationBar).value as string) }) const loginDialogRef = React.useRef(null) const loginInputAccountRef = React.useRef(null) const loginInputPasswordRef = React.useRef(null) const registerDialogRef = React.useRef(null) const registerInputUserNameRef = React.useRef(null) const registerInputNickNameRef = React.useRef(null) const registerInputPasswordRef = React.useRef(null) const myProfileDialogRef = React.useRef(null) const openMyProfileDialogButtonRef = React.useRef(null) useEventListener(openMyProfileDialogButtonRef, 'click', (_event) => { myProfileDialogRef.current!.open = true }) const addContactDialogRef = React.useRef(null) const chatInfoDialogRef = React.useRef(null) const [chatInfo, setChatInfo] = React.useState(null as unknown as Chat) const userProfileDialogRef = React.useRef(null) const [userInfo, setUserInfo] = React.useState(null as unknown as User) const [myUserProfileCache, setMyUserProfileCache] = React.useState(null as unknown as User) const [isShowChatFragment, setIsShowChatFragment] = React.useState(false) const [currentChatId, setCurrentChatId] = React.useState('') const chatFragmentDialogRef = React.useRef(null) React.useEffect(() => { const shadow = chatFragmentDialogRef.current!.shadowRoot as ShadowRoot const panel = shadow.querySelector(".panel") as HTMLElement panel.style.padding = '0' panel.style.color = 'inherit' panel.style.backgroundColor = 'rgb(var(--mdui-color-background))' panel.style.setProperty('--mdui-color-background', 'inherit') const body = shadow.querySelector(".body") as HTMLElement body.style.height = '100%' body.style.display = 'flex' }) useAsyncEffect(async () => { Client.connect() const re = await Client.auth(data.access_token || "") if (re.code == 401) loginDialogRef.current!.open = true else if (re.code != 200) { if (checkApiSuccessOrSncakbar(re, "驗證失敗")) return } else if (re.code == 200) { setMyUserProfileCache(Client.myUserProfile as User) } }) function openChatInfoDialog(chat: Chat) { setChatInfo(chat) chatInfoDialogRef.current!.open = true } function openChatFragment(chatId: string) { setCurrentChatId(chatId) setIsShowChatFragment(true) } async function openUserInfoDialog(user: User | string) { if (user instanceof User) { setUserInfo(user) } else { setUserInfo(await DataCaches.getUserProfile(user)) } userProfileDialogRef.current!.open = true } return (
{ // 聊天页面 }
setIsShowChatFragment(false)} key={currentChatId} openChatInfoDialog={openChatInfoDialog} target={currentChatId} />
{ setCurrentChatId(id) setIsShowChatFragment(true) }} chat={chatInfo} /> { ({ Recents: "最近對話", Contacts: "所有對話" })[navigationItemSelected] }
{ // 侧边列表 } 最近 對話
) }