Support core status check and force restart Optimize proxies page and access page Update flutter and pub dependencies Update go version Optimize more details
111 lines
3.0 KiB
Dart
111 lines
3.0 KiB
Dart
import 'package:fl_clash/enum/enum.dart';
|
|
import 'package:fl_clash/models/models.dart';
|
|
|
|
import 'string.dart';
|
|
|
|
List<Group> computeSort({
|
|
required List<Group> groups,
|
|
required ProxiesSortType sortType,
|
|
required DelayMap delayMap,
|
|
required SelectedMap selectedMap,
|
|
required String defaultTestUrl,
|
|
}) {
|
|
return groups.map((group) {
|
|
final proxies = group.all;
|
|
final newProxies = switch (sortType) {
|
|
ProxiesSortType.none => proxies,
|
|
ProxiesSortType.delay => _sortOfDelay(
|
|
groups: groups,
|
|
proxies: proxies,
|
|
delayMap: delayMap,
|
|
selectedMap: selectedMap,
|
|
testUrl: group.testUrl.getSafeValue(defaultTestUrl),
|
|
),
|
|
ProxiesSortType.name => _sortOfName(proxies),
|
|
};
|
|
return group.copyWith(all: newProxies);
|
|
}).toList();
|
|
}
|
|
|
|
DelayState computeProxyDelayState({
|
|
required String proxyName,
|
|
required String testUrl,
|
|
required List<Group> groups,
|
|
required SelectedMap selectedMap,
|
|
required DelayMap delayMap,
|
|
}) {
|
|
final state = computeRealSelectedProxyState(
|
|
proxyName,
|
|
groups: groups,
|
|
selectedMap: selectedMap,
|
|
);
|
|
final currentDelayMap = delayMap[state.testUrl.getSafeValue(testUrl)] ?? {};
|
|
final delay = currentDelayMap[state.proxyName];
|
|
return DelayState(delay: delay ?? 0, group: state.group);
|
|
}
|
|
|
|
SelectedProxyState computeRealSelectedProxyState(
|
|
String proxyName, {
|
|
required List<Group> groups,
|
|
required SelectedMap selectedMap,
|
|
}) {
|
|
return _getRealSelectedProxyState(
|
|
SelectedProxyState(proxyName: proxyName),
|
|
groups: groups,
|
|
selectedMap: selectedMap,
|
|
);
|
|
}
|
|
|
|
SelectedProxyState _getRealSelectedProxyState(
|
|
SelectedProxyState state, {
|
|
required List<Group> groups,
|
|
required SelectedMap selectedMap,
|
|
}) {
|
|
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;
|
|
}
|
|
return _getRealSelectedProxyState(
|
|
newState.copyWith(proxyName: currentSelectedName, testUrl: group.testUrl),
|
|
groups: groups,
|
|
selectedMap: selectedMap,
|
|
);
|
|
}
|
|
|
|
List<Proxy> _sortOfDelay({
|
|
required List<Group> groups,
|
|
required List<Proxy> proxies,
|
|
required DelayMap delayMap,
|
|
required SelectedMap 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));
|
|
}
|