diff --git a/lib/api.dart b/lib/api.dart index d6a8d32..fb7fc96 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -1,13 +1,14 @@ import 'dart:convert'; -import 'dart:developer'; import 'dart:io'; import 'package:http/http.dart' as http; +import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; // For cache storage import 'sheet.dart'; class ApiClient { + final log = Logger("ApiClient"); final String baseUrl; String? token; @@ -15,7 +16,7 @@ class ApiClient { /// Login and store the JWT token Future login(String username, String password) async { - log("Logging in..."); + log.info("Logging in..."); try { final url = '$baseUrl/login'; final response = await http.post( @@ -29,13 +30,13 @@ class ApiClient { if (response.statusCode == 200) { token = jsonDecode(response.body); - log('Login successful'); + log.info('Login successful'); return true; } else { - log('Login failed: ${response.statusCode}, ${response.body}'); + log.warning('Login failed: ${response.statusCode}, ${response.body}'); } } catch (e) { - log('Error during login: $e'); + log.warning('Error during login', e); } return false; } @@ -43,7 +44,7 @@ class ApiClient { /// Logout and clear the token void logout() { token = null; - log('Logged out successfully.'); + log.info('Logged out successfully.'); } /// Make a GET request @@ -60,10 +61,11 @@ class ApiClient { if (response.statusCode == 200) { return response; } else { - log('GET request failed: ${response.statusCode} ${response.body}'); + log.warning( + 'GET request failed: ${response.statusCode} ${response.body}'); } } catch (e) { - log('Error during GET request: $e'); + log.warning('Error during GET request', e); } return null; } @@ -87,10 +89,11 @@ class ApiClient { if (response.statusCode == 200 || response.statusCode == 201) { return response; } else { - log('POST request failed: ${response.statusCode} ${response.body}'); + log.info( + 'POST request failed: ${response.statusCode} ${response.body}'); } } catch (e) { - log('Error during POST request: $e'); + log.info('Error during POST request: $e'); } return null; } @@ -113,10 +116,11 @@ class ApiClient { if (response.statusCode == 200 || response.statusCode == 201) { return response; } else { - log('POST Form Data request failed: ${response.statusCode} ${response.body}'); + log.info( + 'POST Form Data request failed: ${response.statusCode} ${response.body}'); } } catch (e) { - log('Error during POST Form Data request: $e'); + log.info('Error during POST Form Data request: $e'); } return null; } @@ -131,16 +135,16 @@ class ApiClient { if (response.statusCode == 200) { final data = jsonDecode(response.body); - log("Data: $data"); return (data as List) .map((sheet) => Sheet.fromJson(sheet as Map)) .toList(); } else { - log('Failed to fetch sheets with status: ${response.statusCode}'); - log('Response: ${response.body}'); + log.warning( + 'Failed to fetch sheets with status: ${response.statusCode}'); + log.info('Response: ${response.body}'); } } catch (e) { - log('Error during fetching sheets: $e'); + log.warning('Error during fetching sheets', e); } return List.empty(); @@ -160,7 +164,7 @@ class ApiClient { final cachedFile = File(cachedPdfPath); if (await cachedFile.exists()) { - log("PDF found in cache: $cachedPdfPath"); + log.info("PDF found in cache: $cachedPdfPath"); return cachedFile; } @@ -172,13 +176,14 @@ class ApiClient { // Save the fetched file to the cache // await cachedFile.writeAsBytes(response.bodyBytes); - log("PDF downloaded and cached at: $cachedPdfPath"); + log.info("PDF downloaded and cached at: $cachedPdfPath"); return cachedFile; } else { - log("Failed to fetch PDF from API. Status: ${response?.statusCode}"); + log.warning( + "Failed to fetch PDF from API. Status: ${response?.statusCode}"); } } catch (e) { - log("Error fetching PDF: $e"); + log.warning("Error fetching PDF", e); } return null; diff --git a/lib/home_page.dart b/lib/home_page.dart index 050d09c..0082cf4 100644 --- a/lib/home_page.dart +++ b/lib/home_page.dart @@ -1,6 +1,5 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; import 'package:sheetless/sheet_viewer_page.dart'; import 'package:sheetless/storage_helper.dart'; @@ -18,6 +17,7 @@ class _MyHomePageState extends State { ApiClient? apiClient; Future apiLoggedIn = Future.value(false); final StorageHelper _storageHelper = StorageHelper(); + final log = Logger("MyHomePage"); @override void initState() { @@ -40,7 +40,7 @@ class _MyHomePageState extends State { apiClient = ApiClient(baseUrl: url!, token: jwt); // TODO: check if really logged in final sheets = await apiClient!.fetchSheets(); - log("${sheets.length} sheets fetched"); + log.info("${sheets.length} sheets fetched"); return sheets; // return api.main(); diff --git a/lib/main.dart b/lib/main.dart index 67e578a..de75764 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; import 'login_page.dart'; 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()); } diff --git a/lib/sheet_viewer_page.dart b/lib/sheet_viewer_page.dart index 154d425..4fecefe 100644 --- a/lib/sheet_viewer_page.dart +++ b/lib/sheet_viewer_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:pdfrx/pdfrx.dart'; import 'package:sheetless/api.dart'; import 'package:sheetless/sheet.dart'; @@ -17,6 +18,7 @@ class SheetViewerPage extends StatefulWidget { class _SheetViewerPageState extends State { int page = 1; int numPages = 1; + bool isFullscreen = false; @override void initState() { @@ -34,9 +36,23 @@ class _SheetViewerPageState extends State { 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 Widget build(BuildContext context) { - print("Building with page: $page"); return Scaffold( appBar: AppBar( title: Text(widget.sheet.name), @@ -54,8 +70,16 @@ class _SheetViewerPageState extends State { // Get the size of the screen 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 - 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 setState(() { page = page > 1 ? page - 1 : 1; diff --git a/pubspec.lock b/pubspec.lock index df637b5..0bff156 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -256,6 +256,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + logging: + dependency: "direct main" + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 56c7785..304d674 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: flutter_secure_storage: ^9.2.2 jwt_decoder: ^2.0.1 pdfrx: ^1.0.94 + logging: ^1.3.0 dev_dependencies: flutter_test: