103 lines
2.7 KiB
TypeScript
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,
|
|
};
|
|
}
|