simplified code across the app and consolidated duplicated helpers

This commit is contained in:
2026-09-27 17:29:54 +02:00
parent 3e856d0b1c
commit ee1240f71a
155 changed files with 1772 additions and 2546 deletions
@@ -13,11 +13,10 @@ import '../../../state/app/infrastructure/loadable_state/view/loadable_state_con
import '../../../state/app/infrastructure/utility_widgets/bloc_module.dart';
import '../../../state/app/modules/files/bloc/files_bloc.dart';
import '../../../state/app/modules/files/bloc/files_state.dart';
import '../../../state/app/modules/settings/bloc/settings_cubit.dart';
import '../../../widget/centered_leading.dart';
import '../../../widget/info_dialog.dart';
import '../../../widget/placeholder_view.dart';
import '../files/data/sort_options.dart';
import '../files/data/file_sort.dart';
import '../files/files_upload_dialog.dart';
import '../files/widgets/add_file_menu.dart';
import '../files/widgets/file_leading.dart';
@@ -73,22 +72,6 @@ class _ShareFolderPickerView extends StatefulWidget {
}
class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
late final SettingsCubit _settings;
late SortOption _currentSort;
late bool _ascending;
@override
void initState() {
super.initState();
_settings = context.read<SettingsCubit>();
_currentSort = _settings.val().fileSettings.sortBy;
_ascending = _settings.val().fileSettings.ascending;
}
void _enter(FilesBloc bloc, List<String> currentPath, String folderName) {
bloc.setPath([...currentPath, folderName]);
}
void _goUp(FilesBloc bloc, List<String> currentPath) {
if (currentPath.isEmpty) return;
bloc.setPath(currentPath.sublist(0, currentPath.length - 1));
@@ -97,6 +80,9 @@ class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
@override
Widget build(BuildContext context) {
final bloc = context.read<FilesBloc>();
// Selected here, not in the LoadableStateConsumer child: that closure runs
// during the consumer's build, where this context may not subscribe.
final sort = context.select(fileSortOf);
return BlocBuilder<FilesBloc, LoadableState<FilesState>>(
buildWhen: (a, b) => a.data?.currentPath != b.data?.currentPath,
builder: (_, outerState) {
@@ -109,9 +95,9 @@ class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
canPop: currentPath.isEmpty,
onPopInvokedWithResult: (didPop, _) {
if (didPop) return;
if (currentPath.isNotEmpty) _goUp(bloc, currentPath);
_goUp(bloc, currentPath);
},
child: _buildScaffold(context, bloc, currentPath),
child: _buildScaffold(context, bloc, currentPath, sort),
);
},
);
@@ -121,6 +107,7 @@ class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
BuildContext context,
FilesBloc bloc,
List<String> currentPath,
FileSort sort,
) => Scaffold(
appBar: AppBar(
title: Text(
@@ -133,22 +120,7 @@ class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
tooltip: 'Ordner erstellen',
onPressed: () => showCreateFolderDialog(context, bloc),
),
FilesSortActions(
currentSort: _currentSort,
ascending: _ascending,
onDirectionChanged: (e) {
setState(() {
_ascending = e;
_settings.val(write: true).fileSettings.ascending = e;
});
},
onSortChanged: (e) {
setState(() {
_currentSort = e;
_settings.val(write: true).fileSettings.sortBy = e;
});
},
),
const FilesSortActions(),
],
),
floatingActionButton: FloatingActionButton.extended(
@@ -160,12 +132,7 @@ class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
body: LoadableStateConsumer<FilesBloc, FilesState>(
isReady: (state) => state.listing != null,
child: (state, _) {
final listing = state.listing!;
final entries = listing.sortBy(
sortOption: _currentSort,
foldersToTop: _settings.val().fileSettings.sortFoldersToTop,
reversed: _ascending,
);
final entries = state.listing!.sortedBy(sort);
if (entries.isEmpty) {
return PlaceholderView(
@@ -181,18 +148,16 @@ class _ShareFolderPickerViewState extends State<_ShareFolderPickerView> {
itemCount: entries.length,
itemBuilder: (context, i) {
final entry = entries[i];
if (entry.isDirectory) {
return ListTile(
leading: CenteredLeading(FileLeading(file: entry)),
title: Text(entry.name),
trailing: const Icon(Icons.chevron_right),
onTap: () => _enter(bloc, state.currentPath, entry.name),
);
}
return ListTile(
enabled: false,
enabled: entry.isDirectory,
leading: CenteredLeading(FileLeading(file: entry)),
title: Text(entry.name),
trailing: entry.isDirectory
? const Icon(Icons.chevron_right)
: null,
onTap: entry.isDirectory
? () => bloc.setPath([...state.currentPath, entry.name])
: null,
);
},
);