Add hook to terminate a session
This commit is contained in:
parent
3fbcd6a62d
commit
ae5cd428b8
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue