Skip to content

Commit 28e9f65

Browse files
committed
refactor(ssh): Refactor server import logic and extract common methods
Extract server import logic into the `ServerDeduplication` class Use the `importServersWithNotification` method consistently to handle imports Remove duplicate `_importServers` and `_resolveServers` methods Add checks for existing server IDs
1 parent fe06504 commit 28e9f65

File tree

5 files changed

+72
-50
lines changed

5 files changed

+72
-50
lines changed

lib/core/utils/server_dedup.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import 'package:fl_lib/fl_lib.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_riverpod/flutter_riverpod.dart';
14
import 'package:server_box/data/model/server/server_private_info.dart';
5+
import 'package:server_box/data/provider/server/all.dart';
26
import 'package:server_box/data/store/server.dart';
37

48
class ServerDeduplication {
@@ -66,6 +70,40 @@ class ServerDeduplication {
6670
toImport: deduplicatedList.length,
6771
);
6872
}
73+
74+
/// Import servers with deduplication and show appropriate notifications
75+
/// Returns the number of servers actually imported
76+
static Future<int> importServersWithNotification({
77+
required List<Spi> servers,
78+
required WidgetRef ref,
79+
required BuildContext context,
80+
required bool mounted,
81+
List<Spi>? resolvedServers,
82+
required String Function(String) allExistMessage,
83+
required String Function(String) importedMessage,
84+
}) async {
85+
final resolved = resolvedServers ?? _resolveServers(servers);
86+
87+
if (resolved.isEmpty) {
88+
if (!mounted) return 0;
89+
context.showSnackBar(allExistMessage(''));
90+
return 0;
91+
}
92+
93+
if (!mounted) return 0;
94+
95+
for (final server in resolved) {
96+
ref.read(serversProvider.notifier).addServer(server);
97+
}
98+
context.showSnackBar(importedMessage('${resolved.length}'));
99+
return resolved.length;
100+
}
101+
102+
static List<Spi> _resolveServers(List<Spi> servers) {
103+
final deduplicated = deduplicateServers(servers);
104+
final resolved = resolveNameConflicts(deduplicated);
105+
return resolved;
106+
}
69107
}
70108

71109
class ImportSummary {

lib/data/res/github_id.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ abstract final class GithubIds {
150150
'yeluonight',
151151
'Yinhono',
152152
'kuvaldini',
153+
'aliferne',
153154
};
154155
}
155156

lib/view/page/server/edit/edit.dart

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -247,31 +247,19 @@ class _ServerEditPageState extends ConsumerState<ServerEditPage>
247247
Stores.setting.firstTimeReadSSHCfg.put(false);
248248

249249
if (shouldImport == true) {
250-
await _importServers(servers);
250+
await ServerDeduplication.importServersWithNotification(
251+
servers: servers,
252+
ref: ref,
253+
context: context,
254+
mounted: mounted,
255+
allExistMessage: l10n.sshConfigAllExist,
256+
importedMessage: l10n.sshConfigImported,
257+
);
251258
}
252259
} catch (e) {
253260
if (!mounted) return;
254261
Stores.setting.firstTimeReadSSHCfg.put(false);
255262
dprint('Error checking SSH config: $e');
256263
}
257264
}
258-
259-
Future<void> _importServers(List<Spi> servers) async {
260-
final deduplicated = ServerDeduplication.deduplicateServers(servers);
261-
final resolved = ServerDeduplication.resolveNameConflicts(deduplicated);
262-
final summary = ServerDeduplication.getImportSummary(servers, resolved);
263-
264-
if (!summary.hasItemsToImport) {
265-
if (!mounted) return;
266-
context.showSnackBar(l10n.sshConfigAllExist('${summary.duplicates}'));
267-
return;
268-
}
269-
270-
if (!mounted) return;
271-
272-
for (final server in resolved) {
273-
ref.read(serversProvider.notifier).addServer(server);
274-
}
275-
context.showSnackBar(l10n.sshConfigImported('${resolved.length}'));
276-
}
277265
}

