vue3plate-auth-sanctum
Version:
Vue 3 authentication package for vue3plate boilerplate that integrates with Laravel Sanctum
2 lines (1 loc) • 24.8 kB
JavaScript
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),q=require("vuex"),U=require("vue-router"),O=require("axios");function p(a){const o=q.useStore(),r=U.useRouter(),t=e.computed(()=>o.getters["auth/isAuthenticated"]),n=e.computed(()=>o.getters["auth/user"]),c=e.computed(()=>o.getters["auth/token"]),s=e.computed(()=>o.getters["auth/isLoading"]),l=e.computed(()=>o.getters["auth/error"]),i=e.computed(()=>o.getters["auth/userRole"]),_=e.computed(()=>o.getters["auth/userStatus"]),m=e.computed(()=>o.getters["auth/isAdmin"]),f=e.computed(()=>o.getters["auth/isStaff"]),T=e.computed(()=>o.getters["auth/isActive"]),C=e.computed(()=>o.getters["auth/fullName"]),L=async d=>{try{await o.dispatch("auth/login",d),r.push(a.afterLogin)}catch(N){throw N}},x=async d=>{try{await o.dispatch("auth/register",d),r.push(a.afterRegister)}catch(N){throw N}},B=async()=>{try{await o.dispatch("auth/logout"),r.push(a.afterLogout)}catch(d){console.warn("Logout error:",d),r.push(a.afterLogout)}},D=()=>{o.dispatch("auth/clearError")},I=()=>{o.dispatch("auth/initializeAuth")},b=d=>i.value===d,v=d=>d.includes(i.value),P=d=>!!(m.value||f.value&&["read","update"].includes(d)),h=()=>t.value?!0:(r.push("/login"),!1);return{isAuthenticated:t,user:n,token:c,isLoading:s,error:l,userRole:i,userStatus:_,isAdmin:m,isStaff:f,isActive:T,fullName:C,login:L,register:x,logout:B,clearError:D,initializeAuth:I,hasRole:b,hasAnyRole:v,can:P,requireAuth:h,requireGuest:()=>t.value?(r.push(a.afterLogin),!1):!0,requireRole:d=>h()?b(d)?!0:(r.push("/unauthorized"),!1):!1,requireAnyRole:d=>h()?v(d)?!0:(r.push("/unauthorized"),!1):!1}}const g=(a,o)=>{const r=a.__vccOpts||a;for(const[t,n]of o)r[t]=n;return r},M={name:"LoginForm",props:{config:{type:Object,default:()=>({})}},emits:["success","error"],setup(a,{emit:o}){const{login:r,isLoading:t,error:n,clearError:c}=p(a.config),s=e.ref({email:"",password:"",remember:!1}),l=e.ref(!1),i=e.computed(()=>{var m;return((m=n.value)==null?void 0:m.errors)||{}});return{form:s,showPassword:l,errors:i,isLoading:t,error:n,handleSubmit:async()=>{c();try{await r({email:s.value.email,password:s.value.password}),o("success")}catch(m){o("error",m)}}}}},F={key:0,class:"error-message"},z={class:"form-group"},G={class:"input-group"},K={key:0,class:"field-error"},j={class:"form-group"},H={class:"input-group"},J=["type"],W={key:0,class:"field-error"},Y={class:"form-group"},X={class:"checkbox-label"},Q=["disabled"],Z={class:"form-footer"},$={class:"signup-prompt"};function ee(a,o,r,t,n,c){const s=e.resolveComponent("font-awesome-icon"),l=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("form",{onSubmit:o[4]||(o[4]=e.withModifiers((...i)=>t.handleSubmit&&t.handleSubmit(...i),["prevent"])),class:"login-form"},[o[12]||(o[12]=e.createElementVNode("div",{class:"form-header"},[e.createElementVNode("h2",{class:"form-title"},"Welcome Back"),e.createElementVNode("p",{class:"form-subtitle"},"Sign in to your account")],-1)),t.error?(e.openBlock(),e.createElementBlock("div",F,[e.createVNode(s,{icon:"fa-solid fa-exclamation-circle"}),e.createTextVNode(" "+e.toDisplayString(t.error.message),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",z,[o[5]||(o[5]=e.createElementVNode("label",{for:"email",class:"form-label"},"Email Address",-1)),e.createElementVNode("div",G,[e.createVNode(s,{icon:"fa-solid fa-envelope",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"email","onUpdate:modelValue":o[0]||(o[0]=i=>t.form.email=i),type:"email",class:e.normalizeClass(["form-input",{error:t.errors.email}]),placeholder:"Enter your email",required:"",autocomplete:"email"},null,2),[[e.vModelText,t.form.email]])]),t.errors.email?(e.openBlock(),e.createElementBlock("span",K,e.toDisplayString(t.errors.email[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",j,[o[6]||(o[6]=e.createElementVNode("label",{for:"password",class:"form-label"},"Password",-1)),e.createElementVNode("div",H,[e.createVNode(s,{icon:"fa-solid fa-lock",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"password","onUpdate:modelValue":o[1]||(o[1]=i=>t.form.password=i),type:t.showPassword?"text":"password",class:e.normalizeClass(["form-input",{error:t.errors.password}]),placeholder:"Enter your password",required:"",autocomplete:"current-password"},null,10,J),[[e.vModelDynamic,t.form.password]]),e.createElementVNode("button",{type:"button",onClick:o[2]||(o[2]=i=>t.showPassword=!t.showPassword),class:"password-toggle"},[e.createVNode(s,{icon:t.showPassword?"fa-solid fa-eye-slash":"fa-solid fa-eye"},null,8,["icon"])])]),t.errors.password?(e.openBlock(),e.createElementBlock("span",W,e.toDisplayString(t.errors.password[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Y,[e.createElementVNode("label",X,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":o[3]||(o[3]=i=>t.form.remember=i),type:"checkbox",class:"checkbox-input"},null,512),[[e.vModelCheckbox,t.form.remember]]),o[7]||(o[7]=e.createElementVNode("span",{class:"checkbox-custom"},null,-1)),o[8]||(o[8]=e.createTextVNode(" Remember me "))])]),e.createElementVNode("button",{type:"submit",class:"submit-button",disabled:t.isLoading},[t.isLoading?(e.openBlock(),e.createBlock(s,{key:0,icon:"fa-solid fa-spinner",spin:"",class:"button-icon"})):(e.openBlock(),e.createBlock(s,{key:1,icon:"fa-solid fa-sign-in-alt",class:"button-icon"})),e.createTextVNode(" "+e.toDisplayString(t.isLoading?"Signing In...":"Sign In"),1)],8,Q),e.createElementVNode("div",Z,[e.createVNode(l,{to:"/forgot-password",class:"forgot-link"},{default:e.withCtx(()=>o[9]||(o[9]=[e.createTextVNode(" Forgot your password? ")])),_:1,__:[9]}),e.createElementVNode("div",$,[o[11]||(o[11]=e.createTextVNode(" Don't have an account? ")),e.createVNode(l,{to:"/register",class:"signup-link"},{default:e.withCtx(()=>o[10]||(o[10]=[e.createTextVNode(" Sign up here ")])),_:1,__:[10]})])])],32)}const E=g(M,[["render",ee],["__scopeId","data-v-de152c65"]]);const oe={name:"LoginPage",components:{LoginForm:E},props:{config:{type:Object,default:()=>({})}},methods:{handleLoginSuccess(){console.log("Login successful")},handleLoginError(a){console.error("Login error:",a)}}},te={class:"login-page"},re={class:"login-container"},se={class:"login-content"},ne={class:"brand-section"},ae={class:"brand-logo"};function ie(a,o,r,t,n,c){const s=e.resolveComponent("font-awesome-icon"),l=e.resolveComponent("LoginForm");return e.openBlock(),e.createElementBlock("div",te,[e.createElementVNode("div",re,[e.createElementVNode("div",se,[e.createElementVNode("div",ne,[e.createElementVNode("div",ae,[e.createVNode(s,{icon:"fa-solid fa-sign-in-alt"})]),o[0]||(o[0]=e.createElementVNode("h1",{class:"brand-title"},"vue3plate",-1)),o[1]||(o[1]=e.createElementVNode("p",{class:"brand-subtitle"},"Welcome Back",-1))]),e.createVNode(l,{config:r.config,onSuccess:c.handleLoginSuccess,onError:c.handleLoginError},null,8,["config","onSuccess","onError"])])])])}const w=g(oe,[["render",ie],["__scopeId","data-v-999b0c89"]]);const le={name:"RegisterForm",props:{config:{type:Object,default:()=>({})}},emits:["success","error"],setup(a,{emit:o}){const{register:r,isLoading:t,error:n,clearError:c}=p(a.config),s=e.ref({firstName:"",middleName:"",lastName:"",email:"",mobileNumber:"",password:"",passwordConfirmation:"",agreeToTerms:!1}),l=e.ref(!1),i=e.ref(!1),_=e.computed(()=>{var f;return((f=n.value)==null?void 0:f.errors)||{}});return{form:s,showPassword:l,showPasswordConfirm:i,errors:_,isLoading:t,error:n,handleSubmit:async()=>{c();try{await r({firstName:s.value.firstName,middleName:s.value.middleName,lastName:s.value.lastName,email:s.value.email,mobileNumber:s.value.mobileNumber,password:s.value.password,passwordConfirmation:s.value.passwordConfirmation}),o("success")}catch(f){o("error",f)}}}}},ce={key:0,class:"error-message"},de={class:"form-row"},ue={class:"form-group"},me={class:"input-group"},fe={key:0,class:"field-error"},pe={class:"form-group"},ge={class:"input-group"},_e={key:0,class:"field-error"},he={class:"form-group"},Ne={class:"input-group"},Ee={key:0,class:"field-error"},we={class:"form-group"},ye={class:"input-group"},Ve={key:0,class:"field-error"},be={class:"form-group"},ve={class:"input-group"},ke={key:0,class:"field-error"},Ae={class:"form-row"},Se={class:"form-group"},Re={class:"input-group"},Te=["type"],Ce={key:0,class:"field-error"},Le={class:"form-group"},xe={class:"input-group"},Be=["type"],De={key:0,class:"field-error"},Ie={class:"form-group"},Pe={class:"checkbox-label"},qe=["disabled"],Ue={class:"form-footer"},Oe={class:"signin-prompt"};function Me(a,o,r,t,n,c){const s=e.resolveComponent("font-awesome-icon"),l=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("form",{onSubmit:o[10]||(o[10]=e.withModifiers((...i)=>t.handleSubmit&&t.handleSubmit(...i),["prevent"])),class:"register-form"},[o[25]||(o[25]=e.createElementVNode("div",{class:"form-header"},[e.createElementVNode("h2",{class:"form-title"},"Create Account"),e.createElementVNode("p",{class:"form-subtitle"},"Join us today")],-1)),t.error?(e.openBlock(),e.createElementBlock("div",ce,[e.createVNode(s,{icon:"fa-solid fa-exclamation-circle"}),e.createTextVNode(" "+e.toDisplayString(t.error.message),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",de,[e.createElementVNode("div",ue,[o[11]||(o[11]=e.createElementVNode("label",{for:"firstName",class:"form-label"},"First Name",-1)),e.createElementVNode("div",me,[e.createVNode(s,{icon:"fa-solid fa-user",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"firstName","onUpdate:modelValue":o[0]||(o[0]=i=>t.form.firstName=i),type:"text",class:e.normalizeClass(["form-input",{error:t.errors.first_name}]),placeholder:"First name",required:"",autocomplete:"given-name"},null,2),[[e.vModelText,t.form.firstName]])]),t.errors.first_name?(e.openBlock(),e.createElementBlock("span",fe,e.toDisplayString(t.errors.first_name[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",pe,[o[12]||(o[12]=e.createElementVNode("label",{for:"lastName",class:"form-label"},"Last Name",-1)),e.createElementVNode("div",ge,[e.createVNode(s,{icon:"fa-solid fa-user",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"lastName","onUpdate:modelValue":o[1]||(o[1]=i=>t.form.lastName=i),type:"text",class:e.normalizeClass(["form-input",{error:t.errors.last_name}]),placeholder:"Last name",required:"",autocomplete:"family-name"},null,2),[[e.vModelText,t.form.lastName]])]),t.errors.last_name?(e.openBlock(),e.createElementBlock("span",_e,e.toDisplayString(t.errors.last_name[0]),1)):e.createCommentVNode("",!0)])]),e.createElementVNode("div",he,[o[13]||(o[13]=e.createElementVNode("label",{for:"middleName",class:"form-label"},"Middle Name (Optional)",-1)),e.createElementVNode("div",Ne,[e.createVNode(s,{icon:"fa-solid fa-user",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"middleName","onUpdate:modelValue":o[2]||(o[2]=i=>t.form.middleName=i),type:"text",class:e.normalizeClass(["form-input",{error:t.errors.middle_name}]),placeholder:"Middle name",autocomplete:"additional-name"},null,2),[[e.vModelText,t.form.middleName]])]),t.errors.middle_name?(e.openBlock(),e.createElementBlock("span",Ee,e.toDisplayString(t.errors.middle_name[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",we,[o[14]||(o[14]=e.createElementVNode("label",{for:"email",class:"form-label"},"Email Address",-1)),e.createElementVNode("div",ye,[e.createVNode(s,{icon:"fa-solid fa-envelope",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"email","onUpdate:modelValue":o[3]||(o[3]=i=>t.form.email=i),type:"email",class:e.normalizeClass(["form-input",{error:t.errors.email}]),placeholder:"Enter your email",required:"",autocomplete:"email"},null,2),[[e.vModelText,t.form.email]])]),t.errors.email?(e.openBlock(),e.createElementBlock("span",Ve,e.toDisplayString(t.errors.email[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",be,[o[15]||(o[15]=e.createElementVNode("label",{for:"mobileNumber",class:"form-label"},"Mobile Number",-1)),e.createElementVNode("div",ve,[e.createVNode(s,{icon:"fa-solid fa-phone",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"mobileNumber","onUpdate:modelValue":o[4]||(o[4]=i=>t.form.mobileNumber=i),type:"tel",class:e.normalizeClass(["form-input",{error:t.errors.mobile_number}]),placeholder:"Enter your mobile number",required:"",autocomplete:"tel"},null,2),[[e.vModelText,t.form.mobileNumber]])]),t.errors.mobile_number?(e.openBlock(),e.createElementBlock("span",ke,e.toDisplayString(t.errors.mobile_number[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ae,[e.createElementVNode("div",Se,[o[16]||(o[16]=e.createElementVNode("label",{for:"password",class:"form-label"},"Password",-1)),e.createElementVNode("div",Re,[e.createVNode(s,{icon:"fa-solid fa-lock",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"password","onUpdate:modelValue":o[5]||(o[5]=i=>t.form.password=i),type:t.showPassword?"text":"password",class:e.normalizeClass(["form-input",{error:t.errors.password}]),placeholder:"Create password",required:"",autocomplete:"new-password"},null,10,Te),[[e.vModelDynamic,t.form.password]]),e.createElementVNode("button",{type:"button",onClick:o[6]||(o[6]=i=>t.showPassword=!t.showPassword),class:"password-toggle"},[e.createVNode(s,{icon:t.showPassword?"fa-solid fa-eye-slash":"fa-solid fa-eye"},null,8,["icon"])])]),t.errors.password?(e.openBlock(),e.createElementBlock("span",Ce,e.toDisplayString(t.errors.password[0]),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Le,[o[17]||(o[17]=e.createElementVNode("label",{for:"passwordConfirmation",class:"form-label"},"Confirm Password",-1)),e.createElementVNode("div",xe,[e.createVNode(s,{icon:"fa-solid fa-lock",class:"input-icon"}),e.withDirectives(e.createElementVNode("input",{id:"passwordConfirmation","onUpdate:modelValue":o[7]||(o[7]=i=>t.form.passwordConfirmation=i),type:t.showPasswordConfirm?"text":"password",class:e.normalizeClass(["form-input",{error:t.errors.password_confirmation}]),placeholder:"Confirm password",required:"",autocomplete:"new-password"},null,10,Be),[[e.vModelDynamic,t.form.passwordConfirmation]]),e.createElementVNode("button",{type:"button",onClick:o[8]||(o[8]=i=>t.showPasswordConfirm=!t.showPasswordConfirm),class:"password-toggle"},[e.createVNode(s,{icon:t.showPasswordConfirm?"fa-solid fa-eye-slash":"fa-solid fa-eye"},null,8,["icon"])])]),t.errors.password_confirmation?(e.openBlock(),e.createElementBlock("span",De,e.toDisplayString(t.errors.password_confirmation[0]),1)):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Ie,[e.createElementVNode("label",Pe,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":o[9]||(o[9]=i=>t.form.agreeToTerms=i),type:"checkbox",class:"checkbox-input",required:""},null,512),[[e.vModelCheckbox,t.form.agreeToTerms]]),o[18]||(o[18]=e.createElementVNode("span",{class:"checkbox-custom"},null,-1)),o[19]||(o[19]=e.createTextVNode(" I agree to the ")),o[20]||(o[20]=e.createElementVNode("a",{href:"/terms",target:"_blank",class:"terms-link"},"Terms of Service",-1)),o[21]||(o[21]=e.createTextVNode(" and ")),o[22]||(o[22]=e.createElementVNode("a",{href:"/privacy",target:"_blank",class:"terms-link"},"Privacy Policy",-1))])]),e.createElementVNode("button",{type:"submit",class:"submit-button",disabled:t.isLoading||!t.form.agreeToTerms},[t.isLoading?(e.openBlock(),e.createBlock(s,{key:0,icon:"fa-solid fa-spinner",spin:"",class:"button-icon"})):(e.openBlock(),e.createBlock(s,{key:1,icon:"fa-solid fa-user-plus",class:"button-icon"})),e.createTextVNode(" "+e.toDisplayString(t.isLoading?"Creating Account...":"Create Account"),1)],8,qe),e.createElementVNode("div",Ue,[e.createElementVNode("div",Oe,[o[24]||(o[24]=e.createTextVNode(" Already have an account? ")),e.createVNode(l,{to:"/login",class:"signin-link"},{default:e.withCtx(()=>o[23]||(o[23]=[e.createTextVNode(" Sign in here ")])),_:1,__:[23]})])])],32)}const y=g(le,[["render",Me],["__scopeId","data-v-be35a40f"]]);const Fe={name:"RegisterPage",components:{RegisterForm:y},props:{config:{type:Object,default:()=>({})}},methods:{handleRegisterSuccess(){console.log("Registration successful")},handleRegisterError(a){console.error("Registration error:",a)}}},ze={class:"register-page"},Ge={class:"register-container"},Ke={class:"register-content"},je={class:"brand-section"},He={class:"brand-logo"};function Je(a,o,r,t,n,c){const s=e.resolveComponent("font-awesome-icon"),l=e.resolveComponent("RegisterForm");return e.openBlock(),e.createElementBlock("div",ze,[e.createElementVNode("div",Ge,[e.createElementVNode("div",Ke,[e.createElementVNode("div",je,[e.createElementVNode("div",He,[e.createVNode(s,{icon:"fa-solid fa-user-plus"})]),o[0]||(o[0]=e.createElementVNode("h1",{class:"brand-title"},"vue3plate",-1)),o[1]||(o[1]=e.createElementVNode("p",{class:"brand-subtitle"},"Join Our Community",-1))]),e.createVNode(l,{config:r.config,onSuccess:c.handleRegisterSuccess,onError:c.handleRegisterError},null,8,["config","onSuccess","onError"])])])])}const V=g(Fe,[["render",Je],["__scopeId","data-v-ea5bb4e2"]]);const We={name:"AuthGuard",props:{config:{type:Object,default:()=>({})},requireRole:{type:String,default:null},requireAnyRole:{type:Array,default:()=>[]}},setup(a){const{isAuthenticated:o,isLoading:r,userRole:t,hasRole:n,hasAnyRole:c}=p(a.config),s=e.computed(()=>a.requireRole?n(a.requireRole):a.requireAnyRole.length>0?c(a.requireAnyRole):!0);return{isAuthenticated:e.computed(()=>o.value&&s.value),isLoading:r,userRole:t}}},Ye={key:0},Xe={key:1,class:"auth-guard-message"},Qe={class:"message-content"},Ze={key:2,class:"auth-guard-loading"};function $e(a,o,r,t,n,c){const s=e.resolveComponent("font-awesome-icon"),l=e.resolveComponent("router-link");return t.isAuthenticated?(e.openBlock(),e.createElementBlock("div",Ye,[e.renderSlot(a.$slots,"default",{},void 0,!0)])):t.isLoading?(e.openBlock(),e.createElementBlock("div",Ze,[e.createVNode(s,{icon:"fa-solid fa-spinner",spin:"",class:"loading-icon"}),o[3]||(o[3]=e.createElementVNode("p",null,"Checking authentication...",-1))])):(e.openBlock(),e.createElementBlock("div",Xe,[e.createElementVNode("div",Qe,[e.createVNode(s,{icon:"fa-solid fa-lock",class:"lock-icon"}),o[1]||(o[1]=e.createElementVNode("h3",{class:"message-title"},"Authentication Required",-1)),o[2]||(o[2]=e.createElementVNode("p",{class:"message-text"},"You need to be logged in to access this content.",-1)),e.createVNode(l,{to:"/login",class:"login-button"},{default:e.withCtx(()=>[e.createVNode(s,{icon:"fa-solid fa-sign-in-alt"}),o[0]||(o[0]=e.createTextVNode(" Sign In "))]),_:1,__:[0]})])]))}const k=g(We,[["render",$e],["__scopeId","data-v-f42a8912"]]);class eo{constructor(){this.config=null,this.client=null}init(o){this.config=o,this.client=O.create({baseURL:o.apiBaseUrl,timeout:1e4,headers:{"Content-Type":"application/json",Accept:"application/json","X-Requested-With":"XMLHttpRequest"}}),this.client.interceptors.request.use(r=>{const t=localStorage.getItem(o.tokenKey);return t&&(r.headers.Authorization=`Bearer ${t}`),r},r=>Promise.reject(r)),this.client.interceptors.response.use(r=>r,r=>{var t;return((t=r.response)==null?void 0:t.status)===401&&(this.clearAuthData(),window.location.pathname!=="/login"&&(window.location.href="/login")),Promise.reject(r)})}async register(o){try{const r=await this.client.post("/register-account",{first_name:o.firstName,middle_name:o.middleName||"",last_name:o.lastName,email:o.email,mobile_number:o.mobileNumber,password:o.password,password_confirmation:o.passwordConfirmation});return r.data.token&&this.setAuthData(r.data.token,r.data.user),r.data}catch(r){throw this.handleError(r)}}async login(o){try{const r=await this.client.post("/login",{email:o.email,password:o.password});return r.data.token&&this.setAuthData(r.data.token,r.data.user),r.data}catch(r){throw this.handleError(r)}}async logout(){try{const o=await this.client.post("/logout");return this.clearAuthData(),o.data}catch(o){throw this.clearAuthData(),this.handleError(o)}}setAuthData(o,r){localStorage.setItem(this.config.tokenKey,o),localStorage.setItem(this.config.userKey,JSON.stringify(r))}clearAuthData(){localStorage.removeItem(this.config.tokenKey),localStorage.removeItem(this.config.userKey)}getStoredToken(){return localStorage.getItem(this.config.tokenKey)}getStoredUser(){const o=localStorage.getItem(this.config.userKey);return o?JSON.parse(o):null}isAuthenticated(){return!!this.getStoredToken()}handleError(o){return o.response?{message:o.response.data.message||"An error occurred",errors:o.response.data.errors||{},status:o.response.status}:o.request?{message:"Network error. Please check your connection.",errors:{},status:0}:{message:o.message||"An unexpected error occurred",errors:{},status:0}}}const u=new eo;function A(a){return{namespaced:!0,state:()=>({user:u.getStoredUser(),token:u.getStoredToken(),isLoading:!1,error:null,isAuthenticated:u.isAuthenticated()}),getters:{isAuthenticated:o=>o.isAuthenticated,user:o=>o.user,token:o=>o.token,isLoading:o=>o.isLoading,error:o=>o.error,userRole:o=>{var r,t;return((t=(r=o.user)==null?void 0:r.role)==null?void 0:t.name)||null},userStatus:o=>{var r,t;return((t=(r=o.user)==null?void 0:r.status)==null?void 0:t.name)||null},isAdmin:o=>{var r,t;return((t=(r=o.user)==null?void 0:r.role)==null?void 0:t.name)==="Admin"},isStaff:o=>{var r,t;return((t=(r=o.user)==null?void 0:r.role)==null?void 0:t.name)==="Staff"},isActive:o=>{var r,t;return((t=(r=o.user)==null?void 0:r.status)==null?void 0:t.name)==="Active"},fullName:o=>{if(!o.user)return"";const{first_name:r,middle_name:t,last_name:n}=o.user;return[r,t,n].filter(Boolean).join(" ")}},mutations:{SET_LOADING(o,r){o.isLoading=r},SET_ERROR(o,r){o.error=r},SET_AUTH_DATA(o,{user:r,token:t}){o.user=r,o.token=t,o.isAuthenticated=!0,o.error=null},CLEAR_AUTH_DATA(o){o.user=null,o.token=null,o.isAuthenticated=!1,o.error=null},UPDATE_USER(o,r){o.user&&(o.user={...o.user,...r})}},actions:{async login({commit:o,dispatch:r},t){o("SET_LOADING",!0),o("SET_ERROR",null);try{const n=await u.login(t);return o("SET_AUTH_DATA",{user:n.user,token:n.token}),r("app/addHeaderMenuItem",{id:"user-menu",type:"dropdown",label:n.user.first_name,icon:"fa-solid fa-user",items:[{id:"logout",label:"Logout",icon:"fa-solid fa-sign-out-alt",action:()=>r("logout")}]},{root:!0}),n}catch(n){throw o("SET_ERROR",n),n}finally{o("SET_LOADING",!1)}},async register({commit:o,dispatch:r},t){o("SET_LOADING",!0),o("SET_ERROR",null);try{const n=await u.register(t);return o("SET_AUTH_DATA",{user:n.user,token:n.token}),r("app/addHeaderMenuItem",{id:"user-menu",type:"dropdown",label:n.user.first_name,icon:"fa-solid fa-user",items:[{id:"logout",label:"Logout",icon:"fa-solid fa-sign-out-alt",action:()=>r("logout")}]},{root:!0}),n}catch(n){throw o("SET_ERROR",n),n}finally{o("SET_LOADING",!1)}},async logout({commit:o,dispatch:r}){o("SET_LOADING",!0);try{await u.logout()}catch(t){console.warn("Logout API call failed:",t)}finally{o("CLEAR_AUTH_DATA"),r("app/removeHeaderMenuItem","user-menu",{root:!0}),o("SET_LOADING",!1)}},initializeAuth({commit:o,dispatch:r}){const t=u.getStoredToken(),n=u.getStoredUser();t&&n&&(o("SET_AUTH_DATA",{user:n,token:t}),r("app/addHeaderMenuItem",{id:"user-menu",type:"dropdown",label:n.first_name,icon:"fa-solid fa-user",items:[{id:"logout",label:"Logout",icon:"fa-solid fa-sign-out-alt",action:()=>r("logout")}]},{root:!0}))},clearError({commit:o}){o("SET_ERROR",null)}}}}function S(a){return[{path:"/login",name:"Login",component:w,meta:{layout:"auth",requiresGuest:!0,title:"Login"},beforeEnter:(o,r,t)=>{localStorage.getItem(a.tokenKey)?t(a.afterLogin):t()}},{path:"/register",name:"Register",component:V,meta:{layout:"auth",requiresGuest:!0,title:"Register"},beforeEnter:(o,r,t)=>{localStorage.getItem(a.tokenKey)?t(a.afterRegister):t()}}]}function R(a={}){const r={...{apiBaseUrl:{}.VITE_API_URL||"http://localhost:8000/api",tokenKey:{}.VITE_TOKEN_KEY||"auth_token",userKey:{}.VITE_USER_KEY||"auth_user",afterLogin:"/dashboard",afterLogout:"/",afterRegister:"/dashboard"},...a};return u.init(r),{name:"authentication",config:r,routes:S(r),store:A(),components:{LoginForm:E,RegisterForm:y,AuthGuard:k},views:{LoginPage:w,RegisterPage:V},composables:{useAuth:()=>p(r)},api:u,sidebarItems:[],headerItems:[{id:"auth-logout",label:"Logout",icon:"fa-solid fa-sign-out-alt",action:"logout",requiresAuth:!0}]}}exports.AuthGuard=k;exports.LoginForm=E;exports.LoginPage=w;exports.RegisterForm=y;exports.RegisterPage=V;exports.authApi=u;exports.authRoutes=S;exports.authStore=A;exports.createAuthenticationFeature=R;exports.default=R;exports.useAuth=p;