diff --git a/web/repertory/lib/models/mount_list.dart b/web/repertory/lib/models/mount_list.dart index e95cbf00..593de8c6 100644 --- a/web/repertory/lib/models/mount_list.dart +++ b/web/repertory/lib/models/mount_list.dart @@ -16,6 +16,29 @@ class MountList with ChangeNotifier { UnmodifiableListView get items => UnmodifiableListView(_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 _fetch() async { try { final response = await http.get( diff --git a/web/repertory/lib/screens/add_mount_screen.dart b/web/repertory/lib/screens/add_mount_screen.dart index 94dbea9c..bc9b6a53 100644 --- a/web/repertory/lib/screens/add_mount_screen.dart +++ b/web/repertory/lib/screens/add_mount_screen.dart @@ -145,7 +145,7 @@ class _AddMountScreenState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "'$key' is not valid", + "Setting '$key' is not valid", textAlign: TextAlign.center, ), ), @@ -154,17 +154,11 @@ class _AddMountScreenState extends State { return; } - final existingMount = mountList.items.firstWhereOrNull( - (item) => - item.name.toLowerCase() == - _mountNameController.text.toLowerCase(), - ); - - if (existingMount != null) { + if (mountList.hasConfigName(_mountNameController.text)) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "'${_mountNameController.text}' already exists", + "Configuration '${_mountNameController.text}' already exists", textAlign: TextAlign.center, ), ), @@ -172,6 +166,23 @@ class _AddMountScreenState extends State { 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( _mountType, _mountNameController.text, diff --git a/web/repertory/lib/widgets/mount_settings.dart b/web/repertory/lib/widgets/mount_settings.dart index 3d085f23..609b7cb3 100644 --- a/web/repertory/lib/widgets/mount_settings.dart +++ b/web/repertory/lib/widgets/mount_settings.dart @@ -1,9 +1,11 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; import 'package:repertory/constants.dart' as constants; import 'package:repertory/helpers.dart' show Validator, getSettingValidators; import 'package:repertory/models/mount.dart'; +import 'package:repertory/models/mount_list.dart'; import 'package:settings_ui/settings_ui.dart'; class MountSettingsWidget extends StatefulWidget { @@ -84,7 +86,7 @@ class _MountSettingsWidgetState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "'$key' is not valid", + "Setting '$key' is not valid", textAlign: TextAlign.center, ), ), @@ -219,7 +221,7 @@ class _MountSettingsWidgetState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "'$key' does not match", + "Setting '$key' does not match", textAlign: TextAlign.center, ), ), @@ -234,7 +236,7 @@ class _MountSettingsWidgetState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "'$key' is not valid", + "Setting '$key' is not valid", textAlign: TextAlign.center, ), ), @@ -318,7 +320,7 @@ class _MountSettingsWidgetState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "'$key' is not valid", + "Setting '$key' is not valid", textAlign: TextAlign.center, ), ), @@ -594,7 +596,18 @@ class _MountSettingsWidgetState extends State { subValue, Icons.folder, false, - validators: getSettingValidators('$key.$subKey'), + validators: [ + ...getSettingValidators('$key.$subKey'), + (value) => + !Provider.of( + context, + listen: false, + ).hasBucketName( + widget.mount.type, + subValue, + excludeName: widget.mount.name, + ), + ], ); } }); @@ -841,7 +854,18 @@ class _MountSettingsWidgetState extends State { subValue, Icons.folder, false, - validators: getSettingValidators('$key.$subKey'), + validators: [ + ...getSettingValidators('$key.$subKey'), + (value) => + !Provider.of( + context, + listen: false, + ).hasBucketName( + widget.mount.type, + subValue, + excludeName: widget.mount.name, + ), + ], ); } break; diff --git a/web/repertory/lib/widgets/mount_widget.dart b/web/repertory/lib/widgets/mount_widget.dart index 5454ecd5..2703f035 100644 --- a/web/repertory/lib/widgets/mount_widget.dart +++ b/web/repertory/lib/widgets/mount_widget.dart @@ -102,7 +102,7 @@ class _MountWidgetState extends State { ).showSnackBar( SnackBar( content: const Text( - "mount location is not valid", + "Mount location is not valid", textAlign: TextAlign.center, ), ), @@ -144,7 +144,7 @@ class _MountWidgetState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: const Text( - "mount location is not set", + "Mount location is not set", textAlign: TextAlign.center, ), ),