Refactor VPN proxy routing logic

This commit is contained in:
2026-07-08 09:39:24 +03:00
parent 288acbf0c8
commit 149bb999dc
28 changed files with 2260 additions and 278 deletions

View File

@@ -0,0 +1,83 @@
export type RouteMode = 'external' | 'local-singbox';
export interface ApplyReadinessInput {
routeMode: RouteMode;
appCount: number;
proxiFyreInstalled: boolean;
singBoxInstalled: boolean;
selectedServerTag?: string;
externalProxyValue: string;
externalProxyError?: string | null;
busy: boolean;
}
export interface ApplyReadiness {
ready: boolean;
title?: string;
text?: string;
}
export function getApplyReadiness(input: ApplyReadinessInput): ApplyReadiness {
if (input.busy) {
return {
ready: false,
title: 'Операция уже выполняется',
text: 'Дождись завершения текущего действия перед повторным применением.',
};
}
if (!input.proxiFyreInstalled) {
return {
ready: false,
title: 'ProxiFyre не установлен',
text: 'Установи ProxiFyre, чтобы маршрутизировать выбранные приложения.',
};
}
if (input.appCount < 1) {
return {
ready: false,
title: 'Нет приложений',
text: 'Добавь хотя бы один процесс, EXE-файл или папку.',
};
}
if (input.routeMode === 'external') {
if (!input.externalProxyValue.trim()) {
return {
ready: false,
title: 'Прокси не указан',
text: 'Введи адрес SOCKS5 прокси в формате host:port или socks5://host:port.',
};
}
if (input.externalProxyError) {
return {
ready: false,
title: 'Проверь формат прокси',
text: input.externalProxyError,
};
}
}
if (input.routeMode === 'local-singbox') {
if (!input.singBoxInstalled) {
return {
ready: false,
title: 'Local sing-box не установлен',
text: 'Установи Local sing-box, чтобы применить локальный маршрут.',
};
}
if (!input.selectedServerTag) {
return {
ready: false,
title: 'Сервер не выбран',
text: 'Выбери сервер Local sing-box перед применением маршрута.',
};
}
}
return { ready: true };
}