import { CbEvents, MessageType } from "@openim/wasm-client-sdk"; import { GroupItem, MessageItem, RtcInvite, WSEvent, } from "@openim/wasm-client-sdk/lib/types/entity"; import { Popover } from "antd"; import i18n, { t } from "i18next"; import { useCallback, useEffect, useRef, useState } from "react"; import { getBusinessUserInfo } from "@/api/login"; import add_friend from "@/assets/images/topSearchBar/add_friend.png"; import add_group from "@/assets/images/topSearchBar/add_group.png"; import create_group from "@/assets/images/topSearchBar/create_group.png"; import search from "@/assets/images/topSearchBar/search.png"; import show_more from "@/assets/images/topSearchBar/show_more.png"; import WindowControlBar from "@/components/WindowControlBar"; import { CustomType } from "@/constants"; import { OverlayVisibleHandle } from "@/hooks/useOverlayVisible"; import ChooseModal, { ChooseModalState } from "@/pages/common/ChooseModal"; import GroupCardModal from "@/pages/common/GroupCardModal"; import RtcCallModal from "@/pages/common/RtcCallModal"; import { InviteData } from "@/pages/common/RtcCallModal/data"; import UserCardModal, { CardInfo } from "@/pages/common/UserCardModal"; import emitter, { OpenUserCardParams } from "@/utils/events"; import { IMSDK } from "../MainContentWrap"; import SearchUserOrGroup from "./SearchUserOrGroup"; type UserCardState = OpenUserCardParams & { cardInfo?: CardInfo; }; const TopSearchBar = () => { const userCardRef = useRef(null); const groupCardRef = useRef(null); const chooseModalRef = useRef(null); const searchModalRef = useRef(null); const rtcRef = useRef(null); const [chooseModalState, setChooseModalState] = useState({ type: "CRATE_GROUP", }); const [userCardState, setUserCardState] = useState(); const [groupCardData, setGroupCardData] = useState(); const [actionVisible, setActionVisible] = useState(false); const [isSearchGroup, setIsSearchGroup] = useState(false); const [inviteData, setInviteData] = useState({} as InviteData); useEffect(() => { const userCardHandler = (params: OpenUserCardParams) => { setUserCardState({ ...params }); userCardRef.current?.openOverlay(); }; const chooseModalHandler = (params: ChooseModalState) => { setChooseModalState({ ...params }); chooseModalRef.current?.openOverlay(); }; const callRtcHandler = (inviteData: InviteData) => { if (window.electronAPI?.ipcSend) { window.electronAPI?.ipcSend("calling-window", { data: "test" }); return; } if (rtcRef.current?.isOverlayOpen) return; setInviteData(inviteData); rtcRef.current?.openOverlay(); }; const newMessageHandler = ({ data }: WSEvent) => { if (rtcRef.current?.isOverlayOpen) return; let rtcInvite = undefined as undefined | RtcInvite; data.map((message) => { if (message.contentType === MessageType.CustomMessage) { const customData = JSON.parse(message.customElem!.data); if (customData.customType === CustomType.CallingInvite) { rtcInvite = customData.data; } } }); if (rtcInvite) { getBusinessUserInfo([rtcInvite.inviterUserID]).then(({ data: { users } }) => { if (users.length === 0) return; setInviteData({ invitation: rtcInvite, participant: { userInfo: { nickname: users[0].nickname, faceURL: users[0].faceURL, userID: users[0].userID, ex: "", }, }, }); rtcRef.current?.openOverlay(); }); } }; emitter.on("OPEN_USER_CARD", userCardHandler); emitter.on("OPEN_GROUP_CARD", openGroupCardWithData); emitter.on("OPEN_CHOOSE_MODAL", chooseModalHandler); emitter.on("OPEN_RTC_MODAL", callRtcHandler); IMSDK.on(CbEvents.OnRecvNewMessages, newMessageHandler); return () => { emitter.off("OPEN_USER_CARD", userCardHandler); emitter.off("OPEN_GROUP_CARD", openGroupCardWithData); emitter.off("OPEN_CHOOSE_MODAL", chooseModalHandler); emitter.off("OPEN_RTC_MODAL", callRtcHandler); IMSDK.off(CbEvents.OnRecvNewMessages, newMessageHandler); }; }, []); const actionClick = (idx: number) => { switch (idx) { case 0: case 1: setIsSearchGroup(Boolean(idx)); searchModalRef.current?.openOverlay(); break; case 2: setChooseModalState({ type: "CRATE_GROUP" }); chooseModalRef.current?.openOverlay(); break; case 3: break; default: break; } setActionVisible(false); }; const openUserCardWithData = useCallback((cardInfo: CardInfo) => { searchModalRef.current?.closeOverlay(); setUserCardState({ userID: cardInfo.userID, cardInfo }); userCardRef.current?.openOverlay(); }, []); const openGroupCardWithData = useCallback((group: GroupItem) => { searchModalRef.current?.closeOverlay(); setGroupCardData(group); groupCardRef.current?.openOverlay(); }, []); return (
{t("placeholder.search")}
} arrow={false} title={null} trigger="click" placement="bottom" open={actionVisible} onOpenChange={(vis) => setActionVisible(vis)} >
); }; export default TopSearchBar; const actionMenuList = [ { idx: 0, title: t("placeholder.addFriends"), icon: add_friend, }, { idx: 1, title: t("placeholder.addGroup"), icon: add_group, }, { idx: 2, title: t("placeholder.createGroup"), icon: create_group, }, ]; i18n.on("languageChanged", () => { actionMenuList[0].title = t("placeholder.addFriends"); actionMenuList[1].title = t("placeholder.addGroup"); actionMenuList[2].title = t("placeholder.createGroup"); }); const ActionPopContent = ({ actionClick }: { actionClick: (idx: number) => void }) => { return (
{actionMenuList.map((action) => (
actionClick?.(action.idx)} > call_video
{action.title}
))}
); };