diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index dcce6205..c3a591ec 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -21,6 +21,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:island/pods/config.dart'; import 'package:island/pods/pool_provider.dart'; +import 'package:island/utils/pool_utils.dart'; class SettingsScreen extends HookConsumerWidget { const SettingsScreen({super.key}); @@ -368,8 +369,12 @@ class SettingsScreen extends HookConsumerWidget { ), ), ), + poolsAsync.when( data: (pools) { + final validPools = filterValidPools(pools); + final currentPoolId = resolveDefaultPoolId(ref, pools); + return ListTile( isThreeLine: true, minLeadingWidth: 48, @@ -377,29 +382,23 @@ class SettingsScreen extends HookConsumerWidget { contentPadding: const EdgeInsets.only(left: 24, right: 17), leading: const Icon(Symbols.cloud), subtitle: Text( - settings.defaultPoolId != null - ? pools - .firstWhereOrNull( - (p) => p.id == settings.defaultPoolId, - ) - ?.description ?? - 'settingsDefaultPoolHelper'.tr() - : 'settingsDefaultPoolHelper'.tr(), + validPools + .firstWhereOrNull((p) => p.id == currentPoolId) + ?.description ?? + 'settingsDefaultPoolHelper'.tr(), style: Theme.of(context).textTheme.bodySmall, ), trailing: DropdownButtonHideUnderline( child: DropdownButton2( isExpanded: true, items: - pools.map((p) { + validPools.map((p) { return DropdownMenuItem( value: p.id, child: Text(p.name).fontSize(14), ); }).toList(), - value: - settings.defaultPoolId ?? - (pools.isNotEmpty ? pools.first.id : null), + value: currentPoolId, onChanged: (value) { ref .read(appSettingsNotifierProvider.notifier) diff --git a/lib/utils/pool_utils.dart b/lib/utils/pool_utils.dart new file mode 100644 index 00000000..12d34d54 --- /dev/null +++ b/lib/utils/pool_utils.dart @@ -0,0 +1,35 @@ + +import '../models/file_pool.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import '../pods/config.dart'; + +List filterValidPools(List pools) { + return pools.where((p) { + final accept = p.policyConfig['accept_types']; + if (accept != null) { + final acceptsOnlyMedia = accept.every((t) => + t.startsWith('image/') || + t.startsWith('video/') || + t.startsWith('audio/')); + if (acceptsOnlyMedia) return false; + } + return true; + }).toList(); +} + +String resolveDefaultPoolId(WidgetRef ref, List pools) { + final settings = ref.watch(appSettingsNotifierProvider); + final validPools = filterValidPools(pools); + + if (settings.defaultPoolId != null && + validPools.any((p) => p.id == settings.defaultPoolId)) { + return settings.defaultPoolId!; + } + + if (validPools.isNotEmpty) { + return validPools.first.id; + } + // DEFAULT: Solar Network Driver + return '500e5ed8-bd44-4359-bc0a-ec85e2adf447'; +} + diff --git a/lib/widgets/post/compose_shared.dart b/lib/widgets/post/compose_shared.dart index c30df65a..e94f0e5d 100644 --- a/lib/widgets/post/compose_shared.dart +++ b/lib/widgets/post/compose_shared.dart @@ -20,6 +20,8 @@ import 'package:island/widgets/alert.dart'; import 'package:island/widgets/post/compose_link_attachments.dart'; import 'package:island/widgets/post/compose_poll.dart'; import 'package:island/widgets/post/compose_recorder.dart'; +import 'package:island/pods/pool_provider.dart'; +import 'package:island/utils/pool_utils.dart'; import 'package:pasteboard/pasteboard.dart'; import 'package:textfield_tags/textfield_tags.dart'; import 'dart:async'; @@ -522,8 +524,8 @@ class ComposeLogic { SnCloudFile? cloudFile; - final settings = ref.watch(appSettingsNotifierProvider); - final selectedPoolId = poolId ?? settings.defaultPoolId ?? '500e5ed8-bd44-4359-bc0a-ec85e2adf447'; + final pools = await ref.read(poolsProvider.future); + final selectedPoolId = resolveDefaultPoolId(ref, pools); if (attachment.type == UniversalFileType.file) { cloudFile = await putFileToPool(