mirror of
https://github.com/go-vikunja/app
synced 2024-06-14 08:24:18 +00:00
implemented login by webview of frontend
This commit is contained in:
parent
8681a3267e
commit
32cdfea6d0
|
@ -17,7 +17,8 @@
|
|||
FlutterApplication and put your custom class here. -->
|
||||
<application
|
||||
android:label="Vikunja"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:usesCleartextTraffic="true">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:launchMode="singleTop"
|
||||
|
|
|
@ -13,6 +13,7 @@ class Client {
|
|||
bool authenticated;
|
||||
|
||||
String get base => _base;
|
||||
String get token => _token;
|
||||
|
||||
Client(this._token, String base, {this.authenticated = true})
|
||||
: _base = base.endsWith('/api/v1') ? base : '$base/api/v1';
|
||||
|
|
|
@ -1,10 +1,16 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vikunja_app/api/client.dart';
|
||||
import 'package:vikunja_app/api/user_implementation.dart';
|
||||
import 'package:vikunja_app/global.dart';
|
||||
import 'package:vikunja_app/pages/user/login_webview.dart';
|
||||
import 'package:vikunja_app/pages/user/register.dart';
|
||||
import 'package:vikunja_app/theme/button.dart';
|
||||
import 'package:vikunja_app/theme/buttonText.dart';
|
||||
import 'package:vikunja_app/theme/constants.dart';
|
||||
import 'package:vikunja_app/utils/validator.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class LoginPage extends StatefulWidget {
|
||||
@override
|
||||
|
@ -129,6 +135,18 @@ class _LoginPageState extends State<LoginPage> {
|
|||
builder: (context) => RegisterPage())),
|
||||
child: VikunjaButtonText('Register'),
|
||||
)),
|
||||
Builder(builder: (context) => FancyButton(
|
||||
onPressed: () {
|
||||
if(_formKey.currentState.validate()) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) =>
|
||||
LoginWithWebView(_serverController.text))).then((client) => _loginUserByClientToken(client));
|
||||
} else {
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Please enter your frontend url")));
|
||||
}
|
||||
},
|
||||
child: VikunjaButtonText("Login with Frontend")))
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -170,4 +188,17 @@ class _LoginPageState extends State<LoginPage> {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
_loginUserByClientToken(Client client) async {
|
||||
setState(() => _loading = true);
|
||||
try {
|
||||
var newUser = await UserAPIService(client).getCurrentUser();
|
||||
VikunjaGlobal.of(context).changeUser(
|
||||
newUser, token: client.token, base: client.base);
|
||||
} catch (e) {
|
||||
log(e.toString());
|
||||
}
|
||||
setState(() => _loading = false);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
58
lib/pages/user/login_webview.dart
Normal file
58
lib/pages/user/login_webview.dart
Normal file
|
@ -0,0 +1,58 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vikunja_app/models/user.dart';
|
||||
import 'package:vikunja_app/api/client.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class LoginWithWebView extends StatefulWidget {
|
||||
String frontEndUrl;
|
||||
|
||||
LoginWithWebView(this.frontEndUrl);
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => LoginWithWebViewState();
|
||||
}
|
||||
|
||||
class LoginWithWebViewState extends State<LoginWithWebView> {
|
||||
|
||||
WebView webView;
|
||||
WebViewController webViewController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
webView = WebView(
|
||||
initialUrl: widget.frontEndUrl,
|
||||
javascriptMode: JavascriptMode.unrestricted,
|
||||
onPageFinished: (value) => _handlePageFinished(value),
|
||||
onWebViewCreated: (controller) => webViewController = controller,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: webView
|
||||
);
|
||||
}
|
||||
|
||||
void _handlePageFinished(String value) {
|
||||
log("handlePageFinished");
|
||||
if(webView != null)
|
||||
webViewController.runJavascriptReturningResult("JSON.stringify(localStorage);").then((value) {
|
||||
if(value != "null") {
|
||||
value = value.replaceAll("\\", "");
|
||||
value = value.substring(1,value.length-1);
|
||||
var json = jsonDecode(value);
|
||||
if (json["API_URL"] != null && json["token"] != null) {
|
||||
Client client = Client(json["token"], json["API_URL"]);
|
||||
Navigator.pop(context, client);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -23,6 +23,7 @@ dependencies:
|
|||
json_serializable: 6.1.6
|
||||
petitparser: 4.1.0
|
||||
provider: 6.0.0
|
||||
webview_flutter: 3.0.2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
Loading…
Reference in New Issue
Block a user