From 00e52f8dca86af996ab07dc0eb5451b4c90e4ff0 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Mon, 7 Apr 2025 06:37:14 +0000 Subject: [PATCH] feat: enhance error logging and upgrade Android build tools - Add detailed error logging for image upload failures - Upgrade Gradle to 8.11.1 and Android build tools to 8.9.0 - Add Capacitor camera and filesystem modules to Android build --- android/app/capacitor.build.gradle | 2 + .../src/main/assets/capacitor.plugins.json | 8 +++ android/build.gradle | 2 +- android/capacitor.settings.gradle | 6 ++ .../gradle/wrapper/gradle-wrapper.properties | 2 +- src/components/PhotoDialog.vue | 53 +++++++++++++++++- src/views/SharedPhotoView.vue | 55 ++++++++++++++++++- 7 files changed, 121 insertions(+), 7 deletions(-) diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index 151fee42..d4eda79d 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -10,6 +10,8 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { implementation project(':capacitor-app') + implementation project(':capacitor-camera') + implementation project(':capacitor-filesystem') } diff --git a/android/app/src/main/assets/capacitor.plugins.json b/android/app/src/main/assets/capacitor.plugins.json index 21a0521e..d0a6315f 100644 --- a/android/app/src/main/assets/capacitor.plugins.json +++ b/android/app/src/main/assets/capacitor.plugins.json @@ -2,5 +2,13 @@ { "pkg": "@capacitor/app", "classpath": "com.capacitorjs.plugins.app.AppPlugin" + }, + { + "pkg": "@capacitor/camera", + "classpath": "com.capacitorjs.plugins.camera.CameraPlugin" + }, + { + "pkg": "@capacitor/filesystem", + "classpath": "com.capacitorjs.plugins.filesystem.FilesystemPlugin" } ] diff --git a/android/build.gradle b/android/build.gradle index 85a5dda2..3995fb3d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.2.1' + classpath 'com.android.tools.build:gradle:8.9.0' classpath 'com.google.gms:google-services:4.4.0' // NOTE: Do not place your application dependencies here; they belong diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index 2085c863..82d81801 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -4,3 +4,9 @@ project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/ include ':capacitor-app' project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') + +include ':capacitor-camera' +project(':capacitor-camera').projectDir = new File('../node_modules/@capacitor/camera/android') + +include ':capacitor-filesystem' +project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android') diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index c747538f..c1d5e018 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/components/PhotoDialog.vue b/src/components/PhotoDialog.vue index 79e937a9..f0f5b631 100644 --- a/src/components/PhotoDialog.vue +++ b/src/components/PhotoDialog.vue @@ -271,13 +271,62 @@ export default class PhotoDialog extends Vue { this.close(); this.setImageCallback(response.data.url as string); } catch (error) { - logger.error("Error uploading the image", error); + // Log the raw error first + logger.error("Raw error object:", JSON.stringify(error, null, 2)); + + let errorMessage = "There was an error saving the picture."; + + if (axios.isAxiosError(error)) { + const status = error.response?.status; + const statusText = error.response?.statusText; + const data = error.response?.data; + + // Log detailed error information + logger.error("Upload error details:", { + status, + statusText, + data: JSON.stringify(data, null, 2), + message: error.message, + config: { + url: error.config?.url, + method: error.config?.method, + headers: error.config?.headers + } + }); + + if (status === 401) { + errorMessage = "Authentication failed. Please try logging in again."; + } else if (status === 413) { + errorMessage = "Image file is too large. Please try a smaller image."; + } else if (status === 415) { + errorMessage = "Unsupported image format. Please try a different image."; + } else if (status && status >= 500) { + errorMessage = "Server error. Please try again later."; + } else if (data?.message) { + errorMessage = data.message; + } + } else if (error instanceof Error) { + // Log non-Axios error with full details + logger.error("Non-Axios error details:", { + name: error.name, + message: error.message, + stack: error.stack, + error: JSON.stringify(error, Object.getOwnPropertyNames(error), 2) + }); + } else { + // Log any other type of error + logger.error("Unknown error type:", { + error: JSON.stringify(error, null, 2), + type: typeof error + }); + } + this.$notify( { group: "alert", type: "danger", title: "Error", - text: "There was an error saving the picture.", + text: errorMessage, }, 5000, ); diff --git a/src/views/SharedPhotoView.vue b/src/views/SharedPhotoView.vue index 8f15d838..815e1b17 100644 --- a/src/views/SharedPhotoView.vue +++ b/src/views/SharedPhotoView.vue @@ -137,7 +137,7 @@ export default class SharedPhotoView extends Vue { // this might be wrong since "name" goes with params, but it works so test well when you change it query: { destinationPathAfter: "/", - hideBackButton: true, + hideBackButton: "true", imageUrl: url, recipientDid: this.activeDid, }, @@ -221,13 +221,62 @@ export default class SharedPhotoView extends Vue { this.uploading = false; } catch (error) { - logger.error("Error uploading the image", error); + // Log the raw error first + logger.error("Raw error object:", JSON.stringify(error, null, 2)); + + let errorMessage = "There was an error saving the picture."; + + if (axios.isAxiosError(error)) { + const status = error.response?.status; + const statusText = error.response?.statusText; + const data = error.response?.data; + + // Log detailed error information + logger.error("Upload error details:", { + status, + statusText, + data: JSON.stringify(data, null, 2), + message: error.message, + config: { + url: error.config?.url, + method: error.config?.method, + headers: error.config?.headers + } + }); + + if (status === 401) { + errorMessage = "Authentication failed. Please try logging in again."; + } else if (status === 413) { + errorMessage = "Image file is too large. Please try a smaller image."; + } else if (status === 415) { + errorMessage = "Unsupported image format. Please try a different image."; + } else if (status && status >= 500) { + errorMessage = "Server error. Please try again later."; + } else if (data?.message) { + errorMessage = data.message; + } + } else if (error instanceof Error) { + // Log non-Axios error with full details + logger.error("Non-Axios error details:", { + name: error.name, + message: error.message, + stack: error.stack, + error: JSON.stringify(error, Object.getOwnPropertyNames(error), 2) + }); + } else { + // Log any other type of error + logger.error("Unknown error type:", { + error: JSON.stringify(error, null, 2), + type: typeof error + }); + } + this.$notify( { group: "alert", type: "danger", title: "Error", - text: "There was an error saving the picture.", + text: errorMessage, }, 5000, );