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 { static const String basePath = '/'; FilesBloc() { add(Emit((state) => state.copyWith(currentFolder: basePath))); on((event, emit) { add(Emit((state) { log('setFolder'); return state.copyWith(currentFolder: event.absolutePath); }, fetch: true)); }); } List? 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) => file.updatedAt ?? DateTime.now()), ]; @override FilesState fromNothing() => const FilesState(currentFolder: basePath, files: {}); @override FilesState fromStorage(Map json) => FilesState.fromJson(json); @override Future gatherData() async { var fetchFolder = getCurrentFolder(); log(fetchFolder); var files = await repo.getFileList(fetchFolder); var newFileMap = Map.of(innerState?.files ?? >{}); 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? toStorage(FilesState state) => state.toJson(); }