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 currentLocation = useLocation() const navigate = useNavigate() function back() { navigate(-1) } 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(currentLocation) }, [currentLocation]) useAsyncEffect(async () => { console.log(id, currentLocation.pathname) try { if (!currentLocation.pathname.startsWith('/info/')) { dialogRef.current!.open = false return } if (id == null) { dialogRef.current!.open = false return back() } if (currentLocation.pathname.startsWith('/info/user')) { 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, currentLocation]) if (!currentLocation.pathname.startsWith('/info/')) return null 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) }}>打开对话
) }