@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.
@@ -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
- uploadExpertClientFiles({
97
- variables: {
98
- input: {
99
- clientId: (_a = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.client) === null || _a === void 0 ? void 0 : _a.id,
100
- clientName: (_b = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.client) === null || _b === void 0 ? void 0 : _b.name,
101
- email: isClientPortal ? (_c = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.freelancer) === null || _c === void 0 ? void 0 : _c.name : freelancerEmail,
102
- fileName: `${documentName}.${fileExtension}`,
103
- fileSize: selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.size,
104
- fileType: utils_1.DOCUMENT_TYPE_CONSTANTS[docType],
105
- freelancerId: isClientPortal ? (_d = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.freelancer) === null || _d === void 0 ? void 0 : _d.id : legacyFreelancerId,
106
- freelancerName: isClientPortal ? (_e = clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.freelancer) === null || _e === void 0 ? void 0 : _e.name : freelancerName,
107
- projectId: clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.id,
108
- projectName: clientAndProject === null || clientAndProject === void 0 ? void 0 : clientAndProject.name,
109
- uploadedBy: isClientPortal ? 'CLIENT' : 'FREELANCER',
110
- data: isLargeFile ? "" : fileForUpload,
111
- },
112
- }
113
- })
114
- .then((res) => {
115
- var _a;
116
- if ((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.uploadExpertClientFilesData) {
117
- refetchFiles();
118
- (0, utils_1.showToast)('success', 'File Uploaded successfully!');
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
- .catch((err) => {
125
- (0, utils_1.showToast)('warning', 'Upload failed! Please try again.');
126
- }).finally(() => {
127
- setIsUploading(false);
128
- setDocumentName('');
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);
@@ -4,6 +4,7 @@ interface DocumentTableProps {
4
4
  setExpiryDate: (expiryDate: string) => void;
5
5
  expertFiles: any[];
6
6
  setExpertFiles: (expertFiles: any[]) => void;
7
+ uploadExpertClientFiles: any;
7
8
  uploadFileData: any;
8
9
  deleteFileMutation: any;
9
10
  updateFreelancerExpiryMutation: any;
@@ -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, handleUpload: handleUpload, expiryDate: insuranceExpiryDate, handleDateChange: handleDateChange, error: error, isUploading: isUploading }),
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 ServiceLinesTemplate = ({ getFreelancerDataResult, createOrUpdateRates, getRatesByExpertId, updateExpert, openServiceLinesTemplate, setOpenServiceLinesTemplate, getServiceLines, legacyFreelancerId, expertId, isFirmProfile, serviceLineData, selectedServicesList = [], isInternalProfile = false, updateFreelancerPreferences, }) => {
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(((_a = serviceLinesResponse === null || serviceLinesResponse === void 0 ? void 0 : serviceLinesResponse.data) === null || _a === void 0 ? void 0 : _a.getServiceLines) || serviceLineData);
58
- const currentService = (_d = (_c = (_b = freelancerResponse === null || freelancerResponse === void 0 ? void 0 : freelancerResponse.data) === null || _b === void 0 ? void 0 : _b.getExpertByLegacyFreelancerId) === null || _c === void 0 ? void 0 : _c.legacyMetadata) === null || _d === void 0 ? void 0 : _d.primaryServiceLine;
59
- const currentRate = (_g = (_f = (_e = freelancerResponse === null || freelancerResponse === void 0 ? void 0 : freelancerResponse.data) === null || _e === void 0 ? void 0 : _e.getExpertByLegacyFreelancerId) === null || _f === void 0 ? void 0 : _f.legacyMetadata) === null || _g === void 0 ? void 0 : _g.defaultHourlyRate;
60
- const expertRates = (_h = ratesResponse === null || ratesResponse === void 0 ? void 0 : ratesResponse.data) === null || _h === void 0 ? void 0 : _h.getRatesByExpertId;
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
- react_1.default.createElement(core_1.Grid, { style: { backgroundColor: '#132f4a', padding: 12 }, className: "service-lines-header" },
193
- 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' } },
194
- "Expand Your Expertise: Add More Services to Your Profile",
195
- 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 } })),
196
- react_1.default.createElement(core_1.Typography, { className: "headerMiddle", style: { color: '#ffffff', fontWeight: 200, fontStyle: 'italic', paddingLeft: 12 } }, "Why Add More Services?"),
197
- 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 },
198
- react_1.default.createElement(icons_1.AdjustRounded, { style: {
199
- marginRight: 8,
200
- color: '#2A9D8F',
201
- fontSize: 20
202
- }, className: "headerCircle" }),
203
- react_1.default.createElement(core_1.Typography, { className: "headerFeature", variant: "body2", style: { color: '#ffffff' } }, feature)))))),
204
- react_1.default.createElement(core_1.Grid, { container: true, style: { padding: 4 } },
205
- react_1.default.createElement(core_1.Typography, { variant: "h6", style: { marginLeft: 20, fontWeight: 500 } }, "Select from the following service lines:"),
206
- react_1.default.createElement(core_1.Grid, { container: true, direction: "row", justifyContent: "space-evenly", alignItems: "center" }, services === null || services === void 0 ? void 0 :
207
- services.map((service, index) => {
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.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paro.io/expert-shared-components",
3
- "version": "1.7.3",
3
+ "version": "1.7.5",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {