This commit is contained in:
yj 2024-07-24 11:17:54 +08:00
parent e2a0427f57
commit 83c337e5c4
7 changed files with 59 additions and 20 deletions

View File

@ -10,10 +10,11 @@ import Meeting from '@/page/Meeting/index'
import NotFound from '@/page/NotFound/index' import NotFound from '@/page/NotFound/index'
import { storage } from '@/utils' import { storage } from '@/utils'
import { Spin } from "antd"; import { Spin } from "antd";
import { onInvitation } from "@/utils/package/signalr"; import { onInvitation, onInvoke, onReconnected } from "@/utils/package/signalr";
import JoinMeetingModal from "./components/JoinMeetingModal"; import JoinMeetingModal from "./components/JoinMeetingModal";
import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js';
import { PostLogin } from "@/api/Login"; import { PostLogin } from "@/api/Login";
import { startSignalr } from '@/utils/package/signalr';
const App: React.FC = () => { const App: React.FC = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@ -55,6 +56,7 @@ const App: React.FC = () => {
if (res.code === 200) { if (res.code === 200) {
storage.setItem('user', JSON.stringify(res.data)) storage.setItem('user', JSON.stringify(res.data))
toHome() toHome()
startSignalr()
} else { } else {
toLogin() toLogin()
} }
@ -101,6 +103,11 @@ const App: React.FC = () => {
} }
}) })
}, [navigate]) }, [navigate])
useEffect(() => {
onReconnected(async () => {
storage.setItem('reconnect', true)
})
}, [])
const handleResize = (): void => { const handleResize = (): void => {
setWindowSize({ setWindowSize({
width: window.innerWidth, width: window.innerWidth,

View File

@ -16,4 +16,3 @@ export const PostRefresh = (refreshToken: string) =>
url: `auth/refresh?refreshToken=${refreshToken}`, url: `auth/refresh?refreshToken=${refreshToken}`,
method: 'post', method: 'post',
}) })

View File

@ -6,7 +6,6 @@ import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn' import 'dayjs/locale/zh-cn'
import { storage } from '@/utils'; import { storage } from '@/utils';
import ImageUrl from '@/utils/package/imageUrl' import ImageUrl from '@/utils/package/imageUrl'
import { startSignalr } from '@/utils/package/signalr';
import Avatar from '@/components/Avatar'; import Avatar from '@/components/Avatar';
dayjs.locale('zh-cn'); dayjs.locale('zh-cn');
type navListType = { type navListType = {
@ -51,7 +50,6 @@ const Home: React.FC = () => {
useEffect(() => { useEffect(() => {
const user = JSON.parse(storage.getItem('user') as string); const user = JSON.parse(storage.getItem('user') as string);
setUserInfo(user) setUserInfo(user)
startSignalr(() => { })
const updateTime = () => { const updateTime = () => {
setDateInfo({ setDateInfo({
work: dayjs().format('ddd'), work: dayjs().format('ddd'),

View File

@ -7,6 +7,7 @@ import { storage } from '@/utils'
import { GetCheckUser, PostLogin } from '@/api/Login' import { GetCheckUser, PostLogin } from '@/api/Login'
import * as CryptoJS from 'crypto-js'; import * as CryptoJS from 'crypto-js';
import ImageUrl from '@/utils/package/imageUrl' import ImageUrl from '@/utils/package/imageUrl'
import { startSignalr } from '@/utils/package/signalr';
const Login: React.FC = () => { const Login: React.FC = () => {
const navigate = useNavigate(); const navigate = useNavigate();
const [accountPasswordStatus, setAccountPasswordStatus] = useState<boolean>(false); const [accountPasswordStatus, setAccountPasswordStatus] = useState<boolean>(false);
@ -130,6 +131,7 @@ const Login: React.FC = () => {
} catch { } catch {
} }
startSignalr()
navigate('/home') navigate('/home')
} }
}) })

View File

@ -12,7 +12,7 @@ import { GetRoomFile, PostRoomFile, DeleteRoomFile, GetRoomUpFileurl, GetRoomFil
import axios from 'axios'; import axios from 'axios';
import ImageUrl from '@/utils/package/imageUrl' import ImageUrl from '@/utils/package/imageUrl'
import agora from '@/utils/package/agora' import agora from '@/utils/package/agora'
import { onInvoke, onSignalr, offSignalr, startSignalr } from '@/utils/package/signalr'; import { onInvoke, onSignalr, offSignalr, onStart } from '@/utils/package/signalr';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import durationPlugin from 'dayjs/plugin/duration'; import durationPlugin from 'dayjs/plugin/duration';
import { VideoSourceType } from 'agora-electron-sdk'; import { VideoSourceType } from 'agora-electron-sdk';
@ -249,14 +249,16 @@ const Meeting: React.FC = () => {
const handleNetworkChange = (): void => { const handleNetworkChange = (): void => {
if (navigator.onLine) { if (navigator.onLine) {
message.success('网络已恢复。') message.success('网络已恢复。')
startSignalr(async () => { setTimeout(async () => {
await onInvoke('joinChannel', { await onStart(async () => {
roomNum: state.channelId, await onInvoke('joinChannel', {
enableMicr: true, roomNum: state.channelId,
enableCamera: true enableMicr: true,
enableCamera: true
})
await getRoomUser()
}) })
await getRoomUser() }, 1000)
})
} else { } else {
message.error('网络已断开!') message.error('网络已断开!')
} }
@ -451,6 +453,17 @@ const Meeting: React.FC = () => {
case 'meetingMode': case 'meetingMode':
setMeetingMode(e.value) setMeetingMode(e.value)
break; break;
case 'reconnect':
if (e.value == true) {
storage.setItem('reconnect', false)
await onInvoke('joinChannel', {
roomNum: state.channelId,
enableMicr: true,
enableCamera: true
})
await getRoomUser()
}
break;
} }
}; };
// 聊天发送 // 聊天发送

View File

@ -1,7 +1,7 @@
import * as signalR from '@microsoft/signalr'; import * as signalR from '@microsoft/signalr';
import storage from './storage'; import storage from './storage';
let connection = null as any; let connection = '' as any;
export const startSignalr = async (callBack: Function) => { export const startSignalr = async () => {
const user = await JSON.parse(storage.getItem('user') as string); const user = await JSON.parse(storage.getItem('user') as string);
connection = new signalR.HubConnectionBuilder().withAutomaticReconnect() connection = new signalR.HubConnectionBuilder().withAutomaticReconnect()
.withUrl(`${import.meta.env.VITE_BASE_URL_API}/session-manage`, { .withUrl(`${import.meta.env.VITE_BASE_URL_API}/session-manage`, {
@ -10,12 +10,32 @@ export const startSignalr = async (callBack: Function) => {
accessTokenFactory: () => user.token accessTokenFactory: () => user.token
}) })
.build(); .build();
onStart()
connection.start() connection.onclose(async () => {
.then(() => callBack()) await onStart()
.catch((err: any) => setTimeout(() => startSignalr(() => { }), 5000)); });
} }
export const onStart = async (callBack?: Function) => {
if (connection.state !== signalR.HubConnectionState.Connected) {
try {
await connection.start();
if (callBack) {
callBack()
}
} catch (err) {
console.log(err);
setTimeout(onStart, 5000);
}
}
}
export const onReconnected = async (callBack: Function) => {
if (connection) {
connection.onreconnected(async (newConnectionId: any) => {
callBack()
});
}
}
export const onInvitation = (callBack: Function) => { export const onInvitation = (callBack: Function) => {
if (connection) { if (connection) {
connection.on("Invitation", (roomNum: string, roomName: string, InviterName: string) => { connection.on("Invitation", (roomNum: string, roomName: string, InviterName: string) => {

View File

@ -1,6 +1,6 @@
import axios, { AxiosInstance, AxiosResponse } from 'axios' import axios, { AxiosInstance, AxiosResponse } from 'axios'
import { RequestConfig, RequestInterceptors } from './types' import { RequestConfig, RequestInterceptors } from './types'
import { request, storage } from '@/utils' import { storage } from '@/utils'
import { constant } from '@/config' import { constant } from '@/config'
import { message } from 'antd'; import { message } from 'antd';
import { PostRefresh } from '@/api/Login'; import { PostRefresh } from '@/api/Login';