lib/view/page/setting/entries/server.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ extension _Server on _AppSettingsPageState {
180180
_buildDoubleColumnServersPage(),
181181
_buildUpdateInterval(),
182182
_buildMaxRetry(),
183-
if (isDesktop) _buildSSHConfigImport(),
183+
if (isDesktop) _buildSSHConfigAutoImportToggle(),
184184
],
185185
);
186186
}
@@ -261,7 +261,7 @@ extension _Server on _AppSettingsPageState {
261261
);
262262
}
263263

264-
Widget _buildSSHConfigImport() {
264+
Widget _buildSSHConfigAutoImportToggle() {
265265
return ListTile(
266266
title: Text(l10n.sshConfigImport),
267267
subtitle: Text(l10n.sshConfigImportTip, style: UIs.textGrey),

lib/view/page/setting/entries/ssh.dart

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,15 @@ extension _SSH on _AppSettingsPageState {
4545
);
4646
final code = ret?.text;
4747
if (code == null) return;
48+
if (!mounted) return;
4849

4950
try {
5051
final spi = Spi.fromJson(json.decode(code));
52+
final existingIds = ref.read(serversProvider).servers.keys;
53+
if (existingIds.contains(spi.id)) {
54+
context.showSnackBar('${l10n.sameIdServerExist}: ${spi.id}');
55+
return;
56+
}
5157
ref.read(serversProvider.notifier).addServer(spi);
5258
context.showSnackBar(libL10n.success);
5359
} catch (e, s) {
@@ -92,8 +98,6 @@ extension _SSH on _AppSettingsPageState {
9298
children: [
9399
Text(l10n.sshConfigFoundServers('${discoveredServers.length}')),
94100
const SizedBox(height: 8),
95-
Text(libL10n.setting),
96-
const SizedBox(height: 8),
97101
Input(
98102
controller: usernameController,
99103
label: libL10n.user,
@@ -121,37 +125,20 @@ extension _SSH on _AppSettingsPageState {
121125
)
122126
.toList();
123127

124-
await _importServers(servers);
128+
await ServerDeduplication.importServersWithNotification(
129+
servers: servers,
130+
ref: ref,
131+
context: context,
132+
mounted: mounted,
133+
allExistMessage: l10n.sshConfigAllExist,
134+
importedMessage: l10n.sshConfigImported,
135+
);
125136
}
126137
} finally {
127138
usernameController.dispose();
128139
}
129140
}
130141

131-
Future<void> _importServers(List<Spi> servers, {List<Spi>? resolvedServers}) async {
132-
final resolved = resolvedServers ?? _resolveServers(servers);
133-
134-
if (resolved.isEmpty) {
135-
if (!mounted) return;
136-
context.showSnackBar(l10n.sshConfigAllExist(''));
137-
return;
138-
}
139-
140-
if (!mounted) return;
141-
142-
for (final server in resolved) {
143-
ref.read(serversProvider.notifier).addServer(server);
144-
}
145-
context.showSnackBar(l10n.sshConfigImported('${resolved.length}'));
146-
}
147-
148-
List<Spi> _resolveServers(List<Spi> servers) {
149-
final deduplicated = ServerDeduplication.deduplicateServers(servers);
150-
final resolved = ServerDeduplication.resolveNameConflicts(deduplicated);
151-
final summary = ServerDeduplication.getImportSummary(servers, resolved);
152-
return summary.hasItemsToImport ? resolved : [];
153-
}
154-
155142
Future<void> _onTapSSHConfigImport() async {
156143
try {
157144
final servers = await SSHConfig.parseConfig();
@@ -206,7 +193,15 @@ extension _SSH on _AppSettingsPageState {
206193
if (!mounted) return;
207194

208195
if (shouldImport == true) {
209-
await _importServers(resolved, resolvedServers: resolved);
196+
await ServerDeduplication.importServersWithNotification(
197+
servers: resolved,
198+
ref: ref,
199+
context: context,
200+
mounted: mounted,
201+
resolvedServers: resolved,
202+
allExistMessage: l10n.sshConfigAllExist,
203+
importedMessage: l10n.sshConfigImported,
204+
);
210205
}
211206
}
212207

0 commit comments

Comments
 (0)