Use logging library

This commit is contained in:
2024-12-21 22:04:20 +01:00
parent ff7c01c166
commit ba83b5ebf8
6 changed files with 72 additions and 25 deletions

View File

@@ -1,13 +1,14 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart'; // For cache storage import 'package:path_provider/path_provider.dart'; // For cache storage
import 'sheet.dart'; import 'sheet.dart';
class ApiClient { class ApiClient {
final log = Logger("ApiClient");
final String baseUrl; final String baseUrl;
String? token; String? token;
@@ -15,7 +16,7 @@ class ApiClient {
/// Login and store the JWT token /// Login and store the JWT token
Future<bool> login(String username, String password) async { Future<bool> login(String username, String password) async {
log("Logging in..."); log.info("Logging in...");
try { try {
final url = '$baseUrl/login'; final url = '$baseUrl/login';
final response = await http.post( final response = await http.post(
@@ -29,13 +30,13 @@ class ApiClient {
if (response.statusCode == 200) { if (response.statusCode == 200) {
token = jsonDecode(response.body); token = jsonDecode(response.body);
log('Login successful'); log.info('Login successful');
return true; return true;
} else { } else {
log('Login failed: ${response.statusCode}, ${response.body}'); log.warning('Login failed: ${response.statusCode}, ${response.body}');
} }
} catch (e) { } catch (e) {
log('Error during login: $e'); log.warning('Error during login', e);
} }
return false; return false;
} }
@@ -43,7 +44,7 @@ class ApiClient {
/// Logout and clear the token /// Logout and clear the token
void logout() { void logout() {
token = null; token = null;
log('Logged out successfully.'); log.info('Logged out successfully.');
} }
/// Make a GET request /// Make a GET request
@@ -60,10 +61,11 @@ class ApiClient {
if (response.statusCode == 200) { if (response.statusCode == 200) {
return response; return response;
} else { } else {
log('GET request failed: ${response.statusCode} ${response.body}'); log.warning(
'GET request failed: ${response.statusCode} ${response.body}');
} }
} catch (e) { } catch (e) {
log('Error during GET request: $e'); log.warning('Error during GET request', e);
} }
return null; return null;
} }
@@ -87,10 +89,11 @@ class ApiClient {
if (response.statusCode == 200 || response.statusCode == 201) { if (response.statusCode == 200 || response.statusCode == 201) {
return response; return response;
} else { } else {
log('POST request failed: ${response.statusCode} ${response.body}'); log.info(
'POST request failed: ${response.statusCode} ${response.body}');
} }
} catch (e) { } catch (e) {
log('Error during POST request: $e'); log.info('Error during POST request: $e');
} }
return null; return null;
} }
@@ -113,10 +116,11 @@ class ApiClient {
if (response.statusCode == 200 || response.statusCode == 201) { if (response.statusCode == 200 || response.statusCode == 201) {
return response; return response;
} else { } else {
log('POST Form Data request failed: ${response.statusCode} ${response.body}'); log.info(
'POST Form Data request failed: ${response.statusCode} ${response.body}');
} }
} catch (e) { } catch (e) {
log('Error during POST Form Data request: $e'); log.info('Error during POST Form Data request: $e');
} }
return null; return null;
} }
@@ -131,16 +135,16 @@ class ApiClient {
if (response.statusCode == 200) { if (response.statusCode == 200) {
final data = jsonDecode(response.body); final data = jsonDecode(response.body);
log("Data: $data");
return (data as List<dynamic>) return (data as List<dynamic>)
.map((sheet) => Sheet.fromJson(sheet as Map<String, dynamic>)) .map((sheet) => Sheet.fromJson(sheet as Map<String, dynamic>))
.toList(); .toList();
} else { } else {
log('Failed to fetch sheets with status: ${response.statusCode}'); log.warning(
log('Response: ${response.body}'); 'Failed to fetch sheets with status: ${response.statusCode}');
log.info('Response: ${response.body}');
} }
} catch (e) { } catch (e) {
log('Error during fetching sheets: $e'); log.warning('Error during fetching sheets', e);
} }
return List.empty(); return List.empty();
@@ -160,7 +164,7 @@ class ApiClient {
final cachedFile = File(cachedPdfPath); final cachedFile = File(cachedPdfPath);
if (await cachedFile.exists()) { if (await cachedFile.exists()) {
log("PDF found in cache: $cachedPdfPath"); log.info("PDF found in cache: $cachedPdfPath");
return cachedFile; return cachedFile;
} }
@@ -172,13 +176,14 @@ class ApiClient {
// Save the fetched file to the cache // Save the fetched file to the cache
// //
await cachedFile.writeAsBytes(response.bodyBytes); await cachedFile.writeAsBytes(response.bodyBytes);
log("PDF downloaded and cached at: $cachedPdfPath"); log.info("PDF downloaded and cached at: $cachedPdfPath");
return cachedFile; return cachedFile;
} else { } else {
log("Failed to fetch PDF from API. Status: ${response?.statusCode}"); log.warning(
"Failed to fetch PDF from API. Status: ${response?.statusCode}");
} }
} catch (e) { } catch (e) {
log("Error fetching PDF: $e"); log.warning("Error fetching PDF", e);
} }
return null; return null;

