RADOM JAXDA
This commit is contained in:
		
							parent
							
								
									99fc05ce72
								
							
						
					
					
						commit
						d43702a2c7
					
				
					 4 changed files with 96 additions and 47 deletions
				
			
		| 
						 | 
					@ -42,6 +42,11 @@ class ApiClient {
 | 
				
			||||||
      Uri.parse('$baseUrl$path'),
 | 
					      Uri.parse('$baseUrl$path'),
 | 
				
			||||||
      headers: headers(),
 | 
					      headers: headers(),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (response.statusCode != 200) {
 | 
				
			||||||
 | 
					      throw Exception('Response returned status code: ${response.statusCode}');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return jsonDecode(response.body);
 | 
					    return jsonDecode(response.body);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,6 +56,11 @@ class ApiClient {
 | 
				
			||||||
      body: jsonEncode(body),
 | 
					      body: jsonEncode(body),
 | 
				
			||||||
      headers: headers(),
 | 
					      headers: headers(),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (response.statusCode != 200) {
 | 
				
			||||||
 | 
					      throw Exception('Response returned status code: ${response.statusCode}');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return jsonDecode(response.body);
 | 
					    return jsonDecode(response.body);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,6 +70,11 @@ class ApiClient {
 | 
				
			||||||
      Uri.parse('$baseUrl$path'),
 | 
					      Uri.parse('$baseUrl$path'),
 | 
				
			||||||
      headers: headers(),
 | 
					      headers: headers(),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (response.statusCode != 200) {
 | 
				
			||||||
 | 
					      throw Exception('Response returned status code: ${response.statusCode}');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return jsonDecode(response.body);
 | 
					    return jsonDecode(response.body);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,6 +84,11 @@ class ApiClient {
 | 
				
			||||||
      body: jsonEncode(body),
 | 
					      body: jsonEncode(body),
 | 
				
			||||||
      headers: headers(),
 | 
					      headers: headers(),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (response.statusCode != 200) {
 | 
				
			||||||
 | 
					      throw Exception('Response returned status code: ${response.statusCode}');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return jsonDecode(response.body);
 | 
					    return jsonDecode(response.body);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,4 +119,22 @@ class ApiClient {
 | 
				
			||||||
    this.refreshToken = refreshToken;
 | 
					    this.refreshToken = refreshToken;
 | 
				
			||||||
    window.localStorage['refreshToken'] = refreshToken;
 | 
					    window.localStorage['refreshToken'] = refreshToken;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> 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!;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,30 @@
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					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() {
 | 
					void main() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:fooder_web/screens/based.dart';
 | 
					import 'package:fooder_web/screens/based.dart';
 | 
				
			||||||
 | 
					import 'package:fooder_web/screens/main.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LoginScreen extends BasedScreen {
 | 
					class LoginScreen extends BasedScreen {
 | 
				
			||||||
| 
						 | 
					@ -42,11 +43,16 @@ class _LoginScreen extends State<LoginScreen> {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void popMeDady() {
 | 
					  void popMeDady() {
 | 
				
			||||||
    Navigator.pop(context);
 | 
					    Navigator.push(
 | 
				
			||||||
 | 
					      context,
 | 
				
			||||||
 | 
					      MaterialPageRoute(
 | 
				
			||||||
 | 
					        builder: (context) => MainScreen(apiClient: widget.apiClient),
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // login client when button pressed
 | 
					  // login client when button pressed
 | 
				
			||||||
  void _login() async {
 | 
					  Future<void> _login() async {
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      await widget.apiClient.login(
 | 
					      await widget.apiClient.login(
 | 
				
			||||||
        usernameController.text,
 | 
					        usernameController.text,
 | 
				
			||||||
| 
						 | 
					@ -58,13 +64,30 @@ class _LoginScreen extends State<LoginScreen> {
 | 
				
			||||||
      showError(e.toString());
 | 
					      showError(e.toString());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  void initState () {
 | 
				
			||||||
 | 
					    super.initState();
 | 
				
			||||||
 | 
					    _asyncInitState().then((value) => null);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> _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
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return Scaffold(
 | 
					    return Scaffold(
 | 
				
			||||||
      appBar: AppBar(
 | 
					      appBar: AppBar(
 | 
				
			||||||
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
 | 
					        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
 | 
				
			||||||
        title: const Text("FOODER login"),
 | 
					        title: const Text("FOODER"),
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
      body: Center(
 | 
					      body: Center(
 | 
				
			||||||
        child: Container(
 | 
					        child: Container(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,56 +1,19 @@
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:fooder_web/screens/based.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/meal.dart';
 | 
				
			||||||
import 'package:fooder_web/models/entry.dart';
 | 
					import 'package:fooder_web/models/entry.dart';
 | 
				
			||||||
import 'package:fooder_web/models/diary.dart';
 | 
					import 'package:fooder_web/models/diary.dart';
 | 
				
			||||||
import 'package:fooder_web/widgets/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
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  State<MainScreen> createState() => _MainScreen();
 | 
				
			||||||
    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',
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MyHomePage extends BasedScreen {
 | 
					class _MainScreen extends State<MainScreen> {
 | 
				
			||||||
  final String title;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const MyHomePage({super.key, required super.apiClient, required this.title});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					 | 
				
			||||||
  State<MyHomePage> createState() => _MyHomePageState();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class _MyHomePageState extends State<MyHomePage> {
 | 
					 | 
				
			||||||
  // login client when button pressed
 | 
					 | 
				
			||||||
  void _login() async {
 | 
					 | 
				
			||||||
    Navigator.push(
 | 
					 | 
				
			||||||
      context,
 | 
					 | 
				
			||||||
      MaterialPageRoute(
 | 
					 | 
				
			||||||
        builder: (context) => LoginScreen(apiClient: widget.apiClient),
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    var testDiary = Diary(
 | 
					    var testDiary = Diary(
 | 
				
			||||||
| 
						 | 
					@ -97,7 +60,7 @@ class _MyHomePageState extends State<MyHomePage> {
 | 
				
			||||||
    return Scaffold(
 | 
					    return Scaffold(
 | 
				
			||||||
      appBar: AppBar(
 | 
					      appBar: AppBar(
 | 
				
			||||||
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
 | 
					        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
 | 
				
			||||||
        title: Text(widget.title),
 | 
					        title: Text("FOODER"),
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
      body: Center(
 | 
					      body: Center(
 | 
				
			||||||
        child: Container(
 | 
					        child: Container(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue