1
- import React , { useState , useEffect } from "react" ;
1
+ import React , { useState , useEffect , useRef } from "react" ;
2
2
import { Navigate , useNavigate } from "react-router-dom" ;
3
3
import Parse from "parse" ;
4
4
import { SaveFileSize } from "../constant/saveFileSize" ;
@@ -27,6 +27,10 @@ function UserProfile() {
27
27
const [ percentage , setpercentage ] = useState ( 0 ) ;
28
28
const [ isDisableDocId , setIsDisableDocId ] = useState ( false ) ;
29
29
const [ isSubscribe , setIsSubscribe ] = useState ( false ) ;
30
+ const [ publicUserName , setPublicUserName ] = useState (
31
+ extendUser && extendUser ?. [ 0 ] ?. UserName
32
+ ) ;
33
+ const previousPublicUserName = useRef ( publicUserName ) ;
30
34
const [ company , setCompany ] = useState (
31
35
extendUser && extendUser ?. [ 0 ] ?. Company
32
36
) ;
@@ -37,6 +41,7 @@ function UserProfile() {
37
41
const [ otp , setOtp ] = useState ( "" ) ;
38
42
const [ otpLoader , setOtpLoader ] = useState ( false ) ;
39
43
const [ isEmailVerified , setIsEmailVerified ] = useState ( false ) ;
44
+ const [ userNameError , setUserNameError ] = useState ( "" ) ;
40
45
useEffect ( ( ) => {
41
46
getUserDetail ( ) ;
42
47
} , [ ] ) ;
@@ -74,46 +79,72 @@ function UserProfile() {
74
79
}
75
80
}
76
81
} ;
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
+ } ;
77
100
const handleSubmit = async ( e ) => {
78
101
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 ) ;
106
142
}
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
+ }
117
148
}
118
149
} ;
119
150
@@ -122,14 +153,15 @@ function UserProfile() {
122
153
const extClass = localStorage . getItem ( "extended_class" ) ;
123
154
const extData = JSON . parse ( localStorage . getItem ( "Extand_Class" ) ) ;
124
155
const ExtUserId = extData [ 0 ] . objectId ;
125
-
126
156
const body = {
127
157
Phone : obj ?. Phone || "" ,
128
158
Name : obj . Name ,
129
159
HeaderDocId : isDisableDocId ,
130
160
JobTitle : jobTitle ,
131
- Company : company
161
+ Company : company ,
162
+ UserName : publicUserName || ""
132
163
} ;
164
+
133
165
await axios . put (
134
166
parseBaseUrl + "classes/" + extClass + "/" + ExtUserId ,
135
167
body ,
@@ -147,7 +179,6 @@ function UserProfile() {
147
179
148
180
const json = JSON . parse ( JSON . stringify ( [ res ] ) ) ;
149
181
const extRes = JSON . stringify ( json ) ;
150
-
151
182
localStorage . setItem ( "Extand_Class" , extRes ) ;
152
183
// console.log("updateRes ", updateRes);
153
184
} ;
@@ -241,6 +272,27 @@ function UserProfile() {
241
272
setOtpLoader ( false ) ;
242
273
alert ( "OTP sent on you email" ) ;
243
274
} ;
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
+ } ;
244
296
return (
245
297
< React . Fragment >
246
298
< Title title = { "Profile" } />
@@ -262,7 +314,14 @@ function UserProfile() {
262
314
> </ div >
263
315
</ div >
264
316
) : (
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
+ ) }
266
325
< div className = "bg-white flex flex-col justify-center shadow rounded w-[450px]" >
267
326
< div className = "flex flex-col justify-center items-center my-4" >
268
327
< div className = "w-[200px] h-[200px] overflow-hidden rounded-full" >
@@ -390,6 +449,37 @@ function UserProfile() {
390
449
) }
391
450
</ span >
392
451
</ 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
+ ) }
393
483
< li className = "border-y-[1px] border-gray-300 break-all" >
394
484
< div className = "flex justify-between items-center py-2" >
395
485
< span
@@ -460,7 +550,7 @@ function UserProfile() {
460
550
type = "button"
461
551
onClick = { ( ) => {
462
552
if ( editmode ) {
463
- setEditMode ( false ) ;
553
+ handleCancel ( ) ;
464
554
} else {
465
555
navigate ( "/changepassword" ) ;
466
556
}
0 commit comments