@paro.io/expert-shared-components 1.12.51 → 1.12.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,15 +13,12 @@ const AccountSuspensionBanner = ({ setShowSuspensionModal, suspended = false })
13
13
  react_1.default.createElement(base_icons_1.IconExclamation, { className: "h-6 w-6 text-white" })),
14
14
  react_1.default.createElement("div", { className: "flex-1" },
15
15
  react_1.default.createElement("h3", { className: "text-lg font-bold text-white" }, "\uD83D\uDEAB Account Suspended"),
16
- react_1.default.createElement("p", { className: "text-red-100 text-sm mt-1" }, "Your account has been suspended due to escalation #12847. You must complete comprehensive training to regain access to new opportunities."),
16
+ react_1.default.createElement("p", { className: "text-red-100 text-sm mt-1" }, "Your account has been suspended due to an escalation. You must complete comprehensive training to regain access to new opportunities."),
17
17
  react_1.default.createElement("div", { className: "mt-3 bg-white bg-opacity-10 rounded p-3" },
18
18
  react_1.default.createElement("div", { className: "flex items-center justify-between text-sm" },
19
19
  react_1.default.createElement("div", null,
20
20
  react_1.default.createElement("span", { className: "text-red-100" }, "Suspension: "),
21
- react_1.default.createElement("span", { className: "text-white font-medium" }, "30 days (Medium Severity)")),
22
- react_1.default.createElement("div", null,
23
- react_1.default.createElement("span", { className: "text-red-100" }, "Started: "),
24
- react_1.default.createElement("span", { className: "text-white font-medium" }, "May 29, 2025"))))))
21
+ react_1.default.createElement("span", { className: "text-white font-medium" }, "30 days (Medium Severity)"))))))
25
22
  :
