From a45378a094006364d41ca379da9ff3793e43c117 Mon Sep 17 00:00:00 2001 From: RafayAhmad7548 Date: Sun, 10 Aug 2025 07:10:30 +0500 Subject: [PATCH 1/2] make error snack bar fn global --- lib/main.dart | 14 ++++++++++++++ lib/sftp_explorer.dart | 20 ++++---------------- lib/widgets/operation_buttons.dart | 5 ++++- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index cc30c25..ffdfa68 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -28,3 +28,17 @@ class MainApp extends StatelessWidget { ); } } + +SnackBar buildErrorSnackBar(BuildContext context, String error) { + return SnackBar( + backgroundColor: Theme.of(context).colorScheme.secondaryContainer, + behavior: SnackBarBehavior.floating, + content: Row( + spacing: 10, + children: [ + Icon(Icons.error, color: Colors.red,), + Text(error, style: TextStyle(color: Theme.of(context).colorScheme.onSecondaryContainer),), + ], + ) + ); +} diff --git a/lib/sftp_explorer.dart b/lib/sftp_explorer.dart index 6fbe64a..49f6e53 100644 --- a/lib/sftp_explorer.dart +++ b/lib/sftp_explorer.dart @@ -4,6 +4,7 @@ import 'package:dartssh2/dartssh2.dart'; import 'package:file_picker/file_picker.dart'; import 'package:file_selector/file_selector.dart'; import 'package:flutter/material.dart'; +import 'package:fluxcloud/main.dart'; import 'package:fluxcloud/sftp_worker.dart'; import 'widgets/operation_buttons.dart'; @@ -39,7 +40,7 @@ class _SftpExplorerState extends State { } catch (e) { if (mounted) { - ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, e.toString())); + ScaffoldMessenger.of(context).showSnackBar(buildErrorSnackBar(context, e.toString())); } } setState(() => _isLoading = false); @@ -168,7 +169,7 @@ class _SftpExplorerState extends State { } catch (e) { if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, e.toString())); + ScaffoldMessenger.of(context).showSnackBar(buildErrorSnackBar(context, e.toString())); } } if (context.mounted) { @@ -202,7 +203,7 @@ class _SftpExplorerState extends State { } catch (e) { if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, e.toString())); + ScaffoldMessenger.of(context).showSnackBar(buildErrorSnackBar(context, e.toString())); } } setState(() => _progress = null); @@ -214,17 +215,4 @@ class _SftpExplorerState extends State { ); } - SnackBar _buildErrorSnackBar(BuildContext context, String error) { - return SnackBar( - backgroundColor: Theme.of(context).colorScheme.secondaryContainer, - behavior: SnackBarBehavior.floating, - content: Row( - spacing: 10, - children: [ - Icon(Icons.error, color: Colors.red,), - Text(error, style: TextStyle(color: Theme.of(context).colorScheme.onSecondaryContainer),), - ], - ) - ); - } } diff --git a/lib/widgets/operation_buttons.dart b/lib/widgets/operation_buttons.dart index 9584762..f6d157e 100644 --- a/lib/widgets/operation_buttons.dart +++ b/lib/widgets/operation_buttons.dart @@ -1,5 +1,6 @@ import 'package:dartssh2/dartssh2.dart'; import 'package:flutter/material.dart'; +import 'package:fluxcloud/main.dart'; import 'package:fluxcloud/sftp_worker.dart'; class OperationButtons extends StatelessWidget { @@ -97,7 +98,9 @@ class OperationButtons extends StatelessWidget { await sftpWorker.remove(dirEntry, path); } catch (e) { - print(e.toString()); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar(buildErrorSnackBar(context, e.toString())); + } } listDir(); if (context.mounted) { From 3f12b14e8a4cec4ccf7bdbbb4d3aadb184a6b8f2 Mon Sep 17 00:00:00 2001 From: RafayAhmad7548 Date: Sun, 10 Aug 2025 07:16:13 +0500 Subject: [PATCH 2/2] rename worky again --- lib/sftp_worker.dart | 25 ++++++++++++++++++++++++- lib/widgets/operation_buttons.dart | 26 +++++++++++++------------- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/lib/sftp_worker.dart b/lib/sftp_worker.dart index 120c6af..fb4607c 100644 --- a/lib/sftp_worker.dart +++ b/lib/sftp_worker.dart @@ -35,6 +35,13 @@ class Remove extends SftpCommand { Remove(this.dirEntry, this.path); } +class Rename extends SftpCommand { + final String oldpath; + final String newpath; + + Rename(this.oldpath, this.newpath); +} + class SftpWorker { @@ -163,7 +170,15 @@ class SftpWorker { } sendPort.send((id, 0)); } - on SftpStatusError catch (e) { + on SftpStatusError catch (e) { + sendPort.send((id, RemoteError(e.message, ''))); + } + case Rename(:final oldpath, :final newpath): + try { + await sftpClient.rename(oldpath, newpath); + sendPort.send((id, 0)); + } + on SftpStatusError catch (e) { sendPort.send((id, RemoteError(e.message, ''))); } } @@ -232,4 +247,12 @@ class SftpWorker { await completer.future; } + Future rename(String oldpath, String newpath) async { + final completer = Completer.sync(); + final id = _idCounter++; + _activeRequests[id] = completer; + _commands.send((id, Rename(oldpath, newpath))); + await completer.future; + } + } diff --git a/lib/widgets/operation_buttons.dart b/lib/widgets/operation_buttons.dart index f6d157e..fe32b75 100644 --- a/lib/widgets/operation_buttons.dart +++ b/lib/widgets/operation_buttons.dart @@ -51,19 +51,19 @@ class OperationButtons extends StatelessWidget { TextButton(onPressed: () => Navigator.pop(context), child: Text('Cancel')), TextButton( onPressed: () async { - // try { - // await sftpWorker.rename('${path}${dirEntry.filename}', '${widget.path}${newNameController.text}'); - // _listDir(); - // } - // on SftpStatusError catch (e) { - // if (context.mounted) { - // ScaffoldMessenger.of(context).showSnackBar(_buildErrorSnackBar(context, e.message)); - // } - // } - // if (context.mounted) { - // Navigator.pop(context); - // } - // + try { + await sftpWorker.rename('$path${dirEntry.filename}', '$path${newNameController.text}'); + listDir(); + } + on SftpStatusError catch (e) { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar(buildErrorSnackBar(context, e.message)); + } + } + if (context.mounted) { + Navigator.pop(context); + } + }, child: Text('Rename') ),