From a5befe634bf7baf30e0fb4d1077facd9e0c689c9 Mon Sep 17 00:00:00 2001 From: Lixian Zhou Date: Thu, 12 Mar 2026 18:50:24 -0400 Subject: [PATCH] fix --- .../components/customers/UpdateCustomer.js | 41 +++++++++++++++---- client/src/services/CustomerService.js | 4 +- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/client/src/components/customers/UpdateCustomer.js b/client/src/components/customers/UpdateCustomer.js index ad53472..26b8066 100644 --- a/client/src/components/customers/UpdateCustomer.js +++ b/client/src/components/customers/UpdateCustomer.js @@ -6,7 +6,7 @@ import { AuthService, CustomerService, ResourceService, parseDateFromBackend } f import Select from 'react-select'; import DatePicker from 'react-datepicker'; import "react-datepicker/dist/react-datepicker.css"; -import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab, Modal, Button } from "react-bootstrap"; +import { Spinner, Breadcrumb, BreadcrumbItem, Tabs, Tab, Modal, Button, ProgressBar } from "react-bootstrap"; import { CUSTOMER_TYPE, CUSTOMER_TYPE_TEXT, PROGRAM_TYPE, PROGRAM_TYPE_TEXT, @@ -168,6 +168,8 @@ const UpdateCustomer = () => { const [notesForDriver, setNotesForDriver] = useState(''); const [selectedFile, setSelectedFile] = useState(); const [showDeleteModal, setShowDeleteModal] = useState(false); + const [isAvatarUploading, setIsAvatarUploading] = useState(false); + const [avatarUploadProgress, setAvatarUploadProgress] = useState(0); const isFormUploaded = (fieldValue) => fieldValue === true || fieldValue === 'true'; @@ -864,21 +866,37 @@ const UpdateCustomer = () => { CustomerService.uploadCustomerFile(fd, urlParams.id, currentCustomer?.name || '', fileType); }; - const saveCustomer = () => { + const saveCustomer = async () => { if (!validateCustomer()) { return; } const data = buildCustomerData(); - const formData = new FormData(); - formData.append("file", selectedFile); let payload = {id: urlParams.id, data, currentCustomer}; - if (selectedFile) { - payload = Object.assign({}, payload, {avatar: formData}) - } dispatch(updateCustomer(payload)); + if (selectedFile) { + const formData = new FormData(); + formData.append("file", selectedFile); + try { + setIsAvatarUploading(true); + setAvatarUploadProgress(0); + await CustomerService.uploadAvatar(urlParams.id, formData, { + onUploadProgress: (event) => { + if (!event?.total) return; + const progress = Math.round((event.loaded * 100) / event.total); + setAvatarUploadProgress(progress); + } + }); + } catch (error) { + console.error('Error uploading avatar:', error); + window.alert('Profile picture upload failed. Customer data was saved.'); + } finally { + setIsAvatarUploading(false); + } + } + // Upload form files uploadFormFile(hipaaAuthorizationForm, 'hipaa_authorization_form'); uploadFormFile(medicationManagementConsentForm, 'medication_management_consent_form'); @@ -1366,6 +1384,15 @@ const UpdateCustomer = () => { setSelectedFile(e.target.files[0])}/>
{selectedFile?.name}
+ {isAvatarUploading && ( +
+ +
+ )}
Notes And Attachments
diff --git a/client/src/services/CustomerService.js b/client/src/services/CustomerService.js index aeb00c4..dc77b60 100644 --- a/client/src/services/CustomerService.js +++ b/client/src/services/CustomerService.js @@ -46,12 +46,12 @@ const uploadDriverSignature = (filename, data, options = {}) => { }) } -const uploadAvatar = (filename, data) => { +const uploadAvatar = (filename, data, requestConfig = {}) => { const safeFilename = `${filename || ''}`.trim(); if (!safeFilename || safeFilename.includes('undefined') || safeFilename.includes('null')) { throw new Error('Invalid upload filename for avatar/signature.'); } - return http.post(`/files/upload-general/${encodeURIComponent(safeFilename)}`, data); + return http.post(`/files/upload-general/${encodeURIComponent(safeFilename)}`, data, requestConfig); } const getAvatar = (filename) => {