diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b1f3bab --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cSpell.words": ["Displayname"] +} diff --git a/analysis_options.yaml b/analysis_options.yaml index f340ea5..c2aaaa0 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,6 +2,7 @@ analyzer: errors: invalid_annotation_target: ignore exclude: + - "build/**" - "**/*.g.dart" - "**/*.freezed.dart" include: package:flutter_lints/flutter.yaml diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index a2e8177..2b5926f 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -1,4 +1,5 @@ import "dart:convert"; +import "dart:io"; import "package:flutter/foundation.dart"; import "package:matrix/matrix.dart"; @@ -59,8 +60,7 @@ class ClientController extends AsyncNotifier { Future login(String username, String password) async { final client = await future; try { - final deviceName = - "Nexus Client login at ${DateTime.now().toIso8601String()}"; + final deviceName = "Nexus Client login on ${Platform.localHostname}"; final details = await MatrixApi(homeserver: client.homeserver).login( LoginType.mLoginPassword, initialDeviceDisplayName: deviceName, diff --git a/lib/helpers/extension_helper.dart b/lib/helpers/extension_helper.dart index b2287eb..9a62ad4 100644 --- a/lib/helpers/extension_helper.dart +++ b/lib/helpers/extension_helper.dart @@ -20,11 +20,14 @@ extension BetterWhen on AsyncValue { } extension GetFullRoom on Room { - Future get fullRoom async => FullRoom( - roomData: this, - title: getLocalizedDisplayname(), - avatar: await avatar?.getThumbnailUri(client, width: 24, height: 24), - ); + Future get fullRoom async { + await loadHeroUsers(); + return FullRoom( + roomData: this, + title: getLocalizedDisplayname(), + avatar: await avatar?.getThumbnailUri(client, width: 24, height: 24), + ); + } } extension GetHeaders on Client { @@ -45,15 +48,7 @@ extension ToMessage on Event { "txnId": transactionId, }; - if (redacted) { - return Message.text( - metadata: metadata, - id: eventId, - authorId: senderId, - text: "This message has been redacted.", - deletedAt: redactedBecause?.originServerTs, - ); - } + if (redacted) return null; final asText = Message.text( diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart new file mode 100644 index 0000000..6cab84d --- /dev/null +++ b/lib/pages/settings_page.dart @@ -0,0 +1,10 @@ +import "package:flutter/material.dart"; + +class SettingsPage extends StatelessWidget { + const SettingsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold(appBar: AppBar(title: Text("Settings"))); + } +} diff --git a/lib/widgets/sidebar.dart b/lib/widgets/sidebar.dart index da84406..89d5d2f 100644 --- a/lib/widgets/sidebar.dart +++ b/lib/widgets/sidebar.dart @@ -4,6 +4,7 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/current_room_controller.dart"; import "package:nexus/controllers/spaces_controller.dart"; import "package:nexus/helpers/extension_helper.dart"; +import "package:nexus/pages/settings_page.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; class Sidebar extends HookConsumerWidget { @@ -50,6 +51,16 @@ class Sidebar extends HookConsumerWidget { ) .toList(), selectedIndex: selectedSpace.value, + trailingAtBottom: true, + trailing: Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: IconButton( + onPressed: () => Navigator.of( + context, + ).push(MaterialPageRoute(builder: (_) => SettingsPage())), + icon: Icon(Icons.settings), + ), + ), ), ), Expanded(