Add hook to terminate a session

This commit is contained in:
vishnukvmd 2021-11-24 01:24:47 +05:30
parent 3fbcd6a62d
commit ae5cd428b8

View file

@ -5,6 +5,7 @@ import 'package:photos/models/sessions.dart';
import 'package:photos/services/user_service.dart';
import 'package:photos/ui/loading_widget.dart';
import 'package:photos/utils/date_time_util.dart';
import 'package:photos/utils/dialog_util.dart';
import 'package:user_agent_parser/user_agent_parser.dart';
class SessionsPage extends StatefulWidget {
@ -48,37 +49,50 @@ class _SessionsPageState extends State<SessionsPage> {
Widget _getSessionWidget(Session session) {
final lastUsedTime =
DateTime.fromMicrosecondsSinceEpoch(session.lastUsedTime);
return Column(
children: [
Padding(padding: EdgeInsets.all(8)),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_getPrettyUA(session)),
Padding(padding: EdgeInsets.all(4)),
Text(
session.ip,
style: TextStyle(
color: Colors.white.withOpacity(0.8),
return InkWell(
onTap: () async {
_showSessionTerminationDialog(session);
},
child: Column(
children: [
Padding(padding: EdgeInsets.all(8)),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_getPrettyUA(session)),
Padding(padding: EdgeInsets.all(4)),
Text(
session.ip,
style: TextStyle(
color: Colors.white.withOpacity(0.8),
),
),
),
],
),
Text(getFormattedTime(lastUsedTime)),
],
],
),
Text(getFormattedTime(lastUsedTime)),
],
),
),
),
Padding(padding: EdgeInsets.all(8)),
Divider(),
],
Padding(padding: EdgeInsets.all(8)),
Divider(),
],
),
);
}
Future<void> _terminateSession(Session session) async {
final dialog = createProgressDialog(context, "please wait...");
await dialog.show();
await UserService.instance.terminateSession(session.token);
await _fetchActiveSessions();
await dialog.hide();
}
Future<void> _fetchActiveSessions() async {
_sessions = await UserService.instance.getActiveSessions();
for (final session in _sessions.sessions) {
@ -87,6 +101,47 @@ class _SessionsPageState extends State<SessionsPage> {
setState(() {});
}
void _showSessionTerminationDialog(Session session) {
AlertDialog alert = AlertDialog(
title: Text("terminate session?"),
content: Text(
"this will log you out of the selected device",
),
actions: [
TextButton(
child: Text(
"terminate",
style: TextStyle(
color: Colors.red,
),
),
onPressed: () async {
Navigator.of(context, rootNavigator: true).pop('dialog');
_terminateSession(session);
},
),
TextButton(
child: Text(
"cancel",
style: TextStyle(
color: Colors.white,
),
),
onPressed: () {
Navigator.of(context, rootNavigator: true).pop('dialog');
},
),
],
);
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
String _getPrettyUA(Session session) {
final parsedUA = _userAgentParser.parseResult(session.userAgent);
return parsedUA.browser == null