Skip to content

Commit

Permalink
A few enhancements to the Session Details screen (#51)
Browse files Browse the repository at this point in the history
* obfuscate secrets and tokens but allow to copy them with a tap

* add a missing const

* add an icon to the log out button

* fix small screen support
  • Loading branch information
casimir authored Aug 8, 2023
1 parent 98b61c3 commit e7bab3f
Showing 1 changed file with 61 additions and 12 deletions.
73 changes: 61 additions & 12 deletions lib/pages/session_details.dart
Original file line number Diff line number Diff line change
@@ -1,45 +1,93 @@
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:frigoligo/wallabag/wallabag.dart';
import 'package:provider/provider.dart';

import '../models/db.dart';
import '../providers/settings.dart';

Widget _copyText(BuildContext context, String text, [bool obfuscate = false]) {
var content = text;
if (obfuscate) {
const showLen = 8;
final prefix = text.substring(0, showLen);
final suffix = text.substring(text.length - showLen);
content = '$prefix...$suffix';
}
return InkWell(
onTap: () async {
await Clipboard.setData(ClipboardData(text: content));
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Copied to your clipboard!')));
}
},
child: Text(content, style: const TextStyle(fontFamily: 'monospace')),
);
}

class SessionDetailsPage extends StatelessWidget {
const SessionDetailsPage({super.key});

@override
Widget build(BuildContext context) {
final settings = context.read<SettingsProvider>();
final wallabag = WallabagInstance.get();

String sinceLastSync = 'never';
final lastSync = settings[Sk.lastRefresh];
if (lastSync > 0) {
final now = DateTime.now().millisecondsSinceEpoch / 1000;
final elapsed = now - lastSync;
if (elapsed < 1000) {
sinceLastSync = '${elapsed.toStringAsFixed(0)} seconds ago';
} else {
final asMinutes = elapsed / 60;
sinceLastSync = '${asMinutes.toStringAsFixed(0)} minutes ago';
}
}
final accessToken = wallabag.tokenData?.accessToken;
final accessTokenValidity = wallabag.tokenData != null
? wallabag.tokenData!.expiresIn.toIso8601String()
: 'invalid';

return Scaffold(
appBar: AppBar(
title: const Text('Session details'),
),
body: Column(
body: ListView(
children: [
ListTile(
title: const Text('Server'),
subtitle: Text(wallabag.connectionData.server),
subtitle:
_copyText(context, 'https://${wallabag.connectionData.server}'),
),
ListTile(
title: const Text('Client ID'),
subtitle: Text(wallabag.connectionData.clientId),
subtitle:
_copyText(context, wallabag.connectionData.clientId, true),
),
ListTile(
title: const Text('Client secret'),
subtitle: Text(wallabag.connectionData.clientSecret),
subtitle:
_copyText(context, wallabag.connectionData.clientSecret, true),
),
ListTile(
title: const Text('Access token'),
subtitle:
_copyText(context, accessToken.toString(), accessToken != null),
),
ListTile(
title: const Text('Token valid until'),
subtitle: Text(accessTokenValidity),
),
ListTile(
title: const Text('Token data'),
subtitle: Text(
wallabag.tokenData != null
? wallabag.tokenData!.toJson().toString()
: 'none',
),
title: const Text('Last server sync'),
subtitle: Text(sinceLastSync),
),
ElevatedButton(
const SizedBox(height: 8.0),
ElevatedButton.icon(
onPressed: () async {
final result = await showOkCancelAlertDialog(
context: context,
Expand All @@ -58,7 +106,8 @@ class SessionDetailsPage extends StatelessWidget {
.pushNamedAndRemoveUntil('/', (r) => false);
}
},
child: const Text('Log out session'),
icon: const Icon(Icons.logout),
label: const Text('Log out session'),
),
],
),
Expand Down

0 comments on commit e7bab3f

Please sign in to comment.