123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- 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<OverlayVisibleHandle>(null);
- const groupCardRef = useRef<OverlayVisibleHandle>(null);
- const chooseModalRef = useRef<OverlayVisibleHandle>(null);
- const searchModalRef = useRef<OverlayVisibleHandle>(null);
- const rtcRef = useRef<OverlayVisibleHandle>(null);
- const [chooseModalState, setChooseModalState] = useState<ChooseModalState>({
- type: "CRATE_GROUP",
- });
- const [userCardState, setUserCardState] = useState<UserCardState>();
- const [groupCardData, setGroupCardData] = useState<GroupItem>();
- const [actionVisible, setActionVisible] = useState(false);
- const [isSearchGroup, setIsSearchGroup] = useState(false);
- const [inviteData, setInviteData] = useState<InviteData>({} 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<MessageItem[]>) => {
- 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 (
- <div className="no-mobile app-drag flex h-10 min-h-[40px] items-center bg-[var(--top-search-bar)] dark:bg-[#141414]">
- <div className="flex w-full items-center justify-center">
- <div className="app-no-drag flex h-[26px] w-1/3 cursor-pointer items-center justify-center rounded-md bg-[rgba(255,255,255,0.2)]">
- <img width={16} src={search} alt="" />
- <span className="ml-2 text-[#D2E3F8]">{t("placeholder.search")}</span>
- </div>
- <Popover
- content={<ActionPopContent actionClick={actionClick} />}
- arrow={false}
- title={null}
- trigger="click"
- placement="bottom"
- open={actionVisible}
- onOpenChange={(vis) => setActionVisible(vis)}
- >
- <img
- className="app-no-drag ml-8 cursor-pointer"
- width={20}
- src={show_more}
- alt=""
- />
- </Popover>
- </div>
- <WindowControlBar />
- <UserCardModal ref={userCardRef} {...userCardState} />
- <GroupCardModal ref={groupCardRef} groupData={groupCardData} />
- <ChooseModal ref={chooseModalRef} state={chooseModalState} />
- <SearchUserOrGroup
- ref={searchModalRef}
- isSearchGroup={isSearchGroup}
- openUserCardWithData={openUserCardWithData}
- openGroupCardWithData={openGroupCardWithData}
- />
- <RtcCallModal inviteData={inviteData} ref={rtcRef} />
- </div>
- );
- };
- 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 (
- <div className="p-1">
- {actionMenuList.map((action) => (
- <div
- className="flex cursor-pointer items-center rounded px-3 py-2 text-xs hover:bg-[var(--primary-active)]"
- key={action.idx}
- onClick={() => actionClick?.(action.idx)}
- >
- <img width={20} src={action.icon} alt="call_video" />
- <div className="ml-3">{action.title}</div>
- </div>
- ))}
- </div>
- );
- };
|