import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/enum/enum.dart'; import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'models.dart'; part 'generated/config.freezed.dart'; part 'generated/config.g.dart'; const defaultBypassDomain = [ '*zhihu.com', '*zhimg.com', '*jd.com', '100ime-iat-api.xfyun.cn', '*360buyimg.com', 'localhost', '*.local', '127.*', '10.*', '172.16.*', '172.17.*', '172.18.*', '172.19.*', '172.2*', '172.30.*', '172.31.*', '192.168.*', ]; const defaultAppSettingProps = AppSettingProps(); const defaultVpnProps = VpnProps(); const defaultNetworkProps = NetworkProps(); const defaultProxiesStyle = ProxiesStyle(); const defaultWindowProps = WindowProps(); const defaultAccessControl = AccessControl(); final defaultThemeProps = ThemeProps(primaryColor: defaultPrimaryColor); const List defaultDashboardWidgets = [ DashboardWidget.networkSpeed, DashboardWidget.systemProxyButton, DashboardWidget.tunButton, DashboardWidget.outboundMode, DashboardWidget.networkDetection, DashboardWidget.trafficUsage, DashboardWidget.intranetIp, ]; List dashboardWidgetsSafeFormJson( List? dashboardWidgets, ) { try { return dashboardWidgets ?.map((e) => $enumDecode(_$DashboardWidgetEnumMap, e)) .toList() ?? defaultDashboardWidgets; } catch (_) { return defaultDashboardWidgets; } } @freezed abstract class AppSettingProps with _$AppSettingProps { const factory AppSettingProps({ String? locale, @Default(defaultDashboardWidgets) @JsonKey(fromJson: dashboardWidgetsSafeFormJson) List dashboardWidgets, @Default(false) bool onlyStatisticsProxy, @Default(false) bool autoLaunch, @Default(false) bool silentLaunch, @Default(false) bool autoRun, @Default(false) bool openLogs, @Default(true) bool closeConnections, @Default(defaultTestUrl) String testUrl, @Default(true) bool isAnimateToPage, @Default(true) bool autoCheckUpdate, @Default(false) bool showLabel, @Default(false) bool disclaimerAccepted, @Default(false) bool crashlyticsTip, @Default(false) bool crashlytics, @Default(true) bool minimizeOnExit, @Default(false) bool hidden, @Default(false) bool developerMode, @Default(RecoveryStrategy.compatible) RecoveryStrategy recoveryStrategy, @Default(true) bool showTrayTitle, }) = _AppSettingProps; factory AppSettingProps.fromJson(Map json) => _$AppSettingPropsFromJson(json); factory AppSettingProps.safeFromJson(Map? json) { return json == null ? defaultAppSettingProps : AppSettingProps.fromJson(json); } } @freezed abstract class AccessControl with _$AccessControl { const factory AccessControl({ @Default(false) bool enable, @Default(AccessControlMode.rejectSelected) AccessControlMode mode, @Default([]) List acceptList, @Default([]) List rejectList, @Default(AccessSortType.none) AccessSortType sort, @Default(true) bool isFilterSystemApp, @Default(true) bool isFilterNonInternetApp, }) = _AccessControl; factory AccessControl.fromJson(Map json) => _$AccessControlFromJson(json); } extension AccessControlExt on AccessControl { List get currentList => switch (mode) { AccessControlMode.acceptSelected => acceptList, AccessControlMode.rejectSelected => rejectList, }; AccessControl copyWithNewList(List value) => switch (mode) { AccessControlMode.acceptSelected => copyWith(acceptList: value), AccessControlMode.rejectSelected => copyWith(rejectList: value), }; } @freezed abstract class WindowProps with _$WindowProps { const factory WindowProps({ @Default(0) double width, @Default(0) double height, double? top, double? left, }) = _WindowProps; factory WindowProps.fromJson(Map? json) => json == null ? const WindowProps() : _$WindowPropsFromJson(json); } extension WindowPropsExt on WindowProps { Size get _size => Size(width, height); Size get size => _size.isEmpty ? Size(680, 580) : _size; } @freezed abstract class VpnProps with _$VpnProps { const factory VpnProps({ @Default(true) bool enable, @Default(true) bool systemProxy, @Default(false) bool ipv6, @Default(true) bool allowBypass, @Default(false) bool dnsHijacking, @Default(defaultAccessControl) AccessControl accessControl, }) = _VpnProps; factory VpnProps.fromJson(Map? json) => json == null ? defaultVpnProps : _$VpnPropsFromJson(json); } @freezed abstract class NetworkProps with _$NetworkProps { const factory NetworkProps({ @Default(true) bool systemProxy, @Default(defaultBypassDomain) List bypassDomain, @Default(RouteMode.config) RouteMode routeMode, @Default(true) bool autoSetSystemDns, @Default(false) bool appendSystemDns, }) = _NetworkProps; factory NetworkProps.fromJson(Map? json) => json == null ? const NetworkProps() : _$NetworkPropsFromJson(json); } @freezed abstract class ProxiesStyle with _$ProxiesStyle { const factory ProxiesStyle({ @Default(ProxiesType.tab) ProxiesType type, @Default(ProxiesSortType.none) ProxiesSortType sortType, @Default(ProxiesLayout.standard) ProxiesLayout layout, @Default(ProxiesIconStyle.standard) ProxiesIconStyle iconStyle, @Default(ProxyCardType.expand) ProxyCardType cardType, }) = _ProxiesStyle; factory ProxiesStyle.fromJson(Map? json) => json == null ? defaultProxiesStyle : _$ProxiesStyleFromJson(json); } @freezed abstract class TextScale with _$TextScale { const factory TextScale({ @Default(false) bool enable, @Default(1.0) double scale, }) = _TextScale; factory TextScale.fromJson(Map json) => _$TextScaleFromJson(json); } @freezed abstract class ThemeProps with _$ThemeProps { const factory ThemeProps({ int? primaryColor, @Default(defaultPrimaryColors) List primaryColors, @Default(ThemeMode.dark) ThemeMode themeMode, @Default(DynamicSchemeVariant.content) DynamicSchemeVariant schemeVariant, @Default(false) bool pureBlack, @Default(TextScale()) TextScale textScale, }) = _ThemeProps; factory ThemeProps.fromJson(Map json) => _$ThemePropsFromJson(json); factory ThemeProps.safeFromJson(Map? json) { if (json == null) { return defaultThemeProps; } try { return ThemeProps.fromJson(json); } catch (_) { return defaultThemeProps; } } } @freezed abstract class ScriptProps with _$ScriptProps { const factory ScriptProps({ String? currentId, @Default([]) List