72 lines
2.3 KiB
Dart
72 lines
2.3 KiB
Dart
|
|
import 'dart:developer';
|
|
|
|
import 'package:sorted/sorted.dart';
|
|
|
|
import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc.dart';
|
|
import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc_event.dart';
|
|
import '../repository/files_repository.dart';
|
|
import 'files_event.dart';
|
|
import 'files_state.dart';
|
|
|
|
class FilesBloc extends LoadableHydratedBloc<FilesEvent, FilesState, FilesRepository> {
|
|
static const String basePath = '/';
|
|
|
|
FilesBloc() {
|
|
add(Emit((state) => state.copyWith(currentFolder: basePath)));
|
|
on<EnterFolder>((event, emit) {
|
|
add(Emit((state) {
|
|
log('setFolder');
|
|
return state.copyWith(currentFolder: event.absolutePath);
|
|
}, fetch: true));
|
|
});
|
|
}
|
|
|
|
List<File>? getVisibleFiles() => innerState?.files[innerState?.currentFolder];
|
|
String getCurrentFolder() => innerState?.currentFolder ?? basePath;
|
|
String getCurrentFolderName() {
|
|
var folder = innerState?.currentFolder.split('/').reversed.elementAt(1);
|
|
return folder!.isEmpty ? 'Dateien' : folder;
|
|
}
|
|
bool canGoBack() => innerState?.currentFolder != basePath;
|
|
String goBackLocation() {
|
|
var pathSegments = innerState?.currentFolder.split(basePath) ?? [];
|
|
if (pathSegments.isNotEmpty) {
|
|
pathSegments.removeLast();
|
|
pathSegments.removeLast();
|
|
}
|
|
return pathSegments.join(basePath) + basePath;
|
|
}
|
|
|
|
List currentSortConfiguration() => [
|
|
SortedComparable<File, DateTime>((file) => file.updatedAt ?? DateTime.now()),
|
|
];
|
|
|
|
@override
|
|
FilesState fromNothing() => const FilesState(currentFolder: basePath, files: {});
|
|
|
|
@override
|
|
FilesState fromStorage(Map<String, dynamic> json) => FilesState.fromJson(json);
|
|
|
|
@override
|
|
Future<void> gatherData() async {
|
|
var fetchFolder = getCurrentFolder();
|
|
log(fetchFolder);
|
|
var files = await repo.getFileList(fetchFolder);
|
|
var newFileMap = Map.of(innerState?.files ?? <String, List<File>>{});
|
|
newFileMap[fetchFolder] = files;
|
|
if(fetchFolder != getCurrentFolder()) {
|
|
log('Fetch aborted due to folder change (expected "$fetchFolder" got "${getCurrentFolder()}")');
|
|
return;
|
|
}
|
|
add(DataGathered((state) => state.copyWith(files: newFileMap)));
|
|
}
|
|
|
|
@override
|
|
FilesRepository repository() => FilesRepository();
|
|
|
|
@override
|
|
Map<String, dynamic>? toStorage(FilesState state) => state.toJson();
|
|
|
|
}
|