diff --git a/client/ui/App.tsx b/client/ui/App.tsx index 8c7a9c4..95798b9 100644 --- a/client/ui/App.tsx +++ b/client/ui/App.tsx @@ -77,6 +77,8 @@ export default function App() { const [currentChatId, setCurrentChatId] = React.useState('') + const [sharedFavouriteChats, setSharedFavouriteChats] = React.useState([]) + useAsyncEffect(async () => { const split = Split(['#SideBar', '#ChatFragment'], { sizes: data.split_sizes ? data.split_sizes : [25, 75], @@ -176,6 +178,7 @@ export default function App() { chatInfoDialogRef={chatInfoDialogRef as any} openChatFragment={openChatFragment} openUserInfoDialog={openUserInfoDialog} + sharedFavouriteChats={sharedFavouriteChats} chat={chatInfo} /> diff --git a/client/ui/AppMobile.tsx b/client/ui/AppMobile.tsx index abc70bf..bbd6aab 100644 --- a/client/ui/AppMobile.tsx +++ b/client/ui/AppMobile.tsx @@ -74,6 +74,8 @@ export default function AppMobile() { const [currentChatId, setCurrentChatId] = React.useState('') + const [sharedFavouriteChats, setSharedFavouriteChats] = React.useState([]) + const chatFragmentDialogRef = React.useRef(null) React.useEffect(() => { const shadow = chatFragmentDialogRef.current!.shadowRoot as ShadowRoot @@ -162,6 +164,7 @@ export default function AppMobile() { { setCurrentChatId(id) setIsShowChatFragment(true) @@ -226,6 +229,7 @@ export default function AppMobile() { // 對話列表 diff --git a/client/ui/dialog/ChatInfoDialog.tsx b/client/ui/dialog/ChatInfoDialog.tsx index 04e0ca9..090ec20 100644 --- a/client/ui/dialog/ChatInfoDialog.tsx +++ b/client/ui/dialog/ChatInfoDialog.tsx @@ -9,17 +9,19 @@ import { checkApiSuccessOrSncakbar } from "../snackbar.ts" import User from "../../api/client_data/User.ts" import getUrlForFileByHash from "../../getUrlForFileByHash.ts" import openImageViewer from "../openImageViewer.ts" +import EventBus from "../../EventBus.ts" interface Args extends React.HTMLAttributes { chat: Chat openChatFragment: (id: string) => void chatInfoDialogRef: React.MutableRefObject openUserInfoDialog: (user: User | string) => void + sharedFavouriteChats: Chat[] } -export default function ChatInfoDialog({ chat, chatInfoDialogRef, openChatFragment, openUserInfoDialog }: Args) { +export default function ChatInfoDialog({ chat, chatInfoDialogRef, openChatFragment, openUserInfoDialog, sharedFavouriteChats }: Args) { const [chatInfo, setChatInfo] = React.useState(null as unknown as Chat) - const isMySelf = Client.myUserProfile?.id == chatInfo?.user_a_id && Client.myUserProfile?.id == chatInfo?.user_b_id + const [favourited, setIsFavourited] = React.useState(false) useAsyncEffect(async () => { if (chat == null) return @@ -29,8 +31,11 @@ export default function ChatInfoDialog({ chat, chatInfoDialogRef, openChatFragme }) if (re.code != 200) return checkApiSuccessOrSncakbar(re, '获取对话信息失败') - setChatInfo(re.data!.chat_info as Chat) - }) + + const info = re.data as Chat + setChatInfo(info) + setIsFavourited(sharedFavouriteChats.indexOf(info) != -1) + }, [chat, sharedFavouriteChats]) const avatarUrl = getUrlForFileByHash(chat?.avatar_file_hash as string) return ( @@ -66,6 +71,17 @@ export default function ChatInfoDialog({ chat, chatInfoDialogRef, openChatFragme openUserInfoDialog(re.data!.user_id as string) }}>用户详情 } + { + 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') + }}>{favourited ? '取消收藏' : '收藏对话'} { chatInfoDialogRef.current!.open = false openChatFragment(chat.id) diff --git a/client/ui/main/ContactsList.tsx b/client/ui/main/ContactsList.tsx index 17ac21d..730f63b 100644 --- a/client/ui/main/ContactsList.tsx +++ b/client/ui/main/ContactsList.tsx @@ -13,6 +13,7 @@ interface Args extends React.HTMLAttributes { openChatInfoDialog: (chat: Chat) => void addContactDialogRef: React.MutableRefObject createGroupDialogRef: React.MutableRefObject + setSharedFavouriteChats: React.Dispatch> } export default function ContactsList({ @@ -20,6 +21,7 @@ export default function ContactsList({ openChatInfoDialog, addContactDialogRef, createGroupDialogRef, + setSharedFavouriteChats, ...props }: Args) { const searchRef = React.useRef(null) @@ -40,7 +42,9 @@ export default function ContactsList({ if (re.code != 200) return checkApiSuccessOrSncakbar(re, "获取所有对话列表失败") - setContactsList(re.data!.contacts_list as Chat[]) + const ls = re.data!.contacts_list as Chat[] + setContactsList(ls) + setSharedFavouriteChats(ls) } updateContacts() EventBus.on('ContactsList.updateContacts', () => updateContacts())