@fluoce/auth-react 0.1.2 → 0.2.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
@@ -168,6 +168,9 @@ var Api_service = class {
168
168
  }
169
169
  });
170
170
  return await res.json();
171
+ },
172
+ onError: (error) => {
173
+ throw error;
171
174
  }
172
175
  }
173
176
  );
@@ -292,7 +295,8 @@ var auth_provider = ({
292
295
  });
293
296
  }, [app_url, on_error, redirect]);
294
297
  const [user, set_user] = (0, import_react2.useState)(null);
295
- const [is_loading, set_is_loading] = (0, import_react2.useState)(false);
298
+ const [safe_loading, set_safe_loading] = (0, import_react2.useState)(false);
299
+ const [auth_flow_loading, set_auth_flow_loading] = (0, import_react2.useState)(false);
296
300
  const refresh = async () => {
297
301
  var _a;
298
302
  const response = await auth_api.refresh();
@@ -303,14 +307,32 @@ var auth_provider = ({
303
307
  set_user(null);
304
308
  return true;
305
309
  };
310
+ const auth_flow = async ({ code }) => {
311
+ set_auth_flow_loading(true);
312
+ try {
313
+ const data = await auth_api.auth_flow({
314
+ code
315
+ });
316
+ if ((data == null ? void 0 : data.success) && (data == null ? void 0 : data.data)) {
317
+ set_user(data == null ? void 0 : data.data);
318
+ return true;
319
+ } else {
320
+ return false;
321
+ }
322
+ } catch (error) {
323
+ return false;
324
+ } finally {
325
+ set_auth_flow_loading(false);
326
+ }
327
+ };
306
328
  const get_safe_user = async () => {
307
- set_is_loading(true);
329
+ set_safe_loading(true);
308
330
  try {
309
331
  if (user) {
310
332
  return user;
311
333
  }
312
334
  const data = await auth_api.safe_me({});
313
- if (data == null ? void 0 : data.data) {
335
+ if ((data == null ? void 0 : data.success) && (data == null ? void 0 : data.data)) {
314
336
  set_user(data == null ? void 0 : data.data);
315
337
  return data.data;
316
338
  } else {
@@ -319,7 +341,7 @@ var auth_provider = ({
319
341
  } catch (error) {
320
342
  return null;
321
343
  } finally {
322
- set_is_loading(false);
344
+ set_safe_loading(false);
323
345
  }
324
346
  };
325
347
  (0, import_react2.useEffect)(() => {
@@ -327,9 +349,11 @@ var auth_provider = ({
327
349
  }, []);
328
350
  const value = {
329
351
  user,
330
- is_loading,
352
+ safe_loading,
353
+ auth_flow_loading,
331
354
  refresh,
332
355
  logout,
356
+ auth_flow,
333
357
  get_safe_user,
334
358
  get access_token() {
335
359
  return auth_api.get_access_token();
@@ -357,11 +381,11 @@ var auth_guard = ({
357
381
  children,
358
382
  fallback = null
359
383
  }) => {
360
- const { user, is_loading } = use_auth();
361
- if (is_loading && !user) {
384
+ const { user, safe_loading } = use_auth();
385
+ if (safe_loading && !user) {
362
386
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: fallback });
363
387
  }
364
- if (!user && !is_loading) {
388
+ if (!user && !safe_loading) {
365
389
  return null;
366
390
  }
367
391
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/const/route.ts","../src/func/func_cookies.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"],"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 { 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 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 redirect,\r\n });\r\n }, [app_url, on_error, redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [is_loading, set_is_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 get_safe_user = async () => {\r\n set_is_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?.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_is_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 is_loading,\r\n refresh,\r\n logout,\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 const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\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 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 if (error instanceof Error) {\r\n throw error;\r\n } else {\r\n throw new Error(String(error));\r\n }\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_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 redirect_at_fluoce_auth = (error: unknown) => {\r\n console.warn(error);\r\n window.location.replace(route.fluoce_auth(this.app_url));\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n switch (this.redirect?.type) {\r\n case \"fluoce\":\r\n this.redirect_at_fluoce_auth(error);\r\n break;\r\n case \"custom\":\r\n this.redirect.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n }\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n return;\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n constructor(\r\n {\r\n app_url,\r\n on_error,\r\n redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n redirect?: redirect_type;\r\n },\r\n private readonly http: typeof fetch = fetch,\r\n ) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (redirect) {\r\n this.redirect = 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 const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 this.handle_error(error);\r\n },\r\n },\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 safe_me({ accessToken }: { accessToken?: string }) {\r\n const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 },\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 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 this.http(\r\n this.base_url + this.api_endpoint.exchange,\r\n {\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 );\r\n return await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 document.cookie = `refreshToken=${encodeURIComponent(refreshToken)}; path=/;`;\r\n document.cookie = `accessToken=${encodeURIComponent(accessToken)}; path=/;`;\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 this.delete_cookie();\r\n await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_error();\r\n },\r\n });\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\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n}: auth_guard_interface) => {\r\n const { user, is_loading } = use_auth();\r\n\r\n if (is_loading && !user) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n if (!user && !is_loading) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;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,IAAM,QAAQ;AAAA,EACnB,aAAa,CAAC,QAAgB,oCAAoC,GAAG;AACvE;;;ACFO,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;;;ACnBA,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,QAAI,iBAAiB,OAAO;AAC1B,YAAM;AAAA,IACR,OAAO;AACL,YAAM,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;;;ACHO,IAAM,cAAN,MAAmD;AAAA,EAmCxD,YACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKiB,OAAqB,OACtC;AADiB;AA5CnB,SAAiB,WAAW;AAC5B,SAAiB,eAAe;AAGhC,SAAQ,WAA2B;AAAA,MACjC,MAAM;AAAA,IACR;AAEA,SAAiB,0BAA0B,CAAC,UAAmB;AAC7D,cAAQ,KAAK,KAAK;AAClB,aAAO,SAAS,QAAQ,MAAM,YAAY,KAAK,OAAO,CAAC;AAAA,IACzD;AAEA,SAAiB,kBAAkB,CAAC,UAA0B;AA/BhE;AAgCI,eAAQ,UAAK,aAAL,mBAAe,MAAM;AAAA,QAC3B,KAAK;AACH,eAAK,wBAAwB,KAAK;AAClC;AAAA,QACF,KAAK;AACH,eAAK,SAAS,SAAS,KAAK;AAC5B;AAAA,QACF,KAAK;AACH;AAAA,MACJ;AAAA,IACF;AAEA,SAAiB,eAAe,CAAC,UAA0B;AACzD,UAAI,KAAK,UAAU;AACjB,aAAK,SAAS,KAAK;AACnB;AAAA,MACF;AACA,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAqBA,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,UAAU;AACZ,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAeA,MAAM,GAAG,EAAE,YAAY,GAA6B;AAClD,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,QACE,IAAI,YAAY;AACd,gBAAM,MAAM,MAAM,KAAK,KAAK,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,YAChE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,YAC9E;AAAA,UACF,CAAC;AACD,iBAAO,MAAM,IAAI,KAAK;AAAA,QACxB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,eAAK,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,EAAE,YAAY,GAA6B;AACvD,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,QACE,IAAI,YAAY;AACd,gBAAM,MAAM,MAAM,KAAK,KAAK,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,YAChE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,YAC9E;AAAA,UACF,CAAC;AACD,iBAAO,MAAM,IAAI,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,EAAE,KAAK,GAAqB;AArI7C;AAsII,UAAM,OAAO,MAAM,eAAsD;AAAA,MACvE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,KAAK;AAAA,UACrB,KAAK,WAAW,KAAK,aAAa;AAAA,UAClC;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,YAClB;AAAA,YACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,UAC/B;AAAA,QACF;AACA,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,aAAK,aAAa;AAAA,MACpB;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;AAxKlB;AAyKI,UAAM,OAAO,MAAM,eAAqD;AAAA,MACtE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,KAAK,KAAK,KAAK,WAAW,KAAK,aAAa,SAAS;AAAA,UACrE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,aAAK,aAAa;AAAA,MACpB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,eAAS,SAAS,gBAAgB,mBAAmB,YAAY,CAAC;AAClE,eAAS,SAAS,eAAe,mBAAmB,WAAW,CAAC;AAAA,IAClE;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,SAAK,cAAc;AACnB,UAAM,eAAuC;AAAA,MAC3C,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,KAAK,KAAK,KAAK,WAAW,KAAK,aAAa,QAAQ;AAAA,UACpE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,aAAK,aAAa;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,EAAE,KAAK,GAAqB;AA3N9C;AA4NI,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;;;ACxOA,mBAAgD;AAGzC,IAAM,mBAAe,aAAAC,eAA8C,IAAI;;;AN4E1E;AApEG,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,QAAQ,CAAC;AAEhC,QAAM,CAAC,MAAM,QAAQ,QAAI,cAAAC,UAA4B,IAAI;AAEzD,QAAM,CAAC,YAAY,cAAc,QAAI,cAAAA,UAAU,KAAK;AAEpD,QAAM,UAAU,YAAY;AA7B9B;AA8BI,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,QAAM,gBAAgB,YAAY;AAChC,mBAAe,IAAI;AACnB,QAAI;AACF,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;AACtC,UAAI,6BAAM,MAAM;AACd,iBAAS,6BAAM,IAAI;AACnB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;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,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;;;AOjFA,IAAAC,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;;;ACDW,IAAAC,sBAAA;AAPJ,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,WAAW;AACb,MAA4B;AAC1B,QAAM,EAAE,MAAM,WAAW,IAAI,SAAS;AAEtC,MAAI,cAAc,CAAC,MAAM;AACvB,WAAO,6EAAG,oBAAS;AAAA,EACrB;AAEA,MAAI,CAAC,QAAQ,CAAC,YAAY;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,6EAAG,UAAS;AACrB;","names":["import_react","create_context","use_memo","use_state","use_effect","import_react","use_context","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/const/route.ts","../src/func/func_cookies.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"],"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 { 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 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 redirect,\r\n });\r\n }, [app_url, on_error, 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 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 const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\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 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 if (error instanceof Error) {\r\n throw error;\r\n } else {\r\n throw new Error(String(error));\r\n }\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_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 redirect_at_fluoce_auth = (error: unknown) => {\r\n console.warn(error);\r\n window.location.replace(route.fluoce_auth(this.app_url));\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n switch (this.redirect?.type) {\r\n case \"fluoce\":\r\n this.redirect_at_fluoce_auth(error);\r\n break;\r\n case \"custom\":\r\n this.redirect.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n }\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n return;\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n constructor(\r\n {\r\n app_url,\r\n on_error,\r\n redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n redirect?: redirect_type;\r\n },\r\n private readonly http: typeof fetch = fetch,\r\n ) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (redirect) {\r\n this.redirect = 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 const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 this.handle_error(error);\r\n },\r\n },\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 safe_me({ accessToken }: { accessToken?: string }) {\r\n const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 throw error;\r\n },\r\n },\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 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 this.http(\r\n this.base_url + this.api_endpoint.exchange,\r\n {\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 );\r\n return await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 document.cookie = `refreshToken=${encodeURIComponent(refreshToken)}; path=/;`;\r\n document.cookie = `accessToken=${encodeURIComponent(accessToken)}; path=/;`;\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 this.delete_cookie();\r\n await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_error();\r\n },\r\n });\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\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n}: auth_guard_interface) => {\r\n const { user, safe_loading } = 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 return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":"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","names":["import_react","create_context","use_memo","use_state","use_effect","import_react","use_context","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -13,7 +13,7 @@ type redirect_type = {
13
13
  interface auth_provider_interface {
14
14
  children: ReactNode;
15
15
  app_url: string;
16
- on_error?: () => void;
16
+ on_error?: (error: unknown) => void;
17
17
  redirect?: redirect_type;
18
18
  }
19
19
 
@@ -33,9 +33,13 @@ type user_type = user_response_type;
33
33
 
34
34
  interface auth_context_interface {
35
35
  user: user_response_type | null;
36
- is_loading: boolean;
36
+ safe_loading: boolean;
37
+ auth_flow_loading: boolean;
37
38
  logout(): Promise<boolean>;
38
39
  refresh(): Promise<boolean>;
40
+ auth_flow({ code }: {
41
+ code: string;
42
+ }): Promise<boolean>;
39
43
  get_safe_user(): Promise<user_type | null>;
40
44
  refresh_token: string | null;
41
45
  access_token: string | null;
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ type redirect_type = {
13
13
  interface auth_provider_interface {
14
14
  children: ReactNode;
15
15
  app_url: string;
16
- on_error?: () => void;
16
+ on_error?: (error: unknown) => void;
17
17
  redirect?: redirect_type;
18
18
  }
19
19
 
@@ -33,9 +33,13 @@ type user_type = user_response_type;
33
33
 
34
34
  interface auth_context_interface {
35
35
  user: user_response_type | null;
36
- is_loading: boolean;
36
+ safe_loading: boolean;
37
+ auth_flow_loading: boolean;
37
38
  logout(): Promise<boolean>;
38
39
  refresh(): Promise<boolean>;
40
+ auth_flow({ code }: {
41
+ code: string;
42
+ }): Promise<boolean>;
39
43
  get_safe_user(): Promise<user_type | null>;
40
44
  refresh_token: string | null;
41
45
  access_token: string | null;
package/dist/index.js CHANGED
@@ -144,6 +144,9 @@ var Api_service = class {
144
144
  }
145
145
  });
146
146
  return await res.json();
147
+ },
148
+ onError: (error) => {
149
+ throw error;
147
150
  }
148
151
  }
149
152
  );
@@ -268,7 +271,8 @@ var auth_provider = ({
268
271
  });
269
272
  }, [app_url, on_error, redirect]);
270
273
  const [user, set_user] = use_state(null);
271
- const [is_loading, set_is_loading] = use_state(false);
274
+ const [safe_loading, set_safe_loading] = use_state(false);
275
+ const [auth_flow_loading, set_auth_flow_loading] = use_state(false);
272
276
  const refresh = async () => {
273
277
  var _a;
274
278
  const response = await auth_api.refresh();
@@ -279,14 +283,32 @@ var auth_provider = ({
279
283
  set_user(null);
280
284
  return true;
281
285
  };
286
+ const auth_flow = async ({ code }) => {
287
+ set_auth_flow_loading(true);
288
+ try {
289
+ const data = await auth_api.auth_flow({
290
+ code
291
+ });
292
+ if ((data == null ? void 0 : data.success) && (data == null ? void 0 : data.data)) {
293
+ set_user(data == null ? void 0 : data.data);
294
+ return true;
295
+ } else {
296
+ return false;
297
+ }
298
+ } catch (error) {
299
+ return false;
300
+ } finally {
301
+ set_auth_flow_loading(false);
302
+ }
303
+ };
282
304
  const get_safe_user = async () => {
283
- set_is_loading(true);
305
+ set_safe_loading(true);
284
306
  try {
285
307
  if (user) {
286
308
  return user;
287
309
  }
288
310
  const data = await auth_api.safe_me({});
289
- if (data == null ? void 0 : data.data) {
311
+ if ((data == null ? void 0 : data.success) && (data == null ? void 0 : data.data)) {
290
312
  set_user(data == null ? void 0 : data.data);
291
313
  return data.data;
292
314
  } else {
@@ -295,7 +317,7 @@ var auth_provider = ({
295
317
  } catch (error) {
296
318
  return null;
297
319
  } finally {
298
- set_is_loading(false);
320
+ set_safe_loading(false);
299
321
  }
300
322
  };
301
323
  use_effect(() => {
@@ -303,9 +325,11 @@ var auth_provider = ({
303
325
  }, []);
304
326
  const value = {
305
327
  user,
306
- is_loading,
328
+ safe_loading,
329
+ auth_flow_loading,
307
330
  refresh,
308
331
  logout,
332
+ auth_flow,
309
333
  get_safe_user,
310
334
  get access_token() {
311
335
  return auth_api.get_access_token();
@@ -333,11 +357,11 @@ var auth_guard = ({
333
357
  children,
334
358
  fallback = null
335
359
  }) => {
336
- const { user, is_loading } = use_auth();
337
- if (is_loading && !user) {
360
+ const { user, safe_loading } = use_auth();
361
+ if (safe_loading && !user) {
338
362
  return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
339
363
  }
340
- if (!user && !is_loading) {
364
+ if (!user && !safe_loading) {
341
365
  return null;
342
366
  }
343
367
  return /* @__PURE__ */ jsx2(Fragment, { children });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/const/route.ts","../src/func/func_cookies.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"],"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 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 redirect,\r\n });\r\n }, [app_url, on_error, redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [is_loading, set_is_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 get_safe_user = async () => {\r\n set_is_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?.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_is_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 is_loading,\r\n refresh,\r\n logout,\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 const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\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 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 if (error instanceof Error) {\r\n throw error;\r\n } else {\r\n throw new Error(String(error));\r\n }\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_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 redirect_at_fluoce_auth = (error: unknown) => {\r\n console.warn(error);\r\n window.location.replace(route.fluoce_auth(this.app_url));\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n switch (this.redirect?.type) {\r\n case \"fluoce\":\r\n this.redirect_at_fluoce_auth(error);\r\n break;\r\n case \"custom\":\r\n this.redirect.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n }\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n return;\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n constructor(\r\n {\r\n app_url,\r\n on_error,\r\n redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n redirect?: redirect_type;\r\n },\r\n private readonly http: typeof fetch = fetch,\r\n ) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (redirect) {\r\n this.redirect = 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 const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 this.handle_error(error);\r\n },\r\n },\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 safe_me({ accessToken }: { accessToken?: string }) {\r\n const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 },\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 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 this.http(\r\n this.base_url + this.api_endpoint.exchange,\r\n {\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 );\r\n return await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 document.cookie = `refreshToken=${encodeURIComponent(refreshToken)}; path=/;`;\r\n document.cookie = `accessToken=${encodeURIComponent(accessToken)}; path=/;`;\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 this.delete_cookie();\r\n await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_error();\r\n },\r\n });\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\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n}: auth_guard_interface) => {\r\n const { user, is_loading } = use_auth();\r\n\r\n if (is_loading && !user) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n if (!user && !is_loading) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":"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","names":["jsx"]}
1
+ {"version":3,"sources":["../src/provider/auth_provider.tsx","../src/const/api_endpoint.ts","../src/const/route.ts","../src/func/func_cookies.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"],"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 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 redirect,\r\n });\r\n }, [app_url, on_error, 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 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 const route = {\r\n fluoce_auth: (ref: string) => `https://auth.fluoce.com/auth?ref=${ref}`,\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 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 if (error instanceof Error) {\r\n throw error;\r\n } else {\r\n throw new Error(String(error));\r\n }\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_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 redirect_at_fluoce_auth = (error: unknown) => {\r\n console.warn(error);\r\n window.location.replace(route.fluoce_auth(this.app_url));\r\n };\r\n\r\n private readonly handle_redirect = (error?: unknown): void => {\r\n switch (this.redirect?.type) {\r\n case \"fluoce\":\r\n this.redirect_at_fluoce_auth(error);\r\n break;\r\n case \"custom\":\r\n this.redirect.redirect(error);\r\n break;\r\n case \"none\":\r\n break;\r\n }\r\n };\r\n\r\n private readonly handle_error = (error?: unknown): void => {\r\n if (this.on_error) {\r\n this.on_error(error);\r\n return;\r\n }\r\n this.handle_redirect(error);\r\n };\r\n\r\n constructor(\r\n {\r\n app_url,\r\n on_error,\r\n redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n redirect?: redirect_type;\r\n },\r\n private readonly http: typeof fetch = fetch,\r\n ) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (redirect) {\r\n this.redirect = 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 const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 this.handle_error(error);\r\n },\r\n },\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 safe_me({ accessToken }: { accessToken?: string }) {\r\n const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\r\n fn: async () => {\r\n const res = await this.http(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 throw error;\r\n },\r\n },\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 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 this.http(\r\n this.base_url + this.api_endpoint.exchange,\r\n {\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 );\r\n return await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_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 document.cookie = `refreshToken=${encodeURIComponent(refreshToken)}; path=/;`;\r\n document.cookie = `accessToken=${encodeURIComponent(accessToken)}; path=/;`;\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 this.delete_cookie();\r\n await func_try_catch<response_type<unknown>>({\r\n fn: async () => {\r\n const res = await this.http(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 await res.json();\r\n },\r\n onError: () => {\r\n this.handle_error();\r\n },\r\n });\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\n\r\nexport const auth_guard = ({\r\n children,\r\n fallback = null,\r\n}: auth_guard_interface) => {\r\n const { user, safe_loading } = 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 return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":"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","names":["jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluoce/auth-react",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "React SDK for Fluoce Auth",
5
5
  "license": "MIT",
6
6
  "type": "module",