mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
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:
@@ -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)),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user