add network status

This commit is contained in:
m
2026-08-28 22:34:00 +02:00
parent f4024c8aae
commit 57d8e70d7f
2 changed files with 53 additions and 3 deletions
+17 -3
View File
@@ -187,16 +187,30 @@ export function HomeScreen() {
const files = data?.data ?? []; const files = data?.data ?? [];
const filteredFiles = useMemo( const filteredFiles = useMemo(
() => debouncedSearch.trim() ? files.filter((f) => matchesQuery(f, debouncedSearch, filters)) : files, () => {
const search = debouncedSearch.trim();
if ( search ) {
return files.filter((f) => matchesQuery(f, debouncedSearch, filters));
}
return files;
},
[files, debouncedSearch, filters] [files, debouncedSearch, filters]
); );
const mediaFilteredFiles = useMemo(() => { const mediaFilteredFiles = useMemo(() => {
if (mediaFilter === 'all') return filteredFiles; if (mediaFilter === 'all') return filteredFiles;
const PHOTOS_VIDEOS = ['image/','video/'];
const DOCUMENTS = ['application/','text/'];
return filteredFiles.filter((f) => { return filteredFiles.filter((f) => {
const mt = (f.mimeType ?? '').toLowerCase(); const mt = (f.mimeType ?? '').toLowerCase();
if (mediaFilter === 'documents') return mt.startsWith('application/') || mt.startsWith('text/'); if (mediaFilter === 'documents') return DOCUMENTS.some(docType => mt.startsWith(docType)) || PHOTOS_VIDEOS.every(docType => !mt.startsWith(docType));
if (mediaFilter === 'photos-videos') return mt.startsWith('image/') || mt.startsWith('video/'); if (mediaFilter === 'photos-videos') return PHOTOS_VIDEOS.some(docType => mt.startsWith(docType));
return true; return true;
}); });
}, [filteredFiles, mediaFilter]); }, [filteredFiles, mediaFilter]);
+36
View File
@@ -4,6 +4,7 @@ import { ENDPOINTS } from '../constants/api';
import type { UnifiedFileItem, PaginatedResponse, FileItem, Tag } from '../types'; import type { UnifiedFileItem, PaginatedResponse, FileItem, Tag } from '../types';
import { fileStore } from '../services/fileStore'; import { fileStore } from '../services/fileStore';
import { actionQueue } from '../services/actionQueue'; import { actionQueue } from '../services/actionQueue';
import { useNetworkStatus } from './useNetworkStatus';
function recordToUnifiedItem(record: ReturnType<typeof fileStore.getById>): UnifiedFileItem | null { function recordToUnifiedItem(record: ReturnType<typeof fileStore.getById>): UnifiedFileItem | null {
if (!record) return null; if (!record) return null;
@@ -33,9 +34,43 @@ export function useFiles(parentId?: string | null, page: number = 1, limit: numb
? ['resources', parentId, page, limit] ? ['resources', parentId, page, limit]
: ['resources', 'root', page, limit]; : ['resources', 'root', page, limit];
const { isOnline } = useNetworkStatus();
return useQuery({ return useQuery({
queryKey, queryKey,
queryFn: async () => { queryFn: async () => {
if ( !isOnline ) {
if ( parentId ) {
const children = fileStore.getChildrenByParent(parentId);
return {
data: children.map((r) => recordToUnifiedItem(r)!).filter(Boolean),
meta: { page, total: children.length },
};
}
const cached = fileStore.getRootFiles();
const localDeviceFiles = fileStore.getLocalDeviceFiles();
const validFiles = cached.files.filter(
(f) => !f.backendId || returnedIds.has(f.backendId) || f.source === 'local',
);
const validIds = new Set(validFiles.map((f) => f.id));
const extraLocal = localDeviceFiles.filter((f) => !validIds.has(f.id));
const mergedFiles = [...validFiles, ...extraLocal];
return {
data: mergedFiles.map((r) => recordToUnifiedItem(r)!).filter(Boolean),
meta: { page, total: ( cached.total) + extraLocal.length },
};
}
if (parentId) { if (parentId) {
const backendRes = await apiClient.get<PaginatedResponse<FileItem>>( const backendRes = await apiClient.get<PaginatedResponse<FileItem>>(
`${ENDPOINTS.RESOURCES}/folders/${parentId}/resources?page=${page}&limit=${limit}&thumbnail=thumbnail_small`, `${ENDPOINTS.RESOURCES}/folders/${parentId}/resources?page=${page}&limit=${limit}&thumbnail=thumbnail_small`,
@@ -103,6 +138,7 @@ export function useFiles(parentId?: string | null, page: number = 1, limit: numb
if (!parentId) { if (!parentId) {
const cached = fileStore.getRootFiles(); const cached = fileStore.getRootFiles();
const localDeviceFiles = fileStore.getLocalDeviceFiles(); const localDeviceFiles = fileStore.getLocalDeviceFiles();
const validIds = new Set(cached.files.map((f) => f.id)); const validIds = new Set(cached.files.map((f) => f.id));
const extraLocal = localDeviceFiles.filter((f) => !validIds.has(f.id)); const extraLocal = localDeviceFiles.filter((f) => !validIds.has(f.id));
const allFiles = [...cached.files, ...extraLocal]; const allFiles = [...cached.files, ...extraLocal];