From 68fde27c7c850a8a41659cda720f913f71e064af Mon Sep 17 00:00:00 2001 From: reng Date: Wed, 10 Sep 2025 19:40:23 +0800 Subject: [PATCH] update for google drive --- package-lock.json | 16 ++- package.json | 1 + src-tauri/2 | 9 +- src-tauri/Cargo.lock | 188 +++++++++++++++++++++++++++- src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 18 ++- src-tauri/src/lib.rs | 40 ++---- src-tauri/src/raw_convert.rs | 38 +++--- src-tauri/src/util.rs | 26 ++-- src/App.jsx | 2 +- src/utils/backend.js | 9 +- src/utils/fs.js | 2 + 12 files changed, 285 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b9bf0e..1d4c48a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2.3.2", "@tauri-apps/plugin-fs": "^2.4.1", + "@tauri-apps/plugin-http": "^2.5.2", "@tauri-apps/plugin-opener": "^2", "firebase": "^12.0.0", "react": "^18.3.1", @@ -2017,9 +2018,9 @@ } }, "node_modules/@tauri-apps/api": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.7.0.tgz", - "integrity": "sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.8.0.tgz", + "integrity": "sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==", "license": "Apache-2.0 OR MIT", "funding": { "type": "opencollective", @@ -2261,6 +2262,15 @@ "@tauri-apps/api": "^2.6.0" } }, + "node_modules/@tauri-apps/plugin-http": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-http/-/plugin-http-2.5.2.tgz", + "integrity": "sha512-x1mQKHSLDk4mS2S938OTeyk8L7QyLpCrKZCZcjkljGsvTvRMojCvI9SeJ1kaxc7t8xSilkC7WdId8xER9TIGLg==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, "node_modules/@tauri-apps/plugin-opener": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.4.0.tgz", diff --git a/package.json b/package.json index bc8c03f..0c04903 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2.3.2", "@tauri-apps/plugin-fs": "^2.4.1", + "@tauri-apps/plugin-http": "^2.5.2", "@tauri-apps/plugin-opener": "^2", "firebase": "^12.0.0", "react": "^18.3.1", diff --git a/src-tauri/2 b/src-tauri/2 index 5d8bf60..98f8bb3 100644 --- a/src-tauri/2 +++ b/src-tauri/2 @@ -1,7 +1,12 @@ -up to date, audited 256 packages in 4s +added 1 package, changed 1 package, and audited 257 packages in 5s 28 packages are looking for funding run `npm fund` for details -found 0 vulnerabilities +1 low severity vulnerability + +To address all issues, run: + npm audit fix + +Run `npm audit` for details. diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7ca3e2a..40c7f9b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -87,7 +87,7 @@ dependencies = [ "num-traits", "ouroboros", "pathfinder_geometry", - "rustc-hash", + "rustc-hash 1.1.0", "tinyvec", "ucd-trie", "unicode-canonical-combining-class", @@ -777,10 +777,29 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" dependencies = [ + "percent-encoding", "time", "version_check", ] +[[package]] +name = "cookie_store" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1118,6 +1137,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + [[package]] name = "downcast-rs" version = "1.2.1" @@ -1700,8 +1728,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1711,9 +1741,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -2063,6 +2095,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", + "webpki-roots", ] [[package]] @@ -2657,6 +2690,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "litrs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" + [[package]] name = "lock_api" version = "0.4.13" @@ -2704,6 +2743,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" @@ -3738,6 +3783,7 @@ dependencies = [ "tauri-build", "tauri-plugin-dialog", "tauri-plugin-fs", + "tauri-plugin-http", "tauri-plugin-opener", "winprint", ] @@ -3864,6 +3910,22 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + +[[package]] +name = "publicsuffix" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" +dependencies = [ + "idna", + "psl-types", +] + [[package]] name = "qoi" version = "0.4.1" @@ -3897,6 +3959,61 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2 0.6.0", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.0", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.40" @@ -4181,6 +4298,8 @@ checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", + "cookie", + "cookie_store", "encoding_rs", "futures-channel", "futures-core", @@ -4199,6 +4318,8 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", "rustls-pki-types", "serde", "serde_json", @@ -4206,6 +4327,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", + "tokio-rustls", "tokio-util", "tower", "tower-http", @@ -4215,6 +4337,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots", ] [[package]] @@ -4321,6 +4444,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -4350,6 +4479,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -4362,6 +4492,7 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ + "web-time", "zeroize", ] @@ -5320,6 +5451,30 @@ dependencies = [ "url", ] +[[package]] +name = "tauri-plugin-http" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcde333d97e565a7765aad82f32d8672458f7bd77b6ee653830d5dded9d7b5c2" +dependencies = [ + "bytes", + "cookie_store", + "data-url", + "http", + "regex", + "reqwest", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.12", + "tokio", + "url", + "urlpattern", +] + [[package]] name = "tauri-plugin-opener" version = "2.4.0" @@ -5618,10 +5773,22 @@ dependencies = [ "signal-hook-registry", "slab", "socket2 0.5.10", + "tokio-macros", "tracing", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -6345,6 +6512,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webkit2gtk" version = "2.0.1" @@ -6389,6 +6566,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webview2-com" version = "0.38.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 24aa1de..ce2eb24 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -30,3 +30,4 @@ tauri-plugin-fs = "2" image = "0.25.6" flate2 = "1.1.2" quick-xml = "0.38.0" +tauri-plugin-http = "2" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 3d8d6d9..55b0796 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -17,8 +17,12 @@ { "identifier": "fs:scope", "allow": [ - {"path":"$DOCUMENT/**/*"}, - {"path":"$DOCUMENT"}, + { + "path": "$DOCUMENT/**/*" + }, + { + "path": "$DOCUMENT" + }, { "path": "$APPDATA" }, @@ -26,6 +30,16 @@ "path": "$APPDATA/**/*" } ] + }, + { + "identifier": "http:default", + "allow": [ + { + "url": "https://drive.google.com/uc?id=*" + },{ + "url":"https://drive.usercontent.google.com/download?id=*" + } + ] } ] } \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a8697b3..11c01f4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -7,8 +7,8 @@ use winprint::ticket::{ PrintCapabilities, PrintTicket, PrintTicketBuilder, }; -mod util; mod raw_convert; +mod util; #[tauri::command] fn get_all_printers() -> Vec { @@ -31,8 +31,7 @@ fn convert_pdf(document_path: String) -> Result { return Err(format!("File does not exist: {}", document_path)); } - - match raw_convert::imageToPdf2(document_path.clone()) { + match raw_convert::imageToPdf2(document_path.clone()) { Ok(pdf_path) => { // Print the converted PDF using the printer // printer.print(Path::new(&pdf_path), ticket).unwrap(); @@ -56,7 +55,7 @@ fn get_printer_capabilities(device_name: String) -> HashMap> } }; println!("My Printer: {:?}", my_device.name()); - + let mut map = HashMap::new(); match PrintCapabilities::fetch_xml(&my_device) { @@ -68,7 +67,6 @@ fn get_printer_capabilities(device_name: String) -> HashMap> println!("DPI Options: {:?}", quality_opts); map.insert("quality_options".to_string(), quality_opts); - } Err(e) => { println!("Failed to fetch capabilities: {:?}", e); @@ -95,7 +93,6 @@ fn get_printer_capabilities(device_name: String) -> HashMap> println!("Color Options: {:?}", color_opts_value); println!("Size Options: {:?}", size_opts_value); - map.insert("dpi_options".to_string(), dpi_opts_value); map.insert("color_options".to_string(), color_opts_value); map.insert("size_options".to_string(), size_opts_value); @@ -111,7 +108,8 @@ fn default_ticket(quality: Option) -> PrintTicket { // let mut ticket = PrintTicket::new(); let _quality = quality.unwrap_or_else(|| "psk:Normal".to_string()); - let xml =format!(r#" + let xml = format!( + r#" @@ -121,7 +119,8 @@ fn default_ticket(quality: Option) -> PrintTicket { - "#); + "# + ); let ticket = PrintTicket::from_xml(xml); ticket @@ -153,14 +152,7 @@ fn print_document( { match raw_convert::imageToPdf2(document_path.clone()) { Ok(pdf_path) => { - print_document( - device_name, - pdf_path, - dpi, - color, - size, - quality, - ); + print_document(device_name, pdf_path, dpi, color, size, quality); } Err(e) => { println!("Error converting image to PDF: {}", e); @@ -169,8 +161,6 @@ fn print_document( return; } - - let my_device = match get_my_device(device_name.clone()) { Some(device) => device, None => { @@ -195,8 +185,7 @@ fn print_document( .expect("Media size not supported by printer"); builder.merge(media).unwrap(); } - - + // dpi if let Some(dpi) = &dpi { let parsed_dpi = dpi @@ -226,18 +215,13 @@ fn print_document( .expect("Color not supported by printer"); builder.merge(supported_color).unwrap(); - } - // let default_ticket = default_ticket(quality); // if let Err(e) = builder.merge(default_ticket) { - // println!("Failed to merge default ticket: {:?}", e); + // println!("Failed to merge default ticket: {:?}", e); // } - - - let ticket = builder.build().unwrap(); // let xml=ticket.get_xml(); @@ -250,13 +234,11 @@ fn print_document( // let theprinter = ImagePrinter::new(my_device); printer.print(path, ticket).unwrap(); - - - } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() + .plugin(tauri_plugin_http::init()) .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_opener::init()) diff --git a/src-tauri/src/raw_convert.rs b/src-tauri/src/raw_convert.rs index 7e46c63..85690d8 100644 --- a/src-tauri/src/raw_convert.rs +++ b/src-tauri/src/raw_convert.rs @@ -1,29 +1,25 @@ -use std::path::Path; use flate2::write::ZlibEncoder; use flate2::Compression; use image::{DynamicImage, GenericImageView}; use std::fs::File; use std::io::{self, Read, Write}; - +use std::path::Path; pub fn imageToPdf2(path: String) -> Result { - let image_data = std::fs::read(&path).expect("Failed to read image"); - let pdf_data = img2pdf_from_bytes(&image_data, 300.0).expect("Failed to convert image to PDF"); - + let pdf_data = match img2pdf_from_bytes(&image_data, 300.0) { + Ok(data) => data, + Err(e) => return Err(format!("Failed to convert image to PDF: {}", e)), + }; let pdf_path = Path::new(&path).with_extension("pdf"); - + match std::fs::write(&pdf_path, pdf_data) { Ok(_) => Ok(pdf_path.display().to_string()), Err(e) => Err(format!("Failed to write PDF file: {}", e)), } - } - - - /// Converts an image from binary data to a PDF as binary data. /// /// # Arguments @@ -34,8 +30,16 @@ pub fn imageToPdf2(path: String) -> Result { /// /// A `Result` containing the PDF data as a `Vec` on success, or an `io::Error` on failure. pub fn img2pdf_from_bytes(img_data: &[u8], dpi: f64) -> io::Result> { + let img = match image::load_from_memory(img_data) { + Ok(img) => img, + Err(e) => { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + format!("Failed to open image: {}", e), + )) + } + }; - let img = image::load_from_memory(img_data).expect("Failed to open image"); let (width, height) = img.dimensions(); let (page_width, page_height) = ( @@ -98,7 +102,9 @@ pub fn img2pdf_from_bytes(img_data: &[u8], dpi: f64) -> io::Result> { let content = format!( "q\n{} 0 0 {} 0 0 cm\n/Im{} Do\nQ", // width, height, image_object_id - page_width, page_height, image_object_id + page_width, + page_height, + image_object_id ); writeln!( pdf_data, @@ -184,7 +190,11 @@ fn separate_rgb_and_alpha(img: DynamicImage) -> (Vec, Vec) { /// # Returns /// /// An `io::Result` indicating success or failure. -pub fn img2pdf_from_file>(input_path: P, output_path: P, dpi: f64) -> io::Result<()> { +pub fn img2pdf_from_file>( + input_path: P, + output_path: P, + dpi: f64, +) -> io::Result<()> { let mut input_file = File::open(input_path)?; let mut img_data = Vec::new(); input_file.read_to_end(&mut img_data)?; @@ -195,4 +205,4 @@ pub fn img2pdf_from_file>(input_path: P, output_path: P, dpi: f64 output_file.write_all(&pdf_data)?; Ok(()) -} \ No newline at end of file +} diff --git a/src-tauri/src/util.rs b/src-tauri/src/util.rs index 0fe742b..3c3d5e3 100644 --- a/src-tauri/src/util.rs +++ b/src-tauri/src/util.rs @@ -1,9 +1,8 @@ // use printpdf::*; -use std::path::Path; +use quick_xml::events::{BytesStart, Event}; use quick_xml::Reader; -use quick_xml::events::{Event, BytesStart}; use std::collections::HashSet; - +use std::path::Path; // pub fn imageToPdf(path: String) -> Result { // let mut doc = PdfDocument::new("image_to_pdf"); @@ -11,7 +10,6 @@ use std::collections::HashSet; // let image_bytes = std::fs::read(&path).map_err(|e| e.to_string())?; // let image = RawImage::decode_from_bytes(&image_bytes, &mut Vec::new()).unwrap(); - // let mut ops = Vec::new(); // // In the PDF, an image is an `XObject`, identified by a unique `ImageId` @@ -37,7 +35,7 @@ use std::collections::HashSet; // dpi: Some(dpi), // ..Default::default() // }, - + // }); // let save_options= PdfSaveOptions { @@ -51,12 +49,11 @@ use std::collections::HashSet; // ..Default::default() // }; - // let page1 = PdfPage::new(Mm(output_width), Mm(output_height), ops); // let pdf_bytes: Vec = doc // .with_pages(vec![page1]) // .save(&save_options, &mut Vec::new()); - + // let pdf_path = Path::new(&path).with_extension("pdf"); // match std::fs::write(&pdf_path, pdf_bytes) { @@ -71,9 +68,6 @@ use std::collections::HashSet; // } // } - - - pub fn get_output_quality_options(xml: &str) -> Vec { let mut reader = Reader::from_str(xml); // reader.trim_text(true); @@ -88,13 +82,21 @@ pub fn get_output_quality_options(xml: &str) -> Vec { match reader.read_event() { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"psf:Feature" { - if let Some(attr) = e.attributes().filter_map(Result::ok).find(|a| a.key.as_ref() == b"name") { + if let Some(attr) = e + .attributes() + .filter_map(Result::ok) + .find(|a| a.key.as_ref() == b"name") + { if attr.unescape_value().unwrap() == "psk:PageOutputQuality" { inside_target_feature = true; } } } else if inside_target_feature && e.name().as_ref() == b"psf:Option" { - if let Some(attr) = e.attributes().filter_map(Result::ok).find(|a| a.key.as_ref() == b"name") { + if let Some(attr) = e + .attributes() + .filter_map(Result::ok) + .find(|a| a.key.as_ref() == b"name") + { results.insert(attr.unescape_value().unwrap().to_string()); } } diff --git a/src/App.jsx b/src/App.jsx index 711cfdf..b7ffd25 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -131,7 +131,7 @@ function App() { setPrinting(latestPrint.id); // save url to local disk - saveToDisk(latestPrint.id, latestPrint.url) + saveToDisk(latestPrint.id, latestPrint.print_url) .then((filePath) => { console.log("File saved to:", filePath); diff --git a/src/utils/backend.js b/src/utils/backend.js index e65ab51..8e865e2 100644 --- a/src/utils/backend.js +++ b/src/utils/backend.js @@ -23,7 +23,14 @@ export function listenToPrints(callback) { onSnapshot(printsRef, (snapshot) => { const prints = []; snapshot.forEach((doc) => { - prints.push({ id: doc.id, ...doc.data() }); + + const data= doc.data(); + if(data.print_url === undefined || data.print_url === null) { + console.warn(`Document with id ${doc.id} has no print URL, skipping.`); + return; + } + console.log("Print data:", { id: doc.id, ...data }); + prints.push({ id: doc.id, ...data }); }); callback(prints); }); diff --git a/src/utils/fs.js b/src/utils/fs.js index 9c80e3d..c0fe9a8 100644 --- a/src/utils/fs.js +++ b/src/utils/fs.js @@ -1,5 +1,6 @@ import { writeFile, BaseDirectory, exists, mkdir, writeTextFile, readTextFile } from '@tauri-apps/plugin-fs'; import { path } from '@tauri-apps/api'; +import { fetch } from '@tauri-apps/plugin-http'; const OutputDir = 'prints'; const settingsFile = 'settings.json'; @@ -10,6 +11,7 @@ export async function saveToDisk(id, url){ const response = await fetch(url); const arrayBuffer = await response.arrayBuffer(); + console.log('fetch data, size=', arrayBuffer.byteLength); const base=BaseDirectory.Document; const folder=`${OutputDir}`;