🚸 feat: Optimize file list loading state, add new fileId to file search and return, uniqueOnly default value is false.

This commit is contained in:
jarvis2f 2024-12-30 11:59:37 +08:00
parent 2ab1f4d075
commit 15974dbe11
3 changed files with 35 additions and 2 deletions

View file

@ -28,6 +28,8 @@ import java.io.IOError;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
public class TelegramVerticle extends AbstractVerticle { public class TelegramVerticle extends AbstractVerticle {
@ -214,6 +216,27 @@ public class TelegramVerticle extends AbstractVerticle {
String status = filter.get("status"); String status = filter.get("status");
if (Arrays.asList("downloading", "paused", "completed", "error").contains(status)) { if (Arrays.asList("downloading", "paused", "completed", "error").contains(status)) {
return DataVerticle.fileRepository.getFiles(chatId, filter) 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<Long, TdApi.Message> messageMap = Arrays.stream(m.messages)
.collect(Collectors.toMap(message -> message.id, Function.identity()));
List<FileRecord> 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() .map(tuple -> new JsonObject()
.put("files", tuple.v1) .put("files", tuple.v1)
.put("nextFromMessageId", tuple.v2) .put("nextFromMessageId", tuple.v2)
@ -359,6 +382,10 @@ public class TelegramVerticle extends AbstractVerticle {
public Future<Void> cancelDownload(Integer fileId) { public Future<Void> cancelDownload(Integer fileId) {
return this.execute(new TdApi.GetFile(fileId)) return this.execute(new TdApi.GetFile(fileId))
.compose(file -> DataVerticle.fileRepository
.updateFileId(file.id, file.remote.uniqueId)
.map(file)
)
.compose(file -> { .compose(file -> {
if (file.local == null) { if (file.local == null) {
return Future.failedFuture("File not started downloading"); return Future.failedFuture("File not started downloading");

View file

@ -6,7 +6,7 @@ import io.vertx.core.json.JsonObject;
import java.util.function.Function; import java.util.function.Function;
public enum SettingKey { public enum SettingKey {
uniqueOnly(Convert::toBool, true), uniqueOnly(Convert::toBool, false),
needToLoadImages(Convert::toBool, false), needToLoadImages(Convert::toBool, false),
imageLoadSize, imageLoadSize,
alwaysHide(Convert::toBool, false), alwaysHide(Convert::toBool, false),

View file

@ -8,6 +8,7 @@ import useSWRInfinite from "swr/infinite";
import { useWebsocket } from "@/hooks/use-websocket"; import { useWebsocket } from "@/hooks/use-websocket";
import { WebSocketMessageType } from "@/lib/websocket-types"; import { WebSocketMessageType } from "@/lib/websocket-types";
import useLocalStorage from "@/hooks/use-local-storage"; import useLocalStorage from "@/hooks/use-local-storage";
import {useDebounce} from "use-debounce";
const DEFAULT_FILTERS: FileFilter = { const DEFAULT_FILTERS: FileFilter = {
search: "", search: "",
@ -60,6 +61,11 @@ export function useFiles(accountId: string, chatId: string) {
keepPreviousData: true, keepPreviousData: true,
}); });
const [debounceLoading] = useDebounce(isLoading || isValidating, 500, {
leading: true,
maxWait: 1000,
});
useEffect(() => { useEffect(() => {
if (lastJsonMessage?.type !== WebSocketMessageType.FILE_STATUS) { if (lastJsonMessage?.type !== WebSocketMessageType.FILE_STATUS) {
return; return;
@ -129,7 +135,7 @@ export function useFiles(accountId: string, chatId: string) {
return { return {
files, files,
filters, filters,
isLoading: isLoading || isValidating, isLoading: debounceLoading,
handleFilterChange, handleFilterChange,
handleLoadMore, handleLoadMore,
hasMore, hasMore,