CreatePassport.jsx
1 import React, {useState} from "react"; 2 import styles from "./passportform.module.scss"; 3 import { PassportDB } from "../Database/Database"; 4 import useAuth from "../../auth/hooks/useAuth"; 5 6 const CreatePassport = () => { 7 const [formData, setFormData] = useState({ 8 credentialId: "", 9 credentialType: "", 10 firstName: "", 11 lastName: "", 12 email: "", 13 phoneNumber: "", 14 issuer: "", 15 issuanceDate: "", 16 organizationType: "", 17 organizationName: "", 18 organizationDescription: "", 19 organizationUrl: "" 20 }); 21 const [organizationLogo, setOrganizationLogo] = useState(null); 22 const [organizationLogoBase64, setOrganizationLogoBase64] = useState(""); 23 const { 24 firstName, 25 lastName, 26 email, 27 phoneNumber, 28 issuanceDate, 29 issuer, 30 organizationType, 31 organizationName, 32 organizationDescription, 33 organizationUrl 34 } = formData; 35 36 const credentialId = "1d15" 37 const credentialType = "CorporateLei" 38 39 const { principalId } = useAuth(); 40 console.log('Principal Id in passport: ', principalId); 41 42 const addPassportData = async () => { 43 try { 44 await PassportDB.passportDetails.add({ 45 credentialId: credentialId, 46 credentialType: credentialType, 47 issuanceDate: issuanceDate, 48 issuer: issuer, 49 firstName: firstName, 50 lastName: lastName, 51 principalId: principalId, 52 email: email, 53 phoneNumber: phoneNumber, 54 organizationType: organizationType, 55 organizationName: organizationName, 56 organizationUrl: organizationUrl, 57 organizationLogo: organizationLogoBase64 58 }); 59 } catch (error) { 60 console.log("Could not add passport details to passport database: ", error) 61 } 62 } 63 64 const passportDataJson = { 65 "name": "Passport", 66 "description": "A signed business card meant to represent a person working for an organization", 67 "relatedLink": [ 68 { 69 "type": [ 70 "LinkRole" 71 ], 72 "target": "https://example.com/organizations/example-org/presentations/available", 73 "linkRelationship": "OrganizationPresentationEndpoint" 74 } 75 ], 76 "credentialSchema": { 77 "id": credentialId, 78 "type": credentialType, 79 }, 80 "issuanceDate": issuanceDate, 81 "issuer": issuer, 82 "credentialSubject": { 83 "type": [ 84 "Person" 85 ], 86 "firstName": firstName, 87 "lastName": lastName, 88 "email": email, 89 "phoneNumber": phoneNumber, 90 "worksFor": { 91 "type": [ 92 organizationType 93 ], 94 "name": organizationName, 95 "description": organizationDescription, 96 "url": organizationUrl, 97 "logo": organizationLogoBase64 98 } 99 } 100 } 101 102 const fetchPassportData = async () => { 103 try { 104 const passportData = await PassportDB?.passportDetails.toArray(); 105 console.log( 106 "Passport Data: ", passportData, 107 "Passport Data Json: ", passportDataJson 108 ) 109 } catch (error) { 110 console.log("Could not fetch passport data from database: ", error); 111 } 112 } 113 114 const handleFormChange = (event) => { 115 const { name, value } = event.target; 116 setFormData((prevData)=>({ 117 ...prevData, 118 [name]: value, 119 })); 120 }; 121 122 const handleOrganizationLogoChange = (event) => { 123 const selectedFile = event.target.files[0]; 124 125 if (selectedFile) { 126 setOrganizationLogo(selectedFile); 127 const reader = new FileReader(); 128 reader.onloadend = () => { 129 const base64Logo = reader.result; 130 setOrganizationLogoBase64(base64Logo); 131 console.log("Base64 Logo:", base64Logo); 132 }; 133 reader.readAsDataURL(selectedFile); 134 } 135 }; 136 137 const handleSubmit = (event) => { 138 event.preventDefault(); 139 console.log("Form Data: ....",formData); 140 addPassportData(); 141 console.log("....Submitting......"); 142 fetchPassportData(); 143 }; 144 145 return ( 146 <> 147 <div className={styles.BusinessCard}> 148 <h1 className={styles.formTitle}>Passport</h1> 149 <form onSubmit={handleSubmit}> 150 <div className={styles.formGroup}> 151 <div className={styles.logoInputContainer}> 152 {organizationLogoBase64 && ( 153 <img 154 src={organizationLogoBase64} 155 className={styles.logoPreview} 156 alt="organization logo" 157 /> 158 )} 159 <label htmlFor="organizationLogo" className={styles.logoUpload}> 160 <span>{organizationLogo ? "Update logo" : "Add logo"}</span> 161 <input 162 accept="image/jpeg, image/jpg, image/png, image/webp" 163 type="file" 164 name="organizationLogo" 165 id="organizationLogo" 166 onChange={handleOrganizationLogoChange} 167 className={styles.logoInput} 168 /> 169 <svg 170 aria-hidden="true" 171 focusable="false" 172 data-prefix="fas" 173 data-icon="image" 174 role="img" 175 xmlns="http://www.w3.org/2000/svg" 176 viewBox="0 0 512 512" 177 > 178 <path 179 fill="currentColor" 180 d="M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z" 181 ></path> 182 </svg> 183 </label> 184 </div> 185 </div> 186 <div className={styles.formGroup}> 187 <label htmlFor="firstName" className={styles.formLabel}> 188 First Name: 189 </label> 190 <input 191 type="text" 192 name="firstName" 193 value={firstName} 194 onChange={handleFormChange} 195 className={styles.formInput} 196 /> 197 </div> 198 <div className={styles.formGroup}> 199 <label htmlFor="lastName" className={styles.formLabel}> 200 Last Name: 201 </label> 202 <input 203 type="text" 204 name="lastName" 205 value={lastName} 206 onChange={handleFormChange} 207 className={styles.formInput} 208 /> 209 </div> 210 <div className={styles.formGroup}> 211 <label htmlFor="email" className={styles.formLabel}> 212 Email: 213 </label> 214 <input 215 type="text" 216 name="email" 217 value={email} 218 onChange={handleFormChange} 219 className={styles.formInput} 220 /> 221 </div> 222 <div className={styles.formGroup}> 223 <label htmlFor="phoneNumber" className={styles.formLabel}> 224 Phone No: 225 </label> 226 <input 227 type="text" 228 name="phoneNumber" 229 value={phoneNumber} 230 onChange={handleFormChange} 231 className={styles.formInput} 232 /> 233 </div> 234 <div className={styles.formGroup}> 235 <label htmlFor="issuanceDate" className={styles.formLabel}> 236 Issuance Date: 237 </label> 238 <input 239 type="date" 240 name="issuanceDate" 241 value={issuanceDate} 242 onChange={handleFormChange} 243 className={styles.formInput} 244 /> 245 </div> 246 <div className={styles.formGroup}> 247 <label htmlFor="issuerId" className={styles.formLabel}> 248 Issuer: 249 </label> 250 <input 251 type="text" 252 name="issuer" 253 value={issuer} 254 onChange={handleFormChange} 255 className={styles.formInput} 256 /> 257 </div> 258 {/* works for */} 259 <div className={styles.formGroup}> 260 <label htmlFor="organizationType" className={styles.formLabel}> 261 Organization Type: 262 </label> 263 <select 264 name="organizationType" 265 value={organizationType} 266 onChange={handleFormChange} 267 className={styles.formInput} 268 > 269 <option value="type1">Type 1</option> 270 <option value="type2">Type 2</option> 271 </select> 272 </div> 273 <div className={styles.formGroup}> 274 <label htmlFor="organizationName" className={styles.formLabel}> 275 Organization Name: 276 </label> 277 <input 278 type="text" 279 name="organizationName" 280 value={organizationName} 281 onChange={handleFormChange} 282 className={styles.formInput} 283 /> 284 </div> 285 <div className={styles.formGroup}> 286 <label htmlFor="organizationDescription" className={styles.formLabel}> 287 Organization Description: 288 </label> 289 <textarea 290 type="text" 291 name="organizationDescription" 292 value={organizationDescription} 293 onChange={handleFormChange} 294 rows={4} 295 cols={50} 296 className={styles.formInput} 297 /> 298 </div> 299 <div className={styles.formGroup}> 300 <label htmlFor="organizationUrl" className={styles.formLabel}> 301 Organization url: 302 </label> 303 <input 304 type="text" 305 name="organizationUrl" 306 value={organizationUrl} 307 onChange={handleFormChange} 308 className={styles.formInput} 309 /> 310 </div> 311 <button type="submit" className={styles.submitButton}> 312 Submit 313 </button> 314 </form> 315 </div> 316 </> 317 ); 318 }; 319 320 export default CreatePassport;