Clean up code
This commit is contained in:
47
flake.nix
47
flake.nix
@@ -42,61 +42,16 @@
|
|||||||
includeNDK = true;
|
includeNDK = true;
|
||||||
ndkVersions = [ "25.1.8937393" ];
|
ndkVersions = [ "25.1.8937393" ];
|
||||||
};
|
};
|
||||||
# androidComposition = pkgs.androidenv.composeAndroidPackages {
|
|
||||||
# toolsVersion = "26.1.1";
|
|
||||||
# platformToolsVersion = "34.0.5";
|
|
||||||
# buildToolsVersions = [ "30.0.3" ];
|
|
||||||
# includeEmulator = false;
|
|
||||||
# emulatorVersion = "34.1.9";
|
|
||||||
# platformVersions = [
|
|
||||||
# "28"
|
|
||||||
# "29"
|
|
||||||
# "30"
|
|
||||||
# "31"
|
|
||||||
# "32"
|
|
||||||
# "33"
|
|
||||||
# "34"
|
|
||||||
# ];
|
|
||||||
# includeSources = false;
|
|
||||||
# includeSystemImages = false;
|
|
||||||
# systemImageTypes = [ "google_apis_playstore" ];
|
|
||||||
# abiVersions = [
|
|
||||||
# "armeabi-v7a"
|
|
||||||
# "arm64-v8a"
|
|
||||||
# ];
|
|
||||||
# cmakeVersions = [ "3.10.2" ];
|
|
||||||
# includeNDK = true;
|
|
||||||
# ndkVersions = [ "21.4.7075529" ];
|
|
||||||
# useGoogleAPIs = false;
|
|
||||||
# useGoogleTVAddOns = false;
|
|
||||||
# # buildToolsVersions = [ buildToolsVersion ];
|
|
||||||
# # platformVersions = [
|
|
||||||
# # "29"
|
|
||||||
# # "30"
|
|
||||||
# # "31"
|
|
||||||
# # "32"
|
|
||||||
# # "33"
|
|
||||||
# # "34"
|
|
||||||
# # "28"
|
|
||||||
# # ];
|
|
||||||
# # abiVersions = [
|
|
||||||
# # "armeabi-v7a"
|
|
||||||
# # "arm64-v8a"
|
|
||||||
# # ];
|
|
||||||
# };
|
|
||||||
androidSdk = androidComposition.androidsdk;
|
androidSdk = androidComposition.androidsdk;
|
||||||
platformTools = androidComposition.platform-tools;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
devShell =
|
devShell =
|
||||||
with pkgs;
|
with pkgs;
|
||||||
mkShell rec {
|
mkShell {
|
||||||
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
|
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
|
||||||
# JAVA_HOME = pkgs.jdk17;
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
flutter
|
flutter
|
||||||
androidSdk
|
androidSdk
|
||||||
# platformTools
|
|
||||||
jdk17
|
jdk17
|
||||||
|
|
||||||
# Needed by flutter_secure_storage
|
# Needed by flutter_secure_storage
|
||||||
|
|||||||
18
lib/api.dart
18
lib/api.dart
@@ -14,7 +14,6 @@ class ApiClient {
|
|||||||
|
|
||||||
ApiClient({required this.baseUrl, this.token});
|
ApiClient({required this.baseUrl, this.token});
|
||||||
|
|
||||||
/// Login and store the JWT token
|
|
||||||
Future<bool> login(String username, String password) async {
|
Future<bool> login(String username, String password) async {
|
||||||
log.info("Logging in...");
|
log.info("Logging in...");
|
||||||
try {
|
try {
|
||||||
@@ -41,13 +40,11 @@ class ApiClient {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Logout and clear the token
|
|
||||||
void logout() {
|
void logout() {
|
||||||
token = null;
|
token = null;
|
||||||
log.info('Logged out successfully.');
|
log.info('Logged out successfully.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Make a GET request
|
|
||||||
Future<http.Response?> get(String endpoint, {bool isBinary = false}) async {
|
Future<http.Response?> get(String endpoint, {bool isBinary = false}) async {
|
||||||
try {
|
try {
|
||||||
final url = '$baseUrl$endpoint';
|
final url = '$baseUrl$endpoint';
|
||||||
@@ -70,7 +67,6 @@ class ApiClient {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Make a POST request
|
|
||||||
Future<http.Response?> post(
|
Future<http.Response?> post(
|
||||||
String endpoint, Map<String, dynamic> body) async {
|
String endpoint, Map<String, dynamic> body) async {
|
||||||
try {
|
try {
|
||||||
@@ -98,7 +94,6 @@ class ApiClient {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Make a POST request with form data
|
|
||||||
Future<http.Response?> postFormData(String endpoint, String body) async {
|
Future<http.Response?> postFormData(String endpoint, String body) async {
|
||||||
try {
|
try {
|
||||||
final url = '$baseUrl$endpoint';
|
final url = '$baseUrl$endpoint';
|
||||||
@@ -152,29 +147,18 @@ class ApiClient {
|
|||||||
|
|
||||||
Future<File?> getPdfFileCached(String sheetUuid) async {
|
Future<File?> getPdfFileCached(String sheetUuid) async {
|
||||||
try {
|
try {
|
||||||
// Get the cache directory
|
|
||||||
|
|
||||||
// final cacheDir = kIsWeb
|
|
||||||
// ? await MemoryFileSystem().systemTempDirectory.createTemp('cache')
|
|
||||||
// : await getTemporaryDirectory();
|
|
||||||
final cacheDir = await getTemporaryDirectory();
|
final cacheDir = await getTemporaryDirectory();
|
||||||
final cachedPdfPath = '${cacheDir.path}/$sheetUuid.pdf';
|
final cachedPdfPath = '${cacheDir.path}/$sheetUuid.pdf';
|
||||||
|
|
||||||
// Check if the file already exists in the cache
|
|
||||||
final cachedFile = File(cachedPdfPath);
|
final cachedFile = File(cachedPdfPath);
|
||||||
|
|
||||||
if (await cachedFile.exists()) {
|
if (await cachedFile.exists()) {
|
||||||
log.info("PDF found in cache: $cachedPdfPath");
|
log.info("PDF found in cache: $cachedPdfPath");
|
||||||
return cachedFile;
|
return cachedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the authenticated API call
|
final response = await get('/sheet/pdf/$sheetUuid', isBinary: true);
|
||||||
|
|
||||||
final response = await this.get('/sheet/pdf/$sheetUuid', isBinary: true);
|
|
||||||
|
|
||||||
if (response != null && response.statusCode == 200) {
|
if (response != null && response.statusCode == 200) {
|
||||||
// Save the fetched file to the cache
|
|
||||||
//
|
|
||||||
await cachedFile.writeAsBytes(response.bodyBytes);
|
await cachedFile.writeAsBytes(response.bodyBytes);
|
||||||
log.info("PDF downloaded and cached at: $cachedPdfPath");
|
log.info("PDF downloaded and cached at: $cachedPdfPath");
|
||||||
return cachedFile;
|
return cachedFile;
|
||||||
|
|||||||
@@ -24,16 +24,6 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Future<String?> getSafPickedSheetsDirectory() async {
|
|
||||||
// await Permission.storage.request();
|
|
||||||
// await Permission.manageExternalStorage.request();
|
|
||||||
// var pickedDirectories = await Saf.getPersistedPermissionDirectories();
|
|
||||||
// if (pickedDirectories == null || pickedDirectories.isEmpty) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// return pickedDirectories.last;
|
|
||||||
// }
|
|
||||||
|
|
||||||
Future<List<Sheet>> acquireSheets() async {
|
Future<List<Sheet>> acquireSheets() async {
|
||||||
final url = await _storageHelper.read(StorageKey.url);
|
final url = await _storageHelper.read(StorageKey.url);
|
||||||
final jwt = await _storageHelper.read(StorageKey.jwt);
|
final jwt = await _storageHelper.read(StorageKey.jwt);
|
||||||
@@ -42,27 +32,6 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
final sheets = await apiClient!.fetchSheets();
|
final sheets = await apiClient!.fetchSheets();
|
||||||
log.info("${sheets.length} sheets fetched");
|
log.info("${sheets.length} sheets fetched");
|
||||||
return sheets;
|
return sheets;
|
||||||
// return api.main();
|
|
||||||
|
|
||||||
// final directory = await getApplicationDocumentsDirectory();
|
|
||||||
// print("Directory is: $directory");
|
|
||||||
// String? sheetsDirectory = "/home/julian/Klavier";
|
|
||||||
// if (sheetsDirectory == null || sheetsDirectory.isEmpty) {
|
|
||||||
// await Saf.getDynamicDirectoryPermission(grantWritePermission: false);
|
|
||||||
// sheetsDirectory = "/home/julian/Klavier";
|
|
||||||
// if (sheetsDirectory == null || sheetsDirectory.isEmpty) {
|
|
||||||
// throw Exception("No Directory selected");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return List.empty();
|
|
||||||
|
|
||||||
// var sheetsDirectoryFiles = await Saf.getFilesPathFor(sheetsDirectory);
|
|
||||||
// if (sheetsDirectoryFiles == null) {
|
|
||||||
// await Saf.releasePersistedPermissions();
|
|
||||||
// throw Exception(
|
|
||||||
// "Permissions for directory no longer valid or Directory deleted. Please restart app.");
|
|
||||||
// }
|
|
||||||
// return loadSheetsSorted(sheetsDirectoryFiles);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:developer';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:jwt_decoder/jwt_decoder.dart';
|
import 'package:jwt_decoder/jwt_decoder.dart';
|
||||||
import 'package:sheetless/api.dart';
|
import 'package:sheetless/api.dart';
|
||||||
import 'package:sheetless/home_page.dart';
|
import 'package:sheetless/home_page.dart';
|
||||||
@@ -12,7 +8,7 @@ class LoginPage extends StatefulWidget {
|
|||||||
const LoginPage({super.key});
|
const LoginPage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_LoginPageState createState() => _LoginPageState();
|
State<LoginPage> createState() => _LoginPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _LoginPageState extends State<LoginPage> {
|
class _LoginPageState extends State<LoginPage> {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class SheetsWidget extends StatefulWidget {
|
|||||||
const SheetsWidget({super.key, required this.sheets, required this.callback});
|
const SheetsWidget({super.key, required this.sheets, required this.callback});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_SheetsWidgetState createState() => _SheetsWidgetState();
|
State<SheetsWidget> createState() => _SheetsWidgetState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _SheetsWidgetState extends State<SheetsWidget> {
|
class _SheetsWidgetState extends State<SheetsWidget> {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:logging/logging.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';
|
||||||
@@ -16,6 +17,7 @@ class SheetViewerPage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _SheetViewerPageState extends State<SheetViewerPage> {
|
class _SheetViewerPageState extends State<SheetViewerPage> {
|
||||||
|
final log = Logger("SheetViewerPage");
|
||||||
int page = 1;
|
int page = 1;
|
||||||
int numPages = 1;
|
int numPages = 1;
|
||||||
bool isFullscreen = false;
|
bool isFullscreen = false;
|
||||||
@@ -39,13 +41,13 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
|
|||||||
void toggleFullscreen() {
|
void toggleFullscreen() {
|
||||||
isFullscreen = !isFullscreen;
|
isFullscreen = !isFullscreen;
|
||||||
if (isFullscreen) {
|
if (isFullscreen) {
|
||||||
print("enter fullscreen");
|
log.info("enter fullscreen");
|
||||||
// enter fullscreen
|
// enter fullscreen
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky,
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky,
|
||||||
overlays: []);
|
overlays: []);
|
||||||
} else {
|
} else {
|
||||||
// exit fullscreen
|
// exit fullscreen
|
||||||
print("exit fullscreen");
|
log.info("exit fullscreen");
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge,
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge,
|
||||||
overlays: SystemUiOverlay.values);
|
overlays: SystemUiOverlay.values);
|
||||||
}
|
}
|
||||||
@@ -70,16 +72,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 y = ${details.localPosition.dy}");
|
||||||
print("Touch at x = ${details.localPosition.dx}");
|
// print("Touch at x = ${details.localPosition.dx}");
|
||||||
print("Screenwidth = ${screenWidth}");
|
// print("Screenwidth = ${screenWidth}");
|
||||||
// Check where the user tapped
|
// Check where the user tapped
|
||||||
if (details.localPosition.dy < 100) {
|
// if (details.localPosition.dy < 100) {
|
||||||
// TODO
|
// TODO
|
||||||
// setState(() {
|
// setState(() {
|
||||||
// toggleFullscreen();
|
// toggleFullscreen();
|
||||||
// });
|
// });
|
||||||
} else if (details.localPosition.dx < screenWidth / 2) {
|
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;
|
||||||
@@ -100,9 +102,9 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
child: Text('$page / $numPages'),
|
|
||||||
alignment: Alignment.bottomCenter,
|
alignment: Alignment.bottomCenter,
|
||||||
padding: EdgeInsets.only(bottom: 5),
|
padding: EdgeInsets.only(bottom: 5),
|
||||||
|
child: Text('$page / $numPages'),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user