From d9db99946d4dc4d722c3b8a9ca9b7c9811f32111 Mon Sep 17 00:00:00 2001 From: nite Date: Thu, 5 Feb 2026 15:48:59 +0800 Subject: [PATCH] fix: auto save block ask process fix: mark all pending transfers canceled when app exit --- README.md | 1 + internal/transfer/client.go | 15 +++++++++++++++ internal/transfer/history.go | 9 ++++++++- internal/transfer/model.go | 9 ++++----- internal/transfer/server.go | 1 + 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5ba8b26..5ff8bf7 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ - [x] 系统通知 - [ ] 应用图标 - [ ] 系统托盘(最小化到托盘) +- [ ] 清理历史 ## 技术栈 diff --git a/internal/transfer/client.go b/internal/transfer/client.go index a29786c..7ca1b20 100644 --- a/internal/transfer/client.go +++ b/internal/transfer/client.go @@ -71,6 +71,11 @@ func (s *Service) SendFile(target *discovery.Peer, targetIP string, filePath str task.Status = TransferStatusCanceled } else { // 如果请求发送失败,更新状态为 Error + if errors.Is(err, io.EOF) { + // 接收方离线 + task.Status = TransferStatusCanceled + return + } task.Status = TransferStatusError task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err) } @@ -125,6 +130,11 @@ func (s *Service) SendFolder(target *discovery.Peer, targetIP string, folderPath task.Status = TransferStatusCanceled } else { // 如果请求发送失败,更新状态为 Error + if errors.Is(err, io.EOF) { + // 接收方离线 + task.Status = TransferStatusCanceled + return + } task.Status = TransferStatusError task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err) } @@ -180,6 +190,11 @@ func (s *Service) SendText(target *discovery.Peer, targetIP string, text string) task.Status = TransferStatusCanceled } else { // 如果请求发送失败,更新状态为 Error + if errors.Is(err, io.EOF) { + // 接收方离线 + task.Status = TransferStatusCanceled + return + } task.Status = TransferStatusError task.ErrorMsg = fmt.Sprintf("Failed to connect to receiver: %v", err) } diff --git a/internal/transfer/history.go b/internal/transfer/history.go index 269959c..35d9a7e 100644 --- a/internal/transfer/history.go +++ b/internal/transfer/history.go @@ -9,9 +9,16 @@ import ( ) func (s *Service) SaveHistory() { + // 将 pending 状态的任务改为 canceled + transferList := s.GetTransferList() + for _, task := range transferList { + if task.Status == TransferStatusPending { + task.Status = TransferStatusCanceled + } + } configDir := config.GetConfigDir() historyPath := filepath.Join(configDir, "history.json") - historyJson, err := json.Marshal(s.GetTransferList()) + historyJson, err := json.Marshal(transferList) if err != nil { return } diff --git a/internal/transfer/model.go b/internal/transfer/model.go index 71a3be7..2124b66 100644 --- a/internal/transfer/model.go +++ b/internal/transfer/model.go @@ -55,11 +55,10 @@ type TransferOption func(*Transfer) func NewTransfer(id string, sender Sender, opts ...TransferOption) *Transfer { t := &Transfer{ - ID: id, - CreateTime: time.Now().UnixMilli(), - Sender: sender, - Status: TransferStatusPending, // Default status - DecisionChan: make(chan Decision, 1), + ID: id, + CreateTime: time.Now().UnixMilli(), + Sender: sender, + Status: TransferStatusPending, // Default status } for _, opt := range opts { diff --git a/internal/transfer/server.go b/internal/transfer/server.go index 59d658a..0d13080 100644 --- a/internal/transfer/server.go +++ b/internal/transfer/server.go @@ -40,6 +40,7 @@ func (s *Service) handleAsk(c *gin.Context) { // 存储请求 task.Type = TransferTypeReceive task.Status = TransferStatusPending + task.DecisionChan = make(chan Decision, 1) s.StoreTransferToList(&task) if s.config.GetAutoAccept() {