26
23
  react_1.default.createElement("div", { className: "flex items-center justify-between" },
27
24
  react_1.default.createElement("div", { className: "flex items-center" },
@@ -48,66 +48,60 @@ const EscalationChat = ({ activeChatIssue, showEscalationChat, setShowEscalation
48
48
  const [uploadingFile, setUploadingFile] = (0, react_1.useState)(false);
49
49
  const fileInputRef = (0, react_1.useRef)(null);
50
50
  const handleFileUpload = (event) => __awaiter(void 0, void 0, void 0, function* () {
51
- const selectedFiles = event.target.files;
52
- if (!selectedFiles)
53
- return;
54
51
  setUploadingFile(true);
55
- const validFileNames = Array.from(selectedFiles)
56
- .filter(file => (0, EscalationRespondForm_1.validateFileUpload)(file))
57
- .map(file => file.name);
58
- if (validFileNames.length === 0)
59
- return;
60
- if (validFileNames && validFileNames.length > 0) {
61
- const uploadPromises = Array.from(selectedFiles).map((selectedFile) => {
62
- return new Promise((resolve, reject) => {
63
- const reader = new FileReader();
64
- reader.onloadend = () => __awaiter(void 0, void 0, void 0, function* () {
65
- var _a, _b, _c, _d, _e, _f, _g, _h;
66
- try {
67
- const res = yield (0, FileUploader_1.fileUploader)({
68
- file: selectedFile,
69
- documentName: selectedFile.name,
70
- escalationId: activeChatIssue.escalationId,
71
- projectId: activeChatIssue.projectDetails.length > 0 ? activeChatIssue.projectDetails[0].projectId : '',
72
- documentUploadUrl: documentUploadUrl,
73
- bucketName: bucketName,
74
- isExpert: false,
75
- uploadExpertClientFiles: uploadExpertClientFiles,
76
- createProjectEscalation: createProjectEscalation,
77
- extraData: {
78
- clientId: (_a = activeChatIssue.client.id) !== null && _a !== void 0 ? _a : 0,
79
- clientName: (_b = activeChatIssue.client.name) !== null && _b !== void 0 ? _b : '',
80
- email: isExpert ? (_e = (_d = (_c = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.client) === null || _c === void 0 ? void 0 : _c.primaryContact) === null || _d === void 0 ? void 0 : _d.email) !== null && _e !== void 0 ? _e : '' : (_f = user === null || user === void 0 ? void 0 : user.email) !== null && _f !== void 0 ? _f : '',
81
- freelancerId: (_g = activeChatIssue.freelancer.id) !== null && _g !== void 0 ? _g : 0,
82
- freelancerName: (_h = activeChatIssue.freelancer.name) !== null && _h !== void 0 ? _h : '',
83
- projectName: activeChatIssue.projectDetails.length > 0 ? activeChatIssue.projectDetails[0].projectName : '',
84
- }
85
- });
86
- if (res) {
87
- setUploadFiles(prev => [...prev, ...res]);
88
- }
89
- }
90
- catch (error) {
91
- console.error("faile upload failed", error);
92
- }
93
- finally {
94
- resolve();
95
- }
96
- });
97
- reader.readAsDataURL(selectedFile);
98
- });
99
- });
100
- try {
101
- const res = yield Promise.all(uploadPromises);
102
- }
103
- catch (error) {
104
- console.error('Error uploading files:', error);
52
+ try {
53
+ const selectedFiles = event.target.files;
54
+ if (!selectedFiles) {
55
+ setUploadingFile(false);
56
+ return;
105
57
  }
106
- finally {
58
+ const validFiles = Array.from(selectedFiles).filter(file => (0, EscalationRespondForm_1.validateFileUpload)(file));
59
+ if (validFiles.length === 0) {
107
60
  setUploadingFile(false);
61
+ return;
108
62
  }
63
+ const uploadPromises = validFiles.map((selectedFile) => {
64
+ return new Promise((resolve, reject) => __awaiter(void 0, void 0, void 0, function* () {
65
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
66
+ try {
67
+ const res = yield (0, FileUploader_1.fileUploader)({
68
+ file: selectedFile,
69
+ documentName: selectedFile.name,
70
+ escalationId: activeChatIssue.escalationId,
71
+ projectId: activeChatIssue.projectDetails.length > 0 ? activeChatIssue.projectDetails[0].projectId : '',
72
+ documentUploadUrl: documentUploadUrl,
73
+ bucketName: bucketName,
74
+ previousFiles: isExpert ? activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.clientDocumentLinks : activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.expertDocumentlinks,
75
+ isExpert: isExpert,
76
+ uploadExpertClientFiles: uploadExpertClientFiles,
77
+ createProjectEscalation: createProjectEscalation,
78
+ extraData: {
79
+ clientId: isExpert ? (_b = (_a = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.client) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 0 : (_d = (_c = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.client) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : 0,
80
+ clientName: isExpert ? (_f = (_e = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.client) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : '' : (_g = user === null || user === void 0 ? void 0 : user.name) !== null && _g !== void 0 ? _g : '',
81
+ email: isExpert ? (_k = (_j = (_h = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.client) === null || _h === void 0 ? void 0 : _h.primaryContact) === null || _j === void 0 ? void 0 : _j.email) !== null && _k !== void 0 ? _k : '' : (_m = (_l = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.freelancer) === null || _l === void 0 ? void 0 : _l.email) !== null && _m !== void 0 ? _m : '',
82
+ freelancerId: isExpert ? (_o = user === null || user === void 0 ? void 0 : user.userId) !== null && _o !== void 0 ? _o : 0 : (_q = (_p = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.freelancer) === null || _p === void 0 ? void 0 : _p.id) !== null && _q !== void 0 ? _q : 0,
83
+ freelancerName: isExpert ? (_r = user === null || user === void 0 ? void 0 : user.name) !== null && _r !== void 0 ? _r : '' : (_t = (_s = activeChatIssue === null || activeChatIssue === void 0 ? void 0 : activeChatIssue.freelancer) === null || _s === void 0 ? void 0 : _s.name) !== null && _t !== void 0 ? _t : '',
84
+ projectName: activeChatIssue.projectDetails.length > 0 ? activeChatIssue.projectDetails[0].projectName : '',
85
+ }
86
+ });
87
+ if (res) {
88
+ setUploadFiles(prev => [...prev, ...res]);
89
+ }
90
+ resolve();
91
+ }
92
+ catch (error) {
93
+ reject(error);
94
+ }
95
+ }));
96
+ });
97
+ yield Promise.all(uploadPromises);
98
+ }
99
+ catch (error) {
100
+ console.error('Error uploading files:', error);
101
+ }
102
+ finally {
103
+ setUploadingFile(false);
109
104
  }
110
- ;
111
105
  });
112
106
  const docs = [activeChatIssue.expertSupportingDocuments, activeChatIssue.clientSupportingDocuments, activeChatIssue.internalSupportingDocuments, ...uploadFiles];
113
107
  const processedDocs = docs
@@ -144,7 +138,7 @@ const EscalationChat = ({ activeChatIssue, showEscalationChat, setShowEscalation
144
138
  react_1.default.createElement("div", { className: "space-y-3" },
145
139
  react_1.default.createElement("div", { className: "flex items-center justify-between" },
146
140
  react_1.default.createElement("div", { className: "flex items-center space-x-2" },
147
- react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv", style: { display: 'none' }, ref: fileInputRef, onChange: handleFileUpload }),
141
+ react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: false, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv,.xslx", style: { display: 'none' }, ref: fileInputRef, onChange: handleFileUpload }),
148
142
  react_1.default.createElement(base_ui_1.Button, { label: "Attach Files", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, color: "info", className: "mx-2", isLoading: uploadingFile })),
149
143
  react_1.default.createElement("div", { className: "flex space-x-2" },
150
144
  react_1.default.createElement(base_ui_1.Button, { label: "cancel", onClick: () => setShowEscalationChat(false), disabled: uploadingFile })))))))));
@@ -32,7 +32,7 @@ const base_ui_1 = require("@paro.io/base-ui");
32
32
  const ClientDisputeProjectCard_1 = require("../Invoices/ClientDisputeProjectCard");
33
33
  const base_icons_1 = require("@paro.io/base-icons");
34
34
  const dayjs_1 = __importDefault(require("dayjs"));
35
- const ViewReponseModal_1 = __importDefault(require("./ViewReponseModal"));
35
+ const ViewResponseModal_1 = __importDefault(require("./ViewResponseModal"));
36
36
  const MarkResolvedModal_1 = __importDefault(require("./MarkResolvedModal"));
37
37
  const getBackgroundColor = (type) => {
38
38
  switch (type) {
@@ -108,7 +108,7 @@ const EscalationIssueCard = ({ issues, isExpert, openEscalationChat, showRespond
108
108
  showMarkResolvedButton && (react_1.default.createElement(base_ui_1.Button, { label: getResponseButtonText(issue), onClick: () => { setViewResponseModal(issue); }, color: 'primary', disabled: getResponseButtonText(issue) === 'Awaiting Response' })),
109
109
  showMarkResolvedButton && !isExpert && (react_1.default.createElement(base_ui_1.Button, { onClick: () => { setMarkAsResolved(issue); }, label: "Mark as Resolved", color: "primary" })))));
110
110
  }),
111
- !!viewResponseModal && react_1.default.createElement(ViewReponseModal_1.default, { response: isExpert ? viewResponseModal.clientResponse : viewResponseModal.expertResponse, isExpert: isExpert, open: !!viewResponseModal, onClose: () => setViewResponseModal(null) }),
111
+ !!viewResponseModal && react_1.default.createElement(ViewResponseModal_1.default, { response: isExpert ? viewResponseModal.clientResponse : viewResponseModal.expertResponse, isExpert: isExpert, open: !!viewResponseModal, onClose: () => setViewResponseModal(null) }),
112
112
  !!markAsResolved && react_1.default.createElement(MarkResolvedModal_1.default, { escalationId: markAsResolved.escalationId, expertName: (_b = (_a = markAsResolved === null || markAsResolved === void 0 ? void 0 : markAsResolved.freelancer) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'Expert', open: !!markAsResolved, onClose: () => setMarkAsResolved(false), updateProjectEscalation: updateProjectEscalation })));
113
113
  };
114
114
  exports.default = EscalationIssueCard;
@@ -46,6 +46,7 @@ exports.ACCEPTED_FILE_TYPES = [
46
46
  'image/jpeg',
47
47
  'image/png',
48
48
  'text/csv',
49
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
49
50
  ];
50
51
  const validateFileUpload = (file) => {
51
52
  if (!file) {
@@ -85,67 +86,60 @@ const EscalationRespondForm = ({ goBack, selectedIssue, documentUploadUrl, downl
85
86
  const [submitting, setSubmitting] = (0, react_1.useState)(false);
86
87
  const fileInputRef = (0, react_1.useRef)(null);
87
88
  const handleFileUpload = (event) => __awaiter(void 0, void 0, void 0, function* () {
88
- const selectedFiles = event.target.files;
89
- if (!selectedFiles)
90
- return;
91
89
  setUploadingFile(true);
92
- const validFileNames = Array.from(selectedFiles)
93
- .filter(file => (0, exports.validateFileUpload)(file))
94
- .map(file => file.name);
95
- if (validFileNames.length === 0)
96
- return;
97
- if (validFileNames && validFileNames.length > 0) {
98
- const uploadPromises = Array.from(selectedFiles).map((selectedFile) => {
99
- return new Promise((resolve, reject) => {
100
- const reader = new FileReader();
101
- reader.onloadend = () => __awaiter(void 0, void 0, void 0, function* () {
102
- var _a, _b, _c, _d, _e, _f, _g, _h;
103
- try {
104
- const res = yield (0, FileUploader_1.fileUploader)({
105
- file: selectedFile,
106
- documentName: selectedFile.name,
107
- escalationId: selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.escalationId,
108
- projectId: selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.projectDetails[0].projectId,
109
- documentUploadUrl: documentUploadUrl,
110
- bucketName: bucketName,
111
- previousFiles: (selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.isExpert) ? (_a = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.clientDocumentLinks) !== null && _a !== void 0 ? _a : [] : selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.expertDocumentlinks,
112
- isExpert: false,
113
- uploadExpertClientFiles: uploadExpertClientFiles,
114
- updateProjectEscalation: updateProjectEscalation,
115
- extraData: {
116
- clientId: selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.client.id,
117
- clientName: (_b = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.client.name) !== null && _b !== void 0 ? _b : '',
118
- email: isExpert ? (_d = (_c = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.freelancer) === null || _c === void 0 ? void 0 : _c.email) !== null && _d !== void 0 ? _d : '' : (_g = (_f = (_e = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.client) === null || _e === void 0 ? void 0 : _e.primaryContact) === null || _f === void 0 ? void 0 : _f.email) !== null && _g !== void 0 ? _g : '',
119
- freelancerId: selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.freelancer.id,
120
- freelancerName: (_h = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.freelancer.name) !== null && _h !== void 0 ? _h : '',
121
- projectName: selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.projectDetails[0].projectName,
122
- }
123
- });
124
- if (res) {
125
- setUploadFiles(prev => [...prev, ...res]);
126
- }
127
- }
128
- catch (error) {
129
- console.error("Failed to upload file", error);
130
- }
131
- finally {
132
- resolve();
133
- }
134
- });
135
- reader.readAsDataURL(selectedFile);
136
- });
137
- });
138
- try {
139
- yield Promise.all(uploadPromises);
140
- }
141
- catch (error) {
142
- console.error('Error uploading files:', error);
90
+ try {
91
+ const selectedFiles = event.target.files;
92
+ if (!selectedFiles) {
93
+ setUploadingFile(false);
94
+ return;
143
95
  }
144
- finally {
96
+ const validFiles = Array.from(selectedFiles).filter(file => (0, exports.validateFileUpload)(file));
97
+ if (validFiles.length === 0) {
145
98
  setUploadingFile(false);
99
+ return;
146
100
  }
101
+ const uploadPromises = validFiles.map((selectedFile) => {
102
+ return new Promise((resolve, reject) => __awaiter(void 0, void 0, void 0, function* () {
103
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
104
+ try {
105
+ const res = yield (0, FileUploader_1.fileUploader)({
106
+ file: selectedFile,
107
+ documentName: selectedFile.name,
108
+ escalationId: selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.escalationId,
109
+ projectId: (_b = (_a = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.projectDetails) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.projectId,
110
+ documentUploadUrl: documentUploadUrl,
111
+ bucketName: bucketName,
112
+ previousFiles: isExpert ? selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.clientDocumentLinks : selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.expertDocumentlinks,
113
+ isExpert: isExpert,
114
+ uploadExpertClientFiles: uploadExpertClientFiles,
115
+ updateProjectEscalation: updateProjectEscalation,
116
+ extraData: {
117
+ clientId: (_c = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.client) === null || _c === void 0 ? void 0 : _c.id,
118
+ clientName: (_e = (_d = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.client) === null || _d === void 0 ? void 0 : _d.name) !== null && _e !== void 0 ? _e : '',
119
+ email: isExpert ? (_h = (_g = (_f = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.client) === null || _f === void 0 ? void 0 : _f.primaryContact) === null || _g === void 0 ? void 0 : _g.email) !== null && _h !== void 0 ? _h : '' : (_k = (_j = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.freelancer) === null || _j === void 0 ? void 0 : _j.email) !== null && _k !== void 0 ? _k : '',
120
+ freelancerId: (_l = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.freelancer) === null || _l === void 0 ? void 0 : _l.id,
121
+ freelancerName: (_o = (_m = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.freelancer) === null || _m === void 0 ? void 0 : _m.name) !== null && _o !== void 0 ? _o : '',
122
+ projectName: (_q = (_p = selectedIssue === null || selectedIssue === void 0 ? void 0 : selectedIssue.projectDetails) === null || _p === void 0 ? void 0 : _p[0]) === null || _q === void 0 ? void 0 : _q.projectName,
123
+ }
124
+ });
125
+ if (res) {
126
+ setUploadFiles(prev => [...prev, ...res]);
127
+ }
128
+ resolve();
129
+ }
130
+ catch (error) {
131
+ reject(error);
132
+ }
133
+ }));
134
+ });
135
+ yield Promise.all(uploadPromises);
136
+ }
137
+ catch (error) {
138
+ console.error('Error uploading files:', error);
139
+ }
140
+ finally {
141
+ setUploadingFile(false);
147
142
  }
148
- ;
149
143
  });
150
144
  const submitResponse = () => __awaiter(void 0, void 0, void 0, function* () {
151
145
  setSubmitting(true);
@@ -209,7 +203,7 @@ const EscalationRespondForm = ({ goBack, selectedIssue, documentUploadUrl, downl
209
203
  react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Supporting Documents (Optional)"),
210
204
  react_1.default.createElement("div", { className: "border border-dashed border-gray-300 rounded-md p-6 text-center" },
211
205
  react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" }, "Upload any supporting documentation"),
212
- react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: true, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv", style: { display: 'none' }, ref: fileInputRef, onChange: handleFileUpload }),
206
+ react_1.default.createElement("input", { id: "upload-file", type: "file", multiple: false, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv,.xslx", style: { display: 'none' }, ref: fileInputRef, onChange: handleFileUpload }),
213
207
  react_1.default.createElement(base_ui_1.Button, { label: "Attach Files", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, color: "info", className: "mx-2", isLoading: uploadingFile, size: "sm" }),
214
208
  processedDocs && processedDocs.length > 0 && (react_1.default.createElement("div", { className: "flex flex-wrap gap-2 mt-4" },
215
209
  react_1.default.createElement("span", { className: "text-sm font-bold text-gray-500 items-center" }, "Supporting Documents: "),
@@ -100,66 +100,59 @@ const EscalationSubmitForm = ({ goBack, goHome, expertsOrClients, projects, docu
100
100
  }
101
101
  }, [projects, selectedUser]);
102
102
  const handleFileUpload = (event) => __awaiter(void 0, void 0, void 0, function* () {
103
- const selectedFiles = event.target.files;
104
- if (!selectedFiles)
105
- return;
106
103
  setUploadingFile(true);
107
- const validFileNames = Array.from(selectedFiles)
108
- .filter(file => (0, EscalationRespondForm_1.validateFileUpload)(file))
109
- .map(file => file.name);
110
- if (validFileNames.length === 0)
111
- return;
112
- if (validFileNames && validFileNames.length > 0) {
113
- const uploadPromises = Array.from(selectedFiles).map((selectedFile) => {
114
- return new Promise((resolve, reject) => {
115
- const reader = new FileReader();
116
- reader.onloadend = () => __awaiter(void 0, void 0, void 0, function* () {
117
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
118
- try {
119
- const res = yield (0, FileUploader_1.fileUploader)({
120
- file: selectedFile,
121
- documentName: selectedFile.name,
122
- escalationId: escalationId,
123
- projectId: selectedProjects.length > 0 ? selectedProjects[0].id : '',
124
- documentUploadUrl: documentUploadUrl,
125
- bucketName: bucketName,
126
- isExpert: false,
127
- uploadExpertClientFiles: uploadExpertClientFiles,
128
- createProjectEscalation: createProjectEscalation,
129
- extraData: {
130
- clientId: isExpert ? (_a = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.id) !== null && _a !== void 0 ? _a : 0 : clientId,
131
- clientName: isExpert ? (_b = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.name) !== null && _b !== void 0 ? _b : '' : (_c = user === null || user === void 0 ? void 0 : user.name) !== null && _c !== void 0 ? _c : '',
132
- email: isExpert ? (_e = (_d = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.primaryContact) === null || _d === void 0 ? void 0 : _d.email) !== null && _e !== void 0 ? _e : '' : (_f = user === null || user === void 0 ? void 0 : user.email) !== null && _f !== void 0 ? _f : '',
133
- freelancerId: isExpert ? (_g = user === null || user === void 0 ? void 0 : user.userId) !== null && _g !== void 0 ? _g : 0 : (_h = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.id) !== null && _h !== void 0 ? _h : 0,
134
- freelancerName: isExpert ? (_j = user === null || user === void 0 ? void 0 : user.name) !== null && _j !== void 0 ? _j : '' : (_k = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.name) !== null && _k !== void 0 ? _k : '',
135
- projectName: selectedProjects.length > 0 ? selectedProjects[0].name : '',
136
- }
137
- });
138
- if (res) {
139
- setUploadFiles(prev => [...prev, ...res]);
140
- }
141
- }
142
- catch (error) {
143
- reject(error);
144
- }
145
- finally {
146
- resolve();
147
- }
148
- });
149
- reader.readAsDataURL(selectedFile);
150
- });
151
- });
152
- try {
153
- const res = yield Promise.all(uploadPromises);
154
- }
155
- catch (error) {
156
- console.error('Error uploading files:', error);
104
+ try {
105
+ const selectedFiles = event.target.files;
106
+ if (!selectedFiles) {
107
+ setUploadingFile(false);
108
+ return;
157
109
  }
158
- finally {
110
+ const validFiles = Array.from(selectedFiles).filter(file => (0, EscalationRespondForm_1.validateFileUpload)(file));
111
+ if (validFiles.length === 0) {
159
112
  setUploadingFile(false);
113
+ return;
160
114
  }
115
+ const uploadPromises = validFiles.map((selectedFile) => {
116
+ return new Promise((resolve, reject) => __awaiter(void 0, void 0, void 0, function* () {
117
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
118
+ try {
119
+ const res = yield (0, FileUploader_1.fileUploader)({
120
+ file: selectedFile,
121
+ documentName: selectedFile.name,
122
+ escalationId: escalationId,
123
+ projectId: selectedProjects.length > 0 ? selectedProjects[0].id : '',
124
+ documentUploadUrl: documentUploadUrl,
125
+ bucketName: bucketName,
126
+ isExpert: isExpert,
127
+ uploadExpertClientFiles: uploadExpertClientFiles,
128
+ createProjectEscalation: createProjectEscalation,
129
+ extraData: {
130
+ clientId: isExpert ? (_a = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.id) !== null && _a !== void 0 ? _a : 0 : clientId,
131
+ clientName: isExpert ? (_b = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.name) !== null && _b !== void 0 ? _b : '' : (_c = user === null || user === void 0 ? void 0 : user.name) !== null && _c !== void 0 ? _c : '',
132
+ email: isExpert ? (_e = (_d = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.primaryContact) === null || _d === void 0 ? void 0 : _d.email) !== null && _e !== void 0 ? _e : '' : (_f = user === null || user === void 0 ? void 0 : user.email) !== null && _f !== void 0 ? _f : '',
133
+ freelancerId: isExpert ? (_g = user === null || user === void 0 ? void 0 : user.userId) !== null && _g !== void 0 ? _g : 0 : (_h = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.id) !== null && _h !== void 0 ? _h : 0,
134
+ freelancerName: isExpert ? (_j = user === null || user === void 0 ? void 0 : user.name) !== null && _j !== void 0 ? _j : '' : (_k = selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.name) !== null && _k !== void 0 ? _k : '',
135
+ projectName: selectedProjects.length > 0 ? selectedProjects[0].name : '',
136
+ }
137
+ });
138
+ if (res) {
139
+ setUploadFiles(prev => [...prev, ...res]);
140
+ }
141
+ resolve();
142
+ }
143
+ catch (error) {
144
+ reject(error);
145
+ }
146
+ }));
147
+ });
148
+ yield Promise.all(uploadPromises);
149
+ }
150
+ catch (error) {
151
+ console.error('Error uploading files:', error);
152
+ }
153
+ finally {
154
+ setUploadingFile(false);
161
155
  }
162
- ;
163
156
  });
164
157
  const isFormValid = () => {
165
158
  const requiredProjectSelection = isExpert || (!isExpert && selectedProjects.length > 0);
@@ -220,7 +213,9 @@ const EscalationSubmitForm = ({ goBack, goHome, expertsOrClients, projects, docu
220
213
  react_1.default.createElement(base_icons_1.IconChevronLeft, { size: "xs" }),
221
214
  " Back"),
222
215
  react_1.default.createElement("div", { className: "mb-6" },
223
- react_1.default.createElement("h2", { className: "text-xl font-bold" }, "Report Issue with Your Expert"),
216
+ react_1.default.createElement("h2", { className: "text-xl font-bold" },
217
+ "Report Issue with Your ",
218
+ isExpert ? 'Client' : 'Expert'),
224
219
  react_1.default.createElement("p", { className: "text-gray-600 mt-1" }, "Provide details about the issue you're experiencing and we'll resolve it within 4-8 hours")),
225
220
  react_1.default.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4 mb-6" },
226
221
  react_1.default.createElement("div", { className: "flex items-start" },
@@ -265,9 +260,9 @@ const EscalationSubmitForm = ({ goBack, goHome, expertsOrClients, projects, docu
265
260
  .filter(opt => selected.includes(opt.value))
266
261
  .map(opt => opt.label)
267
262
  .join(', ');
268
- }, placeholder: `Select a Project(s)` },
263
+ }, placeholder: `Select Project(s)` },
269
264
  react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
270
- react_1.default.createElement("em", null, "Select a Project(s)...")),
265
+ react_1.default.createElement("em", null, "Select Project(s)...")),
271
266
  projectOptions.map(option => (react_1.default.createElement(core_1.MenuItem, { key: option.value.id, value: option.value }, option.label))))),
272
267
  react_1.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" },
273
268
  react_1.default.createElement("div", null,
@@ -307,7 +302,7 @@ const EscalationSubmitForm = ({ goBack, goHome, expertsOrClients, projects, docu
307
302
  react_1.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Supporting Documents (Optional)"),
308
303
  react_1.default.createElement("div", { className: "border border-dashed border-gray-300 rounded-md p-6 text-center" },
309
304
  react_1.default.createElement("p", { className: "text-sm text-gray-600 mb-2" }, "Upload screenshots, emails, or documents"),
310
- react_1.default.createElement("input", { ref: fileInputRef, type: "file", multiple: true, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv", hidden: true, onChange: handleFileUpload }),
305
+ react_1.default.createElement("input", { ref: fileInputRef, type: "file", multiple: false, accept: ".pdf,.doc,.docx,.jpeg,.png,.gif,.csv, .xslx", hidden: true, onChange: handleFileUpload }),
311
306
  react_1.default.createElement(base_ui_1.Button, { label: "Attach Files", iconLeft: react_1.default.createElement(base_icons_1.IconPlus, { size: "sm" }), onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, color: "info", isLoading: uploadingFile, disabled: selectedUser === null, size: "sm" }),
312
307
  uploadFiles.length > 0 && (react_1.default.createElement("ul", { className: "mt-2 text-sm text-gray-600 list-disc list-inside" }, uploadFiles.map(f => react_1.default.createElement("li", { key: f.name }, f.split('%2F')[1])))))),
313
308
  react_1.default.createElement("div", { className: "bg-[#EFF6FF] p-3 rounded" },
@@ -48,7 +48,7 @@ const MarkResolvedModal = ({ escalationId, expertName, open, onClose, updateProj
48
48
  input: {
49
49
  escalationId: escalationId,
50
50
  clientResolution: resolutionText,
51
- status: 'InProgress'
51
+ status: 'Resolved'
52
52
  }
53
53
  }
54
54
  });
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ declare const ViewResponseModal: ({ response, open, onClose, isExpert }: {
3
+ response: string | null;
4
+ open: boolean;
5
+ onClose: () => void;
6
+ isExpert: boolean;
7
+ }) => React.JSX.Element;
8
+ export default ViewResponseModal;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const base_icons_1 = require("@paro.io/base-icons");
8
+ const core_1 = require("@material-ui/core");
9
+ const ViewResponseModal = ({ response, open, onClose, isExpert }) => {
10
+ return (react_1.default.createElement(core_1.Dialog, { open: open, onClose: onClose, maxWidth: 'sm' },
11
+ react_1.default.createElement(core_1.DialogTitle, null,
12
+ react_1.default.createElement("div", { className: "text-black mb-1 p-2 pl-4 absolute top-0 left-0 w-full flex flex-row justify-between items-center z-50" },
13
+ react_1.default.createElement("div", { className: "flex flex-col items-start" },
14
+ react_1.default.createElement("h1", { className: "text-md font-bold mr-2" }, isExpert ? 'Client Response' : 'Expert Response')),
15
+ react_1.default.createElement("div", { className: "flex items-center space-x-4" },
16
+ react_1.default.createElement(core_1.IconButton, { onClick: onClose },
17
+ react_1.default.createElement(base_icons_1.IconX, null))))),
18
+ react_1.default.createElement(core_1.DialogContent, null,
19
+ react_1.default.createElement("div", { className: "bg-green-50 border-green-800 border border-l-4 rounded p-4 mt-4 mb-4" },
20
+ react_1.default.createElement("p", { className: "text-sm font-medium" },
21
+ "Status: ",
22
+ react_1.default.createElement("span", { className: "font-normal" }, "Responded")),
23
+ react_1.default.createElement("p", { className: "text-sm font-medium" },
24
+ "Response: ",
25
+ react_1.default.createElement("span", { className: "font-normal" }, response))))));
26
+ };
27
+ exports.default = ViewResponseModal;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paro.io/expert-shared-components",
3
- "version": "1.12.51",
3
+ "version": "1.12.52",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {