Files
popa-launcher/src/renderer/hooks/useAuth.ts
2025-12-20 17:45:16 +05:00

103 lines
2.7 KiB
TypeScript

import { useState } from 'react';
import {
authenticate,
validateToken,
refreshToken,
type AuthSession,
} from '../api';
export default function useAuth() {
const [status, setStatus] = useState<
'idle' | 'validating' | 'refreshing' | 'authenticating' | 'error'
>('idle');
// Аутентификация (HTTP напрямую, без IPC!)
const authenticateUser = async (
username: string,
password: string,
saveConfigFunc: (config: any) => void,
): Promise<AuthSession | null> => {
try {
setStatus('authenticating');
// Прямой HTTP-запрос к вашему серверу
const session = await authenticate(username, password);
await applySession(session, saveConfigFunc);
return session;
} catch (error) {
console.error('Ошибка при аутентификации:', error);
setStatus('error');
throw error;
}
};
const applySession = async (
session: AuthSession,
saveConfigFunc: (config: any) => void,
) => {
saveConfigFunc({
username: session.selectedProfile.name,
uuid: session.selectedProfile.id,
accessToken: session.accessToken,
clientToken: session.clientToken,
memory: 4096,
});
await window.electron.ipcRenderer.invoke('auth-changed', {
isAuthed: true,
minecraftSession: session,
});
};
// Валидация токена (HTTP напрямую)
const validateSession = async (accessToken: string): Promise<boolean> => {
try {
setStatus('validating');
// Получаем clientToken из localStorage
const savedConfig = localStorage.getItem('launcher_config');
if (!savedConfig) return false;
const config = JSON.parse(savedConfig);
// Прямой HTTP-запрос на валидацию
const isValid = await validateToken(accessToken, config.clientToken);
setStatus('idle');
return isValid;
} catch (error) {
console.error('Ошибка при валидации токена:', error);
setStatus('error');
return false;
}
};
// Обновление токена (HTTP напрямую)
const refreshSession = async (
accessToken: string,
clientToken: string,
): Promise<AuthSession | null> => {
try {
setStatus('refreshing');
// Прямой HTTP-запрос на обновление
const session = await refreshToken(accessToken, clientToken);
setStatus('idle');
return session;
} catch (error) {
console.error('Ошибка при обновлении токена:', error);
setStatus('error');
throw error;
}
};
return {
status,
authenticateUser,
validateSession,
refreshSession,
applySession,
};
}