From 15974dbe11dff8b58bc4b355dc0de59313665488 Mon Sep 17 00:00:00 2001 From: jarvis2f <137974272+jarvis2f@users.noreply.github.com> Date: Mon, 30 Dec 2024 11:59:37 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20feat:=20Optimize=20file=20list?= =?UTF-8?q?=20loading=20state,=20add=20new=20fileId=20to=20file=20search?= =?UTF-8?q?=20and=20return,=20uniqueOnly=20default=20value=20is=20false.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/telegram/files/TelegramVerticle.java | 27 +++++++++++++++++++ .../telegram/files/repository/SettingKey.java | 2 +- web/src/hooks/use-files.ts | 8 +++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/telegram/files/TelegramVerticle.java b/api/src/main/java/telegram/files/TelegramVerticle.java index 2a52cc6..1007a60 100644 --- a/api/src/main/java/telegram/files/TelegramVerticle.java +++ b/api/src/main/java/telegram/files/TelegramVerticle.java @@ -28,6 +28,8 @@ import java.io.IOError; import java.io.IOException; import java.util.*; import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; public class TelegramVerticle extends AbstractVerticle { @@ -214,6 +216,27 @@ public class TelegramVerticle extends AbstractVerticle { String status = filter.get("status"); if (Arrays.asList("downloading", "paused", "completed", "error").contains(status)) { return DataVerticle.fileRepository.getFiles(chatId, filter) + .compose(r -> { + long[] messageIds = r.v1.stream().mapToLong(FileRecord::messageId).toArray(); + return this.execute(new TdApi.GetMessages(chatId, messageIds)) + .map(m -> { + Map messageMap = Arrays.stream(m.messages) + .collect(Collectors.toMap(message -> message.id, Function.identity())); + List fileRecords = r.v1.stream() + .map(fileRecord -> { + TdApi.Message message = messageMap.get(fileRecord.messageId()); + FileRecord source = TdApiHelp.getFileHandler(message) + .map(fileHandler -> fileHandler.convertFileRecord(telegramRecord.id())) + .orElse(null); + if (source != null) { + fileRecord = fileRecord.withSourceField(source.id(), source.downloadedSize()); + } + return fileRecord; + }) + .toList(); + return Tuple.tuple(fileRecords, r.v2, r.v3); + }); + }) .map(tuple -> new JsonObject() .put("files", tuple.v1) .put("nextFromMessageId", tuple.v2) @@ -359,6 +382,10 @@ public class TelegramVerticle extends AbstractVerticle { public Future cancelDownload(Integer fileId) { return this.execute(new TdApi.GetFile(fileId)) + .compose(file -> DataVerticle.fileRepository + .updateFileId(file.id, file.remote.uniqueId) + .map(file) + ) .compose(file -> { if (file.local == null) { return Future.failedFuture("File not started downloading"); diff --git a/api/src/main/java/telegram/files/repository/SettingKey.java b/api/src/main/java/telegram/files/repository/SettingKey.java index fae0449..db3ff6a 100644 --- a/api/src/main/java/telegram/files/repository/SettingKey.java +++ b/api/src/main/java/telegram/files/repository/SettingKey.java @@ -6,7 +6,7 @@ import io.vertx.core.json.JsonObject; import java.util.function.Function; public enum SettingKey { - uniqueOnly(Convert::toBool, true), + uniqueOnly(Convert::toBool, false), needToLoadImages(Convert::toBool, false), imageLoadSize, alwaysHide(Convert::toBool, false), diff --git a/web/src/hooks/use-files.ts b/web/src/hooks/use-files.ts index 61e0616..be6c39d 100644 --- a/web/src/hooks/use-files.ts +++ b/web/src/hooks/use-files.ts @@ -8,6 +8,7 @@ import useSWRInfinite from "swr/infinite"; import { useWebsocket } from "@/hooks/use-websocket"; import { WebSocketMessageType } from "@/lib/websocket-types"; import useLocalStorage from "@/hooks/use-local-storage"; +import {useDebounce} from "use-debounce"; const DEFAULT_FILTERS: FileFilter = { search: "", @@ -60,6 +61,11 @@ export function useFiles(accountId: string, chatId: string) { keepPreviousData: true, }); + const [debounceLoading] = useDebounce(isLoading || isValidating, 500, { + leading: true, + maxWait: 1000, + }); + useEffect(() => { if (lastJsonMessage?.type !== WebSocketMessageType.FILE_STATUS) { return; @@ -129,7 +135,7 @@ export function useFiles(accountId: string, chatId: string) { return { files, filters, - isLoading: isLoading || isValidating, + isLoading: debounceLoading, handleFilterChange, handleLoadMore, hasMore,