mirror of
https://github.com/MatrixSeven/file-transfer-go.git
synced 2026-02-04 03:25:03 +08:00
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import { useCallback } from 'react';
|
|
import { useWebRTCStore } from '../ui/webRTCStore';
|
|
|
|
// 基础连接状态
|
|
export interface WebRTCState {
|
|
isConnected: boolean;
|
|
isConnecting: boolean;
|
|
isWebSocketConnected: boolean;
|
|
isPeerConnected: boolean;
|
|
error: string | null;
|
|
canRetry: boolean;
|
|
}
|
|
|
|
/**
|
|
* WebRTC 状态管理器
|
|
* 负责连接状态的统一管理
|
|
*/
|
|
export interface WebRTCStateManager {
|
|
// 获取当前状态
|
|
getState: () => WebRTCState;
|
|
|
|
// 更新状态
|
|
updateState: (updates: Partial<WebRTCState>) => void;
|
|
|
|
// 设置当前房间
|
|
setCurrentRoom: (room: { code: string; role: 'sender' | 'receiver' } | null) => void;
|
|
|
|
// 重置到初始状态
|
|
resetToInitial: () => void;
|
|
|
|
// 检查是否已连接到指定房间
|
|
isConnectedToRoom: (roomCode: string, role: 'sender' | 'receiver') => boolean;
|
|
}
|
|
|
|
/**
|
|
* WebRTC 状态管理 Hook
|
|
* 封装对 webRTCStore 的操作,提供状态更新和查询的统一接口
|
|
*/
|
|
export function useWebRTCStateManager(): WebRTCStateManager {
|
|
const webrtcStore = useWebRTCStore();
|
|
|
|
const getState = useCallback((): WebRTCState => {
|
|
return {
|
|
isConnected: webrtcStore.isConnected,
|
|
isConnecting: webrtcStore.isConnecting,
|
|
isWebSocketConnected: webrtcStore.isWebSocketConnected,
|
|
isPeerConnected: webrtcStore.isPeerConnected,
|
|
error: webrtcStore.error,
|
|
canRetry: webrtcStore.canRetry,
|
|
};
|
|
}, [webrtcStore]);
|
|
|
|
const updateState = useCallback((updates: Partial<WebRTCState>) => {
|
|
webrtcStore.updateState(updates);
|
|
}, [webrtcStore]);
|
|
|
|
const setCurrentRoom = useCallback((room: { code: string; role: 'sender' | 'receiver' } | null) => {
|
|
webrtcStore.setCurrentRoom(room);
|
|
}, [webrtcStore]);
|
|
|
|
const resetToInitial = useCallback(() => {
|
|
webrtcStore.resetToInitial();
|
|
}, [webrtcStore]);
|
|
|
|
const isConnectedToRoom = useCallback((roomCode: string, role: 'sender' | 'receiver') => {
|
|
return webrtcStore.currentRoom?.code === roomCode &&
|
|
webrtcStore.currentRoom?.role === role &&
|
|
webrtcStore.isConnected;
|
|
}, [webrtcStore]);
|
|
|
|
return {
|
|
getState,
|
|
updateState,
|
|
setCurrentRoom,
|
|
resetToInitial,
|
|
isConnectedToRoom,
|
|
};
|
|
} |