(ne(g))return this._returnResult({data:null,error:g});throw g}const{data:{session:s},error:u}=await this.getSession();if(u)return this._returnResult({data:null,error:u});if(!s)return{data:{currentLevel:null,nextLevel:null,currentAuthenticationMethods:[]},error:null};const{payload:c}=Fc(s.access_token);let d=null;c.aal&&(d=c.aal);let h=d;((a=(i=s.user.factors)===null||i===void 0?void 0:i.filter(g=>g.status==="verified"))!==null&&a!==void 0?a:[]).length>0&&(h="aal2");const m=c.amr||[];return{data:{currentLevel:d,nextLevel:h,currentAuthenticationMethods:m},error:null}}async _getAuthorizationDetails(t){try{return await this._useSession(async r=>{const{data:{session:n},error:i}=r;return i?this._returnResult({data:null,error:i}):n?await ue(this.fetch,"GET",`${this.url}/oauth/authorizations/${t}`,{headers:this.headers,jwt:n.access_token,xform:a=>({data:a,error:null})}):this._returnResult({data:null,error:new At})})}catch(r){if(ne(r))return this._returnResult({data:null,error:r});throw r}}async _approveAuthorization(t,r){try{return await this._useSession(async n=>{const{data:{session:i},error:a}=n;if(a)return this._returnResult({data:null,error:a});if(!i)return this._returnResult({data:null,error:new At});const s=await ue(this.fetch,"POST",`${this.url}/oauth/authorizations/${t}/consent`,{headers:this.headers,jwt:i.access_token,body:{action:"approve"},xform:u=>({data:u,error:null})});return s.data&&s.data.redirect_url&&Lt()&&!(r!=null&&r.skipBrowserRedirect)&&window.location.assign(s.data.redirect_url),s})}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}async _denyAuthorization(t,r){try{return await this._useSession(async n=>{const{data:{session:i},error:a}=n;if(a)return this._returnResult({data:null,error:a});if(!i)return this._returnResult({data:null,error:new At});const s=await ue(this.fetch,"POST",`${this.url}/oauth/authorizations/${t}/consent`,{headers:this.headers,jwt:i.access_token,body:{action:"deny"},xform:u=>({data:u,error:null})});return s.data&&s.data.redirect_url&&Lt()&&!(r!=null&&r.skipBrowserRedirect)&&window.location.assign(s.data.redirect_url),s})}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}async _listOAuthGrants(){try{return await this._useSession(async t=>{const{data:{session:r},error:n}=t;return n?this._returnResult({data:null,error:n}):r?await ue(this.fetch,"GET",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:r.access_token,xform:i=>({data:i,error:null})}):this._returnResult({data:null,error:new At})})}catch(t){if(ne(t))return this._returnResult({data:null,error:t});throw t}}async _revokeOAuthGrant(t){try{return await this._useSession(async r=>{const{data:{session:n},error:i}=r;return i?this._returnResult({data:null,error:i}):n?(await ue(this.fetch,"DELETE",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:n.access_token,query:{client_id:t.clientId},noResolveJson:!0}),{data:{},error:null}):this._returnResult({data:null,error:new At})})}catch(r){if(ne(r))return this._returnResult({data:null,error:r});throw r}}async fetchJwk(t,r={keys:[]}){let n=r.keys.find(u=>u.kid===t);if(n)return n;const i=Date.now();if(n=this.jwks.keys.find(u=>u.kid===t),n&&this.jwks_cached_at+A$>i)return n;const{data:a,error:s}=await ue(this.fetch,"GET",`${this.url}/.well-known/jwks.json`,{headers:this.headers});if(s)throw s;return!a.keys||a.keys.length===0||(this.jwks=a,this.jwks_cached_at=i,n=a.keys.find(u=>u.kid===t),!n)?null:n}async getClaims(t,r={}){try{let n=t;if(!n){const{data:g,error:b}=await this.getSession();if(b||!g.session)return this._returnResult({data:null,error:b});n=g.session.access_token}const{header:i,payload:a,signature:s,raw:{header:u,payload:c}}=Fc(n);r!=null&&r.allowExpired||X$(a.exp);const d=!i.alg||i.alg.startsWith("HS")||!i.kid||!("crypto"in globalThis&&"subtle"in globalThis.crypto)?null:await this.fetchJwk(i.kid,r!=null&&r.keys?{keys:r.keys}:r==null?void 0:r.jwks);if(!d){const{error:g}=await this.getUser(n);if(g)throw g;return{data:{claims:a,header:i,signature:s},error:null}}const h=J$(i.alg),p=await crypto.subtle.importKey("jwk",d,h,!0,["verify"]);if(!await crypto.subtle.verify(h,p,s,$$(`${u}.${c}`)))throw new xg("Invalid JWT signature");return{data:{claims:a,header:i,signature:s},error:null}}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}async signInWithPasskey(t){var r,n,i;tn(this.experimental);try{if(!bd())return this._returnResult({data:null,error:new an("Browser does not support WebAuthn",null)});const{data:a,error:s}=await this._startPasskeyAuthentication({options:{captchaToken:(r=t==null?void 0:t.options)===null||r===void 0?void 0:r.captchaToken}});if(s||!a)return this._returnResult({data:null,error:s});const u=V1(a.options),c=(i=(n=t==null?void 0:t.options)===null||n===void 0?void 0:n.signal)!==null&&i!==void 0?i:_g.createNewAbortSignal(),{data:d,error:h}=await HO({publicKey:u,signal:c});if(h||!d)return this._returnResult({data:null,error:h??new an("WebAuthn ceremony failed",null)});const p=Y1(d);return this._verifyPasskeyAuthentication({challengeId:a.challenge_id,credential:p})}catch(a){if(ne(a))return this._returnResult({data:null,error:a});throw a}}async registerPasskey(t){var r,n;tn(this.experimental);try{if(!bd())return this._returnResult({data:null,error:new an("Browser does not support WebAuthn",null)});const{data:i,error:a}=await this._startPasskeyRegistration();if(a||!i)return this._returnResult({data:null,error:a});const s=K1(i.options),u=(n=(r=t==null?void 0:t.options)===null||r===void 0?void 0:r.signal)!==null&&n!==void 0?n:_g.createNewAbortSignal(),{data:c,error:d}=await qO({publicKey:s,signal:u});if(d||!c)return this._returnResult({data:null,error:d??new an("WebAuthn ceremony failed",null)});const h=G1(c);return this._verifyPasskeyRegistration({challengeId:i.challenge_id,credential:h})}catch(i){if(ne(i))return this._returnResult({data:null,error:i});throw i}}async _startPasskeyRegistration(){tn(this.experimental);try{return await this._useSession(async t=>{const{data:{session:r},error:n}=t;if(n)return this._returnResult({data:null,error:n});if(!r)return this._returnResult({data:null,error:new At});const{data:i,error:a}=await ue(this.fetch,"POST",`${this.url}/passkeys/registration/options`,{headers:this.headers,jwt:r.access_token,body:{}});return a?this._returnResult({data:null,error:a}):this._returnResult({data:i,error:null})})}catch(t){if(ne(t))return this._returnResult({data:null,error:t});throw t}}async _verifyPasskeyRegistration(t){tn(this.experimental);try{return await this._useSession(async r=>{const{data:{session:n},error:i}=r;if(i)return this._returnResult({data:null,error:i});if(!n)return this._returnResult({data:null,error:new At});const{data:a,error:s}=await ue(this.fetch,"POST",`${this.url}/passkeys/registration/verify`,{headers:this.headers,jwt:n.access_token,body:{challenge_id:t.challengeId,credential:t.credential}});return s?this._returnResult({data:null,error:s}):this._returnResult({data:a,error:null})})}catch(r){if(ne(r))return this._returnResult({data:null,error:r});throw r}}async _startPasskeyAuthentication(t){var r;tn(this.experimental);try{const{data:n,error:i}=await ue(this.fetch,"POST",`${this.url}/passkeys/authentication/options`,{headers:this.headers,body:{gotrue_meta_security:{captcha_token:(r=t==null?void 0:t.options)===null||r===void 0?void 0:r.captchaToken}}});return i?this._returnResult({data:null,error:i}):this._returnResult({data:n,error:null})}catch(n){if(ne(n))return this._returnResult({data:null,error:n});throw n}}async _verifyPasskeyAuthentication(t){tn(this.experimental);try{const{data:r,error:n}=await ue(this.fetch,"POST",`${this.url}/passkeys/authentication/verify`,{headers:this.headers,body:{challenge_id:t.challengeId,credential:t.credential},xform:Lr});return n?this._returnResult({data:null,error:n}):(r.session&&(await this._saveSession(r.session),await this._notifyAllSubscribers("SIGNED_IN",r.session)),this._returnResult({data:r,error:null}))}catch(r){if(ne(r))return this._returnResult({data:null,error:r});throw r}}async _listPasskeys(){tn(this.experimental);try{return await this._useSession(async t=>{const{data:{session:r},error:n}=t;if(n)return this._returnResult({data:null,error:n});if(!r)return this._returnResult({data:null,error:new At});const{data:i,error:a}=await ue(this.fetch,"GET",`${this.url}/passkeys`,{headers:this.headers,jwt:r.access_token,xform:s=>({data:s,error:null})});return a?this._returnResult({data:null,error:a}):this._returnResult({data:i,error:null})})}catch(t){if(ne(t))return this._returnResult({data:null,error:t});throw t}}async _updatePasskey(t){tn(this.experimental);try{return await this._useSession(async r=>{const{data:{session:n},error:i}=r;if(i)return this._returnResult({data:null,error:i});if(!n)return this._returnResult({data:null,error:new At});const{data:a,error:s}=await ue(this.fetch,"PATCH",`${this.url}/passkeys/${t.passkeyId}`,{headers:this.headers,jwt:n.access_token,body:{friendly_name:t.friendlyName}});return s?this._returnResult({data:null,error:s}):this._returnResult({data:a,error:null})})}catch(r){if(ne(r))return this._returnResult({data:null,error:r});throw r}}async _deletePasskey(t){tn(this.experimental);try{return await this._useSession(async r=>{const{data:{session:n},error:i}=r;if(i)return this._returnResult({data:null,error:i});if(!n)return this._returnResult({data:null,error:new At});const{error:a}=await ue(this.fetch,"DELETE",`${this.url}/passkeys/${t.passkeyId}`,{headers:this.headers,jwt:n.access_token,noResolveJson:!0});return a?this._returnResult({data:null,error:a}):this._returnResult({data:null,error:null})})}catch(r){if(ne(r))return this._returnResult({data:null,error:r});throw r}}}Bl.nextInstanceID={};const xL=Bl,_L="2.106.2";let kl="";typeof Deno<"u"?kl="deno":typeof document<"u"?kl="web":typeof navigator<"u"&&navigator.product==="ReactNative"?kl="react-native":kl="node";const SL={"X-Client-Info":`supabase-js-${kl}/${_L}`},kL={headers:SL},PL={schema:"public"},EL={autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"implicit"},OL={},AL={enabled:!1,respectSamplingDecision:!0};function CL(e,t,r,n){function i(a){return a instanceof r?a:new r(function(s){s(a)})}return new(r||(r=Promise))(function(a,s){function u(h){try{d(n.next(h))}catch(p){s(p)}}function c(h){try{d(n.throw(h))}catch(p){s(p)}}function d(h){h.done?a(h.value):i(h.value).then(u,c)}d((n=n.apply(e,[])).next())})}let wv=null;const jL="@opentelemetry/api";function TL(){return wv===null&&(wv=import(jL).catch(()=>null)),wv}function NL(){return CL(this,void 0,void 0,function*(){try{const e=yield TL();if(!e||!e.propagation||!e.context)return null;const t={};e.propagation.inject(e.context.active(),t);const r=t.traceparent;return r?{traceparent:r,tracestate:t.tracestate,baggage:t.baggage}:null}catch{return null}})}function IL(e){if(!e||typeof e!="string")return null;const t=e.split("-");if(t.length!==4)return null;const[r,n,i,a]=t;if(r.length!==2||n.length!==32||i.length!==16||a.length!==2)return null;const s=/^[0-9a-f]+$/i;return!s.test(r)||!s.test(n)||!s.test(i)||!s.test(a)||n==="00000000000000000000000000000000"||i==="0000000000000000"?null:{version:r,traceId:n,parentId:i,traceFlags:a,isSampled:(parseInt(a,16)&1)===1}}function RL(e,t){if(!e||!t||t.length===0)return!1;let r;if(e instanceof URL)r=e;else try{r=new URL(e)}catch{return!1}for(const n of t)try{if(typeof n=="string"){if(DL(r.hostname,n))return!0}else if(n instanceof RegExp){if(n.test(r.hostname))return!0}else if(typeof n=="function"&&n(r))return!0}catch{continue}return!1}function DL(e,t){if(t===e)return!0;if(t.startsWith("*.")){const r=t.slice(2);if(e.endsWith(r)&&(e===r||e.endsWith("."+r)))return!0}return!1}function ML(e){const t=[];try{const r=new URL(e);t.push(r.hostname)}catch{}return t.push("*.supabase.co","*.supabase.in"),t.push("localhost","127.0.0.1","[::1]"),t}function Fl(e){"@babel/helpers - typeof";return Fl=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Fl(e)}function $L(e,t){if(Fl(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(Fl(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function LL(e){var t=$L(e,"string");return Fl(t)=="symbol"?t:t+""}function zL(e,t,r){return(t=LL(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function J1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function st(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?J1(Object(r),!0).forEach(function(n){zL(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):J1(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}const UL=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),BL=()=>Headers,FL=(e,t,r,n,i)=>{const a=UL(n),s=BL(),u=(i==null?void 0:i.enabled)===!0,c=(i==null?void 0:i.respectSamplingDecision)!==!1,d=u?ML(t):null;return async(h,p)=>{var m;const g=(m=await r())!==null&&m!==void 0?m:e;let b=new s(p==null?void 0:p.headers);if(b.has("apikey")||b.set("apikey",e),b.has("Authorization")||b.set("Authorization",`Bearer ${g}`),d){const w=await WL(h,d,c);w&&(w.traceparent&&!b.has("traceparent")&&b.set("traceparent",w.traceparent),w.tracestate&&!b.has("tracestate")&&b.set("tracestate",w.tracestate),w.baggage&&!b.has("baggage")&&b.set("baggage",w.baggage))}return a(h,st(st({},p),{},{headers:b}))}};async function WL(e,t,r){if(!RL(typeof e=="string"||e instanceof URL?e:e.url,t))return null;const n=await NL();if(!n||!n.traceparent)return null;if(r){const i=IL(n.traceparent);if(i&&!i.isSampled)return null}return n}function Q1(e){return typeof e=="boolean"?{enabled:e}:e}function qL(e){return e.endsWith("/")?e:e+"/"}function HL(e,t){var r,n,i,a,s,u;const{db:c,auth:d,realtime:h,global:p}=e,{db:m,auth:g,realtime:b,global:w}=t,S=Q1(e.tracePropagation),k=Q1(t.tracePropagation),A={db:st(st({},m),c),auth:st(st({},g),d),realtime:st(st({},b),h),storage:{},global:st(st(st({},w),p),{},{headers:st(st({},(r=w==null?void 0:w.headers)!==null&&r!==void 0?r:{}),(n=p==null?void 0:p.headers)!==null&&n!==void 0?n:{})}),tracePropagation:{enabled:(i=(a=S==null?void 0:S.enabled)!==null&&a!==void 0?a:k==null?void 0:k.enabled)!==null&&i!==void 0?i:!1,respectSamplingDecision:(s=(u=S==null?void 0:S.respectSamplingDecision)!==null&&u!==void 0?u:k==null?void 0:k.respectSamplingDecision)!==null&&s!==void 0?s:!0},accessToken:async()=>""};return e.accessToken?A.accessToken=e.accessToken:delete A.accessToken,A}function KL(e){const t=e==null?void 0:e.trim();if(!t)throw new Error("supabaseUrl is required.");if(!t.match(/^https?:\/\//i))throw new Error("Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.");try{return new URL(qL(t))}catch{throw Error("Invalid supabaseUrl: Provided URL is malformed.")}}var VL=class extends xL{constructor(e){super(e)}},GL=class{constructor(e,t,r){var n,i;this.supabaseUrl=e,this.supabaseKey=t;const a=KL(e);if(!t)throw new Error("supabaseKey is required.");this.realtimeUrl=new URL("realtime/v1",a),this.realtimeUrl.protocol=this.realtimeUrl.protocol.replace("http","ws"),this.authUrl=new URL("auth/v1",a),this.storageUrl=new URL("storage/v1",a),this.functionsUrl=new URL("functions/v1",a);const s=`sb-${a.hostname.split(".")[0]}-auth-token`,u={db:PL,realtime:OL,auth:st(st({},EL),{},{storageKey:s}),global:kL,tracePropagation:AL},c=HL(r??{},u);if(this.settings=c,this.storageKey=(n=c.auth.storageKey)!==null&&n!==void 0?n:"",this.headers=(i=c.global.headers)!==null&&i!==void 0?i:{},c.accessToken)this.accessToken=c.accessToken,this.auth=new Proxy({},{get:(h,p)=>{throw new Error(`@supabase/supabase-js: Supabase Client is configured with the accessToken option, accessing supabase.auth.${String(p)} is not possible`)}});else{var d;this.auth=this._initSupabaseAuthClient((d=c.auth)!==null&&d!==void 0?d:{},this.headers,c.global.fetch)}this.fetch=FL(t,e,this._getAccessToken.bind(this),c.global.fetch,c.tracePropagation),this.realtime=this._initRealtimeClient(st({headers:this.headers,accessToken:this._getAccessToken.bind(this),fetch:this.fetch},c.realtime)),this.accessToken&&Promise.resolve(this.accessToken()).then(h=>this.realtime.setAuth(h)).catch(h=>console.warn("Failed to set initial Realtime auth token:",h)),this.rest=new cM(new URL("rest/v1",a).href,{headers:this.headers,schema:c.db.schema,fetch:this.fetch,timeout:c.db.timeout,urlLengthLimit:c.db.urlLengthLimit}),this.storage=new S$(this.storageUrl.href,this.headers,this.fetch,r==null?void 0:r.storage),c.accessToken||this._listenForAuthEvents()}get functions(){return new eM(this.functionsUrl.href,{headers:this.headers,customFetch:this.fetch})}from(e){return this.rest.from(e)}schema(e){return this.rest.schema(e)}rpc(e,t={},r={head:!1,get:!1,count:void 0}){return this.rest.rpc(e,t,r)}channel(e,t={config:{}}){return this.realtime.channel(e,t)}getChannels(){return this.realtime.getChannels()}removeChannel(e){return this.realtime.removeChannel(e)}removeAllChannels(){return this.realtime.removeAllChannels()}async _getAccessToken(){var e=this,t,r;if(e.accessToken)return await e.accessToken();const{data:n}=await e.auth.getSession();return(t=(r=n.session)===null||r===void 0?void 0:r.access_token)!==null&&t!==void 0?t:e.supabaseKey}_initSupabaseAuthClient({autoRefreshToken:e,persistSession:t,detectSessionInUrl:r,storage:n,userStorage:i,storageKey:a,flowType:s,lock:u,debug:c,throwOnError:d,experimental:h,lockAcquireTimeout:p,skipAutoInitialize:m},g,b){const w={Authorization:`Bearer ${this.supabaseKey}`,apikey:`${this.supabaseKey}`};return new VL({url:this.authUrl.href,headers:st(st({},w),g),storageKey:a,autoRefreshToken:e,persistSession:t,detectSessionInUrl:r,storage:n,userStorage:i,flowType:s,lock:u,debug:c,throwOnError:d,experimental:h,fetch:b,lockAcquireTimeout:p,skipAutoInitialize:m,hasCustomAuthorizationHeader:Object.keys(this.headers).some(S=>S.toLowerCase()==="authorization")})}_initRealtimeClient(e){return new KM(this.realtimeUrl.href,st(st({},e),{},{params:st(st({},{apikey:this.supabaseKey}),e==null?void 0:e.params)}))}_listenForAuthEvents(){return this.auth.onAuthStateChange((e,t)=>{this._handleTokenChanged(e,"CLIENT",t==null?void 0:t.access_token)})}_handleTokenChanged(e,t,r){(e==="TOKEN_REFRESHED"||e==="SIGNED_IN")&&this.changedAccessToken!==r?(this.changedAccessToken=r,this.realtime.setAuth(r)):e==="SIGNED_OUT"&&(this.realtime.setAuth(),t=="STORAGE"&&this.auth.signOut(),this.changedAccessToken=void 0)}};const YL=(e,t,r)=>new GL(e,t,r);function XL(){if(typeof window<"u")return!1;const e=globalThis.process;if(!e)return!1;const t=e.version;if(t==null)return!1;const r=t.match(/^v(\d+)\./);return r?parseInt(r[1],10)<=18:!1}XL()&&console.warn("âš ď¸Ź  Node.js 18 and below are deprecated and will no longer be supported in future versions of @supabase/supabase-js. Please upgrade to Node.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217");const JL="https://djlqjuhzxunvcwjbjzwz.supabase.co",KO="sb_publishable_Emy_uTVEHgno5brBYZ9c3g_9uhWzhGf",_r=!!KO,Be=_r?YL(JL,KO,{auth:{persistSession:!0,autoRefreshToken:!0}}):null,VO="retailcrm-local-db",Sg={id:"local-user"},QL={user:null,products:[{id:"prod-1",user_id:Sg.id,name:"Kawa ziarnista 1 kg",sku:"KAW-001",purchase_price:42,sell_price:65,stock_qty:8,unit:"szt",category:"SpoĹĽywcze",created_at:new Date().toISOString()},{id:"prod-2",user_id:Sg.id,name:"Torba papierowa",sku:"TOR-010",purchase_price:.35,sell_price:.8,stock_qty:4,unit:"szt",category:"Akcesoria",created_at:new Date().toISOString()}],sales:[],saleItems:[],stockPurchases:[],settings:{shopName:"RetailCRM",currency:"zĹ‚",lowStockThreshold:5}},tr=()=>{const e=localStorage.getItem(VO);return e?JSON.parse(e):QL},ja=e=>{localStorage.setItem(VO,JSON.stringify(e))},ZL=Sg,$i={async currentUser(){if(_r&&Be){const{data:e}=await Be.auth.getUser();return e.user?{id:e.user.id,email:e.user.email??"uĹĽytkownik"}:null}return tr().user},async login(e,t){if(_r&&Be){const{data:n,error:i}=await Be.auth.signInWithPassword({email:e,password:t});if(i)throw i;if(!n.user)throw new Error("Nie udaĹ‚o siÄ™ zalogowaÄ‡.");return{id:n.user.id,email:n.user.email??e}}if(!e||t.length<6)throw new Error("Podaj e-mail i hasĹ‚o min. 6 znakĂłw.");const r=tr();return r.user={id:ZL.id,email:e},ja(r),r.user},async register(e,t){if(_r&&Be){const{data:r,error:n}=await Be.auth.signUp({email:e,password:t});if(n)throw n;if(!r.user)throw new Error("SprawdĹş skrzynkÄ™ e-mail, aby potwierdziÄ‡ konto.");return{id:r.user.id,email:r.user.email??e}}return $i.login(e,t)},async logout(){if(_r&&Be){await Be.auth.signOut();return}const e=tr();e.user=null,ja(e)},async updatePassword(e){if(_r&&Be){const{error:t}=await Be.auth.updateUser({password:e});if(t)throw t}},async getSettings(){return tr().settings},async saveSettings(e){const t=tr();return t.settings=e,ja(t),_r&&Be&&await Be.auth.updateUser({data:{shop_name:e.shopName,currency:e.currency,low_stock_threshold:e.lowStockThreshold}}),e}},ez={user:null,settings:{shopName:"RetailCRM",currency:"zĹ‚",lowStockThreshold:5},loading:!0,toasts:[]},tz=(e,t)=>{switch(t.type){case"ready":return{...e,loading:!1,user:t.user,settings:t.settings};case"login":return{...e,user:t.user};case"logout":return{...e,user:null};case"settings":return{...e,settings:t.settings};case"toast":return{...e,toasts:[...e.toasts,t.toast]};case"dismiss":return{...e,toasts:e.toasts.filter(r=>r.id!==t.id)};default:return e}},GO=x.createContext(null),rz=({children:e})=>{const[t,r]=x.useReducer(tz,ez);x.useEffect(()=>{Promise.all([$i.currentUser(),$i.getSettings()]).then(([a,s])=>{r({type:"ready",user:a,settings:s})})},[]);const n=x.useCallback((a,s)=>{const u=crypto.randomUUID();r({type:"toast",toast:{id:u,type:a,message:s}}),window.setTimeout(()=>r({type:"dismiss",id:u}),4200)},[]),i=x.useMemo(()=>({...t,notify:n,dismiss:a=>r({type:"dismiss",id:a}),signIn:async(a,s,u)=>{const c=u==="login"?await $i.login(a,s):await $i.register(a,s);r({type:"login",user:c}),n("success",u==="login"?"Zalogowano.":"Konto zostaĹ‚o utworzone.")},signOut:async()=>{await $i.logout(),