From d80be607d38bac7f8ea91c31bf0038e64a573db0 Mon Sep 17 00:00:00 2001 From: Lajos Date: Thu, 30 Nov 2023 14:13:43 +0100 Subject: [PATCH] fix(frontend): File watchers (#41) --- frontend/src/pages/file-browser/file-list.tsx | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/frontend/src/pages/file-browser/file-list.tsx b/frontend/src/pages/file-browser/file-list.tsx index c6b04eaa..88f2a488 100644 --- a/frontend/src/pages/file-browser/file-list.tsx +++ b/frontend/src/pages/file-browser/file-list.tsx @@ -8,6 +8,23 @@ import { BreadCrumbs } from './breadcrumbs.js' import { DirectoryEntryIcon } from './directory-entry-icon.js' import { DrivesService } from '../../services/drives-service.js' import { FileContextMenu } from './file-context-menu.js' +import type { GetCollectionResult } from '@furystack/rest' + +const emptyResponse: GetCollectionResult = { + count: 0, + entries: [], +} + +const upEntry: DirectoryEntry = { + name: '..', + isDirectory: true, + isBlockDevice: false, + isCharacterDevice: false, + isFIFO: false, + isFile: false, + isSocket: false, + isSymbolicLink: false, +} export const FileList = Shade<{ currentDriveLetter: string @@ -22,29 +39,28 @@ export const FileList = Shade<{ const drivesService = injector.getInstance(DrivesService) const notyService = injector.getInstance(NotyService) + useDisposable('fileChanges', () => + drivesService.getFileListAsObservable(currentDriveLetter, currentPath).subscribe((result) => { + if (result.status === 'obsolete') { + drivesService.getFileList(currentDriveLetter, currentPath) + return + } + result.value && service.data.setValue(result.value) + }), + ) + const service = useDisposable( 'service', () => new CollectionService({ loader: async () => { if (!props.currentDriveLetter || !props.currentPath) { - return { count: 0, entries: [] } - } - - const up: DirectoryEntry = { - name: '..', - isDirectory: true, - isBlockDevice: false, - isCharacterDevice: false, - isFIFO: false, - isFile: false, - isSocket: false, - isSymbolicLink: false, + return emptyResponse } const result = await drivesService.getFileList(currentDriveLetter, currentPath) if (currentPath !== '/') { - return { ...result, entries: [up, ...result.entries.sortBy('isDirectory', 'desc')] } + return { ...result, entries: [upEntry, ...result.entries.sortBy('isDirectory', 'desc')] } } return { ...result, entries: result.entries.sortBy('isDirectory', 'desc') } },