import React from 'react' import { dialog, Dialog } from "mdui" import Avatar from "../Avatar.tsx" import { CallbackError, Chat } from 'lingchair-client-protocol' import { data, useLocation, useNavigate, useSearchParams } from 'react-router' import useAsyncEffect from '../../utils/useAsyncEffect.ts' import { useContextSelector } from 'use-context-selector' import MainSharedContext, { Shared } from '../MainSharedContext.ts' import getClient from '../../getClient.ts' import useEventListener from '../../utils/useEventListener.ts' import showSnackbar from '../../utils/showSnackbar.ts' export default function ChatInfoDialog({ ...props }: React.HTMLAttributes) { const shared = useContextSelector(MainSharedContext, (context: Shared) => ({ myProfileCache: context.myProfileCache, favouriteChats: context.favouriteChats, })) const [chat, setChat] = React.useState() const [userId, setUserId] = React.useState() const [searchParams] = useSearchParams() let pathName = useLocation().pathname const navigate = useNavigate() function back() { navigate('/') } const dialogRef = React.useRef() useEventListener(dialogRef, 'overlay-click', () => back()) const id = searchParams.get('id') const [favourited, setIsFavourited] = React.useState(false) React.useEffect(() => { setIsFavourited(shared.favouriteChats.map((v) => v.getId()).indexOf(chat?.getId() || '') != -1) }, [chat, shared]) React.useEffect(() => { console.log("挂载喵!", pathName) return () => console.log("被抛弃了喵!", pathName) }, [pathName]) const isUser = pathName.startsWith('/info/user') useAsyncEffect(async () => { console.log(id, pathName) try { if (isUser) { setChat(await Chat.getOrCreatePrivateChatOrThrow(getClient(), id!)) setUserId(id!) } else setChat(await Chat.getByIdOrThrow(getClient(), id!)) dialogRef.current!.open = true } catch (e) { if (e instanceof CallbackError) showSnackbar({ message: '打开资料卡失败: ' + e.message }) console.log(e) back() } }, [id, isUser]) const avatarUrl = getClient().getUrlForFileByHash(chat?.getAvatarFileHash())! return (
avatarUrl && openImageViewer(avatarUrl)} />
{chat?.getTitle()} ({chat?.getType()}) ID: {chat?.getType() == 'private' ? userId : chat?.getId()}
dialog({ headline: favourited ? "取消收藏对话" : "收藏对话", description: favourited ? "确定从收藏对话列表中移除吗? (虽然这不会导致聊天记录丢失)" : "确定要添加到收藏对话列表吗?", actions: [ { text: "取消", onClick: () => { return true }, }, { text: "确定", onClick: () => { ; (async () => { const re = await Client.invoke(favourited ? "User.removeContacts" : "User.addContacts", { token: data.access_token, targets: [ chat!.id ], }) if (re.code != 200) checkApiSuccessOrSncakbar(re, favourited ? "取消收藏失败" : "收藏失败") EventBus.emit('ContactsList.updateContacts') })() return true }, } ], })}>{favourited ? '取消收藏' : '收藏对话'} { chatInfoDialogRef.current!.open = false openChatFragment(chat!.id) }}>打开对话
) }