@trieoh/identityx-sdk-ts 0.11.0 → 0.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react.js +5 -5
- package/dist/cjs/react.js.map +1 -1
- package/dist/esm/{api-ThD44lve.d.mts → api-DO5uH1oU.d.ts} +20 -17
- package/dist/esm/{index.d.mts → index.d.ts} +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{react.d.mts → react.d.ts} +19 -19
- package/dist/esm/react.js +5 -5
- package/dist/esm/react.js.map +1 -1
- package/package.json +8 -6
package/dist/esm/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {simpleFetch,logger,createDefaultFetchClient}from'@
|
|
2
|
-
export{
|
|
1
|
+
import {simpleFetch,logger,createDefaultFetchClient}from'@trieoh/envoy-fetch-ts';export{FetchClientError as ApiError}from'@trieoh/envoy-fetch-ts';function C(t,e){if(e.startsWith("http"))return e;let r=t.replace(/\/$/,""),n=e.replace(/^\//,"");return `${r}/${n}`}var R={isAuthenticated:false,isInitializing:true},O=new Set,F=()=>O.forEach(t=>t()),A={subscribe:t=>(O.add(t),()=>O.delete(t)),getSnapshot:()=>R,getServerSnapshot:()=>R,set:t=>{R={...R,...t},F();},reset:()=>{R={isAuthenticated:false,isInitializing:false},F();}};typeof window<"u"&&window.addEventListener("storage",t=>{if(t.key==="trieoh_access_expiry")if(!t.newValue)A.reset();else {let e=parseInt(t.newValue,10),r=!isNaN(e)&&e>Date.now();A.set({isAuthenticated:r,isInitializing:false});}});var i={getItem:t=>typeof window<"u"?localStorage.getItem(t):null,setItem:(t,e)=>{typeof window<"u"&&localStorage.setItem(t,e);},removeItem:t=>{typeof window<"u"&&localStorage.removeItem(t);}},k={getItem:t=>typeof window<"u"?sessionStorage.getItem(t):null,setItem:(t,e)=>{typeof window<"u"&&sessionStorage.setItem(t,e);},removeItem:t=>{typeof window<"u"&&sessionStorage.removeItem(t);}},m={get:t=>{if(typeof window>"u")return null;let e=t+"=",r=document.cookie.split(";");for(let n=0;n<r.length;n++){let s=r[n];for(;s.charAt(0)===" ";)s=s.substring(1,s.length);if(s.indexOf(e)===0)return s.substring(e.length,s.length)}return null},set:(t,e,r={})=>{if(typeof window>"u")return;let{expires:n,path:s="/",domain:d,secure:a=window.location.protocol==="https:",sameSite:o=a?"None":"Lax"}=r,p=[`${t}=${e}`,d?`Domain=${d}`:"",`Path=${s}`,`SameSite=${o}`,a?"Secure":"",n?`expires=${n}`:""];document.cookie=p.filter(Boolean).join("; ");},remove:(t,e)=>{m.set(t,"",{expires:"Thu, 01 Jan 1970 00:00:00 GMT",domain:e});}};var E="trieoh_access_token",f={getAccessToken:()=>k.getItem(E),setAccessToken:t=>{t?k.setItem(E,t):k.removeItem(E);},clear:()=>{k.removeItem(E);}};var g=null,b="trieoh_access_expiry",v="trieoh_refresh_expiry",I="trieoh_refresh_domain";function q(t){if(typeof window>"u")return null;let e=window.location.hostname;if(e==="localhost")return null;if(t)try{let r=t;return r.startsWith("http")&&(r=new URL(r).hostname),r}catch{return t}return e}function D(t){try{let e=t.split(".")[1];return JSON.parse(atob(e))}catch{return null}}function L(t){let{AccessTokenString:e,RefreshTokenString:r,AccessExpiresAt:n,RefreshExpiresAt:s,Domain:d}=t,a=D(e);if(!a){logger.error("Failed to decode tokens");return}f.setAccessToken(e);let o=new Date(s).getTime(),p=new Date(n).getTime(),c=q(d);m.set("refresh_token",r,{expires:new Date(o).toUTCString(),domain:c}),g={access_data:a,refresh_expiry_date:o},i.setItem(b,String(p)),i.setItem(v,String(o)),c?i.setItem(I,c):i.removeItem(I),A.set({isAuthenticated:true,isInitializing:false}),logger.log("Auth session saved");}function B(){if(g)return g;let t=f.getAccessToken();if(!t)return null;let e=D(t);if(!e||e.exp*1e3<=Date.now())return null;let r=i.getItem(v);return r?(g={access_data:e,refresh_expiry_date:parseInt(r,10)},g):null}function H(t,e){try{let r=i.getItem(t);if(!r)return !0;let n=parseInt(r,10);return isNaN(n)?!0:n-Date.now()<=e*1e3}catch(r){return logger.warn("Error reading expiry:",r),true}}var J=(t=30)=>H(b,t),K=(t=10)=>H(v,t);function w(){g=null,f.clear(),i.removeItem(b),i.removeItem(v);let t=i.getItem(I)||q();m.remove("refresh_token",t),i.removeItem(I),A.reset(),logger.log("Auth tokens and claims cleared");}function Y(){let t=typeof window>"u",e=typeof import.meta<"u"&&import.meta.env?import.meta.env:{},r=typeof process<"u"?process.env:{},n=e.VITE_TRIEOH_AUTH_PROJECT_ID||r.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID||r.PUBLIC_TRIEOH_AUTH_PROJECT_ID||"",s=t&&r.TRIEOH_AUTH_API_KEY||"";return {PROJECT_ID:n,API_KEY:s,BASE_URL:"https://api.trieauth.trieoh.com"}}var _=null,U={};function $(t){U={...U,...t},_=null;}function P(){return _||(_={...Y(),...U}),_}var N={get BASE_URL(){return P().BASE_URL}};var T=class{constructor(e){this.isRefreshing=false;this.refreshPromise=null;this.baseURL=e?.baseURL||N.BASE_URL,this.authBaseURL=e?.authBaseURL||this.baseURL,this.onTokenRefreshed=e?.onTokenRefreshed,this.onRefreshFailed=e?.onRefreshFailed;}async refreshToken(){return this.isRefreshing&&this.refreshPromise?this.refreshPromise:(this.isRefreshing=true,this.refreshPromise=(async()=>{try{let e=await simpleFetch(C(this.authBaseURL,"/auth/refresh"),{method:"POST",credentials:"include"});if(e.code!==200||!e.data)throw e.code!==503&&w(),new Error(e.message||"Failed to refresh token");L(e.data);let r=B();r&&this.onTokenRefreshed?.(r),logger.log("Token refreshed successfully");}catch(e){throw logger.warn("Failed to refresh token:",e),w(),this.onRefreshFailed?.(e),e}finally{this.isRefreshing=false,this.refreshPromise=null;}})(),this.refreshPromise)}async beforeRequest(){if(K()){w();return}let e=!!f.getAccessToken(),r=!!m.get("refresh_token");if(!e&&r||e&&J(30))try{await this.refreshToken();}catch(n){logger.warn("Proactive refresh failed:",n);}}async fetch(e,r){let n=r?.requiresAuth!==false,s=e.includes("/auth/refresh");n&&!s&&!r?.skipRefresh&&await this.beforeRequest();let d=C(this.baseURL,e),a=async()=>{let p=f.getAccessToken(),c=new Headers(r?.headers);return n&&p&&c.set("Authorization",`Bearer ${p}`),c.has("Content-Type")||c.set("Content-Type","application/json"),fetch(d,{...r,headers:c,credentials:"include"})},o=await a();if(o.status===401&&n&&!s){logger.log("401 detected, attempting one-time retry after refresh...");try{await this.refreshToken(),o=await a();}catch{logger.error("Retry failed after refresh error");}}return o}},Re=t=>new T(t),Ae=t=>{let e=new T(t);return (r,n)=>e.fetch(r,n)};function h(t){if(!t)return;let{requiresAuth:e,skipRefresh:r,...n}=t,s={};return e!==void 0&&(s.requiresAuth=e),r!==void 0&&(s.skipRefresh=r),{...n,adapterInit:{...n.adapterInit,...s}}}var S=class{constructor(e,r,n,s){this.interceptor=new T({baseURL:e,authBaseURL:r,onTokenRefreshed:n}),this.client=createDefaultFetchClient({...s,adapter:this.interceptor.fetch.bind(this.interceptor)});}request(e,r){return this.client.request(e,h(r))}get(e,r){return this.client.get(e,h(r))}post(e,r,n){return this.client.post(e,r,h(n))}put(e,r,n){return this.client.put(e,r,h(n))}patch(e,r,n){return this.client.patch(e,r,h(n))}delete(e,r,n){return this.client.delete(e,r,h(n))}query(e,r){return this.client.query(e,h(r))}};function M(t){let e=new S(t?.baseURL,t?.authBaseURL,void 0,t?.clientConfig);return {request:e.request.bind(e),get:e.get.bind(e),post:e.post.bind(e),put:e.put.bind(e),patch:e.patch.bind(e),delete:e.delete.bind(e),query:e.query.bind(e)}}function Q(t){let e=new S(t?.baseURL,t?.authBaseURL,void 0,t?.clientConfig);return (r,n)=>e.query(r,n)}
|
|
2
|
+
export{T as AuthInterceptor,$ as configure,Re as createAuthInterceptor,Ae as createAuthenticatedFetch,M as createFetcher,Q as createQueryFetcher};//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/url-utils.ts","../../src/store/auth-store.ts","../../src/utils/storage-adapter.ts","../../src/store/token-store.ts","../../src/utils/token-utils.ts","../../src/core/env.ts","../../src/core/interceptor.ts","../../src/core/api.ts"],"names":["joinUrl","base","path","cleanBase","cleanPath","_state","_listeners","notify","l","authStore","cb","partial","event","expiry","isAuthenticated","browserStorage","key","value","sessionBrowserStorage","cookieStorage","name","nameEQ","ca","i","c","options","expires","domain","secure","sameSite","cookieParts","ACCESS_TOKEN_KEY","tokenStore","token","memoryClaims","ACCESS_EXPIRY_KEY","REFRESH_EXPIRY_KEY","getCookieDomain","hostname","parts","decodeJwt","payload","saveAuthSession","access_token","refresh_token","claims","refreshClaims","logger","refreshExpiry","accessExpiry","getTokenClaims","refreshExpiryStr","isExpiringSoon","thresholdSeconds","expiryStr","e","isTokenExpiringSoon","isRefreshSessionExpired","clearAuthTokens","resolveEnv","isServer","viteEnv","safeProcessEnv","resolvedProjectId","resolvedApiKey","memoizedEnv","overrides","configure","config","getEnv","env","AuthInterceptor","res","simpleFetch","error","hasAccessToken","hasRefreshToken","url","shouldAuth","isRefreshReq","finalUrl","executeFetch","accessToken","headers","response","createAuthInterceptor","createAuthenticatedFetch","interceptor","toFetchOptions","requiresAuth","skipRefresh","rest","interceptorFields","Api","baseURL","authBaseURL","onTokenRefreshed","clientConfig","createDefaultFetchClient","body","createFetcher","api","createQueryFetcher"],"mappings":"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","file":"index.js","sourcesContent":["export function joinUrl(base: string, path: string): string {\n if (path.startsWith(\"http\")) return path;\n \n const cleanBase = base.replace(/\\/$/, \"\");\n const cleanPath = path.replace(/^\\//, \"\");\n \n return `${cleanBase}/${cleanPath}`;\n}\n","type AuthState = {\n isAuthenticated: boolean;\n isInitializing: boolean;\n};\n\nlet _state: AuthState = {\n isAuthenticated: false,\n isInitializing: true,\n};\nconst _listeners = new Set<() => void>();\n\nconst notify = () => _listeners.forEach((l) => l());\n\nexport const authStore = {\n subscribe: (cb: () => void) => {\n _listeners.add(cb);\n return () => _listeners.delete(cb);\n },\n getSnapshot: () => _state,\n getServerSnapshot: () => _state,\n set: (partial: Partial<AuthState>) => {\n _state = { ..._state, ...partial };\n notify();\n },\n reset: () => {\n _state = {\n isAuthenticated: false,\n isInitializing: false,\n };\n notify();\n },\n};\n\n// Sync between tabs\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", (event) => {\n if (event.key === \"trieoh_access_expiry\") {\n if (!event.newValue) authStore.reset();\n else {\n const expiry = parseInt(event.newValue, 10);\n const isAuthenticated = !isNaN(expiry) && expiry > Date.now();\n authStore.set({ isAuthenticated, isInitializing: false });\n }\n }\n });\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport const browserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? localStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") localStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") localStorage.removeItem(key);\n },\n};\n\nexport const sessionBrowserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? sessionStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") sessionStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") sessionStorage.removeItem(key);\n },\n};\n\nexport interface CookieOptions {\n expires?: string;\n path?: string;\n domain?: string | null;\n secure?: boolean;\n sameSite?: \"Lax\" | \"None\" | \"Strict\";\n}\n\nexport const cookieStorage = {\n get: (name: string): string | null => {\n if (typeof window === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n\n set: (name: string, value: string, options: CookieOptions = {}) => {\n if (typeof window === \"undefined\") return;\n\n const {\n expires,\n path = \"/\",\n domain,\n secure = window.location.protocol === \"https:\",\n sameSite = secure ? \"None\" : \"Lax\",\n } = options;\n\n const cookieParts = [\n `${name}=${value}`,\n domain ? `Domain=${domain}` : \"\",\n `Path=${path}`,\n `SameSite=${sameSite}`,\n secure ? \"Secure\" : \"\",\n expires ? `expires=${expires}` : \"\",\n ];\n\n document.cookie = cookieParts.filter(Boolean).join(\"; \");\n },\n\n remove: (name: string, domain?: string | null) => {\n cookieStorage.set(name, \"\", {\n expires: \"Thu, 01 Jan 1970 00:00:00 GMT\",\n domain,\n });\n },\n};\n","import { sessionBrowserStorage } from \"../utils/storage-adapter\";\n\nconst ACCESS_TOKEN_KEY = \"trieoh_access_token\";\n\nexport const tokenStore = {\n getAccessToken: () => sessionBrowserStorage.getItem(ACCESS_TOKEN_KEY),\n setAccessToken: (token: string | null) => {\n if (token) sessionBrowserStorage.setItem(ACCESS_TOKEN_KEY, token);\n else sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n },\n clear: () => {\n sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n }\n};\n","import { authStore } from \"../store/auth-store\";\nimport { tokenStore } from \"../store/token-store\";\nimport { logger } from \"@soramux/node-fetch-sdk\";\nimport { browserStorage, cookieStorage } from \"./storage-adapter\";\n\nexport interface AuthTokens {\n access_token: string;\n refresh_token: string;\n}\n\nexport interface TokenClaims {\n sub: {\n id: string;\n email: string;\n session_id: string;\n user_agent: string;\n user_ip: string;\n project_id: string | null;\n verified_at: string | null;\n is_verified: boolean;\n user_type: \"client\" | \"project\";\n metadata: Record<string, unknown> | null;\n };\n iss: string;\n exp: number;\n iat: number;\n jti: string;\n}\n\nexport interface AuthTokenClaims {\n access_data: TokenClaims;\n refresh_expiry_date: string | number;\n}\n\n// Stored only in memory\nlet memoryClaims: AuthTokenClaims | null = null;\nconst ACCESS_EXPIRY_KEY = \"trieoh_access_expiry\";\nconst REFRESH_EXPIRY_KEY = \"trieoh_refresh_expiry\";\n\nexport function getCookieDomain() {\n if (typeof window === \"undefined\") return null;\n const hostname = window.location.hostname;\n if (hostname === 'localhost') return null;\n if (hostname.endsWith('univents.com.br')) return 'univents.com.br';\n if (hostname.endsWith('identityx.com.br')) return 'identityx.com.br';\n\n const parts = hostname.split('.');\n if (hostname.endsWith('trieoh.com') && parts.length >= 3) {\n const appName = parts[parts.length - 3];\n return `${appName}.trieoh.com`;\n }\n\n return hostname;\n}\n\nexport function decodeJwt<T>(token: string): T | null {\n try {\n const payload = token.split(\".\")[1];\n return JSON.parse(atob(payload));\n } catch {\n return null;\n }\n}\n\nexport function saveAuthSession(\n access_token: string,\n refresh_token: string,\n): void {\n const claims = decodeJwt<TokenClaims>(access_token);\n const refreshClaims = decodeJwt<{ exp: number }>(refresh_token);\n\n if (!claims || !refreshClaims) {\n logger.error(\"Failed to decode tokens\");\n return;\n }\n\n tokenStore.setAccessToken(access_token);\n\n const refreshExpiry = refreshClaims.exp * 1000;\n const accessExpiry = claims.exp * 1000;\n\n cookieStorage.set(\"refresh_token\", refresh_token, {\n expires: new Date(refreshExpiry).toUTCString(),\n domain: getCookieDomain()\n });\n\n memoryClaims = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n browserStorage.setItem(ACCESS_EXPIRY_KEY, String(accessExpiry));\n browserStorage.setItem(REFRESH_EXPIRY_KEY, String(refreshExpiry));\n\n authStore.set({\n isAuthenticated: true,\n isInitializing: false,\n });\n\n logger.log(\"Auth session saved\");\n}\n\nexport function getTokenClaims(): AuthTokenClaims | null {\n if (memoryClaims) return memoryClaims;\n\n const token = tokenStore.getAccessToken();\n if (!token) return null;\n\n const claims = decodeJwt<TokenClaims>(token);\n if (!claims) return null;\n\n // Check if token is expired\n if (claims.exp * 1000 <= Date.now()) return null;\n\n const refreshExpiryStr = browserStorage.getItem(REFRESH_EXPIRY_KEY);\n if (!refreshExpiryStr) return null;\n\n memoryClaims = {\n access_data: claims,\n refresh_expiry_date: parseInt(refreshExpiryStr, 10),\n };\n\n return memoryClaims;\n}\n\nfunction isExpiringSoon(key: string, thresholdSeconds: number): boolean {\n try {\n const expiryStr = browserStorage.getItem(key);\n if (!expiryStr) return true;\n const expiry = parseInt(expiryStr, 10);\n if (isNaN(expiry)) return true;\n return (expiry - Date.now()) <= thresholdSeconds * 1000;\n } catch (e) {\n logger.warn(\"Error reading expiry:\", e);\n return true;\n }\n}\n\nexport const isTokenExpiringSoon = (t = 30) => isExpiringSoon(ACCESS_EXPIRY_KEY, t);\nexport const isRefreshSessionExpired = (t = 10) => isExpiringSoon(REFRESH_EXPIRY_KEY, t);\n\nexport function isAuthenticated(): boolean {\n if (!tokenStore.getAccessToken()) return false;\n const expiryStr = browserStorage.getItem(ACCESS_EXPIRY_KEY);\n if (!expiryStr) return false;\n const accessExpiryTimestamp = parseInt(expiryStr, 10);\n return accessExpiryTimestamp > Date.now();\n}\n\nexport function clearAuthTokens(): void {\n memoryClaims = null;\n tokenStore.clear();\n browserStorage.removeItem(ACCESS_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_EXPIRY_KEY);\n\n const domain = getCookieDomain();\n cookieStorage.remove(\"refresh_token\", domain);\n\n authStore.reset();\n\n logger.log(\"Auth tokens and claims cleared\");\n}\n\nexport function getUserInfo() {\n const claims = getTokenClaims();\n if (!claims) return null;\n\n return claims.access_data.sub\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const decoded = decodeJwt<{ exp: number }>(token);\n return decoded?.exp ?? null;\n}\n","export interface TrieOHEnv {\n PROJECT_ID: string;\n API_KEY: string;\n BASE_URL: string;\n}\n\nexport function resolveEnv(): TrieOHEnv {\n const isServer = typeof window === \"undefined\";\n\n const viteEnv = (\n typeof import.meta !== \"undefined\" && import.meta.env\n ? import.meta.env\n : {}\n ) as Partial<ImportMetaEnv>;\n\n const safeProcessEnv: NodeJS.ProcessEnv =\n typeof process !== \"undefined\" ? process.env : {};\n\n const resolvedProjectId =\n viteEnv.VITE_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n \"\";\n\n const resolvedApiKey = isServer\n ? (safeProcessEnv.TRIEOH_AUTH_API_KEY || \"\")\n : \"\";\n\n return {\n PROJECT_ID: resolvedProjectId,\n API_KEY: resolvedApiKey,\n BASE_URL: \"https://api.trieauth.trieoh.com\",\n };\n}\nlet memoizedEnv: TrieOHEnv | null = null;\nlet overrides: Partial<TrieOHEnv> = {};\n\n/**\n * Configure the SDK manually. This will override any environment variables.\n */\nexport function configure(config: Partial<TrieOHEnv>) {\n overrides = { ...overrides, ...config };\n memoizedEnv = null; // Reset memoization to apply new config\n}\n\nfunction getEnv(): TrieOHEnv {\n if (!memoizedEnv) {\n const resolved = resolveEnv();\n memoizedEnv = {\n ...resolved,\n ...overrides,\n };\n }\n return memoizedEnv;\n}\nexport const env: TrieOHEnv = {\n get PROJECT_ID() {\n return getEnv().PROJECT_ID;\n },\n get API_KEY() {\n return getEnv().API_KEY;\n },\n get BASE_URL() {\n return getEnv().BASE_URL;\n },\n};\n","import { joinUrl } from \"../utils/url-utils\";\nimport {\n clearAuthTokens,\n isRefreshSessionExpired,\n isTokenExpiringSoon,\n saveAuthSession,\n getTokenClaims,\n type AuthTokenClaims,\n type AuthTokens\n} from \"../utils/token-utils\";\nimport { env } from \"./env\";\nimport { logger, simpleFetch } from \"@soramux/node-fetch-sdk\";\nimport { cookieStorage } from \"../utils/storage-adapter\";\nimport { tokenStore } from \"../store/token-store\";\n\nexport interface RequestOptions extends RequestInit {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\ninterface InterceptorConfig {\n baseURL?: string;\n authBaseURL?: string;\n onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n onRefreshFailed?: (error: Error) => void;\n}\n\nexport class AuthInterceptor {\n private baseURL: string;\n private authBaseURL: string;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n private onRefreshFailed?: (error: Error) => void;\n\n constructor(config?: InterceptorConfig) {\n this.baseURL = config?.baseURL || env.BASE_URL;\n this.authBaseURL = config?.authBaseURL || this.baseURL;\n this.onTokenRefreshed = config?.onTokenRefreshed;\n this.onRefreshFailed = config?.onRefreshFailed;\n }\n\n private async refreshToken(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) return this.refreshPromise;\n\n this.isRefreshing = true;\n this.refreshPromise = (async () => {\n try {\n const res = await simpleFetch<{ code: number; data?: AuthTokens; message?: string }>(\n joinUrl(this.authBaseURL, \"/auth/refresh\"),\n { method: \"POST\", credentials: \"include\" }\n );\n\n if (res.code !== 200 || !res.data) {\n if (res.code !== 503) clearAuthTokens();\n throw new Error(res.message || \"Failed to refresh token\");\n }\n\n const { access_token, refresh_token } = res.data;\n saveAuthSession(access_token, refresh_token);\n\n const claims = getTokenClaims();\n if (claims) this.onTokenRefreshed?.(claims);\n\n logger.log(\"Token refreshed successfully\");\n } catch (error) {\n logger.warn(\"Failed to refresh token:\", error);\n clearAuthTokens();\n this.onRefreshFailed?.(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n async beforeRequest(): Promise<void> {\n if (isRefreshSessionExpired()) {\n clearAuthTokens();\n return;\n }\n\n const hasAccessToken = !!tokenStore.getAccessToken();\n const hasRefreshToken = !!cookieStorage.get(\"refresh_token\");\n\n if ((!hasAccessToken && hasRefreshToken) || (hasAccessToken && isTokenExpiringSoon(30))) {\n try {\n await this.refreshToken();\n } catch (error) {\n logger.warn(\"Proactive refresh failed:\", error);\n }\n }\n }\n\n async fetch(url: string, options?: RequestOptions): Promise<Response> {\n const shouldAuth = options?.requiresAuth !== false;\n const isRefreshReq = url.includes(\"/auth/refresh\");\n\n if (shouldAuth && !isRefreshReq && !options?.skipRefresh) {\n await this.beforeRequest();\n }\n\n const finalUrl = joinUrl(this.baseURL, url);\n\n const executeFetch = async (): Promise<Response> => {\n const accessToken = tokenStore.getAccessToken();\n const headers = new Headers(options?.headers);\n\n if (shouldAuth && accessToken) {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n return fetch(finalUrl, {\n ...options,\n headers,\n credentials: \"include\",\n });\n };\n\n let response = await executeFetch();\n\n if (response.status === 401 && shouldAuth && !isRefreshReq) {\n logger.log(\"401 detected, attempting one-time retry after refresh...\");\n try {\n await this.refreshToken();\n response = await executeFetch();\n } catch (e) {\n logger.error(\"Retry failed after refresh error\");\n }\n }\n\n return response;\n }\n}\n\nexport const createAuthInterceptor = (config?: InterceptorConfig) => new AuthInterceptor(config);\n\nexport const createAuthenticatedFetch = (config?: InterceptorConfig) => {\n const interceptor = new AuthInterceptor(config);\n return (url: string, options?: RequestOptions) => interceptor.fetch(url, options);\n};\n","import { AuthInterceptor, type RequestOptions as InterceptorOptions } from \"./interceptor\";\nimport type { AuthTokenClaims } from \"../utils/token-utils\";\nimport {\n createDefaultFetchClient,\n type DefaultFetchClientConfig,\n type DefaultFetchResult,\n type DefaultSuccessEnvelope,\n type DefaultFailureEnvelope,\n type FetchClient,\n type FetchClientOptions\n} from \"@soramux/node-fetch-sdk\";\n\nexport type { DefaultFetchResult as ApiResponse };\n\nexport interface ApiRequestOptions extends FetchClientOptions {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\nfunction toFetchOptions(options?: ApiRequestOptions): FetchClientOptions | undefined {\n if (!options) return undefined;\n\n const { requiresAuth, skipRefresh, ...rest } = options;\n\n const interceptorFields: Partial<InterceptorOptions> = {};\n if (requiresAuth !== undefined) interceptorFields.requiresAuth = requiresAuth;\n if (skipRefresh !== undefined) interceptorFields.skipRefresh = skipRefresh;\n\n return {\n ...rest,\n adapterInit: {\n ...rest.adapterInit,\n ...interceptorFields,\n },\n };\n}\n\nexport class Api {\n readonly interceptor: AuthInterceptor;\n private readonly client: FetchClient<DefaultSuccessEnvelope, DefaultFailureEnvelope>;\n\n constructor(\n baseURL?: string,\n authBaseURL?: string,\n onTokenRefreshed?: (claims: AuthTokenClaims) => void,\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">,\n ) {\n this.interceptor = new AuthInterceptor({\n baseURL,\n authBaseURL,\n onTokenRefreshed,\n });\n\n this.client = createDefaultFetchClient({\n ...clientConfig,\n adapter: this.interceptor.fetch.bind(this.interceptor),\n });\n }\n\n request<T>(path: string, options?: ApiRequestOptions) {\n return this.client.request<T>(path, toFetchOptions(options));\n }\n\n get<T>(path: string, options?: ApiRequestOptions) {\n return this.client.get<T>(path, toFetchOptions(options));\n }\n\n post<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.post<T>(path, body, toFetchOptions(options));\n }\n\n put<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.put<T>(path, body, toFetchOptions(options));\n }\n\n patch<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.patch<T>(path, body, toFetchOptions(options));\n }\n\n delete<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.delete<T>(path, body, toFetchOptions(options));\n }\n\n query<T>(path: string, options?: ApiRequestOptions) {\n return this.client.query<T>(path, toFetchOptions(options));\n }\n}\n\nexport function createFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return {\n request: api.request.bind(api),\n get: api.get.bind(api),\n post: api.post.bind(api),\n put: api.put.bind(api),\n patch: api.patch.bind(api),\n delete: api.delete.bind(api),\n query: api.query.bind(api),\n };\n}\n\nexport function createQueryFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return <TData>(path: string, options?: ApiRequestOptions): Promise<TData> =>\n api.query<TData>(path, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/url-utils.ts","../../src/store/auth-store.ts","../../src/utils/storage-adapter.ts","../../src/store/token-store.ts","../../src/utils/token-utils.ts","../../src/core/env.ts","../../src/core/interceptor.ts","../../src/core/api.ts"],"names":["joinUrl","base","path","cleanBase","cleanPath","_state","_listeners","notify","l","authStore","cb","partial","event","expiry","isAuthenticated","browserStorage","key","value","sessionBrowserStorage","cookieStorage","name","nameEQ","ca","i","c","options","expires","domain","secure","sameSite","cookieParts","ACCESS_TOKEN_KEY","tokenStore","token","memoryClaims","ACCESS_EXPIRY_KEY","REFRESH_EXPIRY_KEY","REFRESH_DOMAIN_KEY","getCookieDomain","returnedDomain","hostname","decodeJwt","payload","saveAuthSession","tokens","AccessTokenString","RefreshTokenString","AccessExpiresAt","RefreshExpiresAt","Domain","claims","logger","refreshExpiry","accessExpiry","getTokenClaims","refreshExpiryStr","isExpiringSoon","thresholdSeconds","expiryStr","e","isTokenExpiringSoon","isRefreshSessionExpired","clearAuthTokens","resolveEnv","isServer","viteEnv","safeProcessEnv","resolvedProjectId","resolvedApiKey","memoizedEnv","overrides","configure","config","getEnv","env","AuthInterceptor","res","simpleFetch","error","hasAccessToken","hasRefreshToken","url","shouldAuth","isRefreshReq","finalUrl","executeFetch","accessToken","headers","response","createAuthInterceptor","createAuthenticatedFetch","interceptor","toFetchOptions","requiresAuth","skipRefresh","rest","interceptorFields","Api","baseURL","authBaseURL","onTokenRefreshed","clientConfig","createDefaultFetchClient","body","createFetcher","api","createQueryFetcher"],"mappings":"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","file":"index.js","sourcesContent":["export function joinUrl(base: string, path: string): string {\n if (path.startsWith(\"http\")) return path;\n \n const cleanBase = base.replace(/\\/$/, \"\");\n const cleanPath = path.replace(/^\\//, \"\");\n \n return `${cleanBase}/${cleanPath}`;\n}\n","type AuthState = {\n isAuthenticated: boolean;\n isInitializing: boolean;\n};\n\nlet _state: AuthState = {\n isAuthenticated: false,\n isInitializing: true,\n};\nconst _listeners = new Set<() => void>();\n\nconst notify = () => _listeners.forEach((l) => l());\n\nexport const authStore = {\n subscribe: (cb: () => void) => {\n _listeners.add(cb);\n return () => _listeners.delete(cb);\n },\n getSnapshot: () => _state,\n getServerSnapshot: () => _state,\n set: (partial: Partial<AuthState>) => {\n _state = { ..._state, ...partial };\n notify();\n },\n reset: () => {\n _state = {\n isAuthenticated: false,\n isInitializing: false,\n };\n notify();\n },\n};\n\n// Sync between tabs\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", (event) => {\n if (event.key === \"trieoh_access_expiry\") {\n if (!event.newValue) authStore.reset();\n else {\n const expiry = parseInt(event.newValue, 10);\n const isAuthenticated = !isNaN(expiry) && expiry > Date.now();\n authStore.set({ isAuthenticated, isInitializing: false });\n }\n }\n });\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport const browserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? localStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") localStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") localStorage.removeItem(key);\n },\n};\n\nexport const sessionBrowserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? sessionStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") sessionStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") sessionStorage.removeItem(key);\n },\n};\n\nexport interface CookieOptions {\n expires?: string;\n path?: string;\n domain?: string | null;\n secure?: boolean;\n sameSite?: \"Lax\" | \"None\" | \"Strict\";\n}\n\nexport const cookieStorage = {\n get: (name: string): string | null => {\n if (typeof window === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n\n set: (name: string, value: string, options: CookieOptions = {}) => {\n if (typeof window === \"undefined\") return;\n\n const {\n expires,\n path = \"/\",\n domain,\n secure = window.location.protocol === \"https:\",\n sameSite = secure ? \"None\" : \"Lax\",\n } = options;\n\n const cookieParts = [\n `${name}=${value}`,\n domain ? `Domain=${domain}` : \"\",\n `Path=${path}`,\n `SameSite=${sameSite}`,\n secure ? \"Secure\" : \"\",\n expires ? `expires=${expires}` : \"\",\n ];\n\n document.cookie = cookieParts.filter(Boolean).join(\"; \");\n },\n\n remove: (name: string, domain?: string | null) => {\n cookieStorage.set(name, \"\", {\n expires: \"Thu, 01 Jan 1970 00:00:00 GMT\",\n domain,\n });\n },\n};\n","import { sessionBrowserStorage } from \"../utils/storage-adapter\";\n\nconst ACCESS_TOKEN_KEY = \"trieoh_access_token\";\n\nexport const tokenStore = {\n getAccessToken: () => sessionBrowserStorage.getItem(ACCESS_TOKEN_KEY),\n setAccessToken: (token: string | null) => {\n if (token) sessionBrowserStorage.setItem(ACCESS_TOKEN_KEY, token);\n else sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n },\n clear: () => {\n sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n }\n};\n","import { authStore } from \"../store/auth-store\";\nimport { tokenStore } from \"../store/token-store\";\nimport { logger } from \"@trieoh/envoy-fetch-ts\";\nimport { browserStorage, cookieStorage } from \"./storage-adapter\";\n\nexport interface AuthTokens {\n AccessTokenString: string;\n RefreshTokenString: string;\n AccessExpiresAt: string;\n RefreshExpiresAt: string;\n Domain: string;\n}\n\nexport interface TokenClaims {\n sub: {\n id: string;\n email: string;\n session_id: string;\n user_agent: string;\n user_ip: string;\n project_id: string | null;\n verified_at: string | null;\n is_verified: boolean;\n user_type: \"client\" | \"project\";\n metadata: Record<string, unknown> | null;\n };\n iss: string;\n exp: number;\n iat: number;\n jti: string;\n}\n\nexport interface AuthTokenClaims {\n access_data: TokenClaims;\n refresh_expiry_date: string | number;\n}\n\n// Stored only in memory\nlet memoryClaims: AuthTokenClaims | null = null;\nconst ACCESS_EXPIRY_KEY = \"trieoh_access_expiry\";\nconst REFRESH_EXPIRY_KEY = \"trieoh_refresh_expiry\";\nconst REFRESH_DOMAIN_KEY = \"trieoh_refresh_domain\";\n\nexport function getCookieDomain(returnedDomain?: string) {\n if (typeof window === \"undefined\") return null;\n const hostname = window.location.hostname;\n\n // Localhost should never have a domain set for cookies to avoid issues\n if (hostname === 'localhost') return null;\n\n if (returnedDomain) {\n try {\n let domain = returnedDomain;\n if (domain.startsWith(\"http\")) domain = new URL(domain).hostname;\n return domain;\n } catch {\n return returnedDomain;\n }\n }\n\n return hostname;\n}\nexport function decodeJwt<T>(token: string): T | null {\n try {\n const payload = token.split(\".\")[1];\n return JSON.parse(atob(payload));\n } catch {\n return null;\n }\n}\n\nexport function saveAuthSession(tokens: AuthTokens): void {\n const {\n AccessTokenString,\n RefreshTokenString,\n AccessExpiresAt,\n RefreshExpiresAt,\n Domain\n } = tokens;\n\n const claims = decodeJwt<TokenClaims>(AccessTokenString);\n\n if (!claims) {\n logger.error(\"Failed to decode tokens\");\n return;\n }\n\n tokenStore.setAccessToken(AccessTokenString);\n\n const refreshExpiry = new Date(RefreshExpiresAt).getTime();\n const accessExpiry = new Date(AccessExpiresAt).getTime();\n const domain = getCookieDomain(Domain);\n\n cookieStorage.set(\"refresh_token\", RefreshTokenString, {\n expires: new Date(refreshExpiry).toUTCString(),\n domain\n });\n\n memoryClaims = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n browserStorage.setItem(ACCESS_EXPIRY_KEY, String(accessExpiry));\n browserStorage.setItem(REFRESH_EXPIRY_KEY, String(refreshExpiry));\n if (domain) browserStorage.setItem(REFRESH_DOMAIN_KEY, domain);\n else browserStorage.removeItem(REFRESH_DOMAIN_KEY);\n\n authStore.set({\n isAuthenticated: true,\n isInitializing: false,\n });\n\n logger.log(\"Auth session saved\");\n}\n\nexport function getTokenClaims(): AuthTokenClaims | null {\n if (memoryClaims) return memoryClaims;\n\n const token = tokenStore.getAccessToken();\n if (!token) return null;\n\n const claims = decodeJwt<TokenClaims>(token);\n if (!claims) return null;\n\n // Check if token is expired\n if (claims.exp * 1000 <= Date.now()) return null;\n\n const refreshExpiryStr = browserStorage.getItem(REFRESH_EXPIRY_KEY);\n if (!refreshExpiryStr) return null;\n\n memoryClaims = {\n access_data: claims,\n refresh_expiry_date: parseInt(refreshExpiryStr, 10),\n };\n\n return memoryClaims;\n}\n\nfunction isExpiringSoon(key: string, thresholdSeconds: number): boolean {\n try {\n const expiryStr = browserStorage.getItem(key);\n if (!expiryStr) return true;\n const expiry = parseInt(expiryStr, 10);\n if (isNaN(expiry)) return true;\n return (expiry - Date.now()) <= thresholdSeconds * 1000;\n } catch (e) {\n logger.warn(\"Error reading expiry:\", e);\n return true;\n }\n}\n\nexport const isTokenExpiringSoon = (t = 30) => isExpiringSoon(ACCESS_EXPIRY_KEY, t);\nexport const isRefreshSessionExpired = (t = 10) => isExpiringSoon(REFRESH_EXPIRY_KEY, t);\n\nexport function isAuthenticated(): boolean {\n if (!tokenStore.getAccessToken()) return false;\n const expiryStr = browserStorage.getItem(ACCESS_EXPIRY_KEY);\n if (!expiryStr) return false;\n const accessExpiryTimestamp = parseInt(expiryStr, 10);\n return accessExpiryTimestamp > Date.now();\n}\n\nexport function clearAuthTokens(): void {\n memoryClaims = null;\n tokenStore.clear();\n browserStorage.removeItem(ACCESS_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_EXPIRY_KEY);\n\n const domain = browserStorage.getItem(REFRESH_DOMAIN_KEY) || getCookieDomain();\n cookieStorage.remove(\"refresh_token\", domain);\n browserStorage.removeItem(REFRESH_DOMAIN_KEY);\n\n authStore.reset();\n\n logger.log(\"Auth tokens and claims cleared\");\n}\n\nexport function getUserInfo() {\n const claims = getTokenClaims();\n if (!claims) return null;\n\n return claims.access_data.sub\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const decoded = decodeJwt<{ exp: number }>(token);\n return decoded?.exp ?? null;\n}\n","export interface TrieOHEnv {\n PROJECT_ID: string;\n API_KEY: string;\n BASE_URL: string;\n}\n\nexport function resolveEnv(): TrieOHEnv {\n const isServer = typeof window === \"undefined\";\n\n const viteEnv = (\n typeof import.meta !== \"undefined\" && import.meta.env\n ? import.meta.env\n : {}\n ) as Partial<ImportMetaEnv>;\n\n const safeProcessEnv: NodeJS.ProcessEnv =\n typeof process !== \"undefined\" ? process.env : {};\n\n const resolvedProjectId =\n viteEnv.VITE_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n \"\";\n\n const resolvedApiKey = isServer\n ? (safeProcessEnv.TRIEOH_AUTH_API_KEY || \"\")\n : \"\";\n\n return {\n PROJECT_ID: resolvedProjectId,\n API_KEY: resolvedApiKey,\n BASE_URL: \"https://api.trieauth.trieoh.com\",\n };\n}\nlet memoizedEnv: TrieOHEnv | null = null;\nlet overrides: Partial<TrieOHEnv> = {};\n\n/**\n * Configure the SDK manually. This will override any environment variables.\n */\nexport function configure(config: Partial<TrieOHEnv>) {\n overrides = { ...overrides, ...config };\n memoizedEnv = null; // Reset memoization to apply new config\n}\n\nfunction getEnv(): TrieOHEnv {\n if (!memoizedEnv) {\n const resolved = resolveEnv();\n memoizedEnv = {\n ...resolved,\n ...overrides,\n };\n }\n return memoizedEnv;\n}\nexport const env: TrieOHEnv = {\n get PROJECT_ID() {\n return getEnv().PROJECT_ID;\n },\n get API_KEY() {\n return getEnv().API_KEY;\n },\n get BASE_URL() {\n return getEnv().BASE_URL;\n },\n};\n","import { joinUrl } from \"../utils/url-utils\";\nimport {\n clearAuthTokens,\n isRefreshSessionExpired,\n isTokenExpiringSoon,\n saveAuthSession,\n getTokenClaims,\n type AuthTokenClaims,\n type AuthTokens\n} from \"../utils/token-utils\";\nimport { env } from \"./env\";\nimport { logger, simpleFetch } from \"@trieoh/envoy-fetch-ts\";\nimport { cookieStorage } from \"../utils/storage-adapter\";\nimport { tokenStore } from \"../store/token-store\";\n\nexport interface RequestOptions extends RequestInit {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\ninterface InterceptorConfig {\n baseURL?: string;\n authBaseURL?: string;\n onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n onRefreshFailed?: (error: Error) => void;\n}\n\nexport class AuthInterceptor {\n private baseURL: string;\n private authBaseURL: string;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n private onRefreshFailed?: (error: Error) => void;\n\n constructor(config?: InterceptorConfig) {\n this.baseURL = config?.baseURL || env.BASE_URL;\n this.authBaseURL = config?.authBaseURL || this.baseURL;\n this.onTokenRefreshed = config?.onTokenRefreshed;\n this.onRefreshFailed = config?.onRefreshFailed;\n }\n\n private async refreshToken(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) return this.refreshPromise;\n\n this.isRefreshing = true;\n this.refreshPromise = (async () => {\n try {\n const res = await simpleFetch<{ code: number; data?: AuthTokens; message?: string }>(\n joinUrl(this.authBaseURL, \"/auth/refresh\"),\n { method: \"POST\", credentials: \"include\" }\n );\n\n if (res.code !== 200 || !res.data) {\n if (res.code !== 503) clearAuthTokens();\n throw new Error(res.message || \"Failed to refresh token\");\n }\n\n saveAuthSession(res.data);\n\n const claims = getTokenClaims();\n if (claims) this.onTokenRefreshed?.(claims);\n\n logger.log(\"Token refreshed successfully\");\n } catch (error) {\n logger.warn(\"Failed to refresh token:\", error);\n clearAuthTokens();\n this.onRefreshFailed?.(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n async beforeRequest(): Promise<void> {\n if (isRefreshSessionExpired()) {\n clearAuthTokens();\n return;\n }\n\n const hasAccessToken = !!tokenStore.getAccessToken();\n const hasRefreshToken = !!cookieStorage.get(\"refresh_token\");\n\n if ((!hasAccessToken && hasRefreshToken) || (hasAccessToken && isTokenExpiringSoon(30))) {\n try {\n await this.refreshToken();\n } catch (error) {\n logger.warn(\"Proactive refresh failed:\", error);\n }\n }\n }\n\n async fetch(url: string, options?: RequestOptions): Promise<Response> {\n const shouldAuth = options?.requiresAuth !== false;\n const isRefreshReq = url.includes(\"/auth/refresh\");\n\n if (shouldAuth && !isRefreshReq && !options?.skipRefresh) {\n await this.beforeRequest();\n }\n\n const finalUrl = joinUrl(this.baseURL, url);\n\n const executeFetch = async (): Promise<Response> => {\n const accessToken = tokenStore.getAccessToken();\n const headers = new Headers(options?.headers);\n\n if (shouldAuth && accessToken) {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n return fetch(finalUrl, {\n ...options,\n headers,\n credentials: \"include\",\n });\n };\n\n let response = await executeFetch();\n\n if (response.status === 401 && shouldAuth && !isRefreshReq) {\n logger.log(\"401 detected, attempting one-time retry after refresh...\");\n try {\n await this.refreshToken();\n response = await executeFetch();\n } catch (e) {\n logger.error(\"Retry failed after refresh error\");\n }\n }\n\n return response;\n }\n}\n\nexport const createAuthInterceptor = (config?: InterceptorConfig) => new AuthInterceptor(config);\n\nexport const createAuthenticatedFetch = (config?: InterceptorConfig) => {\n const interceptor = new AuthInterceptor(config);\n return (url: string, options?: RequestOptions) => interceptor.fetch(url, options);\n};\n","import { AuthInterceptor, type RequestOptions as InterceptorOptions } from \"./interceptor\";\nimport type { AuthTokenClaims } from \"../utils/token-utils\";\nimport {\n createDefaultFetchClient,\n type DefaultFetchClientConfig,\n type DefaultFetchResult,\n type DefaultSuccessEnvelope,\n type DefaultFailureEnvelope,\n type FetchClient,\n type FetchClientOptions\n} from \"@trieoh/envoy-fetch-ts\";\n\nexport type { DefaultFetchResult as ApiResponse };\n\nexport interface ApiRequestOptions extends FetchClientOptions {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\nfunction toFetchOptions(options?: ApiRequestOptions): FetchClientOptions | undefined {\n if (!options) return undefined;\n\n const { requiresAuth, skipRefresh, ...rest } = options;\n\n const interceptorFields: Partial<InterceptorOptions> = {};\n if (requiresAuth !== undefined) interceptorFields.requiresAuth = requiresAuth;\n if (skipRefresh !== undefined) interceptorFields.skipRefresh = skipRefresh;\n\n return {\n ...rest,\n adapterInit: {\n ...rest.adapterInit,\n ...interceptorFields,\n },\n };\n}\n\nexport class Api {\n readonly interceptor: AuthInterceptor;\n private readonly client: FetchClient<DefaultSuccessEnvelope, DefaultFailureEnvelope>;\n\n constructor(\n baseURL?: string,\n authBaseURL?: string,\n onTokenRefreshed?: (claims: AuthTokenClaims) => void,\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">,\n ) {\n this.interceptor = new AuthInterceptor({\n baseURL,\n authBaseURL,\n onTokenRefreshed,\n });\n\n this.client = createDefaultFetchClient({\n ...clientConfig,\n adapter: this.interceptor.fetch.bind(this.interceptor),\n });\n }\n\n request<T>(path: string, options?: ApiRequestOptions) {\n return this.client.request<T>(path, toFetchOptions(options));\n }\n\n get<T>(path: string, options?: ApiRequestOptions) {\n return this.client.get<T>(path, toFetchOptions(options));\n }\n\n post<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.post<T>(path, body, toFetchOptions(options));\n }\n\n put<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.put<T>(path, body, toFetchOptions(options));\n }\n\n patch<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.patch<T>(path, body, toFetchOptions(options));\n }\n\n delete<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.delete<T>(path, body, toFetchOptions(options));\n }\n\n query<T>(path: string, options?: ApiRequestOptions) {\n return this.client.query<T>(path, toFetchOptions(options));\n }\n}\n\nexport function createFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return {\n request: api.request.bind(api),\n get: api.get.bind(api),\n post: api.post.bind(api),\n put: api.put.bind(api),\n patch: api.patch.bind(api),\n delete: api.delete.bind(api),\n query: api.query.bind(api),\n };\n}\n\nexport function createQueryFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return <TData>(path: string, options?: ApiRequestOptions): Promise<TData> =>\n api.query<TData>(path, options);\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { MouseEvent } from 'react';
|
|
4
|
-
import * as
|
|
5
|
-
import { DefaultFetchClientConfig } from '@
|
|
6
|
-
import { e as Api, f as AuthTokens } from './api-
|
|
4
|
+
import * as _trieoh_envoy_fetch_ts from '@trieoh/envoy-fetch-ts';
|
|
5
|
+
import { DefaultFetchClientConfig } from '@trieoh/envoy-fetch-ts';
|
|
6
|
+
import { e as Api, f as AuthTokens } from './api-DO5uH1oU.js';
|
|
7
7
|
|
|
8
8
|
interface SessionI {
|
|
9
9
|
session_id: string;
|
|
@@ -34,16 +34,16 @@ interface AuthCallbacks {
|
|
|
34
34
|
onRefresh?: () => void;
|
|
35
35
|
}
|
|
36
36
|
declare const createAuthService: (apiInstance: Api, callbacks?: AuthCallbacks) => {
|
|
37
|
-
login: (email: string, password: string) => Promise<
|
|
38
|
-
register: (email: string, password: string) => Promise<
|
|
37
|
+
login: (email: string, password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<AuthTokens, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
38
|
+
register: (email: string, password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
39
39
|
logout: (options?: {
|
|
40
40
|
forceLogout?: boolean;
|
|
41
|
-
}) => Promise<
|
|
42
|
-
refresh: () => Promise<
|
|
43
|
-
sessions: () => Promise<
|
|
44
|
-
currentSession: () => Promise<
|
|
45
|
-
revokeASession: (id: string) => Promise<
|
|
46
|
-
revokeSessions: (revokeAll?: boolean) => Promise<
|
|
41
|
+
}) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
42
|
+
refresh: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<AuthTokens, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
43
|
+
sessions: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<SessionI[], _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
44
|
+
currentSession: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<CurrentSessionI, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
45
|
+
revokeASession: (id: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
46
|
+
revokeSessions: (revokeAll?: boolean) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
47
47
|
profile: () => {
|
|
48
48
|
id: string;
|
|
49
49
|
email: string;
|
|
@@ -56,19 +56,19 @@ declare const createAuthService: (apiInstance: Api, callbacks?: AuthCallbacks) =
|
|
|
56
56
|
user_type: "client" | "project";
|
|
57
57
|
metadata: Record<string, unknown> | null;
|
|
58
58
|
} | null;
|
|
59
|
-
sendForgotPassword: (email: string) => Promise<
|
|
60
|
-
resetPassword: (token: string, new_password: string) => Promise<
|
|
61
|
-
verifyEmail: () => Promise<
|
|
62
|
-
resendVerifyEmail: () => Promise<
|
|
63
|
-
health: () => Promise<
|
|
59
|
+
sendForgotPassword: (email: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
60
|
+
resetPassword: (token: string, new_password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
61
|
+
verifyEmail: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
62
|
+
resendVerifyEmail: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
63
|
+
health: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<{
|
|
64
64
|
service: string;
|
|
65
65
|
status: string;
|
|
66
|
-
},
|
|
67
|
-
authHealth: () => Promise<
|
|
66
|
+
}, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
67
|
+
authHealth: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<{
|
|
68
68
|
service: string;
|
|
69
69
|
status: string;
|
|
70
70
|
user_id: string;
|
|
71
|
-
},
|
|
71
|
+
}, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
72
72
|
};
|
|
73
73
|
|
|
74
74
|
type AuthContextType = {
|
package/dist/esm/react.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {createContext,useRef,useSyncExternalStore,useEffect,useCallback,useMemo,useContext,useState}from'react';import {logger,createDefaultFetchClient,simpleFetch}from'@soramux/node-fetch-sdk';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {RiEyeCloseLine,RiEyeLine}from'react-icons/ri';import {GoPerson}from'react-icons/go';import {ImExit}from'react-icons/im';import {FaDesktop,FaTabletAlt,FaMobileAlt,FaTrashAlt}from'react-icons/fa';import {UAParser}from'ua-parser-js';function ge(e,t){if(t.startsWith("http"))return t;let r=e.replace(/\/$/,""),o=t.replace(/^\//,"");return `${r}/${o}`}var K={isAuthenticated:false,isInitializing:true},ve=new Set,Ae=()=>ve.forEach(e=>e()),_={subscribe:e=>(ve.add(e),()=>ve.delete(e)),getSnapshot:()=>K,getServerSnapshot:()=>K,set:e=>{K={...K,...e},Ae();},reset:()=>{K={isAuthenticated:false,isInitializing:false},Ae();}};typeof window<"u"&&window.addEventListener("storage",e=>{if(e.key==="trieoh_access_expiry")if(!e.newValue)_.reset();else {let t=parseInt(e.newValue,10),r=!isNaN(t)&&t>Date.now();_.set({isAuthenticated:r,isInitializing:false});}});var D={getItem:e=>typeof window<"u"?localStorage.getItem(e):null,setItem:(e,t)=>{typeof window<"u"&&localStorage.setItem(e,t);},removeItem:e=>{typeof window<"u"&&localStorage.removeItem(e);}},Y={getItem:e=>typeof window<"u"?sessionStorage.getItem(e):null,setItem:(e,t)=>{typeof window<"u"&&sessionStorage.setItem(e,t);},removeItem:e=>{typeof window<"u"&&sessionStorage.removeItem(e);}},C={get:e=>{if(typeof window>"u")return null;let t=e+"=",r=document.cookie.split(";");for(let o=0;o<r.length;o++){let s=r[o];for(;s.charAt(0)===" ";)s=s.substring(1,s.length);if(s.indexOf(t)===0)return s.substring(t.length,s.length)}return null},set:(e,t,r={})=>{if(typeof window>"u")return;let{expires:o,path:s="/",domain:i,secure:n=window.location.protocol==="https:",sameSite:c=n?"None":"Lax"}=r,u=[`${e}=${t}`,i?`Domain=${i}`:"",`Path=${s}`,`SameSite=${c}`,n?"Secure":"",o?`expires=${o}`:""];document.cookie=u.filter(Boolean).join("; ");},remove:(e,t)=>{C.set(e,"",{expires:"Thu, 01 Jan 1970 00:00:00 GMT",domain:t});}};var se="trieoh_access_token",O={getAccessToken:()=>Y.getItem(se),setAccessToken:e=>{e?Y.setItem(se,e):Y.removeItem(se);},clear:()=>{Y.removeItem(se);}};var U=null,ye="trieoh_access_expiry",ne="trieoh_refresh_expiry";function Ce(){if(typeof window>"u")return null;let e=window.location.hostname;if(e==="localhost")return null;if(e.endsWith("univents.com.br"))return "univents.com.br";if(e.endsWith("identityx.com.br"))return "identityx.com.br";let t=e.split(".");return e.endsWith("trieoh.com")&&t.length>=3?`${t[t.length-3]}.trieoh.com`:e}function _e(e){try{let t=e.split(".")[1];return JSON.parse(atob(t))}catch{return null}}function j(e,t){let r=_e(e),o=_e(t);if(!r||!o){logger.error("Failed to decode tokens");return}O.setAccessToken(e);let s=o.exp*1e3,i=r.exp*1e3;C.set("refresh_token",t,{expires:new Date(s).toUTCString(),domain:Ce()}),U={access_data:r,refresh_expiry_date:s},D.setItem(ye,String(i)),D.setItem(ne,String(s)),_.set({isAuthenticated:true,isInitializing:false}),logger.log("Auth session saved");}function G(){if(U)return U;let e=O.getAccessToken();if(!e)return null;let t=_e(e);if(!t||t.exp*1e3<=Date.now())return null;let r=D.getItem(ne);return r?(U={access_data:t,refresh_expiry_date:parseInt(r,10)},U):null}function Ie(e,t){try{let r=D.getItem(e);if(!r)return !0;let o=parseInt(r,10);return isNaN(o)?!0:o-Date.now()<=t*1e3}catch(r){return logger.warn("Error reading expiry:",r),true}}var ke=(e=30)=>Ie(ye,e),ae=(e=10)=>Ie(ne,e);function z(){U=null,O.clear(),D.removeItem(ye),D.removeItem(ne);let e=Ce();C.remove("refresh_token",e),_.reset(),logger.log("Auth tokens and claims cleared");}function Pe(){let e=G();return e?e.access_data.sub:null}function je(){let e=typeof window>"u",t=typeof import.meta<"u"&&import.meta.env?import.meta.env:{},r=typeof process<"u"?process.env:{},o=t.VITE_TRIEOH_AUTH_PROJECT_ID||r.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID||r.PUBLIC_TRIEOH_AUTH_PROJECT_ID||"",s=e&&r.TRIEOH_AUTH_API_KEY||"";return {PROJECT_ID:o,API_KEY:s,BASE_URL:"https://api.trieauth.trieoh.com"}}var le=null,be={};function De(e){be={...be,...e},le=null;}function xe(){return le||(le={...je(),...be}),le}var y={get PROJECT_ID(){return xe().PROJECT_ID},get BASE_URL(){return xe().BASE_URL}};var ce=class{constructor(t){this.isRefreshing=false;this.refreshPromise=null;this.baseURL=t?.baseURL||y.BASE_URL,this.authBaseURL=t?.authBaseURL||this.baseURL,this.onTokenRefreshed=t?.onTokenRefreshed,this.onRefreshFailed=t?.onRefreshFailed;}async refreshToken(){return this.isRefreshing&&this.refreshPromise?this.refreshPromise:(this.isRefreshing=true,this.refreshPromise=(async()=>{try{let t=await simpleFetch(ge(this.authBaseURL,"/auth/refresh"),{method:"POST",credentials:"include"});if(t.code!==200||!t.data)throw t.code!==503&&z(),new Error(t.message||"Failed to refresh token");let{access_token:r,refresh_token:o}=t.data;j(r,o);let s=G();s&&this.onTokenRefreshed?.(s),logger.log("Token refreshed successfully");}catch(t){throw logger.warn("Failed to refresh token:",t),z(),this.onRefreshFailed?.(t),t}finally{this.isRefreshing=false,this.refreshPromise=null;}})(),this.refreshPromise)}async beforeRequest(){if(ae()){z();return}let t=!!O.getAccessToken(),r=!!C.get("refresh_token");if(!t&&r||t&&ke(30))try{await this.refreshToken();}catch(o){logger.warn("Proactive refresh failed:",o);}}async fetch(t,r){let o=r?.requiresAuth!==false,s=t.includes("/auth/refresh");o&&!s&&!r?.skipRefresh&&await this.beforeRequest();let i=ge(this.baseURL,t),n=async()=>{let u=O.getAccessToken(),f=new Headers(r?.headers);return o&&u&&f.set("Authorization",`Bearer ${u}`),f.has("Content-Type")||f.set("Content-Type","application/json"),fetch(i,{...r,headers:f,credentials:"include"})},c=await n();if(c.status===401&&o&&!s){logger.log("401 detected, attempting one-time retry after refresh...");try{await this.refreshToken(),c=await n();}catch{logger.error("Retry failed after refresh error");}}return c}};function L(e){if(!e)return;let{requiresAuth:t,skipRefresh:r,...o}=e,s={};return t!==void 0&&(s.requiresAuth=t),r!==void 0&&(s.skipRefresh=r),{...o,adapterInit:{...o.adapterInit,...s}}}var ue=class{constructor(t,r,o,s){this.interceptor=new ce({baseURL:t,authBaseURL:r,onTokenRefreshed:o}),this.client=createDefaultFetchClient({...s,adapter:this.interceptor.fetch.bind(this.interceptor)});}request(t,r){return this.client.request(t,L(r))}get(t,r){return this.client.get(t,L(r))}post(t,r,o){return this.client.post(t,r,L(o))}put(t,r,o){return this.client.put(t,r,L(o))}patch(t,r,o){return this.client.patch(t,r,L(o))}delete(t,r,o){return this.client.delete(t,r,L(o))}query(t,r){return this.client.query(t,L(r))}};var H=()=>{if(!y.PROJECT_ID||y.PROJECT_ID.trim()==="")throw new Error("[TRIEOH SDK] Project ID is missing. Please set PUBLIC_TRIEOH_AUTH_PROJECT_ID, NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID or VITE_TRIEOH_AUTH_PROJECT_ID.")};var Oe=(e,t)=>({login:async(r,o)=>{y.PROJECT_ID&&H();let s=`/auth/login${y.PROJECT_ID?`?project_id=${y.PROJECT_ID}`:""}`,i=await e.post(s,{email:r,password:o},{requiresAuth:false});return i.success&&(j(i.data.access_token,i.data.refresh_token),t?.onLogin?.()),i},register:async(r,o)=>{let s={requiresAuth:false},i=`/auth/register${y.PROJECT_ID?`?project_id=${y.PROJECT_ID}`:""}`;y.PROJECT_ID&&H();let n=await e.post(i,{email:r,password:o},s);return n.success&&t?.onRegister?.(),n},logout:async r=>{let o=`/auth/logout${y.PROJECT_ID?`?project_id=${y.PROJECT_ID}`:""}`,s=await e.post(o);return (s.success||r?.forceLogout)&&z(),s},refresh:async()=>{let r=await e.post("/auth/refresh",void 0,{skipRefresh:true});return r.success&&(j(r.data.access_token,r.data.refresh_token),t?.onRefresh?.()),r},sessions:async()=>e.get("/sessions"),currentSession:async()=>e.get("/sessions/me"),revokeASession:async r=>e.delete(`/sessions/${r}`),revokeSessions:async(r=false)=>{let o=r?"/sessions":"/sessions/others";return e.delete(o)},profile:()=>Pe(),sendForgotPassword:async r=>{let o={requiresAuth:false},s=await(async()=>y.PROJECT_ID?(H(),e.post("/account/forgot-password",{email:r,project_id:y.PROJECT_ID},o)):e.post("/account/forgot-password",{email:r},o))();return s.success&&t?.onForgotPassword?.(),s},resetPassword:async(r,o)=>e.post(`/account/reset-password?token=${r}`,{new_password:o},{requiresAuth:false}),verifyEmail:async()=>{let r=await e.get("/account/verify",{requiresAuth:false});return r.success&&t?.onVerify?.(),r},resendVerifyEmail:async()=>e.post("/account/verify/resend"),health:async()=>e.get("/health",{requiresAuth:false}),authHealth:async()=>e.get("/protected/health")});var Ne=createContext(null);function br({children:e,baseURL:t,projectId:r,isProjectMode:o=true,fallback:s,waitSession:i=true,clientConfig:n,onLogin:c,onForgotPassword:u,onRegister:f,onVerify:h,onRefresh:d}){let g=useRef(false),{isAuthenticated:m,isInitializing:p}=useSyncExternalStore(_.subscribe,_.getSnapshot,_.getServerSnapshot);useEffect(()=>{De({...r?{PROJECT_ID:r}:{},...t?{BASE_URL:t}:{}});},[r,t]);let b=useCallback(k=>{_.set({isAuthenticated:!!k.access_data,isInitializing:false}),d?.();},[d]),w=useMemo(()=>new ue(t,void 0,b,n),[t,b,n]),x=useMemo(()=>Oe(w,{onLogin:c,onForgotPassword:u,onRegister:f,onVerify:h,onRefresh:d}),[w,c,u,f,h,d]);useEffect(()=>{o&&H(),(async()=>{if(g.current)return;if(g.current=true,G()){_.set({isAuthenticated:true,isInitializing:false});return}if(!!!C.get("refresh_token")||ae()){_.reset(),_.set({isInitializing:false});return}logger.log("No cached claims, attempting silent refresh...");try{(await x.refresh()).success?(_.set({isAuthenticated:!0,isInitializing:!1}),logger.log("Session restored.")):(_.reset(),logger.warn("No active session."));}catch{_.reset(),logger.warn("Could not restore session (offline?).");}finally{_.set({isInitializing:false});}})();},[x,o]);let A=useMemo(()=>({auth:x,isAuthenticated:m,isInitializing:p,isProjectMode:o}),[x,m,p,o]);return i&&p?s??null:jsx(Ne.Provider,{value:A,children:e})}function R(){let e=useContext(Ne);if(!e)throw new Error("useAuth must be used inside <AuthProvider>");return e}function X(e,{insertAt:t}={}){if(!e||typeof document>"u")return;let r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",t==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e));}X(`@import"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";:root{--trieoh-primary: oklch(.1139 .0789 264.05);--trieoh-secondary: oklch(.7975 .1018 262.7);--trieoh-neutral1: oklch(.9702 0 0);--trieoh-neutral2: oklch(.1944 .0051 248.09);--trieoh-radius-full: 50%;--trieoh-text-sm: .75rem;--trieoh-text-base: .875rem;--trieoh-text-xl: 1.25rem;--trieoh-text-2xl: 1.5rem;--trieoh-text-3xl: 1.875rem;--trieoh-text-6xl: 3.75rem}
|
|
2
|
-
`);
|
|
3
|
-
`);function
|
|
4
|
-
${r?"trieoh-button--loading":""}`,children:e})}function
|
|
5
|
-
${o?"trieoh-button--loading":""}`,children:"Revogar todas as sess\xF5es"})]}),jsx("div",{className:"trieoh-sessions__content",children:i.length>0?i.map(
|
|
1
|
+
import {createContext,useRef,useSyncExternalStore,useEffect,useCallback,useMemo,useContext,useState}from'react';import {logger,createDefaultFetchClient,simpleFetch}from'@trieoh/envoy-fetch-ts';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {RiEyeCloseLine,RiEyeLine}from'react-icons/ri';import {GoPerson}from'react-icons/go';import {ImExit}from'react-icons/im';import {FaDesktop,FaTabletAlt,FaMobileAlt,FaTrashAlt}from'react-icons/fa';import {UAParser}from'ua-parser-js';function ve(e,t){if(t.startsWith("http"))return t;let r=e.replace(/\/$/,""),o=t.replace(/^\//,"");return `${r}/${o}`}var K={isAuthenticated:false,isInitializing:true},_e=new Set,Ae=()=>_e.forEach(e=>e()),_={subscribe:e=>(_e.add(e),()=>_e.delete(e)),getSnapshot:()=>K,getServerSnapshot:()=>K,set:e=>{K={...K,...e},Ae();},reset:()=>{K={isAuthenticated:false,isInitializing:false},Ae();}};typeof window<"u"&&window.addEventListener("storage",e=>{if(e.key==="trieoh_access_expiry")if(!e.newValue)_.reset();else {let t=parseInt(e.newValue,10),r=!isNaN(t)&&t>Date.now();_.set({isAuthenticated:r,isInitializing:false});}});var S={getItem:e=>typeof window<"u"?localStorage.getItem(e):null,setItem:(e,t)=>{typeof window<"u"&&localStorage.setItem(e,t);},removeItem:e=>{typeof window<"u"&&localStorage.removeItem(e);}},Y={getItem:e=>typeof window<"u"?sessionStorage.getItem(e):null,setItem:(e,t)=>{typeof window<"u"&&sessionStorage.setItem(e,t);},removeItem:e=>{typeof window<"u"&&sessionStorage.removeItem(e);}},C={get:e=>{if(typeof window>"u")return null;let t=e+"=",r=document.cookie.split(";");for(let o=0;o<r.length;o++){let s=r[o];for(;s.charAt(0)===" ";)s=s.substring(1,s.length);if(s.indexOf(t)===0)return s.substring(t.length,s.length)}return null},set:(e,t,r={})=>{if(typeof window>"u")return;let{expires:o,path:s="/",domain:i,secure:n=window.location.protocol==="https:",sameSite:a=n?"None":"Lax"}=r,u=[`${e}=${t}`,i?`Domain=${i}`:"",`Path=${s}`,`SameSite=${a}`,n?"Secure":"",o?`expires=${o}`:""];document.cookie=u.filter(Boolean).join("; ");},remove:(e,t)=>{C.set(e,"",{expires:"Thu, 01 Jan 1970 00:00:00 GMT",domain:t});}};var se="trieoh_access_token",O={getAccessToken:()=>Y.getItem(se),setAccessToken:e=>{e?Y.setItem(se,e):Y.removeItem(se);},clear:()=>{Y.removeItem(se);}};var U=null,ye="trieoh_access_expiry",ae="trieoh_refresh_expiry",ne="trieoh_refresh_domain";function Ie(e){if(typeof window>"u")return null;let t=window.location.hostname;if(t==="localhost")return null;if(e)try{let r=e;return r.startsWith("http")&&(r=new URL(r).hostname),r}catch{return e}return t}function Ce(e){try{let t=e.split(".")[1];return JSON.parse(atob(t))}catch{return null}}function j(e){let{AccessTokenString:t,RefreshTokenString:r,AccessExpiresAt:o,RefreshExpiresAt:s,Domain:i}=e,n=Ce(t);if(!n){logger.error("Failed to decode tokens");return}O.setAccessToken(t);let a=new Date(s).getTime(),u=new Date(o).getTime(),d=Ie(i);C.set("refresh_token",r,{expires:new Date(a).toUTCString(),domain:d}),U={access_data:n,refresh_expiry_date:a},S.setItem(ye,String(u)),S.setItem(ae,String(a)),d?S.setItem(ne,d):S.removeItem(ne),_.set({isAuthenticated:true,isInitializing:false}),logger.log("Auth session saved");}function G(){if(U)return U;let e=O.getAccessToken();if(!e)return null;let t=Ce(e);if(!t||t.exp*1e3<=Date.now())return null;let r=S.getItem(ae);return r?(U={access_data:t,refresh_expiry_date:parseInt(r,10)},U):null}function ke(e,t){try{let r=S.getItem(e);if(!r)return !0;let o=parseInt(r,10);return isNaN(o)?!0:o-Date.now()<=t*1e3}catch(r){return logger.warn("Error reading expiry:",r),true}}var Pe=(e=30)=>ke(ye,e),le=(e=10)=>ke(ae,e);function H(){U=null,O.clear(),S.removeItem(ye),S.removeItem(ae);let e=S.getItem(ne)||Ie();C.remove("refresh_token",e),S.removeItem(ne),_.reset(),logger.log("Auth tokens and claims cleared");}function De(){let e=G();return e?e.access_data.sub:null}function Ge(){let e=typeof window>"u",t=typeof import.meta<"u"&&import.meta.env?import.meta.env:{},r=typeof process<"u"?process.env:{},o=t.VITE_TRIEOH_AUTH_PROJECT_ID||r.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID||r.PUBLIC_TRIEOH_AUTH_PROJECT_ID||"",s=e&&r.TRIEOH_AUTH_API_KEY||"";return {PROJECT_ID:o,API_KEY:s,BASE_URL:"https://api.trieauth.trieoh.com"}}var ce=null,be={};function Oe(e){be={...be,...e},ce=null;}function xe(){return ce||(ce={...Ge(),...be}),ce}var y={get PROJECT_ID(){return xe().PROJECT_ID},get BASE_URL(){return xe().BASE_URL}};var ue=class{constructor(t){this.isRefreshing=false;this.refreshPromise=null;this.baseURL=t?.baseURL||y.BASE_URL,this.authBaseURL=t?.authBaseURL||this.baseURL,this.onTokenRefreshed=t?.onTokenRefreshed,this.onRefreshFailed=t?.onRefreshFailed;}async refreshToken(){return this.isRefreshing&&this.refreshPromise?this.refreshPromise:(this.isRefreshing=true,this.refreshPromise=(async()=>{try{let t=await simpleFetch(ve(this.authBaseURL,"/auth/refresh"),{method:"POST",credentials:"include"});if(t.code!==200||!t.data)throw t.code!==503&&H(),new Error(t.message||"Failed to refresh token");j(t.data);let r=G();r&&this.onTokenRefreshed?.(r),logger.log("Token refreshed successfully");}catch(t){throw logger.warn("Failed to refresh token:",t),H(),this.onRefreshFailed?.(t),t}finally{this.isRefreshing=false,this.refreshPromise=null;}})(),this.refreshPromise)}async beforeRequest(){if(le()){H();return}let t=!!O.getAccessToken(),r=!!C.get("refresh_token");if(!t&&r||t&&Pe(30))try{await this.refreshToken();}catch(o){logger.warn("Proactive refresh failed:",o);}}async fetch(t,r){let o=r?.requiresAuth!==false,s=t.includes("/auth/refresh");o&&!s&&!r?.skipRefresh&&await this.beforeRequest();let i=ve(this.baseURL,t),n=async()=>{let u=O.getAccessToken(),d=new Headers(r?.headers);return o&&u&&d.set("Authorization",`Bearer ${u}`),d.has("Content-Type")||d.set("Content-Type","application/json"),fetch(i,{...r,headers:d,credentials:"include"})},a=await n();if(a.status===401&&o&&!s){logger.log("401 detected, attempting one-time retry after refresh...");try{await this.refreshToken(),a=await n();}catch{logger.error("Retry failed after refresh error");}}return a}};function L(e){if(!e)return;let{requiresAuth:t,skipRefresh:r,...o}=e,s={};return t!==void 0&&(s.requiresAuth=t),r!==void 0&&(s.skipRefresh=r),{...o,adapterInit:{...o.adapterInit,...s}}}var de=class{constructor(t,r,o,s){this.interceptor=new ue({baseURL:t,authBaseURL:r,onTokenRefreshed:o}),this.client=createDefaultFetchClient({...s,adapter:this.interceptor.fetch.bind(this.interceptor)});}request(t,r){return this.client.request(t,L(r))}get(t,r){return this.client.get(t,L(r))}post(t,r,o){return this.client.post(t,r,L(o))}put(t,r,o){return this.client.put(t,r,L(o))}patch(t,r,o){return this.client.patch(t,r,L(o))}delete(t,r,o){return this.client.delete(t,r,L(o))}query(t,r){return this.client.query(t,L(r))}};var M=()=>{if(!y.PROJECT_ID||y.PROJECT_ID.trim()==="")throw new Error("[TRIEOH SDK] Project ID is missing. Please set PUBLIC_TRIEOH_AUTH_PROJECT_ID, NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID or VITE_TRIEOH_AUTH_PROJECT_ID.")};var Le=(e,t)=>({login:async(r,o)=>{y.PROJECT_ID&&M();let s=`/auth/login${y.PROJECT_ID?`?project_id=${y.PROJECT_ID}`:""}`,i=await e.post(s,{email:r,password:o},{requiresAuth:false});return i.success&&(j(i.data),t?.onLogin?.()),i},register:async(r,o)=>{let s={requiresAuth:false},i=`/auth/register${y.PROJECT_ID?`?project_id=${y.PROJECT_ID}`:""}`;y.PROJECT_ID&&M();let n=await e.post(i,{email:r,password:o},s);return n.success&&t?.onRegister?.(),n},logout:async r=>{let o=`/auth/logout${y.PROJECT_ID?`?project_id=${y.PROJECT_ID}`:""}`,s=await e.post(o);return (s.success||r?.forceLogout)&&H(),s},refresh:async()=>{let r=await e.post("/auth/refresh",void 0,{skipRefresh:true});return r.success&&(j(r.data),t?.onRefresh?.()),r},sessions:async()=>e.get("/sessions"),currentSession:async()=>e.get("/sessions/me"),revokeASession:async r=>e.delete(`/sessions/${r}`),revokeSessions:async(r=false)=>{let o=r?"/sessions":"/sessions/others";return e.delete(o)},profile:()=>De(),sendForgotPassword:async r=>{let o={requiresAuth:false},s=await(async()=>y.PROJECT_ID?(M(),e.post("/account/forgot-password",{email:r,project_id:y.PROJECT_ID},o)):e.post("/account/forgot-password",{email:r},o))();return s.success&&t?.onForgotPassword?.(),s},resetPassword:async(r,o)=>e.post(`/account/reset-password?token=${r}`,{new_password:o},{requiresAuth:false}),verifyEmail:async()=>{let r=await e.get("/account/verify",{requiresAuth:false});return r.success&&t?.onVerify?.(),r},resendVerifyEmail:async()=>e.post("/account/verify/resend"),health:async()=>e.get("/health",{requiresAuth:false}),authHealth:async()=>e.get("/protected/health")});var Ne=createContext(null);function wr({children:e,baseURL:t,projectId:r,isProjectMode:o=true,fallback:s,waitSession:i=true,clientConfig:n,onLogin:a,onForgotPassword:u,onRegister:d,onVerify:f,onRefresh:m}){let g=useRef(false),{isAuthenticated:p,isInitializing:h}=useSyncExternalStore(_.subscribe,_.getSnapshot,_.getServerSnapshot);useEffect(()=>{Oe({...r?{PROJECT_ID:r}:{},...t?{BASE_URL:t}:{}});},[r,t]);let b=useCallback(P=>{_.set({isAuthenticated:!!P.access_data,isInitializing:false}),m?.();},[m]),w=useMemo(()=>new de(t,void 0,b,n),[t,b,n]),x=useMemo(()=>Le(w,{onLogin:a,onForgotPassword:u,onRegister:d,onVerify:f,onRefresh:m}),[w,a,u,d,f,m]);useEffect(()=>{o&&M(),(async()=>{if(g.current)return;if(g.current=true,G()){_.set({isAuthenticated:true,isInitializing:false});return}if(!!!C.get("refresh_token")||le()){_.reset(),_.set({isInitializing:false});return}logger.log("No cached claims, attempting silent refresh...");try{(await x.refresh()).success?(_.set({isAuthenticated:!0,isInitializing:!1}),logger.log("Session restored.")):(_.reset(),logger.warn("No active session."));}catch{_.reset(),logger.warn("Could not restore session (offline?).");}finally{_.set({isInitializing:false});}})();},[x,o]);let I=useMemo(()=>({auth:x,isAuthenticated:p,isInitializing:h,isProjectMode:o}),[x,p,h,o]);return i&&h?s??null:jsx(Ne.Provider,{value:I,children:e})}function T(){let e=useContext(Ne);if(!e)throw new Error("useAuth must be used inside <AuthProvider>");return e}function Q(e,{insertAt:t}={}){if(!e||typeof document>"u")return;let r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",t==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e));}Q(`@import"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";:root{--trieoh-primary: oklch(.1139 .0789 264.05);--trieoh-secondary: oklch(.7975 .1018 262.7);--trieoh-neutral1: oklch(.9702 0 0);--trieoh-neutral2: oklch(.1944 .0051 248.09);--trieoh-radius-full: 50%;--trieoh-text-sm: .75rem;--trieoh-text-base: .875rem;--trieoh-text-xl: 1.25rem;--trieoh-text-2xl: 1.5rem;--trieoh-text-3xl: 1.875rem;--trieoh-text-6xl: 3.75rem}
|
|
2
|
+
`);Q(`.trieoh{font-family:Inter,sans-serif}.trieoh-input{position:relative;width:100%;display:flex;flex-direction:column;gap:.25rem;color:var(--trieoh-neutral2)}.trieoh-input__label{font-size:1rem;font-weight:600}.trieoh-input__container{display:flex;justify-content:space-between;align-items:center;padding:.0625rem .625rem;gap:.625rem;border-bottom:solid .125rem var(--trieoh-neutral2)}.trieoh-input__container--error{border-color:#e53935!important}.trieoh-input__container-field{min-width:10rem;flex:1;font-size:var(--trieoh-text-base);font-weight:300;color:var(--trieoh-neutral2);-webkit-appearance:none;background:none;outline:none;border:none;box-shadow:none!important;padding:.125rem 0}.trieoh-input__container-icon{cursor:pointer;flex-shrink:0;-webkit-user-select:none;user-select:none}.trieoh-input__hint{font-size:.75rem;color:#6b7280;transition:opacity .2s ease-in-out}.trieoh-input__hint .hint-part{transition:color .12s ease,text-decoration .12s ease,opacity .12s ease;opacity:.95;margin:.125rem}.trieoh-input__hint .hint-part.passed{text-decoration:line-through;opacity:.6;color:#10b981}.trieoh-input__hint .hint-part.failed-on-submit{color:#e53935;font-weight:600;opacity:1}.trieoh-button{--trieoh-button-color: var(--trieoh-neutral2);width:100%;height:3.25rem;font-size:var(--trieoh-text-xl);font-weight:600;color:var(--trieoh-button-color);outline:none;background:none;position:relative;overflow:hidden;min-width:10rem;flex-shrink:0;border:.125rem solid var(--trieoh-button-color);cursor:pointer;padding:0 1.5rem;transition:transform .5s}.trieoh-button--all-rounded{border-radius:.25rem}.trieoh-button:hover{transform:scale(102%)}.trieoh-button:active{transform:scale(99%)}.trieoh-button[disabled],.trieoh-button--logout[disabled]{opacity:.6;cursor:not-allowed;transform:none!important}.trieoh-button--loading:after{content:"";position:absolute;top:0;left:-150%;width:150%;height:100%;background:linear-gradient(120deg,transparent 0%,color-mix(in oklab,var(--trieoh-button-color) 40%,white 15%) 40%,transparent 80%);animation:trieoh-shine 1.5s infinite}@keyframes trieoh-shine{0%{left:-150%}to{left:150%}}.trieoh-button--logout{border:none;background:none;cursor:pointer;--trieoh-button-color: oklch(.628 .2577 29.23);display:flex;align-items:end;gap:.25rem;font-size:var(--trieoh-text-base);font-weight:500;color:var(--trieoh-button-color);transition:transform .2s}.trieoh-button--logout:hover{transform:scale(1.05)}.trieoh-button--logout:active{transform:scale(.98)}.trieoh-avacard{display:flex;flex-direction:column;align-items:center}.trieoh-avacard__container{display:flex;justify-content:center;align-items:center;padding:.5rem;background-color:#d9d9d94d;border-radius:var(--trieoh-radius-full);margin-bottom:.625rem}.trieoh-avacard__content{width:64px;height:64px;padding:.625rem;background-color:var(--trieoh-neutral1);border-radius:var(--trieoh-radius-full);box-shadow:0 .25rem 1rem #00000040}.trieoh-avacard__title{text-align:center;font-size:var(--trieoh-text-xl);font-weight:500;margin:0}.trieoh-avacard__sub-title{text-align:center;font-size:.875rem;font-weight:300;opacity:.6}.trieoh-card{display:flex;flex-direction:column;width:100%;max-width:30rem;min-width:15rem;max-height:max(75dvh,32rem);overflow:hidden;gap:1.25rem;align-items:center;background-color:var(--trieoh-neutral1);color:var(--trieoh-neutral2);padding:1.25rem 1.5rem;box-shadow:0 .25rem .25rem #00000040;transition:transform .15s ease}.trieoh-card--full-rounded{border-radius:.25rem}.trieoh-card__fields{width:100%;display:flex;flex-direction:column;gap:.625rem;flex:1 1 auto;overflow-y:auto;margin-bottom:.5rem}.trieoh-card__divider{display:flex;align-items:center;gap:.625rem;width:100%;font-size:var(--trieoh-text-base);font-weight:600;opacity:.6}.trieoh-card__divider hr{flex:1}.trieoh-card__other{font-size:var(--trieoh-text-sm);font-weight:600}.trieoh-card__other span{cursor:pointer;color:var(--trieoh-secondary);transition:color .2s}.trieoh-card__other span:hover{color:var(--trieoh-primary)}.trieoh-copyright{font-size:var(--trieoh-text-xl);font-weight:500}.trieoh-copyright--xs{font-size:var(--trieoh-text-sm)}.trieoh-copyright--sm{font-size:var(--trieoh-text-base)}.trieoh-copyright--md{font-size:var(--trieoh-text-xl)}.trieoh-copyright--lg{font-size:var(--trieoh-text-2xl)}.trieoh-copyright--xl{font-size:var(--trieoh-text-3xl)}.trieoh-copyright--2xl{font-size:var(--trieoh-text-6xl)}.trieoh-sessions{width:100%;min-width:20rem;margin:.5rem;container-type:inline-size;background-color:var(--trieoh-neutral1);color:var(--trieoh-neutral2);padding:1.5rem .5rem;border-radius:.5rem}.trieoh-sessions__header{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;gap:1rem;box-sizing:border-box;padding:0 .75rem}.trieoh-sessions__header div{flex:0 1 auto;max-width:25rem}.trieoh-sessions__header div h3{font-weight:600;font-size:var(--trieoh-text-2xl);margin:0;margin-bottom:.25rem}.trieoh-sessions__header div p{font-weight:200;font-size:var(--trieoh-text-base);margin:0}.trieoh-sessions__header button{max-width:14rem;padding:1rem 0;height:auto;font-size:var(--trieoh-text-base)}.trieoh-sessions__content{margin-top:1rem}.trieoh-sessions__empty{display:block;border-top:1px solid rgba(0,0,0,.3);padding:1.25rem .75rem;text-align:center;font-weight:600}.trieoh-session{border-top:1px solid rgba(0,0,0,.3);padding:1.25rem .75rem;color:var(--trieoh-neutral2)}.trieoh-session__content{position:relative;display:flex;flex-direction:column;align-items:center;gap:.5rem;flex:1;text-align:center}.trieoh-session__info{display:flex;flex-direction:column;min-width:0}.trieoh-session__meta{display:inline-flex;flex-direction:column;font-size:var(--trieoh-text-sm);font-weight:200}.trieoh-session h3{font-size:var(--trieoh-text-base);font-weight:600;margin:0}.trieoh-session span strong{color:var(--trieoh-primary);font-weight:400}.trieoh-session__content svg:last-child{position:absolute;top:0;right:0;cursor:pointer;opacity:.6;transition:opacity .2s,transform .15s}.trieoh-session__content svg:last-child:hover{opacity:1;transform:scale(1.05)}.trieoh-session__content svg:last-child:active{transform:scale(.95)}@container (min-width: 640px){.trieoh-sessions__header{justify-content:space-between;text-align:left;gap:2rem}.trieoh-session{flex-direction:row;text-align:left}.trieoh-session__content{flex-direction:row;align-items:center;gap:1rem;text-align:left}.trieoh-session__meta{flex-direction:row;gap:.5rem;align-items:center}}
|
|
3
|
+
`);function R({name:e,label:t,placeholder:r,type:o="text",value:s,onValueChange:i,onBlur:n,autoComplete:a,rulesStatus:u=[],submitted:d=false,inputRef:f}){let[m,g]=useState(false),p=u.some(h=>!h.passed);return jsxs("div",{className:"trieoh trieoh-input",children:[jsx("label",{htmlFor:e,className:"trieoh-input__label",children:t}),jsxs("div",{className:(p&&d?"trieoh-input__container--error ":"")+"trieoh-input__container",children:[jsx("input",{type:m?"text":o,name:e,id:e,placeholder:r,value:s,onChange:h=>i&&i(h.target.value),onBlur:n,autoComplete:a,"aria-invalid":p&&d,ref:f,className:"trieoh-input__container-field"}),o==="password"&&(m?jsx(RiEyeCloseLine,{className:"trieoh-input__container-icon",size:24,onClick:()=>g(false)}):jsx(RiEyeLine,{className:"trieoh-input__container-icon",size:24,onClick:()=>g(true)}))]}),jsx("div",{className:"trieoh-input__hint",children:u.map((h,b)=>{let w=["hint-part",h.passed?"passed":"",!h.passed&&d?"failed-on-submit":""].filter(Boolean).join(" ");return jsx("p",{className:w,children:h.message},h.id??b)})})]})}function B({label:e,onSubmit:t,loading:r}){return jsx("button",{type:"submit",onClick:t,disabled:r,className:`trieoh trieoh-button trieoh-button--all-rounded
|
|
4
|
+
${r?"trieoh-button--loading":""}`,children:e})}function N({mainText:e,subText:t}){return jsxs("div",{className:"trieoh trieoh-avacard",children:[jsx("div",{className:"trieoh-avacard__container",children:jsx(GoPerson,{className:"trieoh-avacard__content",size:70})}),jsx("h3",{className:"trieoh-avacard__title",children:e}),jsx("span",{className:"trieoh-avacard__sub-title",children:t})]})}function E(e,t){return e.map(r=>({id:r.id,message:r.message,passed:!!r.test(t)}))}function ut({onSuccess:e,onFailed:t,signUpRedirect:r,forgotPasswordRedirect:o,emailRules:s}){let[i,n]=useState(""),[a,u]=useState(""),[d,f]=useState(false),[m,g]=useState(false),p=useRef(null),h=useRef(null),{auth:b}=T(),w={email:s||[{message:"Digite um e-mail v\xE1lido, ex: exemplo@dominio.com",test:D=>/\S+@\S+\.\S+/.test(D)}],password:[]},x=E(w.email,i),I=E(w.password,a);return jsxs("form",{className:"trieoh trieoh-card trieoh-card--full-rounded",children:[jsx(N,{mainText:"Fa\xE7a login na sua conta",subText:"Insira seus dados para fazer login"}),jsxs("div",{className:"trieoh-card__fields",children:[jsx(R,{label:"Email",name:"email",placeholder:"teste@gmail.com",autoComplete:"email",type:"email",value:i,onValueChange:n,inputRef:p,rulesStatus:x,submitted:d}),jsx(R,{label:"Senha",name:"password",placeholder:"**********",autoComplete:"current-password",type:"password",value:a,onValueChange:u,inputRef:h,rulesStatus:I,submitted:d})]}),jsx(B,{label:"Entrar",onSubmit:async D=>{D.preventDefault(),f(true);let $=x.some(v=>!v.passed),re=I.some(v=>!v.passed);if($){p.current?.focus();return}if(re){h.current?.focus();return}g(true);let J=await b.login(i,a);J.success?e&&await e(J.message):t&&await t(J.message,J.trace),g(false);},loading:m}),o&&jsx("span",{className:"trieoh-card__other",style:{textAlign:"center",cursor:"pointer"},children:jsx("span",{onClick:o,children:"Esqueceu sua senha?"})}),r&&jsxs(Fragment,{children:[jsxs("div",{className:"trieoh-card__divider",children:[jsx("hr",{}),"OU",jsx("hr",{})]}),jsxs("span",{className:"trieoh-card__other",children:["Ainda n\xE3o possui uma conta? ",jsx("span",{onClick:r,children:"Cadastra-se"})]})]})]})}function mt({onSuccess:e,onFailed:t,loginRedirect:r,emailRules:o,passwordRules:s}){let[i,n]=useState(""),[a,u]=useState(""),[d,f]=useState(""),[m,g]=useState(false),[p,h]=useState(false),b=useRef(null),w=useRef(null),x=useRef(null),{auth:I}=T(),P={email:o||[{message:"Digite um e-mail v\xE1lido, ex: exemplo@dominio.com",test:v=>/\S+@\S+\.\S+/.test(v)}],password:s||[{message:"M\xEDnimo de 8 caracteres.",test:v=>v.length>=8},{message:"Deve conter uma letra mai\xFAscula.",test:v=>/[A-Z]/.test(v)},{message:"Inclua pelo menos um caractere especial, ex: ! @ # $ % & * . ,",test:v=>/[!@#$%^&*(),.?":{}|<>_\-+=~`;/\\[\]]/.test(v)},{message:"Deve conter um n\xFAmero.",test:v=>/\d/.test(v)}],confirmPassword:[{message:"Senhas n\xE3o conferem.",test:v=>v===a}]},D=E(P.email,i),$=E(P.password,a),re=E(P.confirmPassword,d);return jsxs("form",{className:"trieoh trieoh-card trieoh-card--full-rounded",children:[jsx(N,{mainText:"Crie sua conta",subText:"Insira seus dados para come\xE7ar"}),jsxs("div",{className:"trieoh-card__fields",children:[jsx(R,{label:"Email",name:"email",placeholder:"teste@gmail.com",autoComplete:"email",type:"email",value:i,onValueChange:n,inputRef:b,rulesStatus:D,submitted:m}),jsx(R,{label:"Senha",name:"password",placeholder:"**********",autoComplete:"new-password",type:"password",value:a,onValueChange:u,inputRef:w,rulesStatus:$,submitted:m}),jsx(R,{label:"Confirme a Senha",name:"confirm-password",placeholder:"**********",autoComplete:"new-password",type:"password",value:d,onValueChange:f,inputRef:x,rulesStatus:re,submitted:m})]}),jsx(B,{label:"Criar Conta",onSubmit:async v=>{v.preventDefault(),g(true);let Ke=D.some(V=>!V.passed),Ye=$.some(V=>!V.passed),je=re.some(V=>!V.passed);if(Ke){b.current?.focus();return}if(Ye){w.current?.focus();return}if(je){x.current?.focus();return}h(true);let oe=await I.register(i,a);oe.success?e&&await e(oe.message):t&&await t(oe.message,oe.trace),h(false);},loading:p}),r&&jsxs(Fragment,{children:[jsxs("div",{className:"trieoh-card__divider",children:[jsx("hr",{}),"OU",jsx("hr",{})]}),jsxs("span",{className:"trieoh-card__other",children:["J\xE1 possui uma conta? ",jsx("span",{onClick:r,children:"Entre"})]})]})]})}function ht({size:e}){let t=e?`trieoh-copyright--${e}`:"";return jsxs("span",{className:`trieoh trieoh-copyright ${t}`,children:["\xA9 ",new Date().getFullYear()," TrieOH"]})}function _t({onSuccess:e,onFailed:t,forceLogout:r}){let{auth:o}=T(),[s,i]=useState(false);return jsxs("button",{onClick:async a=>{if(a.preventDefault(),s)return;i(true);let u=await o.logout({forceLogout:r});u.success?e&&await e(u.message):t&&await t(u.message,u.trace),i(false);},type:"button",disabled:s,className:"trieoh trieoh-button--logout",children:[jsx(ImExit,{size:24})," ",jsx("span",{children:"Log out"})]})}var Me={mobile:FaMobileAlt,tablet:FaTabletAlt,desktop:FaDesktop};function ze(e){let{device:t,os:r,browser:o}=UAParser(e);return {deviceType:t.type??"desktop",os:r.name,browser:o.name}}function qe(e){let t=ze(e);return {device:Rt(t.deviceType),os:t.os,browser:t.browser}}function Rt(e){if(!e)return "desktop";switch(e){case "mobile":return "mobile";case "tablet":return "tablet";default:return "desktop"}}function $e(e){let t=Date.now()-new Date(e).getTime(),r=Math.floor(t/1e3),o=Math.floor(r/60),s=Math.floor(o/60),i=Math.floor(s/24),n=Math.floor(i/7);return r<60?"agora mesmo":o<60?`${o} minutos atr\xE1s`:s<24?`${s} horas atr\xE1s`:i<7?`${i} dias atr\xE1s`:`${n} semanas atr\xE1s`}function Re({is_current:e,session_id:t,user_agent:r,issued_at:o,user_ip:s,onClick:i}){let n=qe(r),a=Me[n.device];return jsx("div",{className:"trieoh-session",children:jsxs("div",{className:"trieoh-session__content",children:[jsx(a,{size:40}),jsxs("div",{className:"trieoh-session__info",children:[jsxs("h3",{children:[n.browser," - ",n.os]}),jsxs("span",{className:"trieoh-session__meta",children:[e&&jsx("strong",{children:"\u2022 Sess\xE3o Atual \u2022"}),jsx("span",{children:`${s} - ${$e(o)}`})]})]}),!e&&jsx(FaTrashAlt,{size:20,color:"red",onClick:u=>i(u,t)})]})})}function At({revokeAll:e=false,onSuccess:t}){let{auth:r}=T(),[o,s]=useState(false),[i,n]=useState([]),a=async()=>{let f=await r.sessions();if(f.success){let m=r.profile()?.session_id,g=f.data.sort((p,h)=>p.session_id===m?-1:h.session_id===m?1:0);n(g);}};useEffect(()=>{a();},[]);let u=async(f,m)=>{f.preventDefault();let g=i.find(p=>p.session_id===m);if(g){n(i.filter(p=>p.session_id!==m));try{(await r.revokeASession(m)).success||n(h=>[...h,g]);}catch{n(p=>[...p,g]);}}};return jsxs("div",{className:"trieoh trieoh-sessions",children:[jsxs("div",{className:"trieoh-sessions__header",children:[jsxs("div",{children:[jsx("h3",{children:"Navegadores e Dispositivos"}),jsx("p",{children:"Esses navegadores e dispositivos est\xE3o atualmente conectados \xE0 sua conta. Remova quaisquer dispositivos n\xE3o autorizados."})]}),jsx("button",{type:"submit",onClick:async f=>{if(f.preventDefault(),o)return;s(true);let m=await r.revokeSessions(e),g=r.profile()?.session_id;m.success&&(n(e?[]:i.filter(p=>p.session_id===g)),t&&t(m.message)),s(false);},disabled:o,className:`trieoh trieoh-button trieoh-button--all-rounded
|
|
5
|
+
${o?"trieoh-button--loading":""}`,children:"Revogar todas as sess\xF5es"})]}),jsx("div",{className:"trieoh-sessions__content",children:i.length>0?i.map(f=>jsx(Re,{...f,is_current:r.profile()?.session_id===f.session_id,onClick:u},f.session_id)):jsx("span",{className:"trieoh-sessions__empty",children:"Nenhuma Sess\xE3o Dispon\xEDvel"})})]})}function Ve({onSuccess:e,onFailed:t,loginRedirect:r,emailRules:o}){let[s,i]=useState(""),[n,a]=useState(false),[u,d]=useState(false),f=useRef(null),{auth:m}=T(),p=E({email:o||[{message:"Digite um e-mail v\xE1lido, ex: exemplo@dominio.com",test:b=>/\S+@\S+\.\S+/.test(b)}]}.email,s);return jsxs("form",{className:"trieoh trieoh-card trieoh-card--full-rounded",children:[jsx(N,{mainText:"Esqueci a senha",subText:"Insira seu e-mail para receber um link de redefini\xE7\xE3o."}),jsx("div",{className:"trieoh-card__fields",children:jsx(R,{label:"Email",name:"email",placeholder:"teste@gmail.com",autoComplete:"email",type:"email",value:s,onValueChange:i,inputRef:f,rulesStatus:p,submitted:n})}),jsx(B,{label:u?"Enviando...":"Enviar link de redefini\xE7\xE3o",onSubmit:async b=>{if(b.preventDefault(),a(true),p.some(I=>!I.passed)){f.current?.focus();return}d(true);let x=await m.sendForgotPassword(s);x.success?e&&await e(x.message):t&&await t(x.message,x.trace),d(false);},loading:u}),r&&jsxs(Fragment,{children:[jsxs("div",{className:"trieoh-card__divider",children:[jsx("hr",{}),"OU",jsx("hr",{})]}),jsxs("span",{className:"trieoh-card__other",children:["Lembrou-se da sua senha? ",jsx("span",{onClick:r,children:"Login"})]})]})]})}export{wr as AuthProvider,R as BasicInputField,_t as BasicLogoutButton,ht as Copyright,Ve as ForgotPassword,At as Sessions,ut as SignIn,mt as SignUp,T as useAuth};//# sourceMappingURL=react.js.map
|
|
6
6
|
//# sourceMappingURL=react.js.map
|