2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
import{a as gt,b as pt}from"./chunk-FETAVRDH.js";import{b as nt,c as it}from"./chunk-R3PUHZUP.js";import"./chunk-3RK6DDJD.js";import{a as rt}from"./chunk-7XDVX5KB.js";import{a as I}from"./chunk-TPLZKWZ7.js";import{b as J,c as K,d as Q,e as X,f as tt,i as et}from"./chunk-EGL4ZKWQ.js";import{a as B,b as j,c as U,d as Z,f as H,g as Y,i as W}from"./chunk-6NRCTHHS.js";import{b as R}from"./chunk-RC3JXGN6.js";import{a as dt,b as ct}from"./chunk-N6VRXIQE.js";import{b as L,d as m,f as V,g as A,l as N,o as D,r as G,x as $,z as q}from"./chunk-GWD5A44H.js";import"./chunk-52JZ5I3Y.js";import{Aa as mt,C as T,j as k,ua as ot,w as F,wa as at,x as z,ya as st,za as lt}from"./chunk-COFYR5MX.js";import{Cb as w,Db as d,Eb as c,Ec as E,Jb as f,Kb as r,Lb as i,Mb as g,U as P,Xb as M,Za as s,Zb as C,da as v,i as x,kc as y,lc as o,mc as h,nc as O,ob as S,ta as b}from"./chunk-2MUIW2M6.js";function ft(a,e){if(a&1&&(r(0,"mat-error"),o(1),i()),a&2){let t=C();s(),h(t.getErrorMessage("username"))}}function ht(a,e){if(a&1&&(r(0,"mat-error"),o(1),i()),a&2){let t=C();s(),h(t.getErrorMessage("email"))}}function vt(a,e){if(a&1&&(r(0,"mat-error"),o(1),i()),a&2){let t=C();s(),h(t.getErrorMessage("password"))}}function Ct(a,e){if(a&1&&(r(0,"div",11)(1,"div",18)(2,"span"),o(3,"Password Strength:"),i(),r(4,"span"),o(5),i()(),g(6,"mat-progress-bar",19),i()),a&2){let t=C();s(4),y("strength-"+t.passwordStrength().color),s(),O(" ",t.passwordStrength().label," "),s(),f("value",t.passwordStrength().score)("color",t.passwordStrength().color)}}function bt(a,e){a&1&&(r(0,"mat-error"),o(1,"Passwords do not match"),i())}function Mt(a,e){a&1&&(r(0,"div",13)(1,"mat-icon"),o(2,"info"),i(),r(3,"span"),o(4,"Your guest progress will be saved to this account!"),i()())}function _t(a,e){a&1&&(g(0,"mat-spinner",20),r(1,"span"),o(2,"Creating Account..."),i())}function wt(a,e){a&1&&(r(0,"span"),o(1,"Create Account"),i())}var ut=class a{fb=v($);authService=v(I);storageService=v(R);router=v(F);destroy$=new x;isSubmitting=b(!1);hidePassword=b(!0);hideConfirmPassword=b(!0);registerForm;passwordStrength=E(()=>{let e=this.registerForm?.get("password")?.value||"";return this.calculatePasswordStrength(e)});constructor(){let e=this.storageService.getGuestToken();this.registerForm=this.fb.group({username:["",[m.required,m.minLength(3),m.maxLength(30),m.pattern(/^[a-zA-Z0-9_]+$/)]],email:["",[m.required,m.email]],password:["",[m.required,m.minLength(8),this.passwordStrengthValidator]],confirmPassword:["",[m.required]]},{validators:this.passwordMatchValidator}),this.authService.isAuthenticated()&&this.router.navigate(["/dashboard"])}passwordStrengthValidator(e){let t=e.value;if(!t)return null;let n=/[A-Z]/.test(t),l=/[a-z]/.test(t),p=/[0-9]/.test(t),u=/[!@#$%^&*(),.?":{}|<>]/.test(t);return n&&l&&p&&u?null:{weakPassword:!0}}passwordMatchValidator(e){let t=e.get("password")?.value,n=e.get("confirmPassword")?.value;return t===n?null:{passwordMismatch:!0}}calculatePasswordStrength(e){if(!e)return{score:0,label:"",color:""};let t=0;e.length>=8&&(t+=25),e.length>=12&&(t+=25),/[a-z]/.test(e)&&(t+=15),/[A-Z]/.test(e)&&(t+=15),/[0-9]/.test(e)&&(t+=10),/[!@#$%^&*(),.?":{}|<>]/.test(e)&&(t+=10);let n="",l="";return t<40?(n="Weak",l="warn"):t<70?(n="Fair",l="accent"):t<90?(n="Good",l="primary"):(n="Strong",l="primary"),{score:t,label:n,color:l}}togglePasswordVisibility(){this.hidePassword.update(e=>!e)}toggleConfirmPasswordVisibility(){this.hideConfirmPassword.update(e=>!e)}onSubmit(){if(this.registerForm.invalid||this.isSubmitting()){this.registerForm.markAllAsTouched();return}this.isSubmitting.set(!0);let{username:e,email:t,password:n}=this.registerForm.value,l=this.storageService.getGuestToken()||void 0;this.authService.register(e,t,n,l).pipe(P(this.destroy$)).subscribe({next:()=>{this.isSubmitting.set(!1)},error:()=>{this.isSubmitting.set(!1)}})}getErrorMessage(e){let t=this.registerForm.get(e);return!t||!t.touched?"":t.hasError("required")?`${this.getFieldLabel(e)} is required`:t.hasError("email")?"Please enter a valid email address":t.hasError("minlength")?`Must be at least ${t.getError("minlength").requiredLength} characters`:t.hasError("maxlength")?`Must not exceed ${t.getError("maxlength").requiredLength} characters`:t.hasError("pattern")&&e==="username"?"Username can only contain letters, numbers, and underscores":t.hasError("weakPassword")?"Password must include uppercase, lowercase, number, and special character":""}getFieldLabel(e){return{username:"Username",email:"Email",password:"Password",confirmPassword:"Confirm Password"}[e]||e}hasPasswordMismatch(){return!!this.registerForm.get("confirmPassword")?.touched&&this.registerForm.hasError("passwordMismatch")}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}static \u0275fac=function(t){return new(t||a)};static \u0275cmp=S({type:a,selectors:[["app-register"]],decls:66,vars:15,consts:[[1,"register-container"],[1,"register-card"],[1,"header-content"],[1,"logo-icon"],[1,"register-form",3,"ngSubmit","formGroup"],["appearance","outline",1,"full-width"],["matInput","","formControlName","username","placeholder","Enter your username","autocomplete","username"],["matPrefix",""],["matInput","","type","email","formControlName","email","placeholder","Enter your email","autocomplete","email"],["matInput","","formControlName","password","placeholder","Enter your password","autocomplete","new-password",3,"type"],["mat-icon-button","","matSuffix","","type","button",3,"click"],[1,"password-strength"],["matInput","","formControlName","confirmPassword","placeholder","Confirm your password","autocomplete","new-password",3,"type"],[1,"guest-conversion-message"],["mat-raised-button","","color","primary","type","submit",1,"full-width","submit-button",3,"disabled"],[1,"footer-links"],["routerLink","/login",1,"link"],["routerLink","/",1,"link"],[1,"strength-label"],["mode","determinate",3,"value","color"],["diameter","20"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"mat-card",1)(2,"mat-card-header")(3,"div",2)(4,"mat-icon",3),o(5,"quiz"),i(),r(6,"div")(7,"mat-card-title"),o(8,"Create Your Account"),i(),r(9,"mat-card-subtitle"),o(10,"Start your interview preparation journey"),i()()()(),r(11,"mat-card-content")(12,"form",4),M("ngSubmit",function(){return n.onSubmit()}),r(13,"mat-form-field",5)(14,"mat-label"),o(15,"Username"),i(),g(16,"input",6),r(17,"mat-icon",7),o(18,"person"),i(),d(19,ft,2,1,"mat-error"),r(20,"mat-hint"),o(21,"3-30 characters, letters, numbers, and underscores only"),i()(),r(22,"mat-form-field",5)(23,"mat-label"),o(24,"Email"),i(),g(25,"input",8),r(26,"mat-icon",7),o(27,"email"),i(),d(28,ht,2,1,"mat-error"),i(),r(29,"mat-form-field",5)(30,"mat-label"),o(31,"Password"),i(),g(32,"input",9),r(33,"mat-icon",7),o(34,"lock"),i(),r(35,"button",10),M("click",function(){return n.togglePasswordVisibility()}),r(36,"mat-icon"),o(37),i()(),d(38,vt,2,1,"mat-error"),r(39,"mat-hint"),o(40,"Minimum 8 characters"),i()(),d(41,Ct,7,5,"div",11),r(42,"mat-form-field",5)(43,"mat-label"),o(44,"Confirm Password"),i(),g(45,"input",12),r(46,"mat-icon",7),o(47,"lock"),i(),r(48,"button",10),M("click",function(){return n.toggleConfirmPasswordVisibility()}),r(49,"mat-icon"),o(50),i()(),d(51,bt,2,0,"mat-error"),i(),d(52,Mt,5,0,"div",13),r(53,"button",14),d(54,_t,3,0)(55,wt,2,0,"span"),i()()(),r(56,"mat-card-footer")(57,"div",15)(58,"p"),o(59,"Already have an account? "),r(60,"a",16),o(61,"Login here"),i()(),r(62,"p"),o(63,"Or continue as "),r(64,"a",17),o(65,"Guest"),i()()()()()()),t&2){let l,p,u,_;s(12),f("formGroup",n.registerForm),s(7),c((l=n.registerForm.get("username"))!=null&&l.invalid&&((l=n.registerForm.get("username"))!=null&&l.touched)?19:-1),s(9),c((p=n.registerForm.get("email"))!=null&&p.invalid&&((p=n.registerForm.get("email"))!=null&&p.touched)?28:-1),s(4),f("type",n.hidePassword()?"password":"text"),s(3),w("aria-label","Toggle password visibility"),s(2),h(n.hidePassword()?"visibility_off":"visibility"),s(),c((u=n.registerForm.get("password"))!=null&&u.invalid&&((u=n.registerForm.get("password"))!=null&&u.touched)?38:-1),s(3),c((_=n.registerForm.get("password"))!=null&&_.value?41:-1),s(4),f("type",n.hideConfirmPassword()?"password":"text"),s(3),w("aria-label","Toggle confirm password visibility"),s(2),h(n.hideConfirmPassword()?"visibility_off":"visibility"),s(),c(n.hasPasswordMismatch()?51:-1),s(),c(-1),s(),f("disabled",n.isSubmitting()),s(),c(n.isSubmitting()?54:55)}},dependencies:[k,q,N,L,V,A,D,G,T,z,W,B,U,Y,H,Z,j,rt,et,J,Q,K,X,tt,it,nt,st,at,ot,mt,lt,pt,gt,ct,dt],styles:[".register-container[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - var(--header-height) - var(--footer-height));padding:var(--spacing-lg);background:linear-gradient(135deg,var(--color-primary-lighter) 0%,var(--color-surface) 100%)}.register-card[_ngcontent-%COMP%]{width:100%;max-width:500px;box-shadow:var(--shadow-xl)}.register-card[_ngcontent-%COMP%] .mat-mdc-card-header{padding:var(--spacing-xl) var(--spacing-xl) 0}.register-card[_ngcontent-%COMP%] .mat-mdc-card-content{padding:var(--spacing-lg) var(--spacing-xl)}.register-card[_ngcontent-%COMP%] .mat-mdc-card-footer{padding:0 var(--spacing-xl) var(--spacing-xl)}.header-content[_ngcontent-%COMP%]{display:flex;align-items:center;gap:var(--spacing-md);width:100%}.header-content[_ngcontent-%COMP%] .logo-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--color-primary)}.header-content[_ngcontent-%COMP%] .mat-mdc-card-title{font-size:var(--font-size-2xl);font-weight:var(--font-weight-bold);margin:0}.header-content[_ngcontent-%COMP%] .mat-mdc-card-subtitle{font-size:var(--font-size-sm);margin:var(--spacing-xs) 0 0 0;color:var(--color-text-secondary)}.register-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:var(--spacing-md);margin-top:var(--spacing-lg)}.full-width[_ngcontent-%COMP%]{width:100%}.password-strength[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:var(--spacing-xs);margin-top:calc(var(--spacing-md) * -1);margin-bottom:var(--spacing-sm)}.password-strength[_ngcontent-%COMP%] .strength-label[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;font-size:var(--font-size-sm)}.password-strength[_ngcontent-%COMP%] .strength-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:var(--color-text-secondary)}.password-strength[_ngcontent-%COMP%] .strength-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:last-child{font-weight:var(--font-weight-semibold)}.password-strength[_ngcontent-%COMP%] .strength-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:last-child.strength-warn{color:var(--color-error)}.password-strength[_ngcontent-%COMP%] .strength-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:last-child.strength-accent{color:var(--color-warning)}.password-strength[_ngcontent-%COMP%] .strength-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:last-child.strength-primary{color:var(--color-success)}.password-strength[_ngcontent-%COMP%] .mat-mdc-progress-bar{height:6px;border-radius:var(--radius-full)}.guest-conversion-message[_ngcontent-%COMP%]{display:flex;align-items:center;gap:var(--spacing-sm);padding:var(--spacing-md);background-color:var(--color-info-light);border-radius:var(--radius-md);color:var(--color-info-dark);font-size:var(--font-size-sm);margin-top:calc(var(--spacing-md) * -1)}.guest-conversion-message[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.submit-button[_ngcontent-%COMP%]{margin-top:var(--spacing-md);height:48px;font-size:var(--font-size-base);font-weight:var(--font-weight-semibold)}.submit-button[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;margin-right:var(--spacing-sm)}.footer-links[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-sm);text-align:center;padding-top:var(--spacing-md);border-top:1px solid var(--color-divider)}.footer-links[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:var(--font-size-sm);color:var(--color-text-secondary)}.footer-links[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:var(--color-primary);font-weight:var(--font-weight-medium);text-decoration:none;transition:color var(--transition-fast)}.footer-links[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]:hover{color:var(--color-primary-dark);text-decoration:underline}.footer-links[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:var(--radius-sm)} .mat-mdc-form-field .mat-mdc-text-field-wrapper{background-color:var(--color-background)} .mat-mdc-form-field .mat-mdc-form-field-hint, .mat-mdc-form-field .mat-mdc-form-field-error{font-size:var(--font-size-xs)} .mat-mdc-form-field-icon-prefix{color:var(--color-text-secondary);margin-right:var(--spacing-sm)}@media (max-width: 767px){.register-container[_ngcontent-%COMP%]{padding:var(--spacing-md)}.register-card[_ngcontent-%COMP%] .mat-mdc-card-header{padding:var(--spacing-lg) var(--spacing-md) 0}.register-card[_ngcontent-%COMP%] .mat-mdc-card-content{padding:var(--spacing-md)}.register-card[_ngcontent-%COMP%] .mat-mdc-card-footer{padding:0 var(--spacing-md) var(--spacing-md)}.header-content[_ngcontent-%COMP%] .logo-icon[_ngcontent-%COMP%]{font-size:40px;width:40px;height:40px}.header-content[_ngcontent-%COMP%] .mat-mdc-card-title{font-size:var(--font-size-xl)}}"]})};export{ut as RegisterComponent};
|