loris/lib/pages/login/weblogin.dart

101 lines
2.5 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:localization/localization.dart';
import 'package:universal_html/html.dart' as html;
import 'package:loris/business_logic/auth/oauth.dart' as oauth;
class Weblogin extends StatefulWidget {
const Weblogin({Key? key, required this.url}) : super(key: key);
final String url;
@override
State<Weblogin> createState() => _WebloginState();
}
class _WebloginState extends State<Weblogin> {
bool doneLoading = false;
void doAuth() async {
final appresponse = await oauth.registerApp(widget.url);
if (appresponse.statusCode != 200) {
informAboutFailure(appresponse.statusCode);
return;
}
final app = oauth.App.fromJson(jsonDecode(appresponse.body));
var popupWin = html.window.open(
oauth.getAuthUrl(widget.url, app).toString(),
"loris",
);
html.window.onMessage.listen((event) async {
final uri = Uri.parse(event.data);
if (uri.queryParameters.containsKey("code")) {
popupWin.close();
final token = await oauth.getToken(
uri.queryParameters["code"]!,
app.clientId,
app.clientSecret,
widget.url,
);
await oauth.saveIdentity(token, widget.url, app.clientId,
app.clientSecret, uri.queryParameters["code"]!);
setState(() {
doneLoading = true;
});
}
});
}
void informAboutFailure(int i) {
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("error: $i")));
}
@override
void initState() {
super.initState();
doAuth();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
SelectableText(widget.url),
doneLoading
? TextButton.icon(
onPressed: () {
Navigator.of(context).pushReplacementNamed("/");
},
icon: const Icon(
Icons.navigate_next,
),
label: Text(
"jack-in".i18n(),
),
)
: const LoadingIndicator(),
],
),
);
}
}
class LoadingIndicator extends StatelessWidget {
const LoadingIndicator({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Wrap(
alignment: WrapAlignment.center,
spacing: 24,
children: [
const CircularProgressIndicator(),
SelectableText("jacking-in".i18n()),
],
);
}
}