From 14f2222acec6a94ac2e339a2eb47f8236f31fb2a Mon Sep 17 00:00:00 2001 From: ngfchl Date: Sat, 18 Jul 2026 11:51:10 +0800 Subject: [PATCH] feat: recursively scan cloud cleanup candidates --- lib/pages/workspace_tools_page.dart | 44 ++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/lib/pages/workspace_tools_page.dart b/lib/pages/workspace_tools_page.dart index ba631ee..4a990ab 100644 --- a/lib/pages/workspace_tools_page.dart +++ b/lib/pages/workspace_tools_page.dart @@ -138,12 +138,24 @@ class _FileScanToolState extends ConsumerState<_FileScanTool> { }); try { final empty = []; - for (final folder in state.files.where((file) => file.isDirectory)) { - final response = await api.fsFiles(parentID: folder.id, pageSize: 1); - if (_extractFileCount(response) == 0) empty.add(folder); - } final groups = >{}; - for (final file in state.files.where((file) => !file.isDirectory)) { + final queue = [ + ...state.files.where((file) => file.isDirectory), + ]; + final files = [ + ...state.files.where((file) => !file.isDirectory), + ]; + while (queue.isNotEmpty) { + final folder = queue.removeLast(); + final response = await api.fsFiles(parentID: folder.id, pageSize: 1000); + final children = _extractFiles(response); + if (children.isEmpty) empty.add(folder); + for (final child in children) { + child.isDirectory ? queue.add(child) : files.add(child); + } + if (mounted) setState(() => _emptyFolders = List.of(empty)); + } + for (final file in files) { final key = file.gcid; if (key != null && key.isNotEmpty) { groups.putIfAbsent(key, () => []).add(file); @@ -164,21 +176,25 @@ class _FileScanToolState extends ConsumerState<_FileScanTool> { } } - int _extractFileCount(Map value) { - List? find(dynamic node) { + List _extractFiles(Map value) { + final files = []; + void visit(dynamic node) { if (node is Map) { - for (final key in const ['list', 'files', 'fileList', 'items']) { - if (node[key] is List) return node[key] as List; - } + try { + files.add(CloudFile.fromJson(Map.from(node))); + } catch (_) {} for (final child in node.values) { - final result = find(child); - if (result != null) return result; + visit(child); + } + } else if (node is List) { + for (final child in node) { + visit(child); } } - return null; } - return find(value)?.length ?? 0; + visit(value); + return {for (final file in files) file.id: file}.values.toList(); } @override