diff --git a/lib/data/provider/server/all.dart b/lib/data/provider/server/all.dart index 3475df93..bbfa6f03 100644 --- a/lib/data/provider/server/all.dart +++ b/lib/data/provider/server/all.dart @@ -225,6 +225,9 @@ class ServersNotifier extends _$ServersNotifier { Stores.setting.serverOrder.put(newOrder); Stores.server.delete(id); + // Remove connection stats when server is deleted + Stores.connectionStats.clearServerStats(id); + // Remove SSH session when server is deleted final sessionId = 'ssh_$id'; TermSessionManager.remove(sessionId); @@ -243,6 +246,7 @@ class ServersNotifier extends _$ServersNotifier { Stores.setting.serverOrder.put([]); Stores.server.clear(); + Stores.connectionStats.clearAll(); bakSync.sync(milliDelay: 1000); } diff --git a/lib/data/store/connection_stats.dart b/lib/data/store/connection_stats.dart index 704bd968..cf60cfe8 100644 --- a/lib/data/store/connection_stats.dart +++ b/lib/data/store/connection_stats.dart @@ -182,9 +182,23 @@ class ConnectionStatsStore extends HiveStore { // Clear stats for a specific server void clearServerStats(String serverId) { - final keysToDelete = keys().where((key) => key.startsWith(serverId)).toList(); + final keysToDelete = keys().where((key) { + if (key == serverId) return true; + return key.startsWith('${serverId}_'); + }).toList(); for (final key in keysToDelete) { remove(key); } } + + Future compact() async { + Loggers.app.info('Start compacting connection_stats database...'); + try { + await box.compact(); + Loggers.app.info('Finished compacting connection_stats database'); + } catch (e, st) { + Loggers.app.warning('Failed compacting connection_stats database', e, st); + rethrow; + } + } } \ No newline at end of file diff --git a/lib/generated/l10n/l10n.dart b/lib/generated/l10n/l10n.dart index 3f8bd1ab..9747bb72 100644 --- a/lib/generated/l10n/l10n.dart +++ b/lib/generated/l10n/l10n.dart @@ -395,6 +395,24 @@ abstract class AppLocalizations { /// **'Clear This Server Statistics'** String get clearThisServerStats; + /// No description provided for @compactDatabase. + /// + /// In en, this message translates to: + /// **'Compact Database'** + String get compactDatabase; + + /// No description provided for @compactDatabaseContent. + /// + /// In en, this message translates to: + /// **'Database size: {size}\n\nThis will reorganize the database to reduce file size. No data will be deleted.'** + String compactDatabaseContent(Object size); + + /// No description provided for @confirm. + /// + /// In en, this message translates to: + /// **'Confirm'** + String get confirm; + /// No description provided for @closeAfterSave. /// /// In en, this message translates to: diff --git a/lib/generated/l10n/l10n_de.dart b/lib/generated/l10n/l10n_de.dart index cd927af9..1c4d96f2 100644 --- a/lib/generated/l10n/l10n_de.dart +++ b/lib/generated/l10n/l10n_de.dart @@ -162,6 +162,17 @@ class AppLocalizationsDe extends AppLocalizations { @override String get clearThisServerStats => 'Statistiken dieses Servers löschen'; + @override + String get compactDatabase => 'Datenbank komprimieren'; + + @override + String compactDatabaseContent(Object size) { + return 'Datenbankgröße: $size\n\nDies wird die Datenbank neu organisieren, um die Dateigröße zu reduzieren. Es werden keine Daten gelöscht.'; + } + + @override + String get confirm => 'Bestätigen'; + @override String get closeAfterSave => 'Speichern und schließen'; diff --git a/lib/generated/l10n/l10n_en.dart b/lib/generated/l10n/l10n_en.dart index b39d0f65..40cf1a52 100644 --- a/lib/generated/l10n/l10n_en.dart +++ b/lib/generated/l10n/l10n_en.dart @@ -161,6 +161,17 @@ class AppLocalizationsEn extends AppLocalizations { @override String get clearThisServerStats => 'Clear This Server Statistics'; + @override + String get compactDatabase => 'Compact Database'; + + @override + String compactDatabaseContent(Object size) { + return 'Database size: $size\n\nThis will reorganize the database to reduce file size. No data will be deleted.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Save and close'; diff --git a/lib/generated/l10n/l10n_es.dart b/lib/generated/l10n/l10n_es.dart index dc4fba52..858a19fa 100644 --- a/lib/generated/l10n/l10n_es.dart +++ b/lib/generated/l10n/l10n_es.dart @@ -162,6 +162,17 @@ class AppLocalizationsEs extends AppLocalizations { @override String get clearThisServerStats => 'Limpiar estadísticas de este servidor'; + @override + String get compactDatabase => 'Compactar base de datos'; + + @override + String compactDatabaseContent(Object size) { + return 'Tamaño de la base de datos: $size\n\nEsto reorganizará la base de datos para reducir el tamaño del archivo. No se eliminará ningún dato.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Guardar y cerrar'; diff --git a/lib/generated/l10n/l10n_fr.dart b/lib/generated/l10n/l10n_fr.dart index 519df294..56b64712 100644 --- a/lib/generated/l10n/l10n_fr.dart +++ b/lib/generated/l10n/l10n_fr.dart @@ -162,6 +162,17 @@ class AppLocalizationsFr extends AppLocalizations { @override String get clearThisServerStats => 'Effacer les statistiques de ce serveur'; + @override + String get compactDatabase => 'Compacter la base de données'; + + @override + String compactDatabaseContent(Object size) { + return 'Taille de la base de données : $size\n\nCela réorganisera la base de données pour réduire la taille du fichier. Aucune donnée ne sera supprimée.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Enregistrer et fermer'; diff --git a/lib/generated/l10n/l10n_id.dart b/lib/generated/l10n/l10n_id.dart index 623a3da7..a89612f1 100644 --- a/lib/generated/l10n/l10n_id.dart +++ b/lib/generated/l10n/l10n_id.dart @@ -160,6 +160,17 @@ class AppLocalizationsId extends AppLocalizations { @override String get clearThisServerStats => 'Hapus Statistik Server Ini'; + @override + String get compactDatabase => 'Kompres Database'; + + @override + String compactDatabaseContent(Object size) { + return 'Ukuran database: $size\n\nIni akan mengatur ulang database untuk mengurangi ukuran file. Tidak ada data yang akan dihapus.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Simpan dan tutup'; diff --git a/lib/generated/l10n/l10n_ja.dart b/lib/generated/l10n/l10n_ja.dart index ea593bcf..1c85a9a9 100644 --- a/lib/generated/l10n/l10n_ja.dart +++ b/lib/generated/l10n/l10n_ja.dart @@ -155,6 +155,17 @@ class AppLocalizationsJa extends AppLocalizations { @override String get clearThisServerStats => 'このサーバーの統計をクリア'; + @override + String get compactDatabase => 'データベースを圧縮'; + + @override + String compactDatabaseContent(Object size) { + return 'データベースサイズ: $size\n\nこれにより、ファイルサイズを小さくするためにデータベースが再編成されます。データは削除されません。'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => '保存して閉じる'; diff --git a/lib/generated/l10n/l10n_nl.dart b/lib/generated/l10n/l10n_nl.dart index ab02bbd2..0fa70a98 100644 --- a/lib/generated/l10n/l10n_nl.dart +++ b/lib/generated/l10n/l10n_nl.dart @@ -161,6 +161,17 @@ class AppLocalizationsNl extends AppLocalizations { @override String get clearThisServerStats => 'Statistieken van deze server wissen'; + @override + String get compactDatabase => 'Database comprimeren'; + + @override + String compactDatabaseContent(Object size) { + return 'Databasgrootte: $size\n\nDit zal de database opnieuw organiseren om de bestandsgrootte te verkleinen. Geen gegevens worden verwijderd.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Opslaan en sluiten'; diff --git a/lib/generated/l10n/l10n_pt.dart b/lib/generated/l10n/l10n_pt.dart index 581c7e9b..97e43e35 100644 --- a/lib/generated/l10n/l10n_pt.dart +++ b/lib/generated/l10n/l10n_pt.dart @@ -161,6 +161,17 @@ class AppLocalizationsPt extends AppLocalizations { @override String get clearThisServerStats => 'Limpar estatísticas deste servidor'; + @override + String get compactDatabase => 'Compactar banco de dados'; + + @override + String compactDatabaseContent(Object size) { + return 'Tamanho do banco de dados: $size\n\nIsso reorganizará o banco de dados para reduzir o tamanho do arquivo. Nenhum dado será excluído.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Salvar e fechar'; diff --git a/lib/generated/l10n/l10n_ru.dart b/lib/generated/l10n/l10n_ru.dart index ecea0bb9..04d1c5f8 100644 --- a/lib/generated/l10n/l10n_ru.dart +++ b/lib/generated/l10n/l10n_ru.dart @@ -162,6 +162,17 @@ class AppLocalizationsRu extends AppLocalizations { @override String get clearThisServerStats => 'Очистить статистику этого сервера'; + @override + String get compactDatabase => 'Сжать базу данных'; + + @override + String compactDatabaseContent(Object size) { + return 'Размер базы данных: $size\n\nЭто перестроит базу данных для уменьшения размера файла. Данные не будут удалены.'; + } + + @override + String get confirm => 'Подтвердить'; + @override String get closeAfterSave => 'Сохранить и закрыть'; diff --git a/lib/generated/l10n/l10n_tr.dart b/lib/generated/l10n/l10n_tr.dart index b106c547..c03da488 100644 --- a/lib/generated/l10n/l10n_tr.dart +++ b/lib/generated/l10n/l10n_tr.dart @@ -160,6 +160,17 @@ class AppLocalizationsTr extends AppLocalizations { @override String get clearThisServerStats => 'Bu Sunucu İstatistiklerini Temizle'; + @override + String get compactDatabase => 'Veritabanını Sıkıştır'; + + @override + String compactDatabaseContent(Object size) { + return 'Veritabanı boyutu: $size\n\nBu, dosya boyutunu küçültmek için veritabanını yeniden düzenleyecektir. Veriler silinmeyecek.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Kaydet ve kapat'; diff --git a/lib/generated/l10n/l10n_uk.dart b/lib/generated/l10n/l10n_uk.dart index 0dc906d6..85047a15 100644 --- a/lib/generated/l10n/l10n_uk.dart +++ b/lib/generated/l10n/l10n_uk.dart @@ -161,6 +161,17 @@ class AppLocalizationsUk extends AppLocalizations { @override String get clearThisServerStats => 'Очистити статистику цього сервера'; + @override + String get compactDatabase => 'Стиснути базу даних'; + + @override + String compactDatabaseContent(Object size) { + return 'Розмір бази даних: $size\n\nЦе перебудує базу даних, щоб зменшити розмір файлу. Дані не будуть видалені.'; + } + + @override + String get confirm => 'Confirm'; + @override String get closeAfterSave => 'Зберегти та закрити'; diff --git a/lib/generated/l10n/l10n_zh.dart b/lib/generated/l10n/l10n_zh.dart index 959d68b0..e3805d2a 100644 --- a/lib/generated/l10n/l10n_zh.dart +++ b/lib/generated/l10n/l10n_zh.dart @@ -153,6 +153,17 @@ class AppLocalizationsZh extends AppLocalizations { @override String get clearThisServerStats => '清空此服务器统计'; + @override + String get compactDatabase => '压缩数据库'; + + @override + String compactDatabaseContent(Object size) { + return '数据库大小:$size\n\n此操作将重新组织数据库以减少体积,数据不会丢失。'; + } + + @override + String get confirm => '确认'; + @override String get closeAfterSave => '保存后关闭'; @@ -1135,6 +1146,14 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get clearThisServerStats => '清空此伺服器統計'; + @override + String get compactDatabase => '壓縮資料庫'; + + @override + String compactDatabaseContent(Object size) { + return '資料庫大小:$size\n\n此操作將重新組織資料庫以減少體積,資料不會遺失。'; + } + @override String get closeAfterSave => '儲存後關閉'; diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 81ec0826..ac45c9b3 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -46,6 +46,9 @@ "clearServerStatsContent": "Sind Sie sicher, dass Sie die Verbindungsstatistiken für Server \"{serverName}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", "clearServerStatsTitle": "{serverName} Statistiken löschen", "clearThisServerStats": "Statistiken dieses Servers löschen", + "compactDatabase": "Datenbank komprimieren", + "compactDatabaseContent": "Datenbankgröße: {size}\n\nDies wird die Datenbank neu organisieren, um die Dateigröße zu reduzieren. Es werden keine Daten gelöscht.", + "confirm": "Bestätigen", "closeAfterSave": "Speichern und schließen", "cmd": "Command", "collapseUITip": "Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 26610055..0a40e91b 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -46,6 +46,9 @@ "clearServerStatsContent": "Are you sure you want to clear connection statistics for server \"{serverName}\"? This action cannot be undone.", "clearServerStatsTitle": "Clear {serverName} Statistics", "clearThisServerStats": "Clear This Server Statistics", + "compactDatabase": "Compact Database", + "compactDatabaseContent": "Database size: {size}\n\nThis will rebuild the whole database to reduce file size.", + "confirm": "Confirm", "closeAfterSave": "Save and close", "cmd": "Command", "collapseUITip": "Whether to collapse long lists present in the UI by default", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 9a02db12..536c5b17 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "¿Estás seguro de que quieres limpiar las estadísticas de conexión del servidor \"{serverName}\"? Esta acción no se puede deshacer.", "clearServerStatsTitle": "Limpiar estadísticas de {serverName}", "clearThisServerStats": "Limpiar estadísticas de este servidor", + "compactDatabase": "Compactar base de datos", + "compactDatabaseContent": "Tamaño de la base de datos: {size}\n\nEsto reorganizará la base de datos para reducir el tamaño del archivo. No se eliminará ningún dato.", "closeAfterSave": "Guardar y cerrar", "cmd": "Comando", "collapseUITip": "¿Colapsar por defecto las listas largas en la UI?", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 0792d705..402ab2d6 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "Êtes-vous sûr de vouloir effacer les statistiques de connexion du serveur \"{serverName}\" ? Cette action ne peut pas être annulée.", "clearServerStatsTitle": "Effacer les statistiques de {serverName}", "clearThisServerStats": "Effacer les statistiques de ce serveur", + "compactDatabase": "Compacter la base de données", + "compactDatabaseContent": "Taille de la base de données : {size}\n\nCela réorganisera la base de données pour réduire la taille du fichier. Aucune donnée ne sera supprimée.", "closeAfterSave": "Enregistrer et fermer", "cmd": "Commande", "collapseUITip": "Indique si les longues listes présentées dans l'interface utilisateur doivent être réduites par défaut.", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 532faad9..f6e776d4 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "Apakah Anda yakin ingin menghapus statistik koneksi untuk server \"{serverName}\"? Tindakan ini tidak dapat dibatalkan.", "clearServerStatsTitle": "Hapus Statistik {serverName}", "clearThisServerStats": "Hapus Statistik Server Ini", + "compactDatabase": "Kompres Database", + "compactDatabaseContent": "Ukuran database: {size}\n\nIni akan mengatur ulang database untuk mengurangi ukuran file. Tidak ada data yang akan dihapus.", "closeAfterSave": "Simpan dan tutup", "cmd": "Memerintah", "collapseUITip": "Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 822071ed..4c90947e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "サーバー\"{serverName}\"の接続統計を削除してもよろしいですか?この操作は元に戻せません。", "clearServerStatsTitle": "{serverName}の統計をクリア", "clearThisServerStats": "このサーバーの統計をクリア", + "compactDatabase": "データベースを圧縮", + "compactDatabaseContent": "データベースサイズ: {size}\n\nこれにより、ファイルサイズを小さくするためにデータベースが再編成されます。データは削除されません。", "closeAfterSave": "保存して閉じる", "cmd": "コマンド", "collapseUITip": "UIの長いリストをデフォルトで折りたたむかどうか", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 695b790a..a579fc06 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "Weet u zeker dat u de verbindingsstatistieken voor server \"{serverName}\" wilt wissen? Deze actie kan niet ongedaan worden gemaakt.", "clearServerStatsTitle": "Statistieken van {serverName} wissen", "clearThisServerStats": "Statistieken van deze server wissen", + "compactDatabase": "Database comprimeren", + "compactDatabaseContent": "Databasgrootte: {size}\n\nDit zal de database opnieuw organiseren om de bestandsgrootte te verkleinen. Geen gegevens worden verwijderd.", "closeAfterSave": "Opslaan en sluiten", "cmd": "Opdracht", "collapseUITip": "Of lange lijsten in de UI standaard moeten worden ingeklapt", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 6d2a2f04..a2589770 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "Tem certeza de que deseja limpar as estatísticas de conexão para o servidor \"{serverName}\"? Esta ação não pode ser desfeita.", "clearServerStatsTitle": "Limpar estatísticas de {serverName}", "clearThisServerStats": "Limpar estatísticas deste servidor", + "compactDatabase": "Compactar banco de dados", + "compactDatabaseContent": "Tamanho do banco de dados: {size}\n\nIsso reorganizará o banco de dados para reduzir o tamanho do arquivo. Nenhum dado será excluído.", "closeAfterSave": "Salvar e fechar", "cmd": "Comando", "collapseUITip": "Deve colapsar listas longas na UI por padrão?", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 907f70bb..ee3268ae 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -46,6 +46,9 @@ "clearServerStatsContent": "Вы уверены, что хотите очистить статистику соединений для сервера \"{serverName}\"? Это действие не может быть отменено.", "clearServerStatsTitle": "Очистить статистику {serverName}", "clearThisServerStats": "Очистить статистику этого сервера", + "compactDatabase": "Сжать базу данных", + "compactDatabaseContent": "Размер базы данных: {size}\n\nЭто перестроит базу данных для уменьшения размера файла. Данные не будут удалены.", + "confirm": "Подтвердить", "closeAfterSave": "Сохранить и закрыть", "cmd": "Команда", "collapseUITip": "Свернуть длинные списки в UI по умолчанию", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 8f4d884a..ece319b7 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "\"{serverName}\" sunucusu için bağlantı istatistiklerini temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "clearServerStatsTitle": "{serverName} İstatistiklerini Temizle", "clearThisServerStats": "Bu Sunucu İstatistiklerini Temizle", + "compactDatabase": "Veritabanını Sıkıştır", + "compactDatabaseContent": "Veritabanı boyutu: {size}\n\nBu, dosya boyutunu küçültmek için veritabanını yeniden düzenleyecektir. Veriler silinmeyecek.", "closeAfterSave": "Kaydet ve kapat", "cmd": "Komut", "collapseUITip": "Arayüzde uzun listelerin varsayılan olarak daraltılıp daraltılmayacağı", diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 8fecb91d..244dced6 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "Ви впевнені, що хочете очистити статистику з'єднань для сервера \"{serverName}\"? Цю дію не можна скасувати.", "clearServerStatsTitle": "Очистити статистику {serverName}", "clearThisServerStats": "Очистити статистику цього сервера", + "compactDatabase": "Стиснути базу даних", + "compactDatabaseContent": "Розмір бази даних: {size}\n\nЦе перебудує базу даних, щоб зменшити розмір файлу. Дані не будуть видалені.", "closeAfterSave": "Зберегти та закрити", "cmd": "Команда", "collapseUITip": "Сховати довгі списки, що є у UI за замовчуванням", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index de3014b9..24ea01c6 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -46,6 +46,9 @@ "clearServerStatsContent": "确定要清空服务器 \"{serverName}\" 的连接统计数据吗?此操作无法撤销。", "clearServerStatsTitle": "清空 {serverName} 统计", "clearThisServerStats": "清空此服务器统计", + "compactDatabase": "压缩数据库", + "compactDatabaseContent": "数据库大小:{size}\n\n此操作将重新组织数据库以减少体积,数据不会丢失。", + "confirm": "确认", "closeAfterSave": "保存后关闭", "cmd": "命令", "collapseUITip": "是否默认折叠 UI 中的长列表", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 7594998d..31f82c27 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -46,6 +46,8 @@ "clearServerStatsContent": "確定要清空伺服器 \"{serverName}\" 的連線統計資料嗎?此操作無法撤銷。", "clearServerStatsTitle": "清空 {serverName} 統計", "clearThisServerStats": "清空此伺服器統計", + "compactDatabase": "壓縮資料庫", + "compactDatabaseContent": "資料庫大小:{size}\n\n此操作將重新組織資料庫以減少體積,資料不會遺失。", "closeAfterSave": "儲存後關閉", "cmd": "指令", "collapseUITip": "是否預設折疊 UI 中存在的長列表", diff --git a/lib/view/page/server/connection_stats.dart b/lib/view/page/server/connection_stats.dart index e5f2a2b7..4ec2bb78 100644 --- a/lib/view/page/server/connection_stats.dart +++ b/lib/view/page/server/connection_stats.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:fl_lib/fl_lib.dart'; import 'package:flutter/material.dart'; import 'package:server_box/core/extension/context/locale.dart'; @@ -16,6 +18,7 @@ class ConnectionStatsPage extends StatefulWidget { class _ConnectionStatsPageState extends State { List _serverStats = []; bool _isLoading = true; + bool _isCompacting = false; @override void initState() { @@ -47,6 +50,13 @@ class _ConnectionStatsPageState extends State { icon: const Icon(Icons.clear_all, color: Colors.red), tooltip: libL10n.clear, ), + IconButton( + onPressed: _isCompacting ? null : _showCompactDialog, + icon: _isCompacting + ? SizedLoading.small + : const Icon(Icons.compress), + tooltip: l10n.compactDatabase, + ), ], ), body: _buildBody, @@ -196,6 +206,42 @@ class _ConnectionStatsPageState extends State { ), ); } + + void _showCompactDialog() { + final path = '${Paths.doc}${Pfs.seperator}connection_stats_enc.hive'; + final file = File(path); + final oldSize = file.existsSync() ? file.lengthSync() : 0; + final sizeStr = oldSize < 1000 ? '$oldSize B' : oldSize < 1000 * 1000 ? '${(oldSize / 1000).toStringAsFixed(1)} KB' : '${(oldSize / (1000 * 1000)).toStringAsFixed(1)} MB'; + + context.showRoundDialog( + title: l10n.compactDatabase, + child: Text(l10n.compactDatabaseContent(sizeStr)), + actions: [ + TextButton(onPressed: context.pop, child: Text(libL10n.cancel)), + TextButton( + onPressed: () async { + context.pop(); + setState(() => _isCompacting = true); + try { + await Stores.connectionStats.compact(); + final newSize = file.existsSync() ? file.lengthSync() : 0; + final newSizeStr = newSize < 1000 ? '$newSize B' : newSize < 1000 * 1000 ? '${(newSize / 1000).toStringAsFixed(1)} KB' : '${(newSize / (1000 * 1000)).toStringAsFixed(1)} MB'; + if (mounted) { + setState(() => _isCompacting = false); + context.showSnackBar('${libL10n.success}: $sizeStr -> $newSizeStr'); + } + } catch (e) { + if (mounted) { + setState(() => _isCompacting = false); + context.showSnackBar('${libL10n.error}: $e'); + } + } + }, + child: Text(l10n.confirm), + ), + ], + ); + } } extension on _ConnectionStatsPageState {