prevent duplicates

This commit is contained in:
Scott E. Graves 2025-03-15 08:42:11 -05:00
parent 492ccfbdfb
commit d209b52848
4 changed files with 75 additions and 17 deletions

View File

@ -16,6 +16,29 @@ class MountList with ChangeNotifier {
UnmodifiableListView<MountConfig> get items => UnmodifiableListView<MountConfig> get items =>
UnmodifiableListView<MountConfig>(_mountList); UnmodifiableListView<MountConfig>(_mountList);
bool hasBucketName(String mountType, String name, {String? excludeName}) {
return (excludeName == null
? items
: items.whereNot(
(item) =>
item.name.toLowerCase() == excludeName.toLowerCase(),
))
.firstWhereOrNull(
(item) =>
(item.settings["${mountType}Config"]["Bucket"] as String)
.toLowerCase() ==
name.toLowerCase(),
) !=
null;
}
bool hasConfigName(String name) {
return items.firstWhereOrNull(
(item) => item.name.toLowerCase() == name.toLowerCase(),
) !=
null;
}
Future<void> _fetch() async { Future<void> _fetch() async {
try { try {
final response = await http.get( final response = await http.get(

View File

@ -145,7 +145,7 @@ class _AddMountScreenState extends State<AddMountScreen> {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
"'$key' is not valid", "Setting '$key' is not valid",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -154,17 +154,11 @@ class _AddMountScreenState extends State<AddMountScreen> {
return; return;
} }
final existingMount = mountList.items.firstWhereOrNull( if (mountList.hasConfigName(_mountNameController.text)) {
(item) =>
item.name.toLowerCase() ==
_mountNameController.text.toLowerCase(),
);
if (existingMount != null) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
"'${_mountNameController.text}' already exists", "Configuration '${_mountNameController.text}' already exists",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -172,6 +166,23 @@ class _AddMountScreenState extends State<AddMountScreen> {
return; return;
} }
if (_mountType == "Sia" || _mountType == "S3") {
final bucket =
_settings[_mountType]!["${_mountType}Config"]["Bucket"]
as String;
if (mountList.hasBucketName(_mountType, bucket)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Bucket '$bucket' already exists",
textAlign: TextAlign.center,
),
),
);
return;
}
}
mountList.add( mountList.add(
_mountType, _mountType,
_mountNameController.text, _mountNameController.text,

View File

@ -1,9 +1,11 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:repertory/constants.dart' as constants; import 'package:repertory/constants.dart' as constants;
import 'package:repertory/helpers.dart' show Validator, getSettingValidators; import 'package:repertory/helpers.dart' show Validator, getSettingValidators;
import 'package:repertory/models/mount.dart'; import 'package:repertory/models/mount.dart';
import 'package:repertory/models/mount_list.dart';
import 'package:settings_ui/settings_ui.dart'; import 'package:settings_ui/settings_ui.dart';
class MountSettingsWidget extends StatefulWidget { class MountSettingsWidget extends StatefulWidget {
@ -84,7 +86,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
"'$key' is not valid", "Setting '$key' is not valid",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -219,7 +221,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
"'$key' does not match", "Setting '$key' does not match",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -234,7 +236,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
"'$key' is not valid", "Setting '$key' is not valid",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -318,7 +320,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
"'$key' is not valid", "Setting '$key' is not valid",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -594,7 +596,18 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
subValue, subValue,
Icons.folder, Icons.folder,
false, false,
validators: getSettingValidators('$key.$subKey'), validators: [
...getSettingValidators('$key.$subKey'),
(value) =>
!Provider.of<MountList>(
context,
listen: false,
).hasBucketName(
widget.mount.type,
subValue,
excludeName: widget.mount.name,
),
],
); );
} }
}); });
@ -841,7 +854,18 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
subValue, subValue,
Icons.folder, Icons.folder,
false, false,
validators: getSettingValidators('$key.$subKey'), validators: [
...getSettingValidators('$key.$subKey'),
(value) =>
!Provider.of<MountList>(
context,
listen: false,
).hasBucketName(
widget.mount.type,
subValue,
excludeName: widget.mount.name,
),
],
); );
} }
break; break;

View File

@ -102,7 +102,7 @@ class _MountWidgetState extends State<MountWidget> {
).showSnackBar( ).showSnackBar(
SnackBar( SnackBar(
content: const Text( content: const Text(
"mount location is not valid", "Mount location is not valid",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -144,7 +144,7 @@ class _MountWidgetState extends State<MountWidget> {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: const Text( content: const Text(
"mount location is not set", "Mount location is not set",
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),