From d43702a2c783fb0ad9f69deb025bc78a74e144ec Mon Sep 17 00:00:00 2001 From: doman Date: Sat, 29 Jul 2023 20:01:56 +0200 Subject: [PATCH] RADOM JAXDA --- lib/client.dart | 38 ++++++++++++++++++++++++++++++++ lib/main.dart | 27 ++++++++++++++++++++++- lib/screens/login.dart | 29 ++++++++++++++++++++++--- lib/screens/main.dart | 49 ++++++------------------------------------ 4 files changed, 96 insertions(+), 47 deletions(-) diff --git a/lib/client.dart b/lib/client.dart index b055b14..3fd8c2e 100644 --- a/lib/client.dart +++ b/lib/client.dart @@ -42,6 +42,11 @@ class ApiClient { Uri.parse('$baseUrl$path'), headers: headers(), ); + + if (response.statusCode != 200) { + throw Exception('Response returned status code: ${response.statusCode}'); + } + return jsonDecode(response.body); } @@ -51,6 +56,11 @@ class ApiClient { body: jsonEncode(body), headers: headers(), ); + + if (response.statusCode != 200) { + throw Exception('Response returned status code: ${response.statusCode}'); + } + return jsonDecode(response.body); } @@ -60,6 +70,11 @@ class ApiClient { Uri.parse('$baseUrl$path'), headers: headers(), ); + + if (response.statusCode != 200) { + throw Exception('Response returned status code: ${response.statusCode}'); + } + return jsonDecode(response.body); } @@ -69,6 +84,11 @@ class ApiClient { body: jsonEncode(body), headers: headers(), ); + + if (response.statusCode != 200) { + throw Exception('Response returned status code: ${response.statusCode}'); + } + return jsonDecode(response.body); } @@ -99,4 +119,22 @@ class ApiClient { this.refreshToken = refreshToken; window.localStorage['refreshToken'] = refreshToken; } + + Future refresh() async { + if (refreshToken == null) { + throw Exception("No valid refresh token found"); + } + + final response = await post( + "/token/refresh", + { + "refresh_token": refreshToken, + } + ); + + token = response['access_token'] as String; + window.localStorage['token'] = token!; + refreshToken = response['refresh_token'] as String; + window.localStorage['refreshToken'] = refreshToken!; + } } diff --git a/lib/main.dart b/lib/main.dart index d4fc7e6..f3434ac 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,30 @@ import 'package:flutter/material.dart'; -import 'package:fooder_web/screens/main.dart'; +import 'package:fooder_web/screens/login.dart'; +import 'package:fooder_web/client.dart'; + + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blueGrey, + brightness: Brightness.dark, + ), + useMaterial3: true, + ), + home: LoginScreen( + apiClient: ApiClient( + baseUrl: 'https://fooderapi.domandoman.xyz/api', + ), + ), + ); + } +} void main() { diff --git a/lib/screens/login.dart b/lib/screens/login.dart index f1b7118..d236658 100644 --- a/lib/screens/login.dart +++ b/lib/screens/login.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:fooder_web/screens/based.dart'; +import 'package:fooder_web/screens/main.dart'; class LoginScreen extends BasedScreen { @@ -42,11 +43,16 @@ class _LoginScreen extends State { } void popMeDady() { - Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MainScreen(apiClient: widget.apiClient), + ), + ); } // login client when button pressed - void _login() async { + Future _login() async { try { await widget.apiClient.login( usernameController.text, @@ -58,13 +64,30 @@ class _LoginScreen extends State { showError(e.toString()); } } + @override + void initState () { + super.initState(); + _asyncInitState().then((value) => null); + } + + Future _asyncInitState() async { + super.initState(); + + try { + await widget.apiClient.refresh(); + showText("Welcome back!"); + popMeDady(); + } on Exception catch (_) { + showError("Session is not longer valid, please log in again"); + } + } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, - title: const Text("FOODER login"), + title: const Text("FOODER"), ), body: Center( child: Container( diff --git a/lib/screens/main.dart b/lib/screens/main.dart index dfa5867..2a0b40c 100644 --- a/lib/screens/main.dart +++ b/lib/screens/main.dart @@ -1,56 +1,19 @@ import 'package:flutter/material.dart'; import 'package:fooder_web/screens/based.dart'; -import 'package:fooder_web/screens/login.dart'; -import 'package:fooder_web/client.dart'; import 'package:fooder_web/models/meal.dart'; import 'package:fooder_web/models/entry.dart'; import 'package:fooder_web/models/diary.dart'; import 'package:fooder_web/widgets/diary.dart'; -class MyApp extends StatelessWidget { - const MyApp({super.key}); + +class MainScreen extends BasedScreen { + const MainScreen({super.key, required super.apiClient}); @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.blueGrey, - brightness: Brightness.dark, - ), - useMaterial3: true, - ), - home: MyHomePage( - apiClient: ApiClient( - baseUrl: 'https://fooderapi.domandoman.xyz/api', - ), - title: 'FOODER', - ), - ); - } + State createState() => _MainScreen(); } -class MyHomePage extends BasedScreen { - final String title; - - const MyHomePage({super.key, required super.apiClient, required this.title}); - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - // login client when button pressed - void _login() async { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => LoginScreen(apiClient: widget.apiClient), - ), - ); - } - +class _MainScreen extends State { @override Widget build(BuildContext context) { var testDiary = Diary( @@ -97,7 +60,7 @@ class _MyHomePageState extends State { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, - title: Text(widget.title), + title: Text("FOODER"), ), body: Center( child: Container(