View File

@@ -1,6 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:sheetless/sheet_viewer_page.dart'; import 'package:sheetless/sheet_viewer_page.dart';
import 'package:sheetless/storage_helper.dart'; import 'package:sheetless/storage_helper.dart';
@@ -18,6 +17,7 @@ class _MyHomePageState extends State<MyHomePage> {
ApiClient? apiClient; ApiClient? apiClient;
Future<bool> apiLoggedIn = Future.value(false); Future<bool> apiLoggedIn = Future.value(false);
final StorageHelper _storageHelper = StorageHelper(); final StorageHelper _storageHelper = StorageHelper();
final log = Logger("MyHomePage");
@override @override
void initState() { void initState() {
@@ -40,7 +40,7 @@ class _MyHomePageState extends State<MyHomePage> {
apiClient = ApiClient(baseUrl: url!, token: jwt); apiClient = ApiClient(baseUrl: url!, token: jwt);
// TODO: check if really logged in // TODO: check if really logged in
final sheets = await apiClient!.fetchSheets(); final sheets = await apiClient!.fetchSheets();
log("${sheets.length} sheets fetched"); log.info("${sheets.length} sheets fetched");
return sheets; return sheets;
// return api.main(); // return api.main();

View File

@@ -1,8 +1,17 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'login_page.dart'; import 'login_page.dart';
void main() { void main() {
Logger.root.level = Level.ALL; // defaults to Level.INFO
Logger.root.onRecord.listen((record) {
debugPrint('${record.level.name}: ${record.time}: ${record.message}');
if (record.error != null) {
debugPrint('${record.error}');
}
});
runApp(const MyApp()); runApp(const MyApp());
} }

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pdfrx/pdfrx.dart'; import 'package:pdfrx/pdfrx.dart';
import 'package:sheetless/api.dart'; import 'package:sheetless/api.dart';
import 'package:sheetless/sheet.dart'; import 'package:sheetless/sheet.dart';
@@ -17,6 +18,7 @@ class SheetViewerPage extends StatefulWidget {
class _SheetViewerPageState extends State<SheetViewerPage> { class _SheetViewerPageState extends State<SheetViewerPage> {
int page = 1; int page = 1;
int numPages = 1; int numPages = 1;
bool isFullscreen = false;
@override @override
void initState() { void initState() {
@@ -34,9 +36,23 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
return document; return document;
} }
void toggleFullscreen() {
isFullscreen = !isFullscreen;
if (isFullscreen) {
print("enter fullscreen");
// enter fullscreen
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky,
overlays: []);
} else {
// exit fullscreen
print("exit fullscreen");
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge,
overlays: SystemUiOverlay.values);
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print("Building with page: $page");
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(widget.sheet.name), title: Text(widget.sheet.name),
@@ -54,8 +70,16 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
// Get the size of the screen // Get the size of the screen
final screenWidth = MediaQuery.of(context).size.width; final screenWidth = MediaQuery.of(context).size.width;
print("Touch at y = ${details.localPosition.dy}");
print("Touch at x = ${details.localPosition.dx}");
print("Screenwidth = ${screenWidth}");
// Check where the user tapped // Check where the user tapped
if (details.localPosition.dx < screenWidth / 2) { if (details.localPosition.dy < 100) {
// TODO
// setState(() {
// toggleFullscreen();
// });
} else if (details.localPosition.dx < screenWidth / 2) {
// Left half of the screen // Left half of the screen
setState(() { setState(() {
page = page > 1 ? page - 1 : 1; page = page > 1 ? page - 1 : 1;

View File

@@ -256,6 +256,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.0" version: "5.0.0"
logging:
dependency: "direct main"
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
source: hosted
version: "1.3.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:

View File

@@ -45,6 +45,7 @@ dependencies:
flutter_secure_storage: ^9.2.2 flutter_secure_storage: ^9.2.2
jwt_decoder: ^2.0.1 jwt_decoder: ^2.0.1
pdfrx: ^1.0.94 pdfrx: ^1.0.94
logging: ^1.3.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: