@fluoce/auth-react 1.1.0 → 1.1.1

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/index.cjs CHANGED
@@ -302,7 +302,7 @@ var auth_provider = ({
302
302
  });
303
303
  }, [app_url, on_error, on_unauthorized_redirect]);
304
304
  const [user, set_user] = (0, import_react2.useState)(null);
305
- const [safe_loading, set_safe_loading] = (0, import_react2.useState)(false);
305
+ const [safe_loading, set_safe_loading] = (0, import_react2.useState)(true);
306
306
  const [auth_flow_loading, set_auth_flow_loading] = (0, import_react2.useState)(false);
307
307
  const refresh = async () => {
308
308
  var _a;
@@ -385,6 +385,7 @@ var use_auth = () => {
385
385
  };
386
386
 
387
387
  // src/guard/auth_guard.tsx
388
+ var import_react4 = require("react");
388
389
  var import_jsx_runtime2 = require("react/jsx-runtime");
389
390
  var auth_guard = ({
390
391
  children,
@@ -392,24 +393,26 @@ var auth_guard = ({
392
393
  can_redirect
393
394
  }) => {
394
395
  const { user, safe_loading, app_url, on_unauthorized_redirect } = use_auth();
395
- if (safe_loading && !user) {
396
+ (0, import_react4.useEffect)(() => {
397
+ if (safe_loading) return;
398
+ if (user) return;
399
+ if (!can_redirect) return;
400
+ func_redirect({
401
+ redirect_to: on_unauthorized_redirect,
402
+ app_url
403
+ });
404
+ }, [safe_loading, user, can_redirect, on_unauthorized_redirect, app_url]);
405
+ if (safe_loading) {
396
406
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: fallback });
397
407
  }
398
- if (!user && !safe_loading) {
399
- if (can_redirect) {
400
- func_redirect({
401
- redirect_to: on_unauthorized_redirect,
402
- app_url
403
- });
404
- return null;
405
- }
406
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: fallback });
408
+ if (!user) {
409
+ return can_redirect ? null : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: fallback });
407
410
  }
408
411
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
409
412
  };
410
413
 
411
414
  // src/components/auth_flow.tsx
412
- var import_react4 = require("react");
415
+ var import_react5 = require("react");
413
416
  var import_jsx_runtime3 = require("react/jsx-runtime");
