crush-level-web/src/context/NimChat/index.tsx

95 lines
2.8 KiB
TypeScript
Raw Normal View History

2025-11-13 08:38:25 +00:00
"use client";
import { createContext, useEffect, useState } from "react";
import V2NIM from "nim-web-sdk-ng";
import { useCurrentUser } from "@/hooks/auth";
import { V2NIMLoginStatus } from "nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMLoginService";
import { NimLoginProvider } from "./NimLoginContext";
import { useGetIMAccount, useIMAccount } from "@/hooks/useIm";
import { ConversationProvider } from "./ConversationContext";
import { NimMsgProvider } from "./NimMsgContext";
import { NimUserProvider } from "./NimUserContext";
const nim = V2NIM.getInstance({
appkey: process.env.NEXT_PUBLIC_NIM_APP_KEY || "2d6abc076f434fc52320c7118de5fead",
debugLevel: 'error', // 设置日志 level
apiVersion: 'v2',
enableV2CloudConversation: true,
}, {
V2NIMLoginServiceConfig: {
lbsUrls: [
"https://lbs.netease.im/lbs/webconf"
],
linkUrl: "weblink01-sg.netease.im:443"
}
})
const NimChatContext = createContext<{
nim: V2NIM;
isNimLoggedIn: boolean;
nimLoginStatus: V2NIMLoginStatus | null;
}>({
nim: nim,
isNimLoggedIn: false,
nimLoginStatus: null,
});
export const NimChatProvider = ({ children }: { children: React.ReactNode }) => {
const [isNimLoggedIn, setIsNimLoggedIn] = useState(false);
const [nimLoginStatus, setNimLoginStatus] = useState<V2NIMLoginStatus | null>(null);
const [hasInitialized, setHasInitialized] = useState(false);
const { data: imAccount } = useGetIMAccount();
const { data: user } = useCurrentUser();
// 初始化和检查登录状态
useEffect(() => {
if (hasInitialized || !user || !imAccount) return;
const init = async () => {
// 只有在未登录状态下才执行登录
console.log('NIM 开始登录...');
await nim.V2NIMLoginService.login(imAccount.accountId, imAccount.token, {
retryCount: 5,
})
setIsNimLoggedIn(true);
setHasInitialized(true);
}
// 检查当前登录状态
const currentStatus = nim.V2NIMLoginService.getLoginStatus();
console.log('NIM 当前登录状态:', currentStatus);
setNimLoginStatus(currentStatus);
// 如果已经登录,更新状态
if (currentStatus === 1) {
console.log('NIM 已经登录,跳过重新登录');
setIsNimLoggedIn(true);
setHasInitialized(true);
return;
}
init();
}, [hasInitialized, user, imAccount])
return (
<NimUserProvider nim={nim}>
<ConversationProvider nim={nim}>
<NimMsgProvider nim={nim}>
<NimLoginProvider nim={nim}>
<NimChatContext.Provider value={{
nim,
isNimLoggedIn,
nimLoginStatus
}}>
{children}
</NimChatContext.Provider>
</NimLoginProvider>
</NimMsgProvider>
</ConversationProvider>
</NimUserProvider>
);
}
export default NimChatContext;