|
|
|
@ -21,8 +21,9 @@ function base64ToFile(dataUrl: string, filename = "photo.jpg"): File { |
|
|
|
const parts = dataUrl.split(","); |
|
|
|
const mimeMatch = parts[0]?.match(/:(.*?);/); |
|
|
|
const mime = mimeMatch ? mimeMatch[1] : "image/jpeg"; |
|
|
|
const base64Data = parts[1] || parts[0]; |
|
|
|
const binaryString = atob(base64Data); |
|
|
|
const rawBase64 = parts[1] || parts[0]; |
|
|
|
const cleanBase64 = rawBase64.replace(/\s+/g, ""); |
|
|
|
const binaryString = atob(cleanBase64); |
|
|
|
const len = binaryString.length; |
|
|
|
const bytes = new Uint8Array(len); |
|
|
|
for (let i = 0; i < len; i++) { |
|
|
|
@ -201,14 +202,18 @@ export function QuestionPhoto({ |
|
|
|
}) |
|
|
|
.catch((err) => { |
|
|
|
console.error("Flutter photo upload to server error:", err); |
|
|
|
handleUploadFailure(); |
|
|
|
const reason = |
|
|
|
err?.response?.data?.reason || |
|
|
|
err?.response?.data?.detail || |
|
|
|
err?.message; |
|
|
|
handleUploadFailure(reason); |
|
|
|
pendingDeferredRef.current?.reject(err); |
|
|
|
pendingDeferredRef.current = null; |
|
|
|
}); |
|
|
|
registerPendingUpload?.(question.id, uploadPromise); |
|
|
|
} catch (convErr) { |
|
|
|
} catch (convErr: any) { |
|
|
|
console.error("Failed to decode base64 photo:", convErr); |
|
|
|
handleUploadFailure(); |
|
|
|
handleUploadFailure(convErr?.message); |
|
|
|
pendingDeferredRef.current?.reject(convErr); |
|
|
|
pendingDeferredRef.current = null; |
|
|
|
} |
|
|
|
@ -279,12 +284,18 @@ export function QuestionPhoto({ |
|
|
|
question.ui_config?.source || |
|
|
|
"gallery"; |
|
|
|
|
|
|
|
const uploadUrl = |
|
|
|
typeof window !== "undefined" |
|
|
|
? `${window.location.origin}/api/proxy?__proxyPath=/upload-tmp-media/` |
|
|
|
: undefined; |
|
|
|
|
|
|
|
uploadFile({ |
|
|
|
requestId: String(question.id), |
|
|
|
mediaType: "image", |
|
|
|
source: pickerSource as any, |
|
|
|
picker_type: pickerType as any, |
|
|
|
returnAs: "base64", |
|
|
|
returnAs: "upload", |
|
|
|
uploadUrl, |
|
|
|
fieldName: "file", |
|
|
|
allowedExtensions: |
|
|
|
extensions.length > 0 ? extensions : ["jpg", "jpeg", "png", "webp"], |
|
|
|
|