mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-04 03:36:29 +08:00
139 lines
3.9 KiB
TypeScript
139 lines
3.9 KiB
TypeScript
import { useEffect, useState } from 'react';
|
||
import { useSettingsStore } from '@/stores/settingsStore';
|
||
import { api } from '@/services/api';
|
||
|
||
export interface ApiConfigStatus {
|
||
isConfigured: boolean;
|
||
isValidating: boolean;
|
||
isValid: boolean | null;
|
||
error: string | null;
|
||
needsConfiguration: boolean;
|
||
}
|
||
|
||
export const useApiConfig = () => {
|
||
const { apiBaseUrl, serverConfig, isLoadingServerConfig } = useSettingsStore();
|
||
const [validationState, setValidationState] = useState<{
|
||
isValidating: boolean;
|
||
isValid: boolean | null;
|
||
error: string | null;
|
||
}>({
|
||
isValidating: false,
|
||
isValid: null,
|
||
error: null,
|
||
});
|
||
|
||
const isConfigured = Boolean(apiBaseUrl && apiBaseUrl.trim());
|
||
const needsConfiguration = !isConfigured;
|
||
|
||
// Validate API configuration when it changes
|
||
useEffect(() => {
|
||
if (!isConfigured) {
|
||
setValidationState({
|
||
isValidating: false,
|
||
isValid: false,
|
||
error: null,
|
||
});
|
||
return;
|
||
}
|
||
|
||
const validateConfig = async () => {
|
||
setValidationState(prev => ({ ...prev, isValidating: true, error: null }));
|
||
|
||
try {
|
||
await api.getServerConfig();
|
||
setValidationState({
|
||
isValidating: false,
|
||
isValid: true,
|
||
error: null,
|
||
});
|
||
} catch (error) {
|
||
let errorMessage = '服务器连接失败';
|
||
|
||
if (error instanceof Error) {
|
||
switch (error.message) {
|
||
case 'API_URL_NOT_SET':
|
||
errorMessage = 'API地址未设置';
|
||
break;
|
||
case 'UNAUTHORIZED':
|
||
errorMessage = '服务器认证失败';
|
||
break;
|
||
default:
|
||
if (error.message.includes('Network')) {
|
||
errorMessage = '网络连接失败,请检查网络或服务器地址';
|
||
} else if (error.message.includes('timeout')) {
|
||
errorMessage = '连接超时,请检查服务器地址';
|
||
} else if (error.message.includes('404')) {
|
||
errorMessage = '服务器地址无效,请检查API路径';
|
||
} else if (error.message.includes('500')) {
|
||
errorMessage = '服务器内部错误';
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
setValidationState({
|
||
isValidating: false,
|
||
isValid: false,
|
||
error: errorMessage,
|
||
});
|
||
}
|
||
};
|
||
|
||
// Only validate if not already loading server config
|
||
if (!isLoadingServerConfig) {
|
||
validateConfig();
|
||
}
|
||
}, [apiBaseUrl, isConfigured, isLoadingServerConfig]);
|
||
|
||
// Reset validation when server config loading state changes
|
||
useEffect(() => {
|
||
if (isLoadingServerConfig) {
|
||
setValidationState(prev => ({ ...prev, isValidating: true, error: null }));
|
||
}
|
||
}, [isLoadingServerConfig]);
|
||
|
||
// Update validation state based on server config
|
||
useEffect(() => {
|
||
if (!isLoadingServerConfig && isConfigured) {
|
||
if (serverConfig) {
|
||
setValidationState(prev => ({ ...prev, isValid: true, error: null }));
|
||
} else {
|
||
setValidationState(prev => ({
|
||
...prev,
|
||
isValid: false,
|
||
error: prev.error || '无法获取服务器配置'
|
||
}));
|
||
}
|
||
}
|
||
}, [serverConfig, isLoadingServerConfig, isConfigured]);
|
||
|
||
const status: ApiConfigStatus = {
|
||
isConfigured,
|
||
isValidating: validationState.isValidating || isLoadingServerConfig,
|
||
isValid: validationState.isValid,
|
||
error: validationState.error,
|
||
needsConfiguration,
|
||
};
|
||
|
||
return status;
|
||
};
|
||
|
||
export const getApiConfigErrorMessage = (status: ApiConfigStatus): string => {
|
||
if (status.needsConfiguration) {
|
||
return '请点击右上角设置按钮,配置您的服务器地址';
|
||
}
|
||
|
||
if (status.error) {
|
||
return status.error;
|
||
}
|
||
|
||
if (status.isValidating) {
|
||
return '正在验证服务器配置...';
|
||
}
|
||
|
||
if (status.isValid === false) {
|
||
return '服务器配置验证失败,请检查设置';
|
||
}
|
||
|
||
return '加载失败,请重试';
|
||
}; |