Merge pull request #151 from BEDOLAGA-DEV/feat/auto-skip-single-server

feat(subscription): auto-skip server selection when only one available
This commit is contained in:
Egor
2026-02-05 07:34:12 +03:00
committed by GitHub

View File

@@ -175,16 +175,28 @@ export default function Subscription() {
const tariffs = const tariffs =
isTariffsMode && purchaseOptions && 'tariffs' in purchaseOptions ? purchaseOptions.tariffs : []; isTariffsMode && purchaseOptions && 'tariffs' in purchaseOptions ? purchaseOptions.tariffs : [];
// Get truly available servers for a given period (same filter as rendering)
const getAvailableServers = useCallback(
(period: PeriodOption | null) => {
if (!period?.servers.options) return [];
return period.servers.options.filter((server) => {
if (!server.is_available) return false;
if (subscription?.is_trial && server.name.toLowerCase().includes('trial')) return false;
return true;
});
},
[subscription?.is_trial],
);
// Determine which steps are needed // Determine which steps are needed
const steps = useMemo<PurchaseStep[]>(() => { const steps = useMemo<PurchaseStep[]>(() => {
const result: PurchaseStep[] = ['period']; const result: PurchaseStep[] = ['period'];
if (selectedPeriod?.traffic.selectable && (selectedPeriod.traffic.options?.length ?? 0) > 0) { if (selectedPeriod?.traffic.selectable && (selectedPeriod.traffic.options?.length ?? 0) > 0) {
result.push('traffic'); result.push('traffic');
} }
if ( const availableServers = getAvailableServers(selectedPeriod);
selectedPeriod && // Skip server selection step if only 1 server available (auto-select it)
(selectedPeriod.servers.options?.filter((s) => s.is_available).length ?? 0) > 0 if (availableServers.length > 1) {
) {
result.push('servers'); result.push('servers');
} }
if (selectedPeriod && selectedPeriod.devices.max > selectedPeriod.devices.min) { if (selectedPeriod && selectedPeriod.devices.max > selectedPeriod.devices.min) {
@@ -192,7 +204,7 @@ export default function Subscription() {
} }
result.push('confirm'); result.push('confirm');
return result; return result;
}, [selectedPeriod]); }, [selectedPeriod, getAvailableServers]);
const currentStepIndex = steps.indexOf(currentStep); const currentStepIndex = steps.indexOf(currentStep);
const isFirstStep = currentStepIndex === 0; const isFirstStep = currentStepIndex === 0;
@@ -206,15 +218,19 @@ export default function Subscription() {
classicOptions.periods[0]; classicOptions.periods[0];
setSelectedPeriod(defaultPeriod); setSelectedPeriod(defaultPeriod);
setSelectedTraffic(classicOptions.selection.traffic_value); setSelectedTraffic(classicOptions.selection.traffic_value);
const availableServerUuids = new Set( const availableServers = getAvailableServers(defaultPeriod);
defaultPeriod.servers.options?.filter((s) => s.is_available).map((s) => s.uuid) ?? [], const availableServerUuids = new Set(availableServers.map((s) => s.uuid));
); // If only 1 server available, auto-select it (step will be skipped)
setSelectedServers( if (availableServers.length === 1) {
classicOptions.selection.servers.filter((uuid) => availableServerUuids.has(uuid)), setSelectedServers([availableServers[0].uuid]);
); } else {
setSelectedServers(
classicOptions.selection.servers.filter((uuid) => availableServerUuids.has(uuid)),
);
}
setSelectedDevices(classicOptions.selection.devices); setSelectedDevices(classicOptions.selection.devices);
} }
}, [classicOptions, selectedPeriod]); }, [classicOptions, selectedPeriod, getAvailableServers]);
// Build selection object // Build selection object
const currentSelection: PurchaseSelection = useMemo( const currentSelection: PurchaseSelection = useMemo(
@@ -3193,12 +3209,12 @@ export default function Subscription() {
if (period.traffic.current !== undefined) { if (period.traffic.current !== undefined) {
setSelectedTraffic(period.traffic.current); setSelectedTraffic(period.traffic.current);
} }
if (period.servers.selected) { const availableServers = getAvailableServers(period);
const availUuids = new Set( // If only 1 server available, auto-select it (step will be skipped)
period.servers.options if (availableServers.length === 1) {
?.filter((s) => s.is_available) setSelectedServers([availableServers[0].uuid]);
.map((s) => s.uuid) ?? [], } else if (period.servers.selected) {
); const availUuids = new Set(availableServers.map((s) => s.uuid));
setSelectedServers( setSelectedServers(
period.servers.selected.filter((uuid) => availUuids.has(uuid)), period.servers.selected.filter((uuid) => availUuids.has(uuid)),
); );