2025-12-16 11:23:09 +08:00
|
|
|
import 'package:fl_clash/common/common.dart';
|
2025-07-31 17:09:18 +08:00
|
|
|
import 'package:fl_clash/enum/enum.dart';
|
|
|
|
|
import 'package:fl_clash/models/models.dart';
|
|
|
|
|
|
|
|
|
|
List<Group> computeSort({
|
|
|
|
|
required List<Group> groups,
|
|
|
|
|
required ProxiesSortType sortType,
|
|
|
|
|
required DelayMap delayMap,
|
2025-10-14 15:13:52 +08:00
|
|
|
required Map<String, String> selectedMap,
|
2025-07-31 17:09:18 +08:00
|
|
|
required String defaultTestUrl,
|
|
|
|
|
}) {
|
2025-12-16 11:23:09 +08:00
|
|
|
List<Proxy> sortOfDelay({
|
|
|
|
|
required List<Group> groups,
|
|
|
|
|
required List<Proxy> proxies,
|
|
|
|
|
required DelayMap delayMap,
|
|
|
|
|
required Map<String, String> selectedMap,
|
|
|
|
|
required String testUrl,
|
|
|
|
|
}) {
|
|
|
|
|
return List.from(proxies)..sort((a, b) {
|
|
|
|
|
final aDelayState = computeProxyDelayState(
|
|
|
|
|
proxyName: a.name,
|
|
|
|
|
testUrl: testUrl,
|
|
|
|
|
groups: groups,
|
|
|
|
|
selectedMap: selectedMap,
|
|
|
|
|
delayMap: delayMap,
|
|
|
|
|
);
|
|
|
|
|
final bDelayState = computeProxyDelayState(
|
|
|
|
|
proxyName: b.name,
|
|
|
|
|
testUrl: testUrl,
|
|
|
|
|
groups: groups,
|
|
|
|
|
selectedMap: selectedMap,
|
|
|
|
|
delayMap: delayMap,
|
|
|
|
|
);
|
|
|
|
|
return aDelayState.compareTo(bDelayState);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<Proxy> sortOfName(List<Proxy> proxies) {
|
|
|
|
|
return List.of(proxies)..sort((a, b) => a.name.compareTo(b.name));
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-31 17:09:18 +08:00
|
|
|
return groups.map((group) {
|
|
|
|
|
final proxies = group.all;
|
|
|
|
|
final newProxies = switch (sortType) {
|
|
|
|
|
ProxiesSortType.none => proxies,
|
2025-12-16 11:23:09 +08:00
|
|
|
ProxiesSortType.delay => sortOfDelay(
|
2025-07-31 17:09:18 +08:00
|
|
|
groups: groups,
|
|
|
|
|
proxies: proxies,
|
|
|
|
|
delayMap: delayMap,
|
|
|
|
|
selectedMap: selectedMap,
|
2025-12-16 11:23:09 +08:00
|
|
|
testUrl: group.testUrl.takeFirstValid([defaultTestUrl]),
|
2025-07-31 17:09:18 +08:00
|
|
|
),
|
2025-12-16 11:23:09 +08:00
|
|
|
ProxiesSortType.name => sortOfName(proxies),
|
2025-07-31 17:09:18 +08:00
|
|
|
};
|
|
|
|
|
return group.copyWith(all: newProxies);
|
|
|
|
|
}).toList();
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-16 11:23:09 +08:00
|
|
|
SelectedProxyState getRealSelectedProxyState(
|
2025-07-31 17:09:18 +08:00
|
|
|
SelectedProxyState state, {
|
|
|
|
|
required List<Group> groups,
|
2025-10-14 15:13:52 +08:00
|
|
|
required Map<String, String> selectedMap,
|
2025-07-31 17:09:18 +08:00
|
|
|
}) {
|
|
|
|
|
if (state.proxyName.isEmpty) return state;
|
|
|
|
|
final index = groups.indexWhere((element) => element.name == state.proxyName);
|
|
|
|
|
final newState = state.copyWith(group: true);
|
|
|
|
|
if (index == -1) return newState;
|
|
|
|
|
final group = groups[index];
|
|
|
|
|
final currentSelectedName = group.getCurrentSelectedName(
|
|
|
|
|
selectedMap[newState.proxyName] ?? '',
|
|
|
|
|
);
|
|
|
|
|
if (currentSelectedName.isEmpty) {
|
|
|
|
|
return newState;
|
|
|
|
|
}
|
2025-12-16 11:23:09 +08:00
|
|
|
return getRealSelectedProxyState(
|
2025-07-31 17:09:18 +08:00
|
|
|
newState.copyWith(proxyName: currentSelectedName, testUrl: group.testUrl),
|
|
|
|
|
groups: groups,
|
|
|
|
|
selectedMap: selectedMap,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-16 11:23:09 +08:00
|
|
|
SelectedProxyState computeRealSelectedProxyState(
|
|
|
|
|
String proxyName, {
|
2025-07-31 17:09:18 +08:00
|
|
|
required List<Group> groups,
|
2025-10-14 15:13:52 +08:00
|
|
|
required Map<String, String> selectedMap,
|
2025-07-31 17:09:18 +08:00
|
|
|
}) {
|
2025-12-16 11:23:09 +08:00
|
|
|
return getRealSelectedProxyState(
|
|
|
|
|
SelectedProxyState(proxyName: proxyName),
|
|
|
|
|
groups: groups,
|
|
|
|
|
selectedMap: selectedMap,
|
|
|
|
|
);
|
2025-07-31 17:09:18 +08:00
|
|
|
}
|
|
|
|
|
|
2025-12-16 11:23:09 +08:00
|
|
|
DelayState computeProxyDelayState({
|
|
|
|
|
required String proxyName,
|
|
|
|
|
required String testUrl,
|
|
|
|
|
required List<Group> groups,
|
|
|
|
|
required Map<String, String> selectedMap,
|
|
|
|
|
required DelayMap delayMap,
|
|
|
|
|
}) {
|
|
|
|
|
final state = computeRealSelectedProxyState(
|
|
|
|
|
proxyName,
|
|
|
|
|
groups: groups,
|
|
|
|
|
selectedMap: selectedMap,
|
|
|
|
|
);
|
|
|
|
|
final currentDelayMap =
|
|
|
|
|
delayMap[state.testUrl.takeFirstValid([testUrl])] ?? {};
|
|
|
|
|
final delay = currentDelayMap[state.proxyName];
|
|
|
|
|
return DelayState(delay: delay ?? 0, group: state.group);
|
2025-07-31 17:09:18 +08:00
|
|
|
}
|