mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-05 03:12:34 -06:00
2801-есть десктоп-версия. реализован ws для авторизации через тг-бота
This commit is contained in:
33
rmser-view/src/hooks/usePlatform.ts
Normal file
33
rmser-view/src/hooks/usePlatform.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { useMemo } from 'react';
|
||||
|
||||
export type Platform = 'MobileApp' | 'Desktop' | 'MobileBrowser';
|
||||
|
||||
/**
|
||||
* Хук для определения текущей платформы
|
||||
* MobileApp - если есть специфические признаки мобильного приложения
|
||||
* Desktop - если это десктопный браузер
|
||||
* MobileBrowser - если это мобильный браузер
|
||||
*/
|
||||
export const usePlatform = (): Platform => {
|
||||
return useMemo(() => {
|
||||
const userAgent = navigator.userAgent;
|
||||
|
||||
// Проверка на мобильное приложение (специфические признаки)
|
||||
// Можно добавить дополнительные проверки для конкретных приложений
|
||||
const isMobileApp = /rmser-app|mobile-app|cordova|phonegap/i.test(userAgent);
|
||||
|
||||
if (isMobileApp) {
|
||||
return 'MobileApp';
|
||||
}
|
||||
|
||||
// Проверка на мобильный браузер
|
||||
const isMobileBrowser = /android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);
|
||||
|
||||
if (isMobileBrowser) {
|
||||
return 'MobileBrowser';
|
||||
}
|
||||
|
||||
// По умолчанию - десктоп
|
||||
return 'Desktop';
|
||||
}, []);
|
||||
};
|
||||
76
rmser-view/src/hooks/useWebSocket.ts
Normal file
76
rmser-view/src/hooks/useWebSocket.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { useEffect, useState, useRef } from 'react';
|
||||
|
||||
const apiUrl = import.meta.env.VITE_API_URL || '';
|
||||
|
||||
// Определяем базовый URL для WS (меняем http->ws, https->wss)
|
||||
const getWsUrl = () => {
|
||||
let baseUrl = apiUrl;
|
||||
if (baseUrl.startsWith('/')) {
|
||||
baseUrl = window.location.origin;
|
||||
} else if (!baseUrl) {
|
||||
baseUrl = 'http://localhost:8080';
|
||||
}
|
||||
|
||||
// Заменяем протокол
|
||||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||
const host = baseUrl.replace(/^http(s)?:\/\//, '');
|
||||
// Важно: путь /socket.io/ оставлен для совместимости с Nginx конфигом
|
||||
return `${protocol}//${host}/socket.io/`;
|
||||
};
|
||||
|
||||
interface WsEvent {
|
||||
event: string;
|
||||
data: unknown;
|
||||
}
|
||||
|
||||
export const useWebSocket = (sessionId: string | null) => {
|
||||
const [isConnected, setIsConnected] = useState(false);
|
||||
const [lastError, setLastError] = useState<string | null>(null);
|
||||
const [lastMessage, setLastMessage] = useState<WsEvent | null>(null);
|
||||
|
||||
const wsRef = useRef<WebSocket | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
if (!sessionId) return;
|
||||
|
||||
const url = `${getWsUrl()}?session_id=${sessionId}`;
|
||||
console.log('🔌 Connecting Native WS:', url);
|
||||
|
||||
const ws = new WebSocket(url);
|
||||
wsRef.current = ws;
|
||||
|
||||
ws.onopen = () => {
|
||||
console.log('✅ WS Connected');
|
||||
setIsConnected(true);
|
||||
setLastError(null);
|
||||
};
|
||||
|
||||
ws.onclose = (event) => {
|
||||
console.log('⚠️ WS Closed', event.code, event.reason);
|
||||
setIsConnected(false);
|
||||
};
|
||||
|
||||
ws.onerror = (error) => {
|
||||
console.error('❌ WS Error', error);
|
||||
setLastError('Connection error');
|
||||
setIsConnected(false);
|
||||
};
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
try {
|
||||
const parsed = JSON.parse(event.data);
|
||||
console.log('📨 WS Message:', parsed);
|
||||
setLastMessage(parsed);
|
||||
} catch {
|
||||
console.error('Failed to parse WS message', event.data);
|
||||
}
|
||||
};
|
||||
|
||||
return () => {
|
||||
console.log('🧹 WS Cleanup');
|
||||
ws.close();
|
||||
};
|
||||
}, [sessionId]);
|
||||
|
||||
return { isConnected, lastError, lastMessage };
|
||||
};
|
||||
Reference in New Issue
Block a user