From 1896c56544a1a417f0a2a9850979afa21f986578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 18 Feb 2026 16:10:23 +0100 Subject: [PATCH] chore: Add code lint check for unused code --- .github/workflows/integrate.yaml | 3 + lib/config/app_emojis.dart | 30 ------- lib/pages/chat/add_widget_tile.dart | 85 ------------------- lib/pages/chat/add_widget_tile_view.dart | 73 ----------------- lib/pages/chat_details/chat_details.dart | 2 - lib/pages/chat_list/chat_list.dart | 11 --- lib/pages/chat_list/chat_list_item.dart | 2 - lib/utils/background_push.dart | 4 - lib/widgets/avatar_page_header.dart | 100 ----------------------- lib/widgets/error_widget.dart | 45 ---------- pubspec.lock | 32 ++++++++ pubspec.yaml | 1 + 12 files changed, 36 insertions(+), 352 deletions(-) delete mode 100644 lib/config/app_emojis.dart delete mode 100644 lib/pages/chat/add_widget_tile.dart delete mode 100644 lib/pages/chat/add_widget_tile_view.dart delete mode 100644 lib/widgets/avatar_page_header.dart delete mode 100644 lib/widgets/error_widget.dart diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 9c8cbbb64..35d8d55f3 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -29,6 +29,9 @@ jobs: run: ./scripts/add-firebase-messaging.sh - run: flutter analyze - run: flutter test + - run: dart run dart_code_linter:metrics check-unused-code lib + - run: dart run dart_code_linter:metrics check-unused-files lib + - run: dart run dart_code_linter:metrics check-unused-l10n lib build_debug_apk: runs-on: ubuntu-latest diff --git a/lib/config/app_emojis.dart b/lib/config/app_emojis.dart deleted file mode 100644 index 3c38e2fa8..000000000 --- a/lib/config/app_emojis.dart +++ /dev/null @@ -1,30 +0,0 @@ -abstract class AppEmojis { - static const List emojis = [ - '👍', - '😊', - '😀', - '❤️', - '😍', - '😘', - '😇', - '😅', - '😭', - '😜', - '😱', - '😆', - '😉', - '😡', - '👋', - '🤔', - '🙁', - '🥳', - '😟', - '😄', - '😁', - '🙄', - '😂', - '🤣', - '😌', - '😬', - ]; -} diff --git a/lib/pages/chat/add_widget_tile.dart b/lib/pages/chat/add_widget_tile.dart deleted file mode 100644 index 88a4022d1..000000000 --- a/lib/pages/chat/add_widget_tile.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/chat/add_widget_tile_view.dart'; - -class AddWidgetTile extends StatefulWidget { - final Room room; - - const AddWidgetTile({super.key, required this.room}); - - @override - State createState() => AddWidgetTileState(); -} - -class AddWidgetTileState extends State { - final TextEditingController urlController = TextEditingController(); - final TextEditingController nameController = TextEditingController(); - String widgetType = 'm.etherpad'; - - late final bool initiallyExpanded; - - String? nameError; - String? urlError; - - @override - void initState() { - initiallyExpanded = widget.room.widgets.isEmpty; - super.initState(); - } - - void setWidgetType(String value) => setState(() => widgetType = value); - - void addWidget() { - try { - nameError = null; - urlError = null; - - final room = widget.room; - final name = nameController.text; - final uri = Uri.tryParse(urlController.text); - - if (name.length < 3) { - setState(() { - nameError = L10n.of(context).widgetNameError; - }); - return; - } - - if (uri == null || uri.scheme != 'https') { - setState(() { - urlError = L10n.of(context).widgetUrlError; - }); - return; - } - setState(() {}); - - late MatrixWidget matrixWidget; - switch (widgetType) { - case 'm.etherpad': - matrixWidget = MatrixWidget.etherpad(room, name, uri); - break; - case 'm.jitsi': - matrixWidget = MatrixWidget.jitsi(room, name, uri); - break; - case 'm.video': - matrixWidget = MatrixWidget.video(room, name, uri); - break; - default: - matrixWidget = MatrixWidget.custom(room, name, uri); - break; - } - widget.room.addWidget(matrixWidget); - Navigator.of(context).pop(); - } catch (e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).errorAddingWidget)), - ); - } - } - - @override - Widget build(BuildContext context) => AddWidgetTileView(controller: this); -} diff --git a/lib/pages/chat/add_widget_tile_view.dart b/lib/pages/chat/add_widget_tile_view.dart deleted file mode 100644 index c69968d6a..000000000 --- a/lib/pages/chat/add_widget_tile_view.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/chat/add_widget_tile.dart'; - -class AddWidgetTileView extends StatelessWidget { - final AddWidgetTileState controller; - - const AddWidgetTileView({super.key, required this.controller}); - - @override - Widget build(BuildContext context) { - return ExpansionTile( - title: Text(L10n.of(context).addWidget), - leading: const Icon(Icons.add), - initiallyExpanded: controller.initiallyExpanded, - children: [ - CupertinoSegmentedControl( - groupValue: controller.widgetType, - padding: const EdgeInsets.all(8), - children: - { - 'm.etherpad': Text(L10n.of(context).widgetEtherpad), - 'm.jitsi': Text(L10n.of(context).widgetJitsi), - 'm.video': Text(L10n.of(context).widgetVideo), - 'm.custom': Text(L10n.of(context).widgetCustom), - }.map( - (key, value) => MapEntry( - key, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: value, - ), - ), - ), - onValueChanged: controller.setWidgetType, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: controller.nameController, - autofocus: true, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.label), - label: Text(L10n.of(context).widgetName), - errorText: controller.nameError, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: controller.urlController, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.add_link), - label: Text(L10n.of(context).link), - errorText: controller.urlError, - ), - ), - ), - OverflowBar( - children: [ - TextButton( - onPressed: controller.addWidget, - child: Text(L10n.of(context).addWidget), - ), - ], - ), - ], - ); - } -} diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 69dda16e5..ad2fa8dcd 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -16,8 +16,6 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart' import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -enum AliasActions { copy, delete, setCanonical } - class ChatDetails extends StatefulWidget { final String roomId; final Widget? embeddedCloseButton; diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 01e3e009a..45e638518 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -29,15 +29,6 @@ import '../../config/setting_keys.dart'; import '../../utils/url_launcher.dart'; import '../../widgets/matrix.dart'; -enum PopupMenuAction { - settings, - invite, - newGroup, - newSpace, - setStatus, - archive, -} - enum ActiveFilter { allChats, messages, groups, unread, spaces } extension LocalizedActiveFilter on ActiveFilter { @@ -879,8 +870,6 @@ class ChatListController extends State enum EditBundleAction { addToBundle, removeFromBundle } -enum InviteActions { accept, decline, block } - enum ChatContextAction { open, goToSpace, diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 02ed40cf7..eb0e5700d 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -14,8 +14,6 @@ import '../../config/themes.dart'; import '../../utils/date_time_extension.dart'; import '../../widgets/avatar.dart'; -enum ArchivedRoomAction { delete, rejoin } - class ChatListItem extends StatelessWidget { final Room room; final Room? space; diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 85651de31..776af7828 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -45,10 +45,6 @@ import 'platform_infos.dart'; //import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; -class NoTokenException implements Exception { - String get cause => 'Cannot get firebase token'; -} - class BackgroundPush { static BackgroundPush? _instance; final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = diff --git a/lib/widgets/avatar_page_header.dart b/lib/widgets/avatar_page_header.dart deleted file mode 100644 index bff0d3881..000000000 --- a/lib/widgets/avatar_page_header.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/config/themes.dart'; - -class AvatarPageHeader extends StatelessWidget { - final Widget avatar; - final void Function()? onAvatarEdit; - final Widget? textButtonLeft, textButtonRight; - final List iconButtons; - - const AvatarPageHeader({ - super.key, - required this.avatar, - this.onAvatarEdit, - this.iconButtons = const [], - this.textButtonLeft, - this.textButtonRight, - }); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final onAvatarEdit = this.onAvatarEdit; - return Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: FluffyThemes.columnWidth), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .center, - spacing: 8.0, - children: [ - Stack( - children: [ - avatar, - if (onAvatarEdit != null) - Positioned( - bottom: 0, - right: 0, - child: FloatingActionButton.small( - elevation: 2, - onPressed: onAvatarEdit, - heroTag: null, - child: const Icon(Icons.camera_alt_outlined), - ), - ), - ], - ), - TextButtonTheme( - data: TextButtonThemeData( - style: TextButton.styleFrom( - disabledForegroundColor: theme.colorScheme.onSurface, - foregroundColor: theme.colorScheme.onSurface, - textStyle: const TextStyle(fontWeight: FontWeight.normal), - ), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: LayoutBuilder( - builder: (context, constraints) { - return Row( - mainAxisAlignment: .center, - children: [ - ConstrainedBox( - constraints: BoxConstraints( - maxWidth: constraints.maxWidth / 2, - ), - child: textButtonLeft, - ), - ConstrainedBox( - constraints: BoxConstraints( - maxWidth: constraints.maxWidth / 2, - ), - child: textButtonRight, - ), - ], - ); - }, - ), - ), - ), - IconButtonTheme( - data: IconButtonThemeData( - style: IconButton.styleFrom( - backgroundColor: theme.colorScheme.surfaceContainer, - iconSize: 24, - padding: const EdgeInsets.all(16), - ), - ), - child: Row( - mainAxisAlignment: .spaceEvenly, - children: iconButtons, - ), - ), - const SizedBox(height: 0.0), - ], - ), - ), - ); - } -} diff --git a/lib/widgets/error_widget.dart b/lib/widgets/error_widget.dart deleted file mode 100644 index 7e786d46e..000000000 --- a/lib/widgets/error_widget.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/utils/error_reporter.dart'; - -class FluffyChatErrorWidget extends StatefulWidget { - final FlutterErrorDetails details; - const FluffyChatErrorWidget(this.details, {super.key}); - - @override - State createState() => _FluffyChatErrorWidgetState(); -} - -class _FluffyChatErrorWidgetState extends State { - static final Set knownExceptions = {}; - @override - void initState() { - super.initState(); - - if (knownExceptions.contains(widget.details.exception.toString())) { - return; - } - knownExceptions.add(widget.details.exception.toString()); - WidgetsBinding.instance.addPostFrameCallback((_) { - ErrorReporter( - context, - 'Error Widget', - ).onErrorCallback(widget.details.exception, widget.details.stack); - }); - } - - @override - Widget build(BuildContext context) { - return Material( - color: Colors.orange, - child: Placeholder( - child: Center( - child: Material( - color: Colors.white.withAlpha(230), - borderRadius: BorderRadius.circular(8), - ), - ), - ), - ); - } -} diff --git a/pubspec.lock b/pubspec.lock index 29662f46d..1f5fde696 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.4.1" + analyzer_plugin: + dependency: transitive + description: + name: analyzer_plugin + sha256: "825071d553c4aef2252196d46a665fbd8e0cb06de07725f25d1b29bd18d65fff" + url: "https://pub.dev" + source: hosted + version: "0.13.6" animations: dependency: "direct main" description: @@ -273,6 +281,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_code_linter: + dependency: "direct dev" + description: + name: dart_code_linter + sha256: "1b53722d9933a5f5d4580acc29c7f16b1fde66d21d1ecf7bb2a811caf3a42b42" + url: "https://pub.dev" + source: hosted + version: "3.2.1" dart_earcut: dependency: transitive description: @@ -289,6 +305,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b + url: "https://pub.dev" + source: hosted + version: "3.1.3" dart_webrtc: dependency: transitive description: @@ -1364,6 +1388,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + pub_updater: + dependency: transitive + description: + name: pub_updater + sha256: "739a0161d73a6974c0675b864fb0cf5147305f7b077b7f03a58fa7a9ab3e7e7d" + url: "https://pub.dev" + source: hosted + version: "0.5.0" pubspec_parse: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f8110a79d..9fd3fc710 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -85,6 +85,7 @@ dependencies: webrtc_interface: ^1.3.0 dev_dependencies: + dart_code_linter: ^3.2.1 flutter_lints: ^6.0.0 flutter_native_splash: ^2.4.7 flutter_test: