Skip to content

Commit df0ce3f

Browse files
Merge pull request #788 from OpenSignLabs/public_url
feat: create public profile URLs to add username and develop functionality to make public template from report
2 parents 0a99b51 + c00406e commit df0ce3f

File tree

11 files changed

+592
-52
lines changed

11 files changed

+592
-52
lines changed

apps/OpenSign/src/pages/PdfRequestFiles.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1578,7 +1578,10 @@ function PdfRequestFiles() {
15781578
handleClose={() => {
15791579
setIsCompleted((prev) => ({ ...prev, isModal: false }));
15801580
}}
1581-
reduceWidth={!isCompleted?.message}
1581+
reduceWidth={
1582+
!isCompleted?.message &&
1583+
"md:min-w-[440px] md:max-w-[400px]"
1584+
}
15821585
>
15831586
<div style={{ height: "100%", padding: 20 }}>
15841587
{isCompleted?.message ? (

apps/OpenSign/src/pages/UserProfile.js

Lines changed: 133 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from "react";
1+
import React, { useState, useEffect, useRef } from "react";
22
import { Navigate, useNavigate } from "react-router-dom";
33
import Parse from "parse";
44
import { SaveFileSize } from "../constant/saveFileSize";
@@ -27,6 +27,10 @@ function UserProfile() {
2727
const [percentage, setpercentage] = useState(0);
2828
const [isDisableDocId, setIsDisableDocId] = useState(false);
2929
const [isSubscribe, setIsSubscribe] = useState(false);
30+
const [publicUserName, setPublicUserName] = useState(
31+
extendUser && extendUser?.[0]?.UserName
32+
);
33+
const previousPublicUserName = useRef(publicUserName);
3034
const [company, setCompany] = useState(
3135
extendUser && extendUser?.[0]?.Company
3236
);
@@ -37,6 +41,7 @@ function UserProfile() {
3741
const [otp, setOtp] = useState("");
3842
const [otpLoader, setOtpLoader] = useState(false);
3943
const [isEmailVerified, setIsEmailVerified] = useState(false);
44+
const [userNameError, setUserNameError] = useState("");
4045
useEffect(() => {
4146
getUserDetail();
4247
}, []);
@@ -74,46 +79,72 @@ function UserProfile() {
7479
}
7580
}
7681
};
82+
//function to check public username already exist
83+
const handleCheckPublicUserName = async () => {
84+
try {
85+
const res = await Parse.Cloud.run("getpublicusername", {
86+
username: publicUserName
87+
});
88+
if (res) {
89+
setIsLoader(false);
90+
setUserNameError("user name already exist");
91+
setTimeout(() => {
92+
setUserNameError("");
93+
}, 3000);
94+
return res;
95+
}
96+
} catch (e) {
97+
console.log("error in getpublicusername cloud function");
98+
}
99+
};
77100
const handleSubmit = async (e) => {
78101
e.preventDefault();
79-
setIsLoader(true);
80-
let phn = Phone;
81-
82-
try {
83-
const tour = Parse.Object.extend("_User");
84-
const query = new Parse.Query(tour);
85-
86-
await query.get(UserProfile.objectId).then((object) => {
87-
object.set("name", name);
88-
object.set("ProfilePic", Image);
89-
object.set("phone", phn || "");
90-
91-
object.save().then(
92-
async (response) => {
93-
if (response) {
94-
let res = response.toJSON();
95-
let rr = JSON.stringify(res);
96-
localStorage.setItem("UserInformation", rr);
97-
SetName(res.name);
98-
SetPhone(res?.phone || "");
99-
setImage(res.ProfilePic);
100-
localStorage.setItem("username", res.name);
101-
localStorage.setItem("profileImg", res.ProfilePic);
102-
await updateExtUser({ Name: res.name, Phone: res?.phone || "" });
103-
alert("Profile updated successfully.");
104-
setEditMode(false);
105-
navigate("/dashboard/35KBoSgoAK");
102+
let phn = Phone,
103+
res;
104+
//condition to call cloud function when user change publicUserName
105+
if (previousPublicUserName.current !== publicUserName) {
106+
res = await handleCheckPublicUserName();
107+
}
108+
if (!res) {
109+
setIsLoader(true);
110+
try {
111+
const userQuery = Parse.Object.extend("_User");
112+
const query = new Parse.Query(userQuery);
113+
await query.get(UserProfile.objectId).then((object) => {
114+
object.set("name", name);
115+
object.set("ProfilePic", Image);
116+
object.set("phone", phn || "");
117+
object.save().then(
118+
async (response) => {
119+
if (response) {
120+
let res = response.toJSON();
121+
let rr = JSON.stringify(res);
122+
localStorage.setItem("UserInformation", rr);
123+
SetName(res.name);
124+
SetPhone(res?.phone || "");
125+
setImage(res.ProfilePic);
126+
localStorage.setItem("username", res.name);
127+
localStorage.setItem("profileImg", res.ProfilePic);
128+
await updateExtUser({
129+
Name: res.name,
130+
Phone: res?.phone || ""
131+
});
132+
alert("Profile updated successfully.");
133+
setEditMode(false);
134+
setIsLoader(false);
135+
//navigate("/dashboard/35KBoSgoAK");
136+
}
137+
},
138+
(error) => {
139+
alert("Something went wrong.");
140+
console.error("Error while updating tour", error);
141+
setIsLoader(false);
106142
}
107-
},
108-
(error) => {
109-
alert("Something went wrong.");
110-
console.error("Error while updating tour", error);
111-
setIsLoader(false);
112-
}
113-
);
114-
});
115-
} catch (error) {
116-
console.log("err", error);
143+
);
144+
});
145+
} catch (error) {
146+
console.log("err", error);
147+
}
117148
}
118149
};
119150

@@ -122,14 +153,15 @@ function UserProfile() {
122153
const extClass = localStorage.getItem("extended_class");
123154
const extData = JSON.parse(localStorage.getItem("Extand_Class"));
124155
const ExtUserId = extData[0].objectId;
125-
126156
const body = {
127157
Phone: obj?.Phone || "",
128158
Name: obj.Name,
129159
HeaderDocId: isDisableDocId,
130160
JobTitle: jobTitle,
131-
Company: company
161+
Company: company,
162+
UserName: publicUserName || ""
132163
};
164+
133165
await axios.put(
134166
parseBaseUrl + "classes/" + extClass + "/" + ExtUserId,
135167
body,
@@ -147,7 +179,6 @@ function UserProfile() {
147179

148180
const json = JSON.parse(JSON.stringify([res]));
149181
const extRes = JSON.stringify(json);
150-
151182
localStorage.setItem("Extand_Class", extRes);
152183
// console.log("updateRes ", updateRes);
153184
};
@@ -241,6 +272,27 @@ function UserProfile() {
241272
setOtpLoader(false);
242273
alert("OTP sent on you email");
243274
};
275+
//function to handle onchange username and restrict 6-characters username for free users
276+
const handleOnchangeUserName = (e) => {
277+
const value = e.target.value;
278+
if (value.length > 6 && !isSubscribe) {
279+
setUserNameError("Please upgrade to allow more than 6 characters.");
280+
setTimeout(() => {
281+
setUserNameError("");
282+
}, 2000);
283+
} else {
284+
setPublicUserName(e.target.value);
285+
}
286+
};
287+
const handleCancel = () => {
288+
setEditMode(false);
289+
SetName(localStorage.getItem("username"));
290+
SetPhone(UserProfile && UserProfile.phone);
291+
setImage(localStorage.getItem("profileImg"));
292+
setPublicUserName(extendUser && extendUser?.[0]?.UserName);
293+
setCompany(extendUser && extendUser?.[0]?.Company);
294+
setJobTitle(extendUser?.[0]?.JobTitle);
295+
};
244296
return (
245297
<React.Fragment>
246298
<Title title={"Profile"} />
@@ -262,7 +314,14 @@ function UserProfile() {
262314
></div>
263315
</div>
264316
) : (
265-
<div className="flex justify-center items-center w-full">
317+
<div className="flex justify-center items-center w-full relative">
318+
{userNameError && (
319+
<div
320+
className={`z-[1000] fixed top-[50%] transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`}
321+
>
322+
{userNameError}
323+
</div>
324+
)}
266325
<div className="bg-white flex flex-col justify-center shadow rounded w-[450px]">
267326
<div className="flex flex-col justify-center items-center my-4">
268327
<div className="w-[200px] h-[200px] overflow-hidden rounded-full">
@@ -390,6 +449,37 @@ function UserProfile() {
390449
)}
391450
</span>
392451
</li>
452+
{!isEnableSubscription && (
453+
<li className="flex justify-between items-center border-t-[1px] border-gray-300 py-2 break-all">
454+
<span className="font-semibold">
455+
Public profile :{" "}
456+
<Tooltip
457+
message={`this is your public URL. Copy or share it
458+
with the signer, and you will be able to see
459+
all your publicly set templates.`}
460+
/>
461+
</span>
462+
<div className="flex items-center">
463+
<span>opensign-me.vercel.app/</span>
464+
{editmode ? (
465+
<input
466+
onChange={handleOnchangeUserName}
467+
value={publicUserName}
468+
disabled={!editmode}
469+
placeholder="enter user name"
470+
className="border-[1px] border-gray-200 rounded-[3px]"
471+
/>
472+
) : (
473+
<input
474+
value={extendUser?.[0]?.UserName}
475+
disabled
476+
placeholder="enter user name"
477+
className="border-[1px] border-gray-200 rounded-[3px]"
478+
/>
479+
)}
480+
</div>
481+
</li>
482+
)}
393483
<li className="border-y-[1px] border-gray-300 break-all">
394484
<div className="flex justify-between items-center py-2">
395485
<span
@@ -460,7 +550,7 @@ function UserProfile() {
460550
type="button"
461551
onClick={() => {
462552
if (editmode) {
463-
setEditMode(false);
553+
handleCancel();
464554
} else {
465555
navigate("/changepassword");
466556
}

0 commit comments

Comments
 (0)