From b3083d37c343abb02e5ab3e9f73ab04eb0a9bf68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Sun, 9 Nov 2025 20:27:59 +0100 Subject: [PATCH] Add button under account to show userid+tokens --- flutter/Makefile | 2 +- .../modals/filter_modal_priority.dart | 2 +- flutter/lib/pages/account/account.dart | 45 ++++++++--- .../lib/pages/account/show_token_modal.dart | 80 +++++++++++++++++++ .../keytoken_list/keytoken_create_modal.dart | 2 +- .../keytoken_list/keytoken_created_modal.dart | 2 +- .../keytoken_view/keytoken_channel_modal.dart | 2 +- .../keytoken_permission_modal.dart | 2 +- flutter/pubspec.yaml | 2 +- 9 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 flutter/lib/pages/account/show_token_modal.dart diff --git a/flutter/Makefile b/flutter/Makefile index eb3db28..198ce16 100644 --- a/flutter/Makefile +++ b/flutter/Makefile @@ -21,7 +21,7 @@ run-web: java gen run-android: java gen ping -c1 10.10.10.177 adb connect 10.10.10.177:5555 - flutter pub run build_runner build + dart run build_runner build _JAVA_OPTIONS="" flutter run -d 10.10.10.177:5555 install-release: java gen diff --git a/flutter/lib/components/modals/filter_modal_priority.dart b/flutter/lib/components/modals/filter_modal_priority.dart index bcafd2a..d481b44 100644 --- a/flutter/lib/components/modals/filter_modal_priority.dart +++ b/flutter/lib/components/modals/filter_modal_priority.dart @@ -32,7 +32,7 @@ class _FilterModalPriorityState extends State { return AlertDialog( title: const Text('Priority'), content: Container( - width: 0, + width: 9000, height: 200, child: ListView.builder( shrinkWrap: true, diff --git a/flutter/lib/pages/account/account.dart b/flutter/lib/pages/account/account.dart index 510d294..c16223d 100644 --- a/flutter/lib/pages/account/account.dart +++ b/flutter/lib/pages/account/account.dart @@ -10,6 +10,7 @@ import 'package:simplecloudnotifier/api/api_client.dart'; import 'package:simplecloudnotifier/components/error_display/error_display.dart'; import 'package:simplecloudnotifier/models/user.dart'; import 'package:simplecloudnotifier/pages/account/login.dart'; +import 'package:simplecloudnotifier/pages/account/show_token_modal.dart'; import 'package:simplecloudnotifier/pages/channel_list/channel_list_extended.dart'; import 'package:simplecloudnotifier/pages/client_list/client_list.dart'; import 'package:simplecloudnotifier/pages/filtered_message_view/filtered_message_view.dart'; @@ -268,7 +269,20 @@ class _AccountRootPageState extends State { _buildHeader(context, user), const SizedBox(height: 16), Text(user.username ?? user.userID, overflow: TextOverflow.ellipsis, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20)), - const SizedBox(height: 16), + const SizedBox(height: 8), + if (acc.tokenSend != null || acc.tokenAdmin != null) + Row( + children: [ + Expanded( + child: UI.button( + text: 'UserID & Token kopieren', + onPressed: () => _showTokenModal(context, acc), + icon: FontAwesomeIcons.copy, + ), + ), + ], + ), + const SizedBox(height: 8), ..._buildCards(context, user), SizedBox(height: 16), _buildFooter(context, user), @@ -456,18 +470,20 @@ class _AccountRootPageState extends State { child: Row( children: [ Expanded( - child: UI.button( - text: 'Logout', - onPressed: _logout, - color: Colors.orange, - )), + child: UI.button( + text: 'Logout', + onPressed: _logout, + color: Colors.orange, + ), + ), const SizedBox(width: 8), Expanded( - child: UI.button( - text: 'Delete Account', - onPressed: _deleteAccount, - color: Colors.red, - )), + child: UI.button( + text: 'Delete Account', + onPressed: _deleteAccount, + color: Colors.red, + ), + ), ], ), ); @@ -717,4 +733,11 @@ class _AccountRootPageState extends State { return completer.future; } + + void _showTokenModal(BuildContext context, AppAuth acc) { + showDialog( + context: context, + builder: (context) => ShowTokenModal(account: acc), + ); + } } diff --git a/flutter/lib/pages/account/show_token_modal.dart b/flutter/lib/pages/account/show_token_modal.dart new file mode 100644 index 0000000..594bb14 --- /dev/null +++ b/flutter/lib/pages/account/show_token_modal.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:simplecloudnotifier/components/badge_display/badge_display.dart'; +import 'package:simplecloudnotifier/state/app_auth.dart'; +import 'package:simplecloudnotifier/utils/toaster.dart'; +import 'package:simplecloudnotifier/utils/ui.dart'; + +class ShowTokenModal extends StatelessWidget { + final AppAuth account; + + const ShowTokenModal({ + Key? key, + required this.account, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text('UserID + Token'), + content: Container( + width: 9000, + height: 400, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const BadgeDisplay( + text: "Use your UserID and Send-Token to send messages to your account.\n\nThe Admin-Token should not be shared.", + icon: null, + mode: BadgeMode.warn, + ), + const SizedBox(height: 16), + if (this.account.userID != null) + UI.metaCard( + context: context, + icon: FontAwesomeIcons.solidUser, + title: 'UserID', + values: [this.account.userID!], + iconActions: [(FontAwesomeIcons.copy, null, () => _copy('UserID', this.account.userID!))], + ), + const SizedBox(height: 4), + if (this.account.tokenSend != null) + UI.metaCard( + context: context, + icon: FontAwesomeIcons.solidKey, + title: 'Send-Token', + values: [this.account.tokenSend!], + iconActions: [(FontAwesomeIcons.copy, null, () => _copy('Send-Token', this.account.tokenSend!))], + ), + const SizedBox(height: 4), + if (this.account.tokenSend != null) + UI.metaCard( + context: context, + icon: FontAwesomeIcons.solidKey, + title: 'Admin-Token', + values: [this.account.tokenAdmin!], + iconActions: [(FontAwesomeIcons.copy, null, () => _copy('Admin-Token', this.account.tokenAdmin!))], + ), + ], + ), + ), + ), + actions: [ + TextButton( + child: const Text('Close'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + } + + void _copy(String txt, String v) { + Clipboard.setData(new ClipboardData(text: v)); + Toaster.info("Clipboard", 'Copied ${txt} to Clipboard'); + print('================= [CLIPBOARD] =================\n${v}\n================= [/CLIPBOARD] ================='); + } +} diff --git a/flutter/lib/pages/keytoken_list/keytoken_create_modal.dart b/flutter/lib/pages/keytoken_list/keytoken_create_modal.dart index 285a7e4..2e36f6e 100644 --- a/flutter/lib/pages/keytoken_list/keytoken_create_modal.dart +++ b/flutter/lib/pages/keytoken_list/keytoken_create_modal.dart @@ -52,7 +52,7 @@ class _KeyTokenCreateDialogState extends State { return AlertDialog( title: const Text('Create new key'), content: Container( - width: 0, + width: 9000, height: 400, child: SingleChildScrollView( child: Column( diff --git a/flutter/lib/pages/keytoken_list/keytoken_created_modal.dart b/flutter/lib/pages/keytoken_list/keytoken_created_modal.dart index 57ae4a4..3dcb022 100644 --- a/flutter/lib/pages/keytoken_list/keytoken_created_modal.dart +++ b/flutter/lib/pages/keytoken_list/keytoken_created_modal.dart @@ -21,7 +21,7 @@ class KeyTokenCreatedModal extends StatelessWidget { return AlertDialog( title: const Text('A new key was created'), content: Container( - width: 0, + width: 9000, height: 350, child: SingleChildScrollView( child: Column( diff --git a/flutter/lib/pages/keytoken_view/keytoken_channel_modal.dart b/flutter/lib/pages/keytoken_view/keytoken_channel_modal.dart index c4ffeb4..21ca622 100644 --- a/flutter/lib/pages/keytoken_view/keytoken_channel_modal.dart +++ b/flutter/lib/pages/keytoken_view/keytoken_channel_modal.dart @@ -40,7 +40,7 @@ class _EditKeyTokenChannelsDialogState extends State return AlertDialog( title: const Text('Channels'), content: Container( - width: 0, + width: 9000, height: 400, child: Column( children: [ diff --git a/flutter/lib/pages/keytoken_view/keytoken_permission_modal.dart b/flutter/lib/pages/keytoken_view/keytoken_permission_modal.dart index deab35e..ce8dc2c 100644 --- a/flutter/lib/pages/keytoken_view/keytoken_permission_modal.dart +++ b/flutter/lib/pages/keytoken_view/keytoken_permission_modal.dart @@ -33,7 +33,7 @@ class _EditKeyTokenPermissionsDialogState extends State=3.2.6 <4.0.0'