Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Proxy Configuration #544

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
17 changes: 14 additions & 3 deletions lib/models/settings_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class SettingsModel {
this.historyRetentionPeriod = HistoryRetentionPeriod.oneWeek,
this.workspaceFolderPath,
this.isSSLDisabled = false,
this.proxySettings = const ProxySettings(),
});

final bool isDark;
Expand All @@ -32,6 +33,9 @@ class SettingsModel {
final String? workspaceFolderPath;
final bool isSSLDisabled;

// Proxy settings
final ProxySettings proxySettings;

SettingsModel copyWith({
bool? isDark,
bool? alwaysShowCollectionPaneScrollbar,
Expand All @@ -45,22 +49,24 @@ class SettingsModel {
HistoryRetentionPeriod? historyRetentionPeriod,
String? workspaceFolderPath,
bool? isSSLDisabled,
ProxySettings? proxySettings,
}) {
return SettingsModel(
isDark: isDark ?? this.isDark,
alwaysShowCollectionPaneScrollbar: alwaysShowCollectionPaneScrollbar ??
this.alwaysShowCollectionPaneScrollbar,
size: size ?? this.size,
offset: offset ?? this.offset,
defaultUriScheme: defaultUriScheme ?? this.defaultUriScheme,
defaultCodeGenLang: defaultCodeGenLang ?? this.defaultCodeGenLang,
offset: offset ?? this.offset,
saveResponses: saveResponses ?? this.saveResponses,
promptBeforeClosing: promptBeforeClosing ?? this.promptBeforeClosing,
activeEnvironmentId: activeEnvironmentId ?? this.activeEnvironmentId,
historyRetentionPeriod:
historyRetentionPeriod ?? this.historyRetentionPeriod,
workspaceFolderPath: workspaceFolderPath ?? this.workspaceFolderPath,
isSSLDisabled: isSSLDisabled ?? this.isSSLDisabled,
proxySettings: proxySettings ?? this.proxySettings,
);
}

Expand All @@ -71,15 +77,16 @@ class SettingsModel {
isDark: isDark,
alwaysShowCollectionPaneScrollbar: alwaysShowCollectionPaneScrollbar,
size: size,
offset: offset,
defaultUriScheme: defaultUriScheme,
defaultCodeGenLang: defaultCodeGenLang,
offset: offset,
saveResponses: saveResponses,
promptBeforeClosing: promptBeforeClosing,
activeEnvironmentId: activeEnvironmentId,
historyRetentionPeriod: historyRetentionPeriod,
workspaceFolderPath: workspaceFolderPath,
isSSLDisabled: isSSLDisabled,
proxySettings: proxySettings,
);
}

Expand Down Expand Up @@ -151,6 +158,7 @@ class SettingsModel {
historyRetentionPeriod ?? HistoryRetentionPeriod.oneWeek,
workspaceFolderPath: workspaceFolderPath,
isSSLDisabled: isSSLDisabled,
proxySettings: ProxySettings.fromJson(data["proxySettings"]),
);
}

Expand All @@ -170,6 +178,7 @@ class SettingsModel {
"historyRetentionPeriod": historyRetentionPeriod.name,
"workspaceFolderPath": workspaceFolderPath,
"isSSLDisabled": isSSLDisabled,
"proxySettings": proxySettings,
};
}

Expand All @@ -194,7 +203,8 @@ class SettingsModel {
other.activeEnvironmentId == activeEnvironmentId &&
other.historyRetentionPeriod == historyRetentionPeriod &&
other.workspaceFolderPath == workspaceFolderPath &&
other.isSSLDisabled == isSSLDisabled;
other.isSSLDisabled == isSSLDisabled &&
other.proxySettings == proxySettings;
}

@override
Expand All @@ -213,6 +223,7 @@ class SettingsModel {
historyRetentionPeriod,
workspaceFolderPath,
isSSLDisabled,
proxySettings,
);
}
}
1 change: 1 addition & 0 deletions lib/providers/collection_providers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ class CollectionStateNotifier
substitutedHttpRequestModel,
defaultUriScheme: defaultUriScheme,
noSSL: noSSL,
proxySettings: ref.read(settingsProvider).proxySettings,
);

