Use logging library
This commit is contained in:
45
lib/api.dart
45
lib/api.dart
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user