From 0daf36719b9b600f765785c8ecb52d469b6a9e0d Mon Sep 17 00:00:00 2001 From: marcobaobao Date: Fri, 21 Jun 2024 10:41:49 +0200 Subject: [PATCH] Fixed process not cleared after download. Closes #160 --- frontend/src/components/DownloadsGridView.tsx | 7 ++++++- frontend/src/components/DownloadsTableView.tsx | 9 +++++++-- frontend/src/lib/rpcClient.ts | 7 +++++++ frontend/src/types/index.ts | 9 ++++++++- frontend/src/utils.ts | 11 ++++++----- server/rpc/service.go | 2 +- 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/DownloadsGridView.tsx b/frontend/src/components/DownloadsGridView.tsx index b54d7e7..1b53c7f 100644 --- a/frontend/src/components/DownloadsGridView.tsx +++ b/frontend/src/components/DownloadsGridView.tsx @@ -4,6 +4,7 @@ import { activeDownloadsState } from '../atoms/downloads' import { useToast } from '../hooks/toast' import { useI18n } from '../hooks/useI18n' import { useRPC } from '../hooks/useRPC' +import { ProcessStatus, RPCResult } from '../types' import DownloadCard from './DownloadCard' const DownloadsGridView: React.FC = () => { @@ -13,6 +14,10 @@ const DownloadsGridView: React.FC = () => { const { client } = useRPC() const { pushMessage } = useToast() + const stop = (r: RPCResult) => r.progress.process_status === ProcessStatus.Completed + ? client.clear(r.id) + : client.kill(r.id) + return ( { @@ -20,7 +25,7 @@ const DownloadsGridView: React.FC = () => { client.kill(download.id)} + onStop={() => stop(download)} onCopy={() => pushMessage(i18n.t('clipboardAction'), 'info')} /> diff --git a/frontend/src/components/DownloadsTableView.tsx b/frontend/src/components/DownloadsTableView.tsx index 85ab27e..4b6baa7 100644 --- a/frontend/src/components/DownloadsTableView.tsx +++ b/frontend/src/components/DownloadsTableView.tsx @@ -24,7 +24,7 @@ import { useRecoilValue } from 'recoil' import { activeDownloadsState } from '../atoms/downloads' import { serverURL } from '../atoms/settings' import { useRPC } from '../hooks/useRPC' -import { RPCResult } from '../types' +import { ProcessStatus, RPCResult } from '../types' import { base64URLEncode, formatSize, formatSpeedMiB } from "../utils" const columns = [ @@ -133,6 +133,11 @@ const DownloadsTableView: React.FC = () => { window.open(`${serverAddr}/archive/d/${encoded}?token=${localStorage.getItem('token')}`) } + const stop = (r: RPCResult) => r.progress.process_status === ProcessStatus.Completed + ? client.clear(r.id) + : client.kill(r.id) + + function rowContent(_index: number, download: RPCResult) { return ( <> @@ -168,7 +173,7 @@ const DownloadsTableView: React.FC = () => { client.kill(download.id)} + onClick={() => stop(download)} > {download.progress.percentage === '-1' ? : } diff --git a/frontend/src/lib/rpcClient.ts b/frontend/src/lib/rpcClient.ts index fc425d4..0d0348a 100644 --- a/frontend/src/lib/rpcClient.ts +++ b/frontend/src/lib/rpcClient.ts @@ -132,6 +132,13 @@ export class RPCClient { }) } + public clear(id: string) { + this.sendHTTP({ + method: 'Service.Clear', + params: [id], + }) + } + public killAll() { this.sendHTTP({ method: 'Service.KillAll', diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 932804b..98fcc04 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -34,11 +34,18 @@ type DownloadInfo = { created_at: string } +export enum ProcessStatus { + Pending = 0, + Downloading, + Completed, + Errored, +} + type DownloadProgress = { speed: number eta: number percentage: string - process_status: number + process_status: ProcessStatus } export type RPCResult = Readonly<{ diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts index 525328b..171b4a7 100644 --- a/frontend/src/utils.ts +++ b/frontend/src/utils.ts @@ -1,5 +1,6 @@ import { pipe } from 'fp-ts/lib/function' import type { RPCResponse } from "./types" +import { ProcessStatus } from './types' export function validateIP(ipAddr: string): boolean { let ipRegex = /^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/gm @@ -53,15 +54,15 @@ export function isRPCResponse(object: any): object is RPCResponse { return 'result' in object && 'id' in object } -export function mapProcessStatus(status: number) { +export function mapProcessStatus(status: ProcessStatus) { switch (status) { - case 0: + case ProcessStatus.Pending: return 'Pending' - case 1: + case ProcessStatus.Downloading: return 'Downloading' - case 2: + case ProcessStatus.Completed: return 'Completed' - case 3: + case ProcessStatus.Errored: return 'Error' default: return 'Pending' diff --git a/server/rpc/service.go b/server/rpc/service.go index 6b8e9bb..5c0f67e 100644 --- a/server/rpc/service.go +++ b/server/rpc/service.go @@ -105,7 +105,7 @@ func (s *Service) Kill(args string, killed *string) error { } if err := proc.Kill(); err != nil { - s.logger.Info("failed killing process", slog.String("id", proc.Id)) + s.logger.Info("failed killing process", slog.String("id", proc.Id), slog.Any("err", err)) return err }