late final RequestModel newRequestModel;
Expand Down
26 changes: 14 additions & 12 deletions lib/providers/settings_providers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,22 @@ class ThemeStateNotifier extends StateNotifier<SettingsModel> {
HistoryRetentionPeriod? historyRetentionPeriod,
String? workspaceFolderPath,
bool? isSSLDisabled,
ProxySettings? proxySettings,
}) async {
state = state.copyWith(
isDark: isDark,
alwaysShowCollectionPaneScrollbar: alwaysShowCollectionPaneScrollbar,
size: size,
offset: offset,
defaultUriScheme: defaultUriScheme,
defaultCodeGenLang: defaultCodeGenLang,
saveResponses: saveResponses,
promptBeforeClosing: promptBeforeClosing,
activeEnvironmentId: activeEnvironmentId,
historyRetentionPeriod: historyRetentionPeriod,
workspaceFolderPath: workspaceFolderPath,
isSSLDisabled: isSSLDisabled,
isDark: isDark ?? state.isDark,
alwaysShowCollectionPaneScrollbar: alwaysShowCollectionPaneScrollbar ?? state.alwaysShowCollectionPaneScrollbar,
size: size ?? state.size,
offset: offset ?? state.offset,
defaultUriScheme: defaultUriScheme ?? state.defaultUriScheme,
defaultCodeGenLang: defaultCodeGenLang ?? state.defaultCodeGenLang,
saveResponses: saveResponses ?? state.saveResponses,
promptBeforeClosing: promptBeforeClosing ?? state.promptBeforeClosing,
activeEnvironmentId: activeEnvironmentId ?? state.activeEnvironmentId,
historyRetentionPeriod: historyRetentionPeriod ?? state.historyRetentionPeriod,
workspaceFolderPath: workspaceFolderPath ?? state.workspaceFolderPath,
isSSLDisabled: isSSLDisabled ?? state.isSSLDisabled,
proxySettings: proxySettings ?? state.proxySettings,
);
await setSettingsToSharedPrefs(state);
}
Expand Down
70 changes: 70 additions & 0 deletions lib/screens/settings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import '../services/services.dart';
import '../utils/utils.dart';
import '../widgets/widgets.dart';
import '../consts.dart';
import 'dart:developer' as developer;

class SettingsPage extends ConsumerWidget {
const SettingsPage({super.key});
Expand Down Expand Up @@ -50,6 +51,75 @@ class SettingsPage extends ConsumerWidget {
ref.read(settingsProvider.notifier).update(isDark: value);
},
),
// Proxy Settings Section
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Proxy settings should have its own modal dialog and model.

SwitchListTile(
hoverColor: kColorTransparent,
title: const Text('Enable Proxy'),
subtitle: const Text('Configure HTTP proxy settings'),
value: ref.watch(settingsProvider.select((settings) => settings.isProxyEnabled)),
onChanged: (bool? value) {
if (value != null) {
developer.log('Toggling proxy settings', name: 'settings_page', error: 'New value: $value');
ref.read(settingsProvider.notifier).update(
isProxyEnabled: value,
proxyHost: value ? settings.proxyHost : '',
proxyPort: value ? settings.proxyPort : '',
proxyUsername: value ? settings.proxyUsername : null,
proxyPassword: value ? settings.proxyPassword : null,
);
developer.log('Proxy settings updated', name: 'settings_page');
}
},
),
if (ref.watch(settingsProvider.select((settings) => settings.isProxyEnabled))) ...[
ListTile(
title: TextField(
decoration: const InputDecoration(
labelText: 'Proxy Host',
hintText: 'e.g., localhost',
),
controller: TextEditingController(text: settings.proxyHost),
onChanged: (value) {
ref.read(settingsProvider.notifier).update(proxyHost: value);
},
),
),
ListTile(
title: TextField(
decoration: const InputDecoration(
labelText: 'Proxy Port',
hintText: 'e.g., 8080',
),
controller: TextEditingController(text: settings.proxyPort),
onChanged: (value) {
ref.read(settingsProvider.notifier).update(proxyPort: value);
},
),
),
ListTile(
title: TextField(
decoration: const InputDecoration(
labelText: 'Username (Optional)',
),
controller: TextEditingController(text: settings.proxyUsername),
onChanged: (value) {
ref.read(settingsProvider.notifier).update(proxyUsername: value);
},
),
),
ListTile(
title: TextField(
decoration: const InputDecoration(
labelText: 'Password (Optional)',
),
obscureText: true,
controller: TextEditingController(text: settings.proxyPassword),
onChanged: (value) {
ref.read(settingsProvider.notifier).update(proxyPassword: value);
},
),
),
],
SwitchListTile(
hoverColor: kColorTransparent,
title: const Text('Collection Pane Scrollbar Visiblity'),
Expand Down
1 change: 1 addition & 0 deletions packages/apidash_core/lib/models/models.dart
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export 'http_request_model.dart';
export 'http_response_model.dart';
export 'proxy_settings_model.dart';
18 changes: 18 additions & 0 deletions packages/apidash_core/lib/models/proxy_settings_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:json_annotation/json_annotation.dart';

part 'proxy_settings_model.freezed.dart';
part 'proxy_settings_model.g.dart';

@freezed
class ProxySettings with _$ProxySettings {
const factory ProxySettings({
@Default('') String host,
@Default('') String port,
String? username,
String? password,
}) = _ProxySettings;

factory ProxySettings.fromJson(Map<String, dynamic> json) =>
_$ProxySettingsFromJson(json);
}
Loading