@paro.io/expert-shared-components 1.7.3 → 1.7.5
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.
- package/lib/components/DocumentCenter/DocumentCenter.js +1 -1
- package/lib/components/DocumentCenter/DocumentUploadRow.d.ts +4 -1
- package/lib/components/DocumentCenter/DocumentUploadRow.js +63 -34
- package/lib/components/DocumentCenter/ParoDocumentsTable.d.ts +1 -0
- package/lib/components/DocumentCenter/ParoDocumentsTable.js +1 -44
- package/lib/components/ServiceLinesTemplate/index.d.ts +3 -1
- package/lib/components/ServiceLinesTemplate/index.js +156 -45
- package/lib/components/shared/utils.d.ts +1 -0
- package/lib/components/shared/utils.js +7 -1
- package/package.json +1 -1
|
@@ -177,7 +177,7 @@ const DocumentCenter = ({ legacyFreelancerId, openModal, setOpenModal, expertCli
|
|
|
177
177
|
react_1.default.createElement(lab_1.TabPanel, { value: '0', style: { paddingTop: '0px' } },
|
|
178
178
|
react_1.default.createElement(ClientDocumentsTable_1.ClientDocumentsTable, { legacyFreelancerId: legacyFreelancerId, expertFiles: expertClientFiles, setExpertClientFiles: setExpertClientFiles, clientAndProjectsList: clientAndProjects, uploadExpertClientFiles: uploadExpertClientFiles, updateFileLastViewed: updateFileLastViewed, deleteExpertClientFile: deleteExpertClientFile, paroDocuments: false, freelancerName: freelancerName !== null && freelancerName !== void 0 ? freelancerName : '', freelancerEmail: freelancerEmail !== null && freelancerEmail !== void 0 ? freelancerEmail : '', getFileLazyQuery: getFileLazyQuery, expertClientFilesLazyQuery: expertClientFilesLazyQuery, isClientPortal: isClientPortal, documentUploadUrl: documentUploadUrl, downloadDocumentUrl: downloadDocumentUrl })),
|
|
179
179
|
react_1.default.createElement(lab_1.TabPanel, { value: '1' },
|
|
180
|
-
react_1.default.createElement(ParoDocumentsTable_1.ParoDocumentsTable, { legacyFreelancerId: legacyFreelancerId, expiryDate: insuranceExpiryDate !== null && insuranceExpiryDate !== void 0 ? insuranceExpiryDate : '', setExpiryDate: setInsuranceExpiryDate, expertFiles: expertFiles, setExpertFiles: setExpertFiles, uploadFileData: uploadFileData, deleteFileMutation: deleteFileMutation, updateFreelancerExpiryMutation: updateFreelancerExpiryMutation, foldername: foldername !== null && foldername !== void 0 ? foldername : '', paroDocuments: true, getFileLazyQuery: getFileLazyQuery, getFilesLazyQuery: getFilesLazyQuery }))))),
|
|
180
|
+
react_1.default.createElement(ParoDocumentsTable_1.ParoDocumentsTable, { legacyFreelancerId: legacyFreelancerId, expiryDate: insuranceExpiryDate !== null && insuranceExpiryDate !== void 0 ? insuranceExpiryDate : '', setExpiryDate: setInsuranceExpiryDate, expertFiles: expertFiles, setExpertFiles: setExpertFiles, uploadExpertClientFiles: uploadExpertClientFiles, uploadFileData: uploadFileData, deleteFileMutation: deleteFileMutation, updateFreelancerExpiryMutation: updateFreelancerExpiryMutation, foldername: foldername !== null && foldername !== void 0 ? foldername : '', paroDocuments: true, getFileLazyQuery: getFileLazyQuery, getFilesLazyQuery: getFilesLazyQuery }))))),
|
|
181
181
|
react_1.default.createElement(react_hot_toast_1.Toaster, { position: "top-center", toastOptions: {
|
|
182
182
|
style: {
|
|
183
183
|
zIndex: 9999,
|
|
@@ -16,6 +16,9 @@ interface DocumentUploadProps {
|
|
|
16
16
|
error?: string | null;
|
|
17
17
|
clientAndProjectsList?: any[];
|
|
18
18
|
uploadExpertClientFiles?: any;
|
|
19
|
+
uploadInternalFile?: any;
|
|
20
|
+
foldername?: string;
|
|
21
|
+
insuranceExpiryDate?: any;
|
|
19
22
|
refetchFiles?: any;
|
|
20
23
|
legacyFreelancerId?: any;
|
|
21
24
|
freelancerName?: string;
|
|
@@ -23,5 +26,5 @@ interface DocumentUploadProps {
|
|
|
23
26
|
isClientPortal?: boolean;
|
|
24
27
|
documentUploadUrl?: string;
|
|
25
28
|
}
|
|
26
|
-
export declare const DocumentUploadRow: ({ clientAndProject, setClientAndProject, docType, setDocType, paroDocuments, expiryDate, handleDateChange, error, clientAndProjectsList, uploadExpertClientFiles, refetchFiles, legacyFreelancerId, freelancerName, freelancerEmail, isClientPortal, documentUploadUrl, }: DocumentUploadProps) => JSX.Element;
|
|
29
|
+
export declare const DocumentUploadRow: ({ clientAndProject, setClientAndProject, docType, setDocType, paroDocuments, expiryDate, handleDateChange, error, clientAndProjectsList, uploadExpertClientFiles, uploadInternalFile, foldername, insuranceExpiryDate, refetchFiles, legacyFreelancerId, freelancerName, freelancerEmail, isClientPortal, documentUploadUrl, }: DocumentUploadProps) => JSX.Element;
|
|
27
30
|
export {};
|
|
@@ -78,7 +78,7 @@ const generateOptions = (array, clientOptions, isClientPortal) => {
|
|
|
78
78
|
}
|
|
79
79
|
});
|
|
80
80
|
};
|
|
81
|
-
const DocumentUploadRow = ({ clientAndProject, setClientAndProject, docType, setDocType, paroDocuments, expiryDate, handleDateChange, error, clientAndProjectsList, uploadExpertClientFiles, refetchFiles, legacyFreelancerId, freelancerName, freelancerEmail, isClientPortal = false, documentUploadUrl, }) => {
|
|
81
|
+
const DocumentUploadRow = ({ clientAndProject, setClientAndProject, docType, setDocType, paroDocuments, expiryDate, handleDateChange, error, clientAndProjectsList, uploadExpertClientFiles, uploadInternalFile, foldername, insuranceExpiryDate, refetchFiles, legacyFreelancerId, freelancerName, freelancerEmail, isClientPortal = false, documentUploadUrl, }) => {
|
|
82
82
|
const [isUploading, setIsUploading] = (0, react_1.useState)(false);
|
|
83
83
|
const [documentName, setDocumentName] = (0, react_1.useState)('');
|
|
84
84
|
const fileInputRef = (0, react_1.useRef)(null);
|
|
@@ -93,40 +93,69 @@ const DocumentUploadRow = ({ clientAndProject, setClientAndProject, docType, set
|
|
|
93
93
|
const disableButton = !(documentName && checkField) && !isUploading;
|
|
94
94
|
const uploadFile = (fileForUpload, fileExtension, isLargeFile, selectedFile) => {
|
|
95
95
|
var _a, _b, _c, _d, _e;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
else {
|
|
96
|
+
paroDocuments ?
|
|
97
|
+
uploadInternalFile({
|
|
98
|
+
variables: {
|
|
99
|
+
input: {
|
|
100
|
+
foldername,
|
|
101
|
+
subfolder: docType,
|
|
102
|
+
filename: `${documentName}.${fileExtension}`,
|
|
103
|
+
data: fileForUpload,
|
|
104
|
+
expirationDate: ((docType === 'EO Insurance') && insuranceExpiryDate) ? insuranceExpiryDate : '',
|
|
105
|
+
valid: true,
|
|
106
|
+
sourceOfEOInsurance: 'Dashboard',
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
}).then((res) => {
|
|
110
|
+
var _a;
|
|
111
|
+
if ((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.uploadFileData) {
|
|
112
|
+
refetchFiles();
|
|
113
|
+
(0, utils_1.showToast)('success', 'File Uploaded successfully!');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
(0, utils_1.showToast)('warning', 'Upload failed! Please try again.');
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
.catch((err) => {
|
|
121
120
|
(0, utils_1.showToast)('warning', 'Upload failed! Please try again.');
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
121
|
+
}).finally(() => {
|
|
122
|
+
setIsUploading(false);
|
|
123
|
+
setDocumentName('');
|
|
124
|
+
})
|
|
125
|
+
: uploadExpertClientFiles({
|
|
126
|
+
variables: {
|
|
127
|
+
input: {
|
|
128
|
+
clientId: (_a = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.client) === null || _a === void 0 ? void 0 : _a.id,
|
|
129
|
+
clientName: (_b = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.client) === null || _b === void 0 ? void 0 : _b.name,
|
|
130
|
+
email: isClientPortal ? (_c = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.freelancer) === null || _c === void 0 ? void 0 : _c.name : freelancerEmail,
|
|
131
|
+
fileName: `${documentName}.${fileExtension}`,
|
|
132
|
+
fileSize: selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.size,
|
|
133
|
+
fileType: utils_1.DOCUMENT_TYPE_CONSTANTS[docType],
|
|
134
|
+
freelancerId: isClientPortal ? (_d = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.freelancer) === null || _d === void 0 ? void 0 : _d.id : legacyFreelancerId,
|
|
135
|
+
freelancerName: isClientPortal ? (_e = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.freelancer) === null || _e === void 0 ? void 0 : _e.name : freelancerName,
|
|
136
|
+
projectId: clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.id,
|
|
137
|
+
projectName: clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.name,
|
|
138
|
+
uploadedBy: isClientPortal ? 'CLIENT' : 'FREELANCER',
|
|
139
|
+
data: isLargeFile ? "" : fileForUpload,
|
|
140
|
+
},
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
.then((res) => {
|
|
144
|
+
var _a;
|
|
145
|
+
if ((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.uploadExpertClientFilesData) {
|
|
146
|
+
refetchFiles();
|
|
147
|
+
(0, utils_1.showToast)('success', 'File Uploaded successfully!');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
(0, utils_1.showToast)('warning', 'Upload failed! Please try again.');
|
|
151
|
+
}
|
|
152
|
+
})
|
|
153
|
+
.catch((err) => {
|
|
154
|
+
(0, utils_1.showToast)('warning', 'Upload failed! Please try again.');
|
|
155
|
+
}).finally(() => {
|
|
156
|
+
setIsUploading(false);
|
|
157
|
+
setDocumentName('');
|
|
158
|
+
});
|
|
130
159
|
};
|
|
131
160
|
const uploadFileRouter = (fileForUpload, fileExtension, selectedFile) => {
|
|
132
161
|
setIsUploading(true);
|
|
@@ -263,49 +263,6 @@ const ParoDocumentsTable = ({ legacyFreelancerId, expiryDate, setExpiryDate, exp
|
|
|
263
263
|
setApiFoldername((_c = segments === null || segments === void 0 ? void 0 : segments.slice(0, segments.length - 1)) === null || _c === void 0 ? void 0 : _c.join('/'));
|
|
264
264
|
}
|
|
265
265
|
};
|
|
266
|
-
const uploadFile = (fileForUpload, fileExtension) => {
|
|
267
|
-
setIsUploading(true);
|
|
268
|
-
uploadFileData({
|
|
269
|
-
variables: {
|
|
270
|
-
input: {
|
|
271
|
-
foldername,
|
|
272
|
-
subfolder: docType,
|
|
273
|
-
filename: `${documentName}.${fileExtension}`,
|
|
274
|
-
data: fileForUpload,
|
|
275
|
-
expirationDate: ((docType === 'EO Insurance') && insuranceExpiryDate) ? insuranceExpiryDate : '',
|
|
276
|
-
valid: true,
|
|
277
|
-
sourceOfEOInsurance: 'Dashboard',
|
|
278
|
-
},
|
|
279
|
-
},
|
|
280
|
-
onCompleted: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
281
|
-
refetchFiles(true);
|
|
282
|
-
})
|
|
283
|
-
})
|
|
284
|
-
.then(() => {
|
|
285
|
-
(0, utils_1.showToast)('success', 'File Uploaded successfully!');
|
|
286
|
-
})
|
|
287
|
-
.catch((err) => {
|
|
288
|
-
(0, utils_1.showToast)('warning', 'Upload failed! Please try again.');
|
|
289
|
-
});
|
|
290
|
-
setIsUploading(false);
|
|
291
|
-
setApiFoldername('');
|
|
292
|
-
setDocumentName('');
|
|
293
|
-
};
|
|
294
|
-
const handleUpload = (event) => {
|
|
295
|
-
const selectedFile = event.target.files && event.target.files[0];
|
|
296
|
-
if (!(0, utils_1.validateFileUpload)(selectedFile, false)) {
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
if (selectedFile) {
|
|
300
|
-
const fileExtension = selectedFile.name.substring(selectedFile.name.lastIndexOf('.') + 1);
|
|
301
|
-
const reader = new FileReader();
|
|
302
|
-
reader.onloadend = () => {
|
|
303
|
-
const fileForUpload = String(reader.result).split(';base64,')[1];
|
|
304
|
-
uploadFile(fileForUpload, fileExtension);
|
|
305
|
-
};
|
|
306
|
-
reader.readAsDataURL(selectedFile);
|
|
307
|
-
}
|
|
308
|
-
};
|
|
309
266
|
const handleDateChange = (date) => {
|
|
310
267
|
if (date) {
|
|
311
268
|
const currentDate = (0, date_fns_1.startOfDay)(new Date);
|
|
@@ -319,7 +276,7 @@ const ParoDocumentsTable = ({ legacyFreelancerId, expiryDate, setExpiryDate, exp
|
|
|
319
276
|
}
|
|
320
277
|
};
|
|
321
278
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
322
|
-
react_1.default.createElement(DocumentUploadRow_1.DocumentUploadRow, { documentName: documentName, setDocumentName: setDocumentName, clientAndProject: clientAndProject, setClientAndProject: setClientAndProject, docType: docType, setDocType: setDocType, searchText: searchText, setSearchText: setSearchText, paroDocuments: paroDocuments,
|
|
279
|
+
react_1.default.createElement(DocumentUploadRow_1.DocumentUploadRow, { documentName: documentName, setDocumentName: setDocumentName, clientAndProject: clientAndProject, setClientAndProject: setClientAndProject, uploadInternalFile: uploadFileData, docType: docType, foldername: foldername, insuranceExpiryDate: insuranceExpiryDate, refetchFiles: refetchFiles, setDocType: setDocType, searchText: searchText, setSearchText: setSearchText, paroDocuments: paroDocuments, expiryDate: insuranceExpiryDate, handleDateChange: handleDateChange, error: error, isUploading: isUploading }),
|
|
323
280
|
react_1.default.createElement(utils_1.CustomPaper, null,
|
|
324
281
|
react_1.default.createElement("div", { className: 'w-1/4' },
|
|
325
282
|
react_1.default.createElement(base_ui_1.Input, { placeholder: "Search Documents", type: "text", value: searchText, onChange: (e) => setSearchText(e.target.value) })),
|
|
@@ -3,6 +3,7 @@ type ServiceLinesTemplateProps = {
|
|
|
3
3
|
getFreelancerDataResult?: any;
|
|
4
4
|
createOrUpdateRates?: any;
|
|
5
5
|
updateExpert?: any;
|
|
6
|
+
currentFeatureStatus?: any;
|
|
6
7
|
openServiceLinesTemplate?: boolean;
|
|
7
8
|
setOpenServiceLinesTemplate?: any;
|
|
8
9
|
getRatesByExpertId?: any;
|
|
@@ -16,6 +17,7 @@ type ServiceLinesTemplateProps = {
|
|
|
16
17
|
servicePricesList?: any;
|
|
17
18
|
isInternalProfile?: boolean;
|
|
18
19
|
updateFreelancerPreferences?: any;
|
|
20
|
+
getExpertVanityTitles?: any;
|
|
19
21
|
};
|
|
20
|
-
export declare const ServiceLinesTemplate: ({ getFreelancerDataResult, createOrUpdateRates, getRatesByExpertId, updateExpert, openServiceLinesTemplate, setOpenServiceLinesTemplate, getServiceLines, legacyFreelancerId, expertId, isFirmProfile, serviceLineData, selectedServicesList, isInternalProfile, updateFreelancerPreferences, }: ServiceLinesTemplateProps) => false | React.JSX.Element | undefined;
|
|
22
|
+
export declare const ServiceLinesTemplate: ({ getFreelancerDataResult, createOrUpdateRates, getRatesByExpertId, updateExpert, currentFeatureStatus, openServiceLinesTemplate, setOpenServiceLinesTemplate, getServiceLines, legacyFreelancerId, expertId, isFirmProfile, serviceLineData, selectedServicesList, isInternalProfile, updateFreelancerPreferences, getExpertVanityTitles, }: ServiceLinesTemplateProps) => false | React.JSX.Element | undefined;
|
|
21
23
|
export {};
|
|
@@ -39,26 +39,43 @@ const icons_1 = require("@material-ui/icons");
|
|
|
39
39
|
const ReviewsTab_1 = require("../ReviewsTab/ReviewsTab");
|
|
40
40
|
const base_ui_1 = require("@paro.io/base-ui");
|
|
41
41
|
const utils_1 = require("../shared/utils");
|
|
42
|
-
const
|
|
42
|
+
const lab_1 = require("@material-ui/lab");
|
|
43
|
+
const react_hot_toast_1 = require("react-hot-toast");
|
|
44
|
+
const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, getRatesByExpertId, updateExpert, currentFeatureStatus, openServiceLinesTemplate, setOpenServiceLinesTemplate, getServiceLines, legacyFreelancerId, expertId, isFirmProfile, serviceLineData, selectedServicesList = [], isInternalProfile = false, updateFreelancerPreferences, getExpertVanityTitles, }) => {
|
|
43
45
|
const [selectedServices, dispatch] = (0, react_1.useReducer)(utils_1.selectedServicesReducer, selectedServicesList);
|
|
44
46
|
const [updateClicked, setUpdateClicked] = (0, react_1.useState)(false);
|
|
45
47
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
46
48
|
const [serviceLines, setServiceLines] = (0, react_1.useState)(serviceLineData);
|
|
47
49
|
const [currentServiveRate, setCurrentServiceRate] = (0, react_1.useState)(null);
|
|
50
|
+
const [value, setValue] = (0, react_1.useState)(0);
|
|
51
|
+
const [titleOptions, setTitleOptions] = (0, react_1.useState)([]);
|
|
52
|
+
const [selectedTitle, setSelectedTitle] = (0, react_1.useState)(null);
|
|
53
|
+
const [customTitle, setCustomTitle] = (0, react_1.useState)(null);
|
|
54
|
+
const [featureStatus, setCurrentFeatureStatus] = (0, react_1.useState)(currentFeatureStatus);
|
|
48
55
|
const fetchServiceLineData = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
56
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
50
57
|
try {
|
|
51
58
|
setLoading(true);
|
|
59
|
+
if (!isInternalProfile) {
|
|
60
|
+
const [expertVanityTitles] = yield Promise.all([
|
|
61
|
+
getExpertVanityTitles({ fetchPolicy: 'network-only' }),
|
|
62
|
+
]);
|
|
63
|
+
const expertTitles = (_a = expertVanityTitles === null || expertVanityTitles === void 0 ? void 0 : expertVanityTitles.data) === null || _a === void 0 ? void 0 : _a.getExpertVanityTitles;
|
|
64
|
+
setTitleOptions(expertTitles);
|
|
65
|
+
}
|
|
52
66
|
const [freelancerResponse, serviceLinesResponse, ratesResponse] = yield Promise.all([
|
|
53
67
|
getFreelancerDataResult({ variables: { legacyFreelancerId: legacyFreelancerId }, skip: !legacyFreelancerId, fetchPolicy: 'network-only' }),
|
|
54
68
|
getServiceLines({ fetchPolicy: 'network-only', }),
|
|
55
69
|
getRatesByExpertId({ variables: { expertId }, skip: !expertId, fetchPolicy: 'network-only' }),
|
|
56
70
|
]);
|
|
57
|
-
setServiceLines(((
|
|
58
|
-
const currentService = (
|
|
59
|
-
const currentRate = (
|
|
60
|
-
const expertRates = (
|
|
71
|
+
setServiceLines(((_b = serviceLinesResponse === null || serviceLinesResponse === void 0 ? void 0 : serviceLinesResponse.data) === null || _b === void 0 ? void 0 : _b.getServiceLines) || serviceLineData);
|
|
72
|
+
const currentService = (_e = (_d = (_c = freelancerResponse === null || freelancerResponse === void 0 ? void 0 : freelancerResponse.data) === null || _c === void 0 ? void 0 : _c.getExpertByLegacyFreelancerId) === null || _d === void 0 ? void 0 : _d.legacyMetadata) === null || _e === void 0 ? void 0 : _e.primaryServiceLine;
|
|
73
|
+
const currentRate = (_h = (_g = (_f = freelancerResponse === null || freelancerResponse === void 0 ? void 0 : freelancerResponse.data) === null || _f === void 0 ? void 0 : _f.getExpertByLegacyFreelancerId) === null || _g === void 0 ? void 0 : _g.legacyMetadata) === null || _h === void 0 ? void 0 : _h.defaultHourlyRate;
|
|
74
|
+
const expertRates = (_j = ratesResponse === null || ratesResponse === void 0 ? void 0 : ratesResponse.data) === null || _j === void 0 ? void 0 : _j.getRatesByExpertId;
|
|
75
|
+
setCurrentFeatureStatus((_l = (_k = freelancerResponse === null || freelancerResponse === void 0 ? void 0 : freelancerResponse.data) === null || _k === void 0 ? void 0 : _k.getExpertByLegacyFreelancerId) === null || _l === void 0 ? void 0 : _l.featureStatus);
|
|
61
76
|
setCurrentServiceRate(currentRate);
|
|
77
|
+
const isTitleExists = (_o = (_m = freelancerResponse === null || freelancerResponse === void 0 ? void 0 : freelancerResponse.data) === null || _m === void 0 ? void 0 : _m.getExpertByLegacyFreelancerId) === null || _o === void 0 ? void 0 : _o.vanityTitle;
|
|
78
|
+
isTitleExists ? setSelectedTitle(isTitleExists) : setValue(1);
|
|
62
79
|
dispatch({
|
|
63
80
|
currentService,
|
|
64
81
|
currentRate,
|
|
@@ -103,6 +120,34 @@ const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, ge
|
|
|
103
120
|
},
|
|
104
121
|
});
|
|
105
122
|
};
|
|
123
|
+
const handleUpdateExpertTitle = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
124
|
+
setUpdateClicked(true);
|
|
125
|
+
updateExpert({
|
|
126
|
+
variables: {
|
|
127
|
+
expertId: expertId,
|
|
128
|
+
input: {
|
|
129
|
+
vanityTitle: selectedTitle === 'Other' ? customTitle : selectedTitle,
|
|
130
|
+
featureStatus: Object.assign({}, featureStatus)
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
}).then(() => {
|
|
134
|
+
(0, ReviewsTab_1.toastNotification)({
|
|
135
|
+
position: 'top-center',
|
|
136
|
+
color: 'success',
|
|
137
|
+
message: 'Expertise title Updated successfully!',
|
|
138
|
+
icon: 'success',
|
|
139
|
+
});
|
|
140
|
+
}).catch((error) => {
|
|
141
|
+
(0, ReviewsTab_1.toastNotification)({
|
|
142
|
+
position: 'top-center',
|
|
143
|
+
color: 'warning',
|
|
144
|
+
message: 'Failed to update expertise title.',
|
|
145
|
+
icon: 'warning'
|
|
146
|
+
});
|
|
147
|
+
}).finally(() => {
|
|
148
|
+
setUpdateClicked(false);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
106
151
|
const handleUpdateProfile = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
107
152
|
try {
|
|
108
153
|
setUpdateClicked(true);
|
|
@@ -131,6 +176,7 @@ const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, ge
|
|
|
131
176
|
}
|
|
132
177
|
finally {
|
|
133
178
|
setOpenServiceLinesTemplate && setOpenServiceLinesTemplate(false);
|
|
179
|
+
setUpdateClicked(false);
|
|
134
180
|
}
|
|
135
181
|
;
|
|
136
182
|
});
|
|
@@ -139,7 +185,7 @@ const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, ge
|
|
|
139
185
|
variables: {
|
|
140
186
|
expertId: expertId,
|
|
141
187
|
input: {
|
|
142
|
-
featureStatus: { "serviceLines": true }
|
|
188
|
+
featureStatus: Object.assign({ "serviceLines": true }, featureStatus)
|
|
143
189
|
}
|
|
144
190
|
},
|
|
145
191
|
}).then(() => {
|
|
@@ -187,45 +233,110 @@ const ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, ge
|
|
|
187
233
|
type: 'update'
|
|
188
234
|
});
|
|
189
235
|
};
|
|
236
|
+
const handleChange = (event, newValue) => {
|
|
237
|
+
if (newValue >= 0) {
|
|
238
|
+
setValue(newValue);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
const handleChangeTitle = (event) => {
|
|
242
|
+
setSelectedTitle(event.target.value);
|
|
243
|
+
};
|
|
244
|
+
const ActionButtons = () => {
|
|
245
|
+
return react_1.default.createElement(core_1.Grid, { container: true, direction: "row", justifyContent: "space-evenly", style: { marginTop: 12 }, spacing: 1 },
|
|
246
|
+
react_1.default.createElement(base_ui_1.Button, { label: "UPDATE PROFILE", onClick: value === 1 ? handleUpdateExpertTitle : handleUpdateProfile, type: "button", isLoading: updateClicked, disabled: isUpdateButtonDisabled(), color: "primary" }),
|
|
247
|
+
react_1.default.createElement(base_ui_1.Button, { label: "NOT INTERESTED", onClick: handleNotInterestedClick, type: "button", disabled: updateClicked, isLoading: updateClicked }));
|
|
248
|
+
};
|
|
249
|
+
const ServiceLinesTab = () => {
|
|
250
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
251
|
+
react_1.default.createElement(core_1.Grid, { style: { backgroundColor: '#132f4a', padding: 12 }, className: "service-lines-header" },
|
|
252
|
+
react_1.default.createElement(core_1.Typography, { className: "headerTop", variant: "h5", style: { color: '#ffffff', fontWeight: 500, padding: 12, justifyContent: 'space-between', display: 'flex', alignItems: 'center' } },
|
|
253
|
+
"Expand Your Expertise: Add More Services to Your Profile",
|
|
254
|
+
react_1.default.createElement("img", { src: 'https://expert-files-dev.s3.us-east-1.amazonaws.com/ParoGroupLogo.png', alt: "Paro Group Logo", style: { width: 24, height: 24, marginLeft: 8 } })),
|
|
255
|
+
react_1.default.createElement(core_1.Typography, { className: "headerMiddle", style: { color: '#ffffff', fontWeight: 200, fontStyle: 'italic', paddingLeft: 12 } }, "Why Add More Services?"),
|
|
256
|
+
react_1.default.createElement(core_1.Grid, { container: true, spacing: 3, style: { padding: 12, color: '#ffffff' }, direction: "row", justifyContent: "flex-start", alignItems: "center" }, utils_1.features.map((feature, index) => (react_1.default.createElement(core_1.Box, { key: index, display: "flex", alignItems: "center", m: 2 },
|
|
257
|
+
react_1.default.createElement(icons_1.AdjustRounded, { style: {
|
|
258
|
+
marginRight: 8,
|
|
259
|
+
color: '#2A9D8F',
|
|
260
|
+
fontSize: 20
|
|
261
|
+
}, className: "headerCircle" }),
|
|
262
|
+
react_1.default.createElement(core_1.Typography, { className: "headerFeature", variant: "body2", style: { color: '#ffffff' } }, feature)))))),
|
|
263
|
+
react_1.default.createElement(core_1.Grid, { container: true, style: { padding: 4 } },
|
|
264
|
+
react_1.default.createElement(core_1.Typography, { variant: "h6", style: { marginLeft: 20, fontWeight: 500 } }, "Select from the following service lines:"),
|
|
265
|
+
react_1.default.createElement(core_1.Grid, { container: true, direction: "row", justifyContent: "space-evenly", alignItems: "center" }, services === null || services === void 0 ? void 0 :
|
|
266
|
+
services.map((service, index) => {
|
|
267
|
+
const serviceExistsInArray = selectedServices.find((svc) => svc.service === service.title);
|
|
268
|
+
return (react_1.default.createElement(core_1.Grid, { item: true, xs: 12, md: 5, key: index, style: { margin: 12 } },
|
|
269
|
+
react_1.default.createElement(core_1.Box, { sx: { display: "flex" } },
|
|
270
|
+
react_1.default.createElement(core_1.Box, { display: 'flex', alignItems: 'center' },
|
|
271
|
+
react_1.default.createElement(CustomCheckbox, { checked: serviceExistsInArray, disabled: serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.currentService, onChange: () => handleServiceToggle(service.title) })),
|
|
272
|
+
react_1.default.createElement(core_1.Box, { sx: { flex: 1 } },
|
|
273
|
+
react_1.default.createElement(core_1.Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 2 } },
|
|
274
|
+
react_1.default.createElement(core_1.Box, null,
|
|
275
|
+
react_1.default.createElement(core_1.Typography, { component: "div", style: { fontWeight: 300, fontSize: 16 } },
|
|
276
|
+
service.title,
|
|
277
|
+
(serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.currentService) && (react_1.default.createElement(core_1.Typography, { variant: "caption", style: { fontWeight: 400, fontSize: 16 } }, "\u00A0(current service line)"))),
|
|
278
|
+
react_1.default.createElement(core_1.Typography, { variant: "body2", style: { fontWeight: 50, fontSize: 14 } }, service.description)),
|
|
279
|
+
react_1.default.createElement(core_1.Box, { display: 'flex', alignItems: 'center', ml: 4 },
|
|
280
|
+
react_1.default.createElement(core_1.TextField, { size: "small", variant: "outlined", value: (serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.rate) || '', onChange: (e) => handlePriceChange(service.title, e.target.value ? parseInt(e.target.value) : 0, serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.currentService), InputProps: {
|
|
281
|
+
startAdornment: react_1.default.createElement(core_1.Typography, null, "$\u00A0"),
|
|
282
|
+
endAdornment: react_1.default.createElement(core_1.Typography, null, "\u00A0/hr"),
|
|
283
|
+
}, style: { width: 100 }, required: serviceExistsInArray, error: serviceExistsInArray && !serviceExistsInArray.rate, label: "Rate", className: "serviceLineRateInput" })))))));
|
|
284
|
+
}),
|
|
285
|
+
react_1.default.createElement(core_1.Grid, { item: true, xs: 12, md: 5, style: { margin: 5 } }, ActionButtons())))));
|
|
286
|
+
};
|
|
287
|
+
const VanityTitlesTab = () => {
|
|
288
|
+
var _a;
|
|
289
|
+
return react_1.default.createElement(core_1.Grid, { container: true, item: true, direction: "row", spacing: 1 },
|
|
290
|
+
react_1.default.createElement(core_1.Grid, { style: { backgroundColor: '#132f4a', padding: 12 }, xs: 12, sm: 6 },
|
|
291
|
+
react_1.default.createElement(core_1.Typography, { className: "headerTop", variant: "h5", style: { color: 'white', fontWeight: 500, padding: 12, justifyContent: 'space-between', display: 'flex', alignItems: 'center' } },
|
|
292
|
+
"Make your new identity standout",
|
|
293
|
+
react_1.default.createElement("img", { src: 'https://expert-files-dev.s3.us-east-1.amazonaws.com/ParoGroupLogo.png', alt: "Paro Group Logo", style: { width: 24, height: 24, marginLeft: 8 } })),
|
|
294
|
+
react_1.default.createElement(core_1.Typography, { className: "headerMiddle", style: { color: '#ffffff', fontWeight: 200, fontStyle: 'italic', paddingLeft: 12 } }, "Why Add a Job Title to Your Profile?"),
|
|
295
|
+
react_1.default.createElement(core_1.Grid, { container: true, spacing: 3, style: { padding: 12 }, direction: "row", justifyContent: "flex-start", alignItems: "center" }, utils_1.titleFeatures.map((feature, index) => {
|
|
296
|
+
const [boldText, text] = feature.split(':');
|
|
297
|
+
return react_1.default.createElement(core_1.Box, { key: index, display: "flex", alignItems: "center", m: 2 },
|
|
298
|
+
react_1.default.createElement(icons_1.AdjustRounded, { style: {
|
|
299
|
+
marginRight: 8,
|
|
300
|
+
color: '#2A9D8F',
|
|
301
|
+
fontSize: 20
|
|
302
|
+
}, className: "headerCircle" }),
|
|
303
|
+
react_1.default.createElement(core_1.Typography, { className: "headerFeature", variant: "body2", style: { color: '#a5b1bc' } },
|
|
304
|
+
react_1.default.createElement("strong", { className: "text-[#f1f1f1]" },
|
|
305
|
+
boldText,
|
|
306
|
+
":"),
|
|
307
|
+
text));
|
|
308
|
+
}))),
|
|
309
|
+
react_1.default.createElement(core_1.Grid, { xs: 12, sm: 6, style: { paddingLeft: 18 }, container: true, direction: "column", justifyContent: "center", alignItems: "center" },
|
|
310
|
+
react_1.default.createElement(core_1.Box, null,
|
|
311
|
+
react_1.default.createElement(core_1.Typography, { variant: "h5", style: { fontWeight: 500 } }, "Expertise Title")),
|
|
312
|
+
react_1.default.createElement(core_1.Grid, { item: true, style: { marginBottom: 12, width: '70%' } },
|
|
313
|
+
react_1.default.createElement(core_1.Select, { required: true, autoWidth: false, variant: "outlined", fullWidth: true, defaultValue: titleOptions, onChange: (event) => handleChangeTitle(event), value: selectedTitle !== null && selectedTitle !== void 0 ? selectedTitle : (_a = titleOptions[0]) === null || _a === void 0 ? void 0 : _a.title },
|
|
314
|
+
titleOptions.length > 1 && (react_1.default.createElement(core_1.MenuItem, { disabled: true, value: "" },
|
|
315
|
+
react_1.default.createElement("em", null, "Select title"))),
|
|
316
|
+
titleOptions.map((option) => (react_1.default.createElement(core_1.MenuItem, { key: option.id, value: option.title }, option.title))),
|
|
317
|
+
react_1.default.createElement(core_1.MenuItem, { value: "Other" },
|
|
318
|
+
react_1.default.createElement("em", null, "Other")))),
|
|
319
|
+
selectedTitle === 'Other' && react_1.default.createElement(core_1.Grid, { item: true, style: { width: '70%' } },
|
|
320
|
+
react_1.default.createElement(core_1.TextField, { size: "small", variant: "outlined", value: customTitle, fullWidth: true, onChange: (e) => { setCustomTitle(e.target.value); }, placeholder: "Enter custom title" })),
|
|
321
|
+
ActionButtons()));
|
|
322
|
+
};
|
|
190
323
|
return (openServiceLinesTemplate && (react_1.default.createElement(core_1.Grid, { style: { backgroundColor: '#fff' } }, loading ? (react_1.default.createElement(core_1.Box, { display: "flex", justifyContent: "center", alignItems: "center", minHeight: "200px" },
|
|
191
324
|
react_1.default.createElement(core_1.CircularProgress, null))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
192
|
-
|
|
193
|
-
react_1.default.createElement(
|
|
194
|
-
|
|
195
|
-
react_1.default.createElement(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const serviceExistsInArray = selectedServices.find((svc) => svc.service === service.title);
|
|
209
|
-
return (react_1.default.createElement(core_1.Grid, { item: true, xs: 12, md: 5, key: index, style: { margin: 12 } },
|
|
210
|
-
react_1.default.createElement(core_1.Box, { sx: { display: "flex" } },
|
|
211
|
-
react_1.default.createElement(core_1.Box, { display: 'flex', alignItems: 'center' },
|
|
212
|
-
react_1.default.createElement(CustomCheckbox, { checked: serviceExistsInArray, disabled: serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.currentService, onChange: () => handleServiceToggle(service.title) })),
|
|
213
|
-
react_1.default.createElement(core_1.Box, { sx: { flex: 1 } },
|
|
214
|
-
react_1.default.createElement(core_1.Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 2 } },
|
|
215
|
-
react_1.default.createElement(core_1.Box, null,
|
|
216
|
-
react_1.default.createElement(core_1.Typography, { component: "div", style: { fontWeight: 300, fontSize: 16 } },
|
|
217
|
-
service.title,
|
|
218
|
-
(serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.currentService) && (react_1.default.createElement(core_1.Typography, { variant: "caption", style: { fontWeight: 400, fontSize: 16 } }, "\u00A0(current service line)"))),
|
|
219
|
-
react_1.default.createElement(core_1.Typography, { variant: "body2", style: { fontWeight: 50, fontSize: 14 } }, service.description)),
|
|
220
|
-
react_1.default.createElement(core_1.Box, { display: 'flex', alignItems: 'center', ml: 4 },
|
|
221
|
-
react_1.default.createElement(core_1.TextField, { size: "small", variant: "outlined", value: (serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.rate) || '', onChange: (e) => handlePriceChange(service.title, e.target.value ? parseInt(e.target.value) : 0, serviceExistsInArray === null || serviceExistsInArray === void 0 ? void 0 : serviceExistsInArray.currentService), InputProps: {
|
|
222
|
-
startAdornment: react_1.default.createElement(core_1.Typography, null, "$\u00A0"),
|
|
223
|
-
endAdornment: react_1.default.createElement(core_1.Typography, null, "\u00A0/hr"),
|
|
224
|
-
}, style: { width: 100 }, required: serviceExistsInArray, error: serviceExistsInArray && !serviceExistsInArray.rate, label: "Rate", className: "serviceLineRateInput" })))))));
|
|
225
|
-
}),
|
|
226
|
-
react_1.default.createElement(core_1.Grid, { item: true, xs: 12, md: 5, style: { margin: 5 } },
|
|
227
|
-
react_1.default.createElement(core_1.Box, { sx: { display: "flex", justifyContent: "space-evenly", mt: 4 } },
|
|
228
|
-
react_1.default.createElement(base_ui_1.Button, { label: "UPDATE PROFILE", onClick: handleUpdateProfile, type: "button", disabled: isUpdateButtonDisabled(), color: "primary" }),
|
|
229
|
-
react_1.default.createElement(base_ui_1.Button, { label: "NOT INTERESTED", onClick: handleNotInterestedClick, type: "button", disabled: updateClicked }))))))))));
|
|
325
|
+
isInternalProfile ?
|
|
326
|
+
react_1.default.createElement(react_1.default.Fragment, null, ServiceLinesTab())
|
|
327
|
+
:
|
|
328
|
+
react_1.default.createElement(lab_1.TabContext, { value: value + '' },
|
|
329
|
+
react_1.default.createElement(core_1.AppBar, { position: 'static', color: 'inherit', style: { backgroundColor: 'transparent', boxShadow: 'none' } },
|
|
330
|
+
react_1.default.createElement(core_1.Tabs, { TabIndicatorProps: { style: { background: '#248384' } }, value: value, onChange: handleChange, variant: "scrollable", scrollButtons: "on" },
|
|
331
|
+
react_1.default.createElement(core_1.Tab, { label: react_1.default.createElement("div", { className: "flex flex-row self-center" }, "Add Additional Service Lines") }),
|
|
332
|
+
react_1.default.createElement(core_1.Tab, { label: react_1.default.createElement("div", { className: "flex flex-row self-center" }, "Add a Title to Your Profile") }))),
|
|
333
|
+
react_1.default.createElement(lab_1.TabPanel, { value: '0' }, ServiceLinesTab()),
|
|
334
|
+
react_1.default.createElement(lab_1.TabPanel, { value: '1' }, VanityTitlesTab())),
|
|
335
|
+
react_1.default.createElement(react_hot_toast_1.Toaster, { position: "top-center", toastOptions: {
|
|
336
|
+
style: {
|
|
337
|
+
zIndex: 9999,
|
|
338
|
+
backgroundColor: 'transparent'
|
|
339
|
+
},
|
|
340
|
+
} }))))));
|
|
230
341
|
};
|
|
231
342
|
exports.ServiceLinesTemplate = ServiceLinesTemplate;
|
|
@@ -36,6 +36,7 @@ export declare const DOCUMENT_TYPE_CONSTANTS: {
|
|
|
36
36
|
};
|
|
37
37
|
export declare const titleMappings: Record<string, string>;
|
|
38
38
|
export declare const features: string[];
|
|
39
|
+
export declare const titleFeatures: string[];
|
|
39
40
|
export declare const serviceDescriptions: Record<string, string>;
|
|
40
41
|
export declare const selectedServicesReducer: (selectedServices: any, action: any) => any;
|
|
41
42
|
export declare const sharedUtils: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sharedUtils = exports.selectedServicesReducer = exports.serviceDescriptions = exports.features = exports.titleMappings = exports.DOCUMENT_TYPE_CONSTANTS = exports.validateFileUpload = exports.showToast = exports.MAX_FILE_SIZE = exports.ACCEPTED_FILE_TYPES = exports.formatDate = exports.CustomPaper = exports.handleDownloadPdf = exports.getFileMimeType = exports.stateAbbreviationMap = exports.getPreviousMonthStartDate = exports.isOlderThan30Days = exports.formatTenure = exports.isOnClickEvent = void 0;
|
|
3
|
+
exports.sharedUtils = exports.selectedServicesReducer = exports.serviceDescriptions = exports.titleFeatures = exports.features = exports.titleMappings = exports.DOCUMENT_TYPE_CONSTANTS = exports.validateFileUpload = exports.showToast = exports.MAX_FILE_SIZE = exports.ACCEPTED_FILE_TYPES = exports.formatDate = exports.CustomPaper = exports.handleDownloadPdf = exports.getFileMimeType = exports.stateAbbreviationMap = exports.getPreviousMonthStartDate = exports.isOlderThan30Days = exports.formatTenure = exports.isOnClickEvent = void 0;
|
|
4
4
|
exports.getComparator = getComparator;
|
|
5
5
|
exports.stableSort = stableSort;
|
|
6
6
|
exports.compareItems = compareItems;
|
|
@@ -285,6 +285,12 @@ exports.features = [
|
|
|
285
285
|
"Stand out from competitors by showcasing the full range of your skills",
|
|
286
286
|
"Attract more opportunities to grow your business",
|
|
287
287
|
];
|
|
288
|
+
exports.titleFeatures = [
|
|
289
|
+
"Showcase Your Brand: Your job title is the first impression Clients get of your professional identity. Whether you call yourself a 'Consultant', 'Financial Strategist', or 'Business Advisor', this title tells Clients who you are at a glance.",
|
|
290
|
+
"Control your Narrative: Your job title gives you the opportunity to shape how Clients perceive you, positioning yourself as a trusted expert in your field.",
|
|
291
|
+
"Highlight your Versatitlity: If you work accross multiple functions, a job title reflects your ability to deliver a broad range of value. It helps Clients understand the bigger picture of your skill set.",
|
|
292
|
+
"Attract the right Clients: By choosing a title that aligns with your target audience, you make it easier for Clients to see you as the perfect fit for their needs.",
|
|
293
|
+
];
|
|
288
294
|
exports.serviceDescriptions = {
|
|
289
295
|
"Full Charge Bookkeeping": "Work directly with companies to set up, clean, maintain, and/or reconcile their books and records. This service requires in-depth expertise and insights into their financials. Example Deliverables: Chart of Accounts, Journal Entry Posting, etc.",
|
|
290
296
|
"Chief Financial Officer (CFO)": "A senior executive expected to offer financial guidance and strategy for for-profit and/or nonprofit organizations. From leading the entire finance function to going even deeper internally to help owners keep and strengthen their financial footing. 10+ years of professional corporate finance experience, MBA, CFA, and/or CPA's are common in this role.",
|