414
417
  var auth_flow = ({
415
418
  code,
@@ -417,7 +420,7 @@ var auth_flow = ({
417
420
  redirect
418
421
  }) => {
419
422
  const { auth_flow: auth_flow2, auth_flow_loading } = use_auth();
420
- (0, import_react4.useEffect)(() => {
423
+ (0, import_react5.useEffect)(() => {
421
424
  const flow = async () => {
422
425
  if (!code) return;
423
426
  const success = await auth_flow2({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/func/func_cookies.ts","../src/const/route.ts","../src/func/func_redirect_at_fluoce.ts","../src/func/func_redirect.ts","../src/func/func_try_catch.ts","../src/api/api_service.ts","../src/context/auth_context.tsx","../src/hook/use_auth.ts","../src/guard/auth_guard.tsx","../src/components/auth_flow.tsx"],"sourcesContent":["export { auth_provider as FluoceAuthProvider } from \"./provider/auth_provider\";\r\nexport { use_auth as useFluoceAuth } from \"./hook/use_auth\";\r\nexport { auth_guard as FluoceAuthGuard } from \"./guard/auth_guard\";\r\nexport { auth_flow as FluoceAuthFlow } from \"./components/auth_flow\";\r\nexport { user_type as FluoceUserType } from \"./types/user_type\";\r\nexport { auth_provider_interface as FluoceAuthProviderType } from \"./types/auth_provider_interface\";\r\nexport { redirect_type as FluoceRedirectType } from \"./types/redirect_type\";\r\n","import {\r\n useMemo as use_memo,\r\n useState as use_state,\r\n useEffect as use_effect,\r\n} from \"react\";\r\nimport { auth_provider_interface } from \"../types/auth_provider_interface\";\r\nimport { Api_service } from \"../api/api_service\";\r\nimport { user_type } from \"../types/user_type\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const auth_provider = ({\r\n children,\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n}: auth_provider_interface) => {\r\n const auth_api = use_memo(() => {\r\n return new Api_service({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n });\r\n }, [app_url, on_error, on_unauthorized_redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [safe_loading, set_safe_loading] = use_state(false);\r\n\r\n const [auth_flow_loading, set_auth_flow_loading] = use_state(false);\r\n\r\n const refresh = async () => {\r\n const response = await auth_api.refresh();\r\n return response?.success ?? false;\r\n };\r\n\r\n const logout = async () => {\r\n await auth_api.logout();\r\n set_user(null);\r\n return true;\r\n };\r\n\r\n const auth_flow = async ({ code }: { code: string }) => {\r\n set_auth_flow_loading(true);\r\n try {\r\n const data = await auth_api.auth_flow({\r\n code,\r\n });\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n set_auth_flow_loading(false);\r\n }\r\n };\r\n\r\n const get_safe_user = async () => {\r\n set_safe_loading(true);\r\n try {\r\n if (user) {\r\n return user;\r\n }\r\n const data = await auth_api.safe_me({});\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return data.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n } finally {\r\n set_safe_loading(false);\r\n }\r\n };\r\n\r\n use_effect(() => {\r\n void get_safe_user();\r\n }, []);\r\n\r\n const value: auth_context_interface = {\r\n user,\r\n safe_loading,\r\n auth_flow_loading,\r\n app_url,\r\n on_unauthorized_redirect,\r\n refresh,\r\n logout,\r\n auth_flow,\r\n get_safe_user,\r\n get access_token() {\r\n return auth_api.get_access_token();\r\n },\r\n get refresh_token() {\r\n return auth_api.get_refresh_token();\r\n },\r\n };\r\n\r\n return (\r\n <auth_context.Provider value={value}>{children}</auth_context.Provider>\r\n );\r\n};\r\n","export const base_url = \"https://auth-service.fluoce.com\";\r\n\r\nexport const api_endpoint = {\r\n me: \"/me\",\r\n exchange: \"/exchange\",\r\n refresh: \"/refresh\",\r\n logout: \"/logout\",\r\n};\r\n","export function func_set_cookie(\n name: string,\n value: string,\n days: number,\n): void {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`;\n}\n\nexport function func_get_cookie(name: string): string | null {\n const escaped = name.replace(/([.$?*|{}()[\\]\\\\/+^])/g, \"\\\\$1\");\n const match = document.cookie.match(\n new RegExp(\"(?:^|; )\" + escaped + \"=([^;]*)\"),\n );\n return match ? decodeURIComponent(match[1]) : null;\n}\n\nexport function func_delete_cookie(name: string): void {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; SameSite=Lax`;\n}\n","export const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\r\n};\r\n","import { route } from \"../const/route\";\r\n\r\nexport function func_redirect_at_fluoce({ app_url }: { app_url: string }) {\r\n window.location.replace(route.fluoce_auth(app_url));\r\n}\r\n","import { redirect_type } from \"../types/redirect_type\";\r\nimport { func_redirect_at_fluoce } from \"./func_redirect_at_fluoce\";\r\n\r\nexport function func_redirect({\r\n redirect_to,\r\n app_url,\r\n error,\r\n}: {\r\n redirect_to: redirect_type | undefined | null;\r\n app_url: string;\r\n error?: unknown;\r\n}) {\r\n if (!redirect_to) {\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n return;\r\n }\r\n switch (redirect_to.type) {\r\n case \"fluoce\":\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n break;\r\n case \"custom\":\r\n redirect_to.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n default:\r\n break;\r\n }\r\n}\r\n","export async function func_try_catch<T>({\r\n fn,\r\n onError,\r\n}: {\r\n fn: () => Promise<T>;\r\n onError?: (error: unknown) => void;\r\n}): Promise<T | null> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n if (onError) {\r\n onError(error);\r\n return null;\r\n }\r\n throw error;\r\n }\r\n}\r\n","import { api_endpoint, base_url } from \"../const/api_endpoint\";\r\nimport { route } from \"../const/route\";\r\nimport {\r\n func_delete_cookie,\r\n func_get_cookie,\r\n func_set_cookie,\r\n} from \"../func/func_cookies\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\nimport { func_try_catch } from \"../func/func_try_catch\";\r\nimport { Api_service_interface } from \"../types/api_service_interface\";\r\nimport { redirect_type } from \"../types/redirect_type\";\r\nimport {\r\n exchange_response_type,\r\n refresh_response_type,\r\n response_type,\r\n user_response_type,\r\n} from \"../types/response_types\";\r\n\r\nexport class Api_service implements Api_service_interface {\r\n private readonly base_url = base_url;\r\n private readonly api_endpoint = api_endpoint;\r\n private app_url: string;\r\n private on_error?: (error: unknown) => void;\r\n private redirect: redirect_type = {\r\n type: \"fluoce\",\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n func_redirect({ redirect_to: this.redirect, app_url: this.app_url, error });\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n console.warn(\"FLUOCE_WARN\", error);\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n private readonly handle_response_parse = async (res: Response) => {\r\n const json = await res.json().catch(() => null);\r\n if (!res.ok) {\r\n throw json ?? new Error(`HTTP:${res.status}:${res.statusText}`);\r\n }\r\n return json;\r\n };\r\n\r\n constructor({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n on_unauthorized_redirect?: redirect_type;\r\n }) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (on_unauthorized_redirect) {\r\n this.redirect = on_unauthorized_redirect;\r\n }\r\n }\r\n\r\n public readonly get_access_token = (): string | null => {\r\n return func_get_cookie(\"accessToken\");\r\n };\r\n\r\n public readonly get_refresh_token = (): string | null => {\r\n return func_get_cookie(\"refreshToken\");\r\n };\r\n\r\n private readonly delete_cookie = () => {\r\n func_delete_cookie(\"accessToken\");\r\n func_delete_cookie(\"refreshToken\");\r\n };\r\n\r\n async me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n }\r\n\r\n async safe_me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return await res.json();\r\n },\r\n onError: (error) => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async refresh() {\r\n const data = await func_try_catch<response_type<refresh_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.refresh, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async logout() {\r\n return await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.logout, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n can_redirect,\r\n}: auth_guard_interface) => {\r\n const { user, safe_loading, app_url, on_unauthorized_redirect } = use_auth();\r\n\r\n if (safe_loading && !user) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n if (!user && !safe_loading) {\r\n if (can_redirect) {\r\n func_redirect({\r\n redirect_to: on_unauthorized_redirect,\r\n app_url,\r\n });\r\n return null;\r\n }\r\n return <>{fallback}</>;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","import { ReactNode as react_node, useEffect as use_effect } from \"react\";\r\nimport { use_auth } from \"../hook/use_auth\";\r\n\r\nexport const auth_flow = ({\r\n code,\r\n fallback,\r\n redirect,\r\n}: {\r\n fallback?: react_node;\r\n code: string;\r\n redirect: string;\r\n}) => {\r\n const { auth_flow, auth_flow_loading } = use_auth();\r\n\r\n use_effect(() => {\r\n const flow = async () => {\r\n if (!code) return;\r\n const success = await auth_flow({\r\n code,\r\n });\r\n if (success) {\r\n window.location.replace(redirect);\r\n }\r\n };\r\n flow();\r\n }, [code]);\r\n\r\n if (fallback) {\r\n return fallback;\r\n }\r\n\r\n if (auth_flow_loading) {\r\n return (\r\n <div>\r\n <span>Logging you in . . . </span>\r\n </div>\r\n );\r\n }\r\n\r\n return <div>Login done or stopped</div>;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAIO;;;ACJA,IAAM,WAAW;AAEjB,IAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;;;ACPO,SAAS,gBACd,MACA,OACA,MACM;AACN,QAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,EAAE,YAAY;AAChE,WAAS,SAAS,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,aAAa,OAAO;AAC5E;AAEO,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,UAAU,KAAK,QAAQ,0BAA0B,MAAM;AAC7D,QAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI,OAAO,aAAa,UAAU,UAAU;AAAA,EAC9C;AACA,SAAO,QAAQ,mBAAmB,MAAM,CAAC,CAAC,IAAI;AAChD;AAEO,SAAS,mBAAmB,MAAoB;AACrD,WAAS,SAAS,GAAG,IAAI;AAC3B;;;ACnBO,IAAM,QAAQ;AAAA,EACnB,aAAa,CAAC,QAAgB,oCAAoC,GAAG;AACvE;;;ACAO,SAAS,wBAAwB,EAAE,QAAQ,GAAwB;AACxE,SAAO,SAAS,QAAQ,MAAM,YAAY,OAAO,CAAC;AACpD;;;ACDO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,aAAa;AAChB,4BAAwB;AAAA,MACtB;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK;AACH,8BAAwB;AAAA,QACtB;AAAA,MACF,CAAC;AACD;AAAA,IACF,KAAK;AACH,kBAAY,SAAS,KAAK;AAC1B;AAAA,IACF,KAAK;AACH;AAAA,IACF;AACE;AAAA,EACJ;AACF;;;AChCA,eAAsB,eAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAGsB;AACpB,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,OAAO;AACd,QAAI,SAAS;AACX,cAAQ,KAAK;AACb,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;;;ACEO,IAAM,cAAN,MAAmD;AAAA,EA6BxD,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AApCH,SAAiB,WAAW;AAC5B,SAAiB,eAAe;AAGhC,SAAQ,WAA0B;AAAA,MAChC,MAAM;AAAA,IACR;AAEA,SAAiB,kBAAkB,CAAC,UAA0B;AAC5D,oBAAc,EAAE,aAAa,KAAK,UAAU,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,IAC5E;AAEA,SAAiB,eAAe,CAAC,UAA0B;AACzD,cAAQ,KAAK,eAAe,KAAK;AACjC,UAAI,KAAK,UAAU;AACjB,aAAK,SAAS,KAAK;AAAA,MACrB;AACA,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAEA,SAAiB,wBAAwB,OAAO,QAAkB;AAChE,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI;AAC9C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,sBAAQ,IAAI,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AAkBA,SAAgB,mBAAmB,MAAqB;AACtD,aAAO,gBAAgB,aAAa;AAAA,IACtC;AAEA,SAAgB,oBAAoB,MAAqB;AACvD,aAAO,gBAAgB,cAAc;AAAA,IACvC;AAEA,SAAiB,gBAAgB,MAAM;AACrC,yBAAmB,aAAa;AAChC,yBAAmB,cAAc;AAAA,IACnC;AAlBE,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,QAAI,0BAA0B;AAC5B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAeA,MAAM,GAAG,EAAE,YAAY,GAA6B;AAClD,WAAO,MAAM,eAAyD;AAAA,MACpE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,UAC5D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,UAC9E;AAAA,QACF,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,EAAE,YAAY,GAA6B;AACvD,WAAO,MAAM,eAAyD;AAAA,MACpE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,UAC5D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,UAC9E;AAAA,QACF,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,KAAK;AAAA,QACrB;AACA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,EAAE,KAAK,GAAqB;AAnH7C;AAoHI,UAAM,OAAO,MAAM,eAAsD;AAAA,MACvE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,UAAU;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,QAC/B,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,sBAAgB,gBAAgB,cAAc,EAAE;AAChD,sBAAgB,eAAe,aAAa,MAAM,KAAK,GAAG;AAAA,IAC5D;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AAnJlB;AAoJI,UAAM,OAAO,MAAM,eAAqD;AAAA,MACtE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,SAAS;AAAA,UACjE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,sBAAgB,gBAAgB,cAAc,EAAE;AAChD,sBAAgB,eAAe,aAAa,MAAM,KAAK,GAAG;AAAA,IAC5D;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,WAAO,MAAM,eAAuC;AAAA,MAClD,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,QAAQ;AAAA,UAChE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC,EAAE,QAAQ,MAAM,KAAK,cAAc,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,UAAU,EAAE,KAAK,GAAqB;AArM9C;AAsMI,UAAM,gBAAgB,MAAM,KAAK,SAAS;AAAA,MACxC;AAAA,IACF,CAAC;AACD,QAAI,+CAAe,SAAS;AAC1B,YAAM,UAAU,MAAM,KAAK,GAAG;AAAA,QAC5B,cAAa,oDAAe,SAAf,mBAAqB;AAAA,MACpC,CAAC;AACD,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AClNA,mBAAgD;AAGzC,IAAM,mBAAe,aAAAC,eAA8C,IAAI;;;ARqG1E;AA7FG,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,QAAM,eAAW,cAAAC,SAAS,MAAM;AAC9B,WAAO,IAAI,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,UAAU,wBAAwB,CAAC;AAEhD,QAAM,CAAC,MAAM,QAAQ,QAAI,cAAAC,UAA4B,IAAI;AAEzD,QAAM,CAAC,cAAc,gBAAgB,QAAI,cAAAA,UAAU,KAAK;AAExD,QAAM,CAAC,mBAAmB,qBAAqB,QAAI,cAAAA,UAAU,KAAK;AAElE,QAAM,UAAU,YAAY;AA/B9B;AAgCI,UAAM,WAAW,MAAM,SAAS,QAAQ;AACxC,YAAO,0CAAU,YAAV,YAAqB;AAAA,EAC9B;AAEA,QAAM,SAAS,YAAY;AACzB,UAAM,SAAS,OAAO;AACtB,aAAS,IAAI;AACb,WAAO;AAAA,EACT;AAEA,QAAMC,aAAY,OAAO,EAAE,KAAK,MAAwB;AACtD,0BAAsB,IAAI;AAC1B,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,UAAU;AAAA,QACpC;AAAA,MACF,CAAC;AACD,WAAI,6BAAM,aAAW,6BAAM,OAAM;AAC/B,iBAAS,6BAAM,IAAI;AACnB,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAChC,qBAAiB,IAAI;AACrB,QAAI;AACF,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;AACtC,WAAI,6BAAM,aAAW,6BAAM,OAAM;AAC/B,iBAAS,6BAAM,IAAI;AACnB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,oBAAAC,WAAW,MAAM;AACf,SAAK,cAAc;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAAD;AAAA,IACA;AAAA,IACA,IAAI,eAAe;AACjB,aAAO,SAAS,iBAAiB;AAAA,IACnC;AAAA,IACA,IAAI,gBAAgB;AAClB,aAAO,SAAS,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAe,UAAS;AAEnD;;;AS1GA,IAAAE,gBAA0C;AAGnC,IAAM,WAAW,MAAM;AAC5B,QAAM,cAAU,cAAAC,YAAY,YAAY;AAExC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,SAAO;AACT;;;ACCW,IAAAC,sBAAA;AARJ,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,WAAW;AAAA,EACX;AACF,MAA4B;AAC1B,QAAM,EAAE,MAAM,cAAc,SAAS,yBAAyB,IAAI,SAAS;AAE3E,MAAI,gBAAgB,CAAC,MAAM;AACzB,WAAO,6EAAG,oBAAS;AAAA,EACrB;AAEA,MAAI,CAAC,QAAQ,CAAC,cAAc;AAC1B,QAAI,cAAc;AAChB,oBAAc;AAAA,QACZ,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AACA,WAAO,6EAAG,oBAAS;AAAA,EACrB;AAEA,SAAO,6EAAG,UAAS;AACrB;;;AC3BA,IAAAC,gBAAiE;AAkCzD,IAAAC,sBAAA;AA/BD,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,EAAE,WAAAC,YAAW,kBAAkB,IAAI,SAAS;AAElD,oBAAAC,WAAW,MAAM;AACf,UAAM,OAAO,YAAY;AACvB,UAAI,CAAC,KAAM;AACX,YAAM,UAAU,MAAMD,WAAU;AAAA,QAC9B;AAAA,MACF,CAAC;AACD,UAAI,SAAS;AACX,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,SAAK;AAAA,EACP,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB;AACrB,WACE,6CAAC,SACC,uDAAC,UAAK,mCAAqB,GAC7B;AAAA,EAEJ;AAEA,SAAO,6CAAC,SAAI,mCAAqB;AACnC;","names":["import_react","create_context","use_memo","use_state","auth_flow","use_effect","import_react","use_context","import_jsx_runtime","import_react","import_jsx_runtime","auth_flow","use_effect"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/func/func_cookies.ts","../src/const/route.ts","../src/func/func_redirect_at_fluoce.ts","../src/func/func_redirect.ts","../src/func/func_try_catch.ts","../src/api/api_service.ts","../src/context/auth_context.tsx","../src/hook/use_auth.ts","../src/guard/auth_guard.tsx","../src/components/auth_flow.tsx"],"sourcesContent":["export { auth_provider as FluoceAuthProvider } from \"./provider/auth_provider\";\r\nexport { use_auth as useFluoceAuth } from \"./hook/use_auth\";\r\nexport { auth_guard as FluoceAuthGuard } from \"./guard/auth_guard\";\r\nexport { auth_flow as FluoceAuthFlow } from \"./components/auth_flow\";\r\nexport { user_type as FluoceUserType } from \"./types/user_type\";\r\nexport { auth_provider_interface as FluoceAuthProviderType } from \"./types/auth_provider_interface\";\r\nexport { redirect_type as FluoceRedirectType } from \"./types/redirect_type\";\r\n","import {\r\n useMemo as use_memo,\r\n useState as use_state,\r\n useEffect as use_effect,\r\n} from \"react\";\r\nimport { auth_provider_interface } from \"../types/auth_provider_interface\";\r\nimport { Api_service } from \"../api/api_service\";\r\nimport { user_type } from \"../types/user_type\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const auth_provider = ({\r\n children,\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n}: auth_provider_interface) => {\r\n const auth_api = use_memo(() => {\r\n return new Api_service({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n });\r\n }, [app_url, on_error, on_unauthorized_redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [safe_loading, set_safe_loading] = use_state(true);\r\n\r\n const [auth_flow_loading, set_auth_flow_loading] = use_state(false);\r\n\r\n const refresh = async () => {\r\n const response = await auth_api.refresh();\r\n return response?.success ?? false;\r\n };\r\n\r\n const logout = async () => {\r\n await auth_api.logout();\r\n set_user(null);\r\n return true;\r\n };\r\n\r\n const auth_flow = async ({ code }: { code: string }) => {\r\n set_auth_flow_loading(true);\r\n try {\r\n const data = await auth_api.auth_flow({\r\n code,\r\n });\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n set_auth_flow_loading(false);\r\n }\r\n };\r\n\r\n const get_safe_user = async () => {\r\n set_safe_loading(true);\r\n try {\r\n if (user) {\r\n return user;\r\n }\r\n const data = await auth_api.safe_me({});\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return data.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n } finally {\r\n set_safe_loading(false);\r\n }\r\n };\r\n\r\n use_effect(() => {\r\n void get_safe_user();\r\n }, []);\r\n\r\n const value: auth_context_interface = {\r\n user,\r\n safe_loading,\r\n auth_flow_loading,\r\n app_url,\r\n on_unauthorized_redirect,\r\n refresh,\r\n logout,\r\n auth_flow,\r\n get_safe_user,\r\n get access_token() {\r\n return auth_api.get_access_token();\r\n },\r\n get refresh_token() {\r\n return auth_api.get_refresh_token();\r\n },\r\n };\r\n\r\n return (\r\n <auth_context.Provider value={value}>{children}</auth_context.Provider>\r\n );\r\n};\r\n","export const base_url = \"https://auth-service.fluoce.com\";\r\n\r\nexport const api_endpoint = {\r\n me: \"/me\",\r\n exchange: \"/exchange\",\r\n refresh: \"/refresh\",\r\n logout: \"/logout\",\r\n};\r\n","export function func_set_cookie(\n name: string,\n value: string,\n days: number,\n): void {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`;\n}\n\nexport function func_get_cookie(name: string): string | null {\n const escaped = name.replace(/([.$?*|{}()[\\]\\\\/+^])/g, \"\\\\$1\");\n const match = document.cookie.match(\n new RegExp(\"(?:^|; )\" + escaped + \"=([^;]*)\"),\n );\n return match ? decodeURIComponent(match[1]) : null;\n}\n\nexport function func_delete_cookie(name: string): void {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; SameSite=Lax`;\n}\n","export const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\r\n};\r\n","import { route } from \"../const/route\";\r\n\r\nexport function func_redirect_at_fluoce({ app_url }: { app_url: string }) {\r\n window.location.replace(route.fluoce_auth(app_url));\r\n}\r\n","import { redirect_type } from \"../types/redirect_type\";\r\nimport { func_redirect_at_fluoce } from \"./func_redirect_at_fluoce\";\r\n\r\nexport function func_redirect({\r\n redirect_to,\r\n app_url,\r\n error,\r\n}: {\r\n redirect_to: redirect_type | undefined | null;\r\n app_url: string;\r\n error?: unknown;\r\n}) {\r\n if (!redirect_to) {\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n return;\r\n }\r\n switch (redirect_to.type) {\r\n case \"fluoce\":\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n break;\r\n case \"custom\":\r\n redirect_to.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n default:\r\n break;\r\n }\r\n}\r\n","export async function func_try_catch<T>({\r\n fn,\r\n onError,\r\n}: {\r\n fn: () => Promise<T>;\r\n onError?: (error: unknown) => void;\r\n}): Promise<T | null> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n if (onError) {\r\n onError(error);\r\n return null;\r\n }\r\n throw error;\r\n }\r\n}\r\n","import { api_endpoint, base_url } from \"../const/api_endpoint\";\r\nimport { route } from \"../const/route\";\r\nimport {\r\n func_delete_cookie,\r\n func_get_cookie,\r\n func_set_cookie,\r\n} from \"../func/func_cookies\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\nimport { func_try_catch } from \"../func/func_try_catch\";\r\nimport { Api_service_interface } from \"../types/api_service_interface\";\r\nimport { redirect_type } from \"../types/redirect_type\";\r\nimport {\r\n exchange_response_type,\r\n refresh_response_type,\r\n response_type,\r\n user_response_type,\r\n} from \"../types/response_types\";\r\n\r\nexport class Api_service implements Api_service_interface {\r\n private readonly base_url = base_url;\r\n private readonly api_endpoint = api_endpoint;\r\n private app_url: string;\r\n private on_error?: (error: unknown) => void;\r\n private redirect: redirect_type = {\r\n type: \"fluoce\",\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n func_redirect({ redirect_to: this.redirect, app_url: this.app_url, error });\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n console.warn(\"FLUOCE_WARN\", error);\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n private readonly handle_response_parse = async (res: Response) => {\r\n const json = await res.json().catch(() => null);\r\n if (!res.ok) {\r\n throw json ?? new Error(`HTTP:${res.status}:${res.statusText}`);\r\n }\r\n return json;\r\n };\r\n\r\n constructor({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n on_unauthorized_redirect?: redirect_type;\r\n }) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (on_unauthorized_redirect) {\r\n this.redirect = on_unauthorized_redirect;\r\n }\r\n }\r\n\r\n public readonly get_access_token = (): string | null => {\r\n return func_get_cookie(\"accessToken\");\r\n };\r\n\r\n public readonly get_refresh_token = (): string | null => {\r\n return func_get_cookie(\"refreshToken\");\r\n };\r\n\r\n private readonly delete_cookie = () => {\r\n func_delete_cookie(\"accessToken\");\r\n func_delete_cookie(\"refreshToken\");\r\n };\r\n\r\n async me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n }\r\n\r\n async safe_me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return await res.json();\r\n },\r\n onError: (error) => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async refresh() {\r\n const data = await func_try_catch<response_type<refresh_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.refresh, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async logout() {\r\n return await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.logout, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\nimport { useEffect } from \"react\";\r\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n can_redirect,\r\n}: auth_guard_interface) => {\r\n const { user, safe_loading, app_url, on_unauthorized_redirect } = use_auth();\r\n\r\n useEffect(() => {\r\n if (safe_loading) return;\r\n if (user) return;\r\n if (!can_redirect) return;\r\n\r\n func_redirect({\r\n redirect_to: on_unauthorized_redirect,\r\n app_url,\r\n });\r\n }, [safe_loading, user, can_redirect, on_unauthorized_redirect, app_url]);\r\n\r\n if (safe_loading) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n if (!user) {\r\n return can_redirect ? null : <>{fallback}</>;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","import { ReactNode as react_node, useEffect as use_effect } from \"react\";\r\nimport { use_auth } from \"../hook/use_auth\";\r\n\r\nexport const auth_flow = ({\r\n code,\r\n fallback,\r\n redirect,\r\n}: {\r\n fallback?: react_node;\r\n code: string;\r\n redirect: string;\r\n}) => {\r\n const { auth_flow, auth_flow_loading } = use_auth();\r\n\r\n use_effect(() => {\r\n const flow = async () => {\r\n if (!code) return;\r\n const success = await auth_flow({\r\n code,\r\n });\r\n if (success) {\r\n window.location.replace(redirect);\r\n }\r\n };\r\n flow();\r\n }, [code]);\r\n\r\n if (fallback) {\r\n return fallback;\r\n }\r\n\r\n if (auth_flow_loading) {\r\n return (\r\n <div>\r\n <span>Logging you in . . . </span>\r\n </div>\r\n );\r\n }\r\n\r\n return <div>Login done or stopped</div>;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAIO;;;ACJA,IAAM,WAAW;AAEjB,IAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;;;ACPO,SAAS,gBACd,MACA,OACA,MACM;AACN,QAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,EAAE,YAAY;AAChE,WAAS,SAAS,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,aAAa,OAAO;AAC5E;AAEO,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,UAAU,KAAK,QAAQ,0BAA0B,MAAM;AAC7D,QAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI,OAAO,aAAa,UAAU,UAAU;AAAA,EAC9C;AACA,SAAO,QAAQ,mBAAmB,MAAM,CAAC,CAAC,IAAI;AAChD;AAEO,SAAS,mBAAmB,MAAoB;AACrD,WAAS,SAAS,GAAG,IAAI;AAC3B;;;ACnBO,IAAM,QAAQ;AAAA,EACnB,aAAa,CAAC,QAAgB,oCAAoC,GAAG;AACvE;;;ACAO,SAAS,wBAAwB,EAAE,QAAQ,GAAwB;AACxE,SAAO,SAAS,QAAQ,MAAM,YAAY,OAAO,CAAC;AACpD;;;ACDO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,aAAa;AAChB,4BAAwB;AAAA,MACtB;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK;AACH,8BAAwB;AAAA,QACtB;AAAA,MACF,CAAC;AACD;AAAA,IACF,KAAK;AACH,kBAAY,SAAS,KAAK;AAC1B;AAAA,IACF,KAAK;AACH;AAAA,IACF;AACE;AAAA,EACJ;AACF;;;AChCA,eAAsB,eAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAGsB;AACpB,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,OAAO;AACd,QAAI,SAAS;AACX,cAAQ,KAAK;AACb,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;;;ACEO,IAAM,cAAN,MAAmD;AAAA,EA6BxD,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AApCH,SAAiB,WAAW;AAC5B,SAAiB,eAAe;AAGhC,SAAQ,WAA0B;AAAA,MAChC,MAAM;AAAA,IACR;AAEA,SAAiB,kBAAkB,CAAC,UAA0B;AAC5D,oBAAc,EAAE,aAAa,KAAK,UAAU,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,IAC5E;AAEA,SAAiB,eAAe,CAAC,UAA0B;AACzD,cAAQ,KAAK,eAAe,KAAK;AACjC,UAAI,KAAK,UAAU;AACjB,aAAK,SAAS,KAAK;AAAA,MACrB;AACA,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAEA,SAAiB,wBAAwB,OAAO,QAAkB;AAChE,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI;AAC9C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,sBAAQ,IAAI,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AAkBA,SAAgB,mBAAmB,MAAqB;AACtD,aAAO,gBAAgB,aAAa;AAAA,IACtC;AAEA,SAAgB,oBAAoB,MAAqB;AACvD,aAAO,gBAAgB,cAAc;AAAA,IACvC;AAEA,SAAiB,gBAAgB,MAAM;AACrC,yBAAmB,aAAa;AAChC,yBAAmB,cAAc;AAAA,IACnC;AAlBE,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,QAAI,0BAA0B;AAC5B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAeA,MAAM,GAAG,EAAE,YAAY,GAA6B;AAClD,WAAO,MAAM,eAAyD;AAAA,MACpE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,UAC5D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,UAC9E;AAAA,QACF,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,EAAE,YAAY,GAA6B;AACvD,WAAO,MAAM,eAAyD;AAAA,MACpE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,UAC5D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,UAC9E;AAAA,QACF,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,KAAK;AAAA,QACrB;AACA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,EAAE,KAAK,GAAqB;AAnH7C;AAoHI,UAAM,OAAO,MAAM,eAAsD;AAAA,MACvE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,UAAU;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,QAC/B,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,sBAAgB,gBAAgB,cAAc,EAAE;AAChD,sBAAgB,eAAe,aAAa,MAAM,KAAK,GAAG;AAAA,IAC5D;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AAnJlB;AAoJI,UAAM,OAAO,MAAM,eAAqD;AAAA,MACtE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,SAAS;AAAA,UACjE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,sBAAgB,gBAAgB,cAAc,EAAE;AAChD,sBAAgB,eAAe,aAAa,MAAM,KAAK,GAAG;AAAA,IAC5D;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,WAAO,MAAM,eAAuC;AAAA,MAClD,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,QAAQ;AAAA,UAChE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,KAAK,sBAAsB,GAAG;AAAA,MACvC;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,CAAC,EAAE,QAAQ,MAAM,KAAK,cAAc,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,UAAU,EAAE,KAAK,GAAqB;AArM9C;AAsMI,UAAM,gBAAgB,MAAM,KAAK,SAAS;AAAA,MACxC;AAAA,IACF,CAAC;AACD,QAAI,+CAAe,SAAS;AAC1B,YAAM,UAAU,MAAM,KAAK,GAAG;AAAA,QAC5B,cAAa,oDAAe,SAAf,mBAAqB;AAAA,MACpC,CAAC;AACD,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AClNA,mBAAgD;AAGzC,IAAM,mBAAe,aAAAC,eAA8C,IAAI;;;ARqG1E;AA7FG,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,QAAM,eAAW,cAAAC,SAAS,MAAM;AAC9B,WAAO,IAAI,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,UAAU,wBAAwB,CAAC;AAEhD,QAAM,CAAC,MAAM,QAAQ,QAAI,cAAAC,UAA4B,IAAI;AAEzD,QAAM,CAAC,cAAc,gBAAgB,QAAI,cAAAA,UAAU,IAAI;AAEvD,QAAM,CAAC,mBAAmB,qBAAqB,QAAI,cAAAA,UAAU,KAAK;AAElE,QAAM,UAAU,YAAY;AA/B9B;AAgCI,UAAM,WAAW,MAAM,SAAS,QAAQ;AACxC,YAAO,0CAAU,YAAV,YAAqB;AAAA,EAC9B;AAEA,QAAM,SAAS,YAAY;AACzB,UAAM,SAAS,OAAO;AACtB,aAAS,IAAI;AACb,WAAO;AAAA,EACT;AAEA,QAAMC,aAAY,OAAO,EAAE,KAAK,MAAwB;AACtD,0BAAsB,IAAI;AAC1B,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,UAAU;AAAA,QACpC;AAAA,MACF,CAAC;AACD,WAAI,6BAAM,aAAW,6BAAM,OAAM;AAC/B,iBAAS,6BAAM,IAAI;AACnB,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAChC,qBAAiB,IAAI;AACrB,QAAI;AACF,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;AACtC,WAAI,6BAAM,aAAW,6BAAM,OAAM;AAC/B,iBAAS,6BAAM,IAAI;AACnB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,oBAAAC,WAAW,MAAM;AACf,SAAK,cAAc;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAAD;AAAA,IACA;AAAA,IACA,IAAI,eAAe;AACjB,aAAO,SAAS,iBAAiB;AAAA,IACnC;AAAA,IACA,IAAI,gBAAgB;AAClB,aAAO,SAAS,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAe,UAAS;AAEnD;;;AS1GA,IAAAE,gBAA0C;AAGnC,IAAM,WAAW,MAAM;AAC5B,QAAM,cAAU,cAAAC,YAAY,YAAY;AAExC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,SAAO;AACT;;;ACRA,IAAAC,gBAA0B;AAqBf,IAAAC,sBAAA;AAnBJ,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,WAAW;AAAA,EACX;AACF,MAA4B;AAC1B,QAAM,EAAE,MAAM,cAAc,SAAS,yBAAyB,IAAI,SAAS;AAE3E,+BAAU,MAAM;AACd,QAAI,aAAc;AAClB,QAAI,KAAM;AACV,QAAI,CAAC,aAAc;AAEnB,kBAAc;AAAA,MACZ,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,MAAM,cAAc,0BAA0B,OAAO,CAAC;AAExE,MAAI,cAAc;AAChB,WAAO,6EAAG,oBAAS;AAAA,EACrB;AAEA,MAAI,CAAC,MAAM;AACT,WAAO,eAAe,OAAO,6EAAG,oBAAS;AAAA,EAC3C;AAEA,SAAO,6EAAG,UAAS;AACrB;;;AChCA,IAAAC,gBAAiE;AAkCzD,IAAAC,sBAAA;AA/BD,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,EAAE,WAAAC,YAAW,kBAAkB,IAAI,SAAS;AAElD,oBAAAC,WAAW,MAAM;AACf,UAAM,OAAO,YAAY;AACvB,UAAI,CAAC,KAAM;AACX,YAAM,UAAU,MAAMD,WAAU;AAAA,QAC9B;AAAA,MACF,CAAC;AACD,UAAI,SAAS;AACX,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,SAAK;AAAA,EACP,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB;AACrB,WACE,6CAAC,SACC,uDAAC,UAAK,mCAAqB,GAC7B;AAAA,EAEJ;AAEA,SAAO,6CAAC,SAAI,mCAAqB;AACnC;","names":["import_react","create_context","use_memo","use_state","auth_flow","use_effect","import_react","use_context","import_react","import_jsx_runtime","import_react","import_jsx_runtime","auth_flow","use_effect"]}
package/dist/index.js CHANGED
@@ -277,7 +277,7 @@ var auth_provider = ({
277
277
  });
278
278
  }, [app_url, on_error, on_unauthorized_redirect]);
279
279
  const [user, set_user] = use_state(null);
280
- const [safe_loading, set_safe_loading] = use_state(false);
280
+ const [safe_loading, set_safe_loading] = use_state(true);
281
281
  const [auth_flow_loading, set_auth_flow_loading] = use_state(false);
282
282
  const refresh = async () => {
283
283
  var _a;
@@ -360,6 +360,7 @@ var use_auth = () => {
360
360
  };
361
361
 
362
362
  // src/guard/auth_guard.tsx
363
+ import { useEffect } from "react";
363
364
  import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
364
365
  var auth_guard = ({
365
366
  children,
@@ -367,18 +368,20 @@ var auth_guard = ({
367
368
  can_redirect
368
369
  }) => {
369
370
  const { user, safe_loading, app_url, on_unauthorized_redirect } = use_auth();
370
- if (safe_loading && !user) {
371
+ useEffect(() => {
372
+ if (safe_loading) return;
373
+ if (user) return;
374
+ if (!can_redirect) return;
375
+ func_redirect({
376
+ redirect_to: on_unauthorized_redirect,
377
+ app_url
378
+ });
379
+ }, [safe_loading, user, can_redirect, on_unauthorized_redirect, app_url]);
380
+ if (safe_loading) {
371
381
  return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
372
382
  }
373
- if (!user && !safe_loading) {
374
- if (can_redirect) {
375
- func_redirect({
376
- redirect_to: on_unauthorized_redirect,
377
- app_url
378
- });
379
- return null;
380
- }
381
- return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
383
+ if (!user) {
384
+ return can_redirect ? null : /* @__PURE__ */ jsx2(Fragment, { children: fallback });
382
385
  }
383
386
  return /* @__PURE__ */ jsx2(Fragment, { children });
384
387
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/func/func_cookies.ts","../src/const/route.ts","../src/func/func_redirect_at_fluoce.ts","../src/func/func_redirect.ts","../src/func/func_try_catch.ts","../src/api/api_service.ts","../src/context/auth_context.tsx","../src/hook/use_auth.ts","../src/guard/auth_guard.tsx","../src/components/auth_flow.tsx"],"sourcesContent":["import {\r\n useMemo as use_memo,\r\n useState as use_state,\r\n useEffect as use_effect,\r\n} from \"react\";\r\nimport { auth_provider_interface } from \"../types/auth_provider_interface\";\r\nimport { Api_service } from \"../api/api_service\";\r\nimport { user_type } from \"../types/user_type\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const auth_provider = ({\r\n children,\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n}: auth_provider_interface) => {\r\n const auth_api = use_memo(() => {\r\n return new Api_service({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n });\r\n }, [app_url, on_error, on_unauthorized_redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [safe_loading, set_safe_loading] = use_state(false);\r\n\r\n const [auth_flow_loading, set_auth_flow_loading] = use_state(false);\r\n\r\n const refresh = async () => {\r\n const response = await auth_api.refresh();\r\n return response?.success ?? false;\r\n };\r\n\r\n const logout = async () => {\r\n await auth_api.logout();\r\n set_user(null);\r\n return true;\r\n };\r\n\r\n const auth_flow = async ({ code }: { code: string }) => {\r\n set_auth_flow_loading(true);\r\n try {\r\n const data = await auth_api.auth_flow({\r\n code,\r\n });\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n set_auth_flow_loading(false);\r\n }\r\n };\r\n\r\n const get_safe_user = async () => {\r\n set_safe_loading(true);\r\n try {\r\n if (user) {\r\n return user;\r\n }\r\n const data = await auth_api.safe_me({});\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return data.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n } finally {\r\n set_safe_loading(false);\r\n }\r\n };\r\n\r\n use_effect(() => {\r\n void get_safe_user();\r\n }, []);\r\n\r\n const value: auth_context_interface = {\r\n user,\r\n safe_loading,\r\n auth_flow_loading,\r\n app_url,\r\n on_unauthorized_redirect,\r\n refresh,\r\n logout,\r\n auth_flow,\r\n get_safe_user,\r\n get access_token() {\r\n return auth_api.get_access_token();\r\n },\r\n get refresh_token() {\r\n return auth_api.get_refresh_token();\r\n },\r\n };\r\n\r\n return (\r\n <auth_context.Provider value={value}>{children}</auth_context.Provider>\r\n );\r\n};\r\n","export const base_url = \"https://auth-service.fluoce.com\";\r\n\r\nexport const api_endpoint = {\r\n me: \"/me\",\r\n exchange: \"/exchange\",\r\n refresh: \"/refresh\",\r\n logout: \"/logout\",\r\n};\r\n","export function func_set_cookie(\n name: string,\n value: string,\n days: number,\n): void {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`;\n}\n\nexport function func_get_cookie(name: string): string | null {\n const escaped = name.replace(/([.$?*|{}()[\\]\\\\/+^])/g, \"\\\\$1\");\n const match = document.cookie.match(\n new RegExp(\"(?:^|; )\" + escaped + \"=([^;]*)\"),\n );\n return match ? decodeURIComponent(match[1]) : null;\n}\n\nexport function func_delete_cookie(name: string): void {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; SameSite=Lax`;\n}\n","export const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\r\n};\r\n","import { route } from \"../const/route\";\r\n\r\nexport function func_redirect_at_fluoce({ app_url }: { app_url: string }) {\r\n window.location.replace(route.fluoce_auth(app_url));\r\n}\r\n","import { redirect_type } from \"../types/redirect_type\";\r\nimport { func_redirect_at_fluoce } from \"./func_redirect_at_fluoce\";\r\n\r\nexport function func_redirect({\r\n redirect_to,\r\n app_url,\r\n error,\r\n}: {\r\n redirect_to: redirect_type | undefined | null;\r\n app_url: string;\r\n error?: unknown;\r\n}) {\r\n if (!redirect_to) {\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n return;\r\n }\r\n switch (redirect_to.type) {\r\n case \"fluoce\":\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n break;\r\n case \"custom\":\r\n redirect_to.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n default:\r\n break;\r\n }\r\n}\r\n","export async function func_try_catch<T>({\r\n fn,\r\n onError,\r\n}: {\r\n fn: () => Promise<T>;\r\n onError?: (error: unknown) => void;\r\n}): Promise<T | null> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n if (onError) {\r\n onError(error);\r\n return null;\r\n }\r\n throw error;\r\n }\r\n}\r\n","import { api_endpoint, base_url } from \"../const/api_endpoint\";\r\nimport { route } from \"../const/route\";\r\nimport {\r\n func_delete_cookie,\r\n func_get_cookie,\r\n func_set_cookie,\r\n} from \"../func/func_cookies\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\nimport { func_try_catch } from \"../func/func_try_catch\";\r\nimport { Api_service_interface } from \"../types/api_service_interface\";\r\nimport { redirect_type } from \"../types/redirect_type\";\r\nimport {\r\n exchange_response_type,\r\n refresh_response_type,\r\n response_type,\r\n user_response_type,\r\n} from \"../types/response_types\";\r\n\r\nexport class Api_service implements Api_service_interface {\r\n private readonly base_url = base_url;\r\n private readonly api_endpoint = api_endpoint;\r\n private app_url: string;\r\n private on_error?: (error: unknown) => void;\r\n private redirect: redirect_type = {\r\n type: \"fluoce\",\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n func_redirect({ redirect_to: this.redirect, app_url: this.app_url, error });\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n console.warn(\"FLUOCE_WARN\", error);\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n private readonly handle_response_parse = async (res: Response) => {\r\n const json = await res.json().catch(() => null);\r\n if (!res.ok) {\r\n throw json ?? new Error(`HTTP:${res.status}:${res.statusText}`);\r\n }\r\n return json;\r\n };\r\n\r\n constructor({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n on_unauthorized_redirect?: redirect_type;\r\n }) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (on_unauthorized_redirect) {\r\n this.redirect = on_unauthorized_redirect;\r\n }\r\n }\r\n\r\n public readonly get_access_token = (): string | null => {\r\n return func_get_cookie(\"accessToken\");\r\n };\r\n\r\n public readonly get_refresh_token = (): string | null => {\r\n return func_get_cookie(\"refreshToken\");\r\n };\r\n\r\n private readonly delete_cookie = () => {\r\n func_delete_cookie(\"accessToken\");\r\n func_delete_cookie(\"refreshToken\");\r\n };\r\n\r\n async me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n }\r\n\r\n async safe_me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return await res.json();\r\n },\r\n onError: (error) => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async refresh() {\r\n const data = await func_try_catch<response_type<refresh_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.refresh, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async logout() {\r\n return await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.logout, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n can_redirect,\r\n}: auth_guard_interface) => {\r\n const { user, safe_loading, app_url, on_unauthorized_redirect } = use_auth();\r\n\r\n if (safe_loading && !user) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n if (!user && !safe_loading) {\r\n if (can_redirect) {\r\n func_redirect({\r\n redirect_to: on_unauthorized_redirect,\r\n app_url,\r\n });\r\n return null;\r\n }\r\n return <>{fallback}</>;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","import { ReactNode as react_node, useEffect as use_effect } from \"react\";\r\nimport { use_auth } from \"../hook/use_auth\";\r\n\r\nexport const auth_flow = ({\r\n code,\r\n fallback,\r\n redirect,\r\n}: {\r\n fallback?: react_node;\r\n code: string;\r\n redirect: string;\r\n}) => {\r\n const { auth_flow, auth_flow_loading } = use_auth();\r\n\r\n use_effect(() => {\r\n const flow = async () => {\r\n if (!code) return;\r\n const success = await auth_flow({\r\n code,\r\n });\r\n if (success) {\r\n window.location.replace(redirect);\r\n }\r\n };\r\n flow();\r\n }, [code]);\r\n\r\n if (fallback) {\r\n return fallback;\r\n }\r\n\r\n if (auth_flow_loading) {\r\n return (\r\n <div>\r\n <span>Logging you in . . . </span>\r\n </div>\r\n );\r\n }\r\n\r\n return <div>Login done or stopped</div>;\r\n};\r\n"],"mappings":"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","names":["auth_flow","jsx","use_effect","jsx","auth_flow","use_effect"]}
1
+ {"version":3,"sources":["../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/func/func_cookies.ts","../src/const/route.ts","../src/func/func_redirect_at_fluoce.ts","../src/func/func_redirect.ts","../src/func/func_try_catch.ts","../src/api/api_service.ts","../src/context/auth_context.tsx","../src/hook/use_auth.ts","../src/guard/auth_guard.tsx","../src/components/auth_flow.tsx"],"sourcesContent":["import {\r\n useMemo as use_memo,\r\n useState as use_state,\r\n useEffect as use_effect,\r\n} from \"react\";\r\nimport { auth_provider_interface } from \"../types/auth_provider_interface\";\r\nimport { Api_service } from \"../api/api_service\";\r\nimport { user_type } from \"../types/user_type\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const auth_provider = ({\r\n children,\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n}: auth_provider_interface) => {\r\n const auth_api = use_memo(() => {\r\n return new Api_service({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n });\r\n }, [app_url, on_error, on_unauthorized_redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [safe_loading, set_safe_loading] = use_state(true);\r\n\r\n const [auth_flow_loading, set_auth_flow_loading] = use_state(false);\r\n\r\n const refresh = async () => {\r\n const response = await auth_api.refresh();\r\n return response?.success ?? false;\r\n };\r\n\r\n const logout = async () => {\r\n await auth_api.logout();\r\n set_user(null);\r\n return true;\r\n };\r\n\r\n const auth_flow = async ({ code }: { code: string }) => {\r\n set_auth_flow_loading(true);\r\n try {\r\n const data = await auth_api.auth_flow({\r\n code,\r\n });\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n set_auth_flow_loading(false);\r\n }\r\n };\r\n\r\n const get_safe_user = async () => {\r\n set_safe_loading(true);\r\n try {\r\n if (user) {\r\n return user;\r\n }\r\n const data = await auth_api.safe_me({});\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return data.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n } finally {\r\n set_safe_loading(false);\r\n }\r\n };\r\n\r\n use_effect(() => {\r\n void get_safe_user();\r\n }, []);\r\n\r\n const value: auth_context_interface = {\r\n user,\r\n safe_loading,\r\n auth_flow_loading,\r\n app_url,\r\n on_unauthorized_redirect,\r\n refresh,\r\n logout,\r\n auth_flow,\r\n get_safe_user,\r\n get access_token() {\r\n return auth_api.get_access_token();\r\n },\r\n get refresh_token() {\r\n return auth_api.get_refresh_token();\r\n },\r\n };\r\n\r\n return (\r\n <auth_context.Provider value={value}>{children}</auth_context.Provider>\r\n );\r\n};\r\n","export const base_url = \"https://auth-service.fluoce.com\";\r\n\r\nexport const api_endpoint = {\r\n me: \"/me\",\r\n exchange: \"/exchange\",\r\n refresh: \"/refresh\",\r\n logout: \"/logout\",\r\n};\r\n","export function func_set_cookie(\n name: string,\n value: string,\n days: number,\n): void {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`;\n}\n\nexport function func_get_cookie(name: string): string | null {\n const escaped = name.replace(/([.$?*|{}()[\\]\\\\/+^])/g, \"\\\\$1\");\n const match = document.cookie.match(\n new RegExp(\"(?:^|; )\" + escaped + \"=([^;]*)\"),\n );\n return match ? decodeURIComponent(match[1]) : null;\n}\n\nexport function func_delete_cookie(name: string): void {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; SameSite=Lax`;\n}\n","export const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\r\n};\r\n","import { route } from \"../const/route\";\r\n\r\nexport function func_redirect_at_fluoce({ app_url }: { app_url: string }) {\r\n window.location.replace(route.fluoce_auth(app_url));\r\n}\r\n","import { redirect_type } from \"../types/redirect_type\";\r\nimport { func_redirect_at_fluoce } from \"./func_redirect_at_fluoce\";\r\n\r\nexport function func_redirect({\r\n redirect_to,\r\n app_url,\r\n error,\r\n}: {\r\n redirect_to: redirect_type | undefined | null;\r\n app_url: string;\r\n error?: unknown;\r\n}) {\r\n if (!redirect_to) {\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n return;\r\n }\r\n switch (redirect_to.type) {\r\n case \"fluoce\":\r\n func_redirect_at_fluoce({\r\n app_url,\r\n });\r\n break;\r\n case \"custom\":\r\n redirect_to.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n default:\r\n break;\r\n }\r\n}\r\n","export async function func_try_catch<T>({\r\n fn,\r\n onError,\r\n}: {\r\n fn: () => Promise<T>;\r\n onError?: (error: unknown) => void;\r\n}): Promise<T | null> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n if (onError) {\r\n onError(error);\r\n return null;\r\n }\r\n throw error;\r\n }\r\n}\r\n","import { api_endpoint, base_url } from \"../const/api_endpoint\";\r\nimport { route } from \"../const/route\";\r\nimport {\r\n func_delete_cookie,\r\n func_get_cookie,\r\n func_set_cookie,\r\n} from \"../func/func_cookies\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\nimport { func_try_catch } from \"../func/func_try_catch\";\r\nimport { Api_service_interface } from \"../types/api_service_interface\";\r\nimport { redirect_type } from \"../types/redirect_type\";\r\nimport {\r\n exchange_response_type,\r\n refresh_response_type,\r\n response_type,\r\n user_response_type,\r\n} from \"../types/response_types\";\r\n\r\nexport class Api_service implements Api_service_interface {\r\n private readonly base_url = base_url;\r\n private readonly api_endpoint = api_endpoint;\r\n private app_url: string;\r\n private on_error?: (error: unknown) => void;\r\n private redirect: redirect_type = {\r\n type: \"fluoce\",\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n func_redirect({ redirect_to: this.redirect, app_url: this.app_url, error });\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n console.warn(\"FLUOCE_WARN\", error);\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n private readonly handle_response_parse = async (res: Response) => {\r\n const json = await res.json().catch(() => null);\r\n if (!res.ok) {\r\n throw json ?? new Error(`HTTP:${res.status}:${res.statusText}`);\r\n }\r\n return json;\r\n };\r\n\r\n constructor({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n on_unauthorized_redirect?: redirect_type;\r\n }) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (on_unauthorized_redirect) {\r\n this.redirect = on_unauthorized_redirect;\r\n }\r\n }\r\n\r\n public readonly get_access_token = (): string | null => {\r\n return func_get_cookie(\"accessToken\");\r\n };\r\n\r\n public readonly get_refresh_token = (): string | null => {\r\n return func_get_cookie(\"refreshToken\");\r\n };\r\n\r\n private readonly delete_cookie = () => {\r\n func_delete_cookie(\"accessToken\");\r\n func_delete_cookie(\"refreshToken\");\r\n };\r\n\r\n async me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n }\r\n\r\n async safe_me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return await res.json();\r\n },\r\n onError: (error) => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async refresh() {\r\n const data = await func_try_catch<response_type<refresh_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.refresh, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async logout() {\r\n return await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.logout, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\nimport { func_redirect } from \"../func/func_redirect\";\r\nimport { useEffect } from \"react\";\r\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n can_redirect,\r\n}: auth_guard_interface) => {\r\n const { user, safe_loading, app_url, on_unauthorized_redirect } = use_auth();\r\n\r\n useEffect(() => {\r\n if (safe_loading) return;\r\n if (user) return;\r\n if (!can_redirect) return;\r\n\r\n func_redirect({\r\n redirect_to: on_unauthorized_redirect,\r\n app_url,\r\n });\r\n }, [safe_loading, user, can_redirect, on_unauthorized_redirect, app_url]);\r\n\r\n if (safe_loading) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n if (!user) {\r\n return can_redirect ? null : <>{fallback}</>;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","import { ReactNode as react_node, useEffect as use_effect } from \"react\";\r\nimport { use_auth } from \"../hook/use_auth\";\r\n\r\nexport const auth_flow = ({\r\n code,\r\n fallback,\r\n redirect,\r\n}: {\r\n fallback?: react_node;\r\n code: string;\r\n redirect: string;\r\n}) => {\r\n const { auth_flow, auth_flow_loading } = use_auth();\r\n\r\n use_effect(() => {\r\n const flow = async () => {\r\n if (!code) return;\r\n const success = await auth_flow({\r\n code,\r\n });\r\n if (success) {\r\n window.location.replace(redirect);\r\n }\r\n };\r\n flow();\r\n }, [code]);\r\n\r\n if (fallback) {\r\n return fallback;\r\n }\r\n\r\n if (auth_flow_loading) {\r\n return (\r\n <div>\r\n <span>Logging you in . . . </span>\r\n </div>\r\n );\r\n }\r\n\r\n return <div>Login done or stopped</div>;\r\n};\r\n"],"mappings":"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","names":["auth_flow","jsx","use_effect","jsx","auth_flow","use_effect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluoce/auth-react",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "React SDK for Fluoce Auth",
5
5
  "license": "MIT",
6
6
  "type": "module",