@fluoce/auth-react 0.2.1 → 0.2.3

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
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ FluoceAuthFlow: () => auth_flow,
23
24
  FluoceAuthGuard: () => auth_guard,
24
25
  FluoceAuthProvider: () => auth_provider,
25
26
  useFluoceAuth: () => use_auth
@@ -71,11 +72,7 @@ async function func_try_catch({
71
72
  onError(error);
72
73
  return null;
73
74
  }
74
- if (error instanceof Error) {
75
- throw error;
76
- } else {
77
- throw new Error(String(error));
78
- }
75
+ throw error;
79
76
  }
80
77
  }
81
78
 
@@ -84,16 +81,15 @@ var Api_service = class {
84
81
  constructor({
85
82
  app_url,
86
83
  on_error,
87
- redirect
88
- }, http = fetch) {
89
- this.http = http;
84
+ on_unauthorized_redirect
85
+ }) {
90
86
  this.base_url = base_url;
91
87
  this.api_endpoint = api_endpoint;
92
88
  this.redirect = {
93
89
  type: "fluoce"
94
90
  };
95
91
  this.redirect_at_fluoce_auth = (error) => {
96
- console.warn(error);
92
+ console.warn("FLUOCE_WARN", error);
97
93
  window.location.replace(route.fluoce_auth(this.app_url));
98
94
  };
99
95
  this.handle_redirect = (error) => {
@@ -107,12 +103,14 @@ var Api_service = class {
107
103
  break;
108
104
  case "none":
109
105
  break;
106
+ default:
107
+ break;
110
108
  }
111
109
  };
112
110
  this.handle_error = (error) => {
111
+ console.warn("FLUOCE_WARN", error);
113
112
  if (this.on_error) {
114
113
  this.on_error(error);
115
- return;
116
114
  }
117
115
  this.handle_redirect(error);
118
116
  };
@@ -128,15 +126,15 @@ var Api_service = class {
128
126
  };
129
127
  this.app_url = app_url;
130
128
  this.on_error = on_error;
131
- if (redirect) {
132
- this.redirect = redirect;
129
+ if (on_unauthorized_redirect) {
130
+ this.redirect = on_unauthorized_redirect;
133
131
  }
134
132
  }
135
133
  async me({ accessToken }) {
136
134
  const data = await func_try_catch(
137
135
  {
138
136
  fn: async () => {
139
- const res = await this.http(this.base_url + this.api_endpoint.me, {
137
+ const res = await fetch(this.base_url + this.api_endpoint.me, {
140
138
  method: "GET",
141
139
  headers: {
142
140
  "Content-Type": "application/json",
@@ -160,7 +158,7 @@ var Api_service = class {
160
158
  const data = await func_try_catch(
161
159
  {
162
160
  fn: async () => {
163
- const res = await this.http(this.base_url + this.api_endpoint.me, {
161
+ const res = await fetch(this.base_url + this.api_endpoint.me, {
164
162
  method: "GET",
165
163
  headers: {
166
164
  "Content-Type": "application/json",
@@ -184,16 +182,13 @@ var Api_service = class {
184
182
  var _a, _b;
185
183
  const data = await func_try_catch({
186
184
  fn: async () => {
187
- const res = await this.http(
188
- this.base_url + this.api_endpoint.exchange,
189
- {
190
- method: "POST",
191
- headers: {
192
- "Content-Type": "application/json"
193
- },
194
- body: JSON.stringify({ code })
195
- }
196
- );
185
+ const res = await fetch(this.base_url + this.api_endpoint.exchange, {
186
+ method: "POST",
187
+ headers: {
188
+ "Content-Type": "application/json"
189
+ },
190
+ body: JSON.stringify({ code })
191
+ });
197
192
  return await res.json();
198
193
  },
199
194
  onError: () => {
@@ -216,7 +211,7 @@ var Api_service = class {
216
211
  var _a, _b;
217
212
  const data = await func_try_catch({
218
213
  fn: async () => {
219
- const res = await this.http(this.base_url + this.api_endpoint.refresh, {
214
+ const res = await fetch(this.base_url + this.api_endpoint.refresh, {
220
215
  method: "POST",
221
216
  headers: {
222
217
  "Content-Type": "application/json",
@@ -232,8 +227,8 @@ var Api_service = class {
232
227
  const refreshToken = (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.refreshToken;
233
228
  const accessToken = (_b = data == null ? void 0 : data.data) == null ? void 0 : _b.accessToken;
234
229
  if (refreshToken && accessToken) {
235
- document.cookie = `refreshToken=${encodeURIComponent(refreshToken)}; path=/;`;
236
- document.cookie = `accessToken=${encodeURIComponent(accessToken)}; path=/;`;
230
+ func_set_cookie("refreshToken", refreshToken, 59);
231
+ func_set_cookie("accessToken", accessToken, 14 / (24 * 60));
237
232
  }
238
233
  if (data == null ? void 0 : data.success) {
239
234
  return data;
@@ -245,7 +240,7 @@ var Api_service = class {
245
240
  this.delete_cookie();
246
241
  await func_try_catch({
247
242
  fn: async () => {
248
- const res = await this.http(this.base_url + this.api_endpoint.logout, {
243
+ const res = await fetch(this.base_url + this.api_endpoint.logout, {
249
244
  method: "POST",
250
245
  headers: {
251
246
  "Content-Type": "application/json",
@@ -285,29 +280,33 @@ var auth_provider = ({
285
280
  children,
286
281
  app_url,
287
282
  on_error,
288
- redirect
283
+ on_unauthorized_redirect
289
284
  }) => {
285
+ console.log("Fluoce Auth Provider mounted");
290
286
  const auth_api = (0, import_react2.useMemo)(() => {
291
287
  return new Api_service({
292
288
  app_url,
293
289
  on_error,
294
- redirect
290
+ on_unauthorized_redirect
295
291
  });
296
- }, [app_url, on_error, redirect]);
292
+ }, [app_url, on_error, on_unauthorized_redirect]);
297
293
  const [user, set_user] = (0, import_react2.useState)(null);
298
294
  const [safe_loading, set_safe_loading] = (0, import_react2.useState)(false);
299
295
  const [auth_flow_loading, set_auth_flow_loading] = (0, import_react2.useState)(false);
300
296
  const refresh = async () => {
301
297
  var _a;
298
+ console.log("Called refresh()");
302
299
  const response = await auth_api.refresh();
303
300
  return (_a = response == null ? void 0 : response.success) != null ? _a : false;
304
301
  };
305
302
  const logout = async () => {
303
+ console.log("Called logout()");
306
304
  await auth_api.logout();
307
305
  set_user(null);
308
306
  return true;
309
307
  };
310
- const auth_flow = async ({ code }) => {
308
+ const auth_flow2 = async ({ code }) => {
309
+ console.log("Called auth_flow() with code:", code);
311
310
  set_auth_flow_loading(true);
312
311
  try {
313
312
  const data = await auth_api.auth_flow({
@@ -326,6 +325,7 @@ var auth_provider = ({
326
325
  }
327
326
  };
328
327
  const get_safe_user = async () => {
328
+ console.log("Called get_safe_user()");
329
329
  set_safe_loading(true);
330
330
  try {
331
331
  if (user) {
@@ -353,7 +353,7 @@ var auth_provider = ({
353
353
  auth_flow_loading,
354
354
  refresh,
355
355
  logout,
356
- auth_flow,
356
+ auth_flow: auth_flow2,
357
357
  get_safe_user,
358
358
  get access_token() {
359
359
  return auth_api.get_access_token();
@@ -386,12 +386,43 @@ var auth_guard = ({
386
386
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: fallback });
387
387
  }
388
388
  if (!user && !safe_loading) {
389
- return null;
389
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: fallback });
390
390
  }
391
391
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
392
392
  };
393
+
394
+ // src/components/auth_flow.tsx
395
+ var import_react4 = require("react");
396
+ var import_jsx_runtime3 = require("react/jsx-runtime");
397
+ var auth_flow = ({
398
+ code,
399
+ fallback,
400
+ redirect
401
+ }) => {
402
+ const { auth_flow: auth_flow2, auth_flow_loading } = use_auth();
403
+ (0, import_react4.useEffect)(() => {
404
+ const flow = async () => {
405
+ if (!code) return;
406
+ const success = await auth_flow2({
407
+ code
408
+ });
409
+ if (success) {
410
+ window.location.replace(redirect);
411
+ }
412
+ };
413
+ flow();
414
+ }, [code]);
415
+ if (fallback) {
416
+ return fallback;
417
+ }
418
+ if (auth_flow_loading) {
419
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: "Logging you in . . . " }) });
420
+ }
421
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { children: "Login done or stopped" });
422
+ };
393
423
  // Annotate the CommonJS export names for ESM import in node:
394
424
  0 && (module.exports = {
425
+ FluoceAuthFlow,
395
426
  FluoceAuthGuard,
396
427
  FluoceAuthProvider,
397
428
  useFluoceAuth
@@ -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 [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"]}
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","../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 console.log(\"Fluoce Auth Provider mounted\");\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 console.log(\"Called refresh()\");\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 console.log(\"Called logout()\");\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 console.log(\"Called auth_flow() with code:\", code);\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 console.log(\"Called get_safe_user()\");\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 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_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(\"FLUOCE_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 default:\r\n break;\r\n }\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 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 const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\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 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 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 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 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 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 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 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 logout() {\r\n this.delete_cookie();\r\n 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 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 <>{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":["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"]}
package/dist/index.d.cts CHANGED
@@ -14,10 +14,10 @@ interface auth_provider_interface {
14
14
  children: ReactNode;
15
15
  app_url: string;
16
16
  on_error?: (error: unknown) => void;
17
- redirect?: redirect_type;
17
+ on_unauthorized_redirect?: redirect_type;
18
18
  }
19
19
 
20
- declare const auth_provider: ({ children, app_url, on_error, redirect, }: auth_provider_interface) => react.JSX.Element;
20
+ declare const auth_provider: ({ children, app_url, on_error, on_unauthorized_redirect, }: auth_provider_interface) => react.JSX.Element;
21
21
 
22
22
  type user_response_type = {
23
23
  id: string;
@@ -52,6 +52,12 @@ interface auth_guard_interface {
52
52
  fallback?: ReactNode;
53
53
  }
54
54
 
55
- declare const auth_guard: ({ children, fallback, }: auth_guard_interface) => react.JSX.Element | null;
55
+ declare const auth_guard: ({ children, fallback, }: auth_guard_interface) => react.JSX.Element;
56
56
 
57
- export { auth_guard as FluoceAuthGuard, auth_provider as FluoceAuthProvider, type auth_provider_interface as FluoceAuthProviderType, type redirect_type as FluoceRedirectType, type user_type as FluoceUserType, use_auth as useFluoceAuth };
57
+ declare const auth_flow: ({ code, fallback, redirect, }: {
58
+ fallback?: ReactNode;
59
+ code: string;
60
+ redirect: string;
61
+ }) => string | number | true | Iterable<ReactNode> | react.JSX.Element;
62
+
63
+ export { auth_flow as FluoceAuthFlow, auth_guard as FluoceAuthGuard, auth_provider as FluoceAuthProvider, type auth_provider_interface as FluoceAuthProviderType, type redirect_type as FluoceRedirectType, type user_type as FluoceUserType, use_auth as useFluoceAuth };
package/dist/index.d.ts CHANGED
@@ -14,10 +14,10 @@ interface auth_provider_interface {
14
14
  children: ReactNode;
15
15
  app_url: string;
16
16
  on_error?: (error: unknown) => void;
17
- redirect?: redirect_type;
17
+ on_unauthorized_redirect?: redirect_type;
18
18
  }
19
19
 
20
- declare const auth_provider: ({ children, app_url, on_error, redirect, }: auth_provider_interface) => react.JSX.Element;
20
+ declare const auth_provider: ({ children, app_url, on_error, on_unauthorized_redirect, }: auth_provider_interface) => react.JSX.Element;
21
21
 
22
22
  type user_response_type = {
23
23
  id: string;
@@ -52,6 +52,12 @@ interface auth_guard_interface {
52
52
  fallback?: ReactNode;
53
53
  }
54
54
 
55
- declare const auth_guard: ({ children, fallback, }: auth_guard_interface) => react.JSX.Element | null;
55
+ declare const auth_guard: ({ children, fallback, }: auth_guard_interface) => react.JSX.Element;
56
56
 
57
- export { auth_guard as FluoceAuthGuard, auth_provider as FluoceAuthProvider, type auth_provider_interface as FluoceAuthProviderType, type redirect_type as FluoceRedirectType, type user_type as FluoceUserType, use_auth as useFluoceAuth };
57
+ declare const auth_flow: ({ code, fallback, redirect, }: {
58
+ fallback?: ReactNode;
59
+ code: string;
60
+ redirect: string;
61
+ }) => string | number | true | Iterable<ReactNode> | react.JSX.Element;
62
+
63
+ export { auth_flow as FluoceAuthFlow, auth_guard as FluoceAuthGuard, auth_provider as FluoceAuthProvider, type auth_provider_interface as FluoceAuthProviderType, type redirect_type as FluoceRedirectType, type user_type as FluoceUserType, use_auth as useFluoceAuth };
package/dist/index.js CHANGED
@@ -47,11 +47,7 @@ async function func_try_catch({
47
47
  onError(error);
48
48
  return null;
49
49
  }
50
- if (error instanceof Error) {
51
- throw error;
52
- } else {
53
- throw new Error(String(error));
54
- }
50
+ throw error;
55
51
  }
56
52
  }
57
53
 
@@ -60,16 +56,15 @@ var Api_service = class {
60
56
  constructor({
61
57
  app_url,
62
58
  on_error,
63
- redirect
64
- }, http = fetch) {
65
- this.http = http;
59
+ on_unauthorized_redirect
60
+ }) {
66
61
  this.base_url = base_url;
67
62
  this.api_endpoint = api_endpoint;
68
63
  this.redirect = {
69
64
  type: "fluoce"
70
65
  };
71
66
  this.redirect_at_fluoce_auth = (error) => {
72
- console.warn(error);
67
+ console.warn("FLUOCE_WARN", error);
73
68
  window.location.replace(route.fluoce_auth(this.app_url));
74
69
  };
75
70
  this.handle_redirect = (error) => {
@@ -83,12 +78,14 @@ var Api_service = class {
83
78
  break;
84
79
  case "none":
85
80
  break;
81
+ default:
82
+ break;
86
83
  }
87
84
  };
88
85
  this.handle_error = (error) => {
86
+ console.warn("FLUOCE_WARN", error);
89
87
  if (this.on_error) {
90
88
  this.on_error(error);
91
- return;
92
89
  }
93
90
  this.handle_redirect(error);
94
91
  };
@@ -104,15 +101,15 @@ var Api_service = class {
104
101
  };
105
102
  this.app_url = app_url;
106
103
  this.on_error = on_error;
107
- if (redirect) {
108
- this.redirect = redirect;
104
+ if (on_unauthorized_redirect) {
105
+ this.redirect = on_unauthorized_redirect;
109
106
  }
110
107
  }
111
108
  async me({ accessToken }) {
112
109
  const data = await func_try_catch(
113
110
  {
114
111
  fn: async () => {
115
- const res = await this.http(this.base_url + this.api_endpoint.me, {
112
+ const res = await fetch(this.base_url + this.api_endpoint.me, {
116
113
  method: "GET",
117
114
  headers: {
118
115
  "Content-Type": "application/json",
@@ -136,7 +133,7 @@ var Api_service = class {
136
133
  const data = await func_try_catch(
137
134
  {
138
135
  fn: async () => {
139
- const res = await this.http(this.base_url + this.api_endpoint.me, {
136
+ const res = await fetch(this.base_url + this.api_endpoint.me, {
140
137
  method: "GET",
141
138
  headers: {
142
139
  "Content-Type": "application/json",
@@ -160,16 +157,13 @@ var Api_service = class {
160
157
  var _a, _b;
161
158
  const data = await func_try_catch({
162
159
  fn: async () => {
163
- const res = await this.http(
164
- this.base_url + this.api_endpoint.exchange,
165
- {
166
- method: "POST",
167
- headers: {
168
- "Content-Type": "application/json"
169
- },
170
- body: JSON.stringify({ code })
171
- }
172
- );
160
+ const res = await fetch(this.base_url + this.api_endpoint.exchange, {
161
+ method: "POST",
162
+ headers: {
163
+ "Content-Type": "application/json"
164
+ },
165
+ body: JSON.stringify({ code })
166
+ });
173
167
  return await res.json();
174
168
  },
175
169
  onError: () => {
@@ -192,7 +186,7 @@ var Api_service = class {
192
186
  var _a, _b;
193
187
  const data = await func_try_catch({
194
188
  fn: async () => {
195
- const res = await this.http(this.base_url + this.api_endpoint.refresh, {
189
+ const res = await fetch(this.base_url + this.api_endpoint.refresh, {
196
190
  method: "POST",
197
191
  headers: {
198
192
  "Content-Type": "application/json",
@@ -208,8 +202,8 @@ var Api_service = class {
208
202
  const refreshToken = (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.refreshToken;
209
203
  const accessToken = (_b = data == null ? void 0 : data.data) == null ? void 0 : _b.accessToken;
210
204
  if (refreshToken && accessToken) {
211
- document.cookie = `refreshToken=${encodeURIComponent(refreshToken)}; path=/;`;
212
- document.cookie = `accessToken=${encodeURIComponent(accessToken)}; path=/;`;
205
+ func_set_cookie("refreshToken", refreshToken, 59);
206
+ func_set_cookie("accessToken", accessToken, 14 / (24 * 60));
213
207
  }
214
208
  if (data == null ? void 0 : data.success) {
215
209
  return data;
@@ -221,7 +215,7 @@ var Api_service = class {
221
215
  this.delete_cookie();
222
216
  await func_try_catch({
223
217
  fn: async () => {
224
- const res = await this.http(this.base_url + this.api_endpoint.logout, {
218
+ const res = await fetch(this.base_url + this.api_endpoint.logout, {
225
219
  method: "POST",
226
220
  headers: {
227
221
  "Content-Type": "application/json",
@@ -261,29 +255,33 @@ var auth_provider = ({
261
255
  children,
262
256
  app_url,
263
257
  on_error,
264
- redirect
258
+ on_unauthorized_redirect
265
259
  }) => {
260
+ console.log("Fluoce Auth Provider mounted");
266
261
  const auth_api = use_memo(() => {
267
262
  return new Api_service({
268
263
  app_url,
269
264
  on_error,
270
- redirect
265
+ on_unauthorized_redirect
271
266
  });
272
- }, [app_url, on_error, redirect]);
267
+ }, [app_url, on_error, on_unauthorized_redirect]);
273
268
  const [user, set_user] = use_state(null);
274
269
  const [safe_loading, set_safe_loading] = use_state(false);
275
270
  const [auth_flow_loading, set_auth_flow_loading] = use_state(false);
276
271
  const refresh = async () => {
277
272
  var _a;
273
+ console.log("Called refresh()");
278
274
  const response = await auth_api.refresh();
279
275
  return (_a = response == null ? void 0 : response.success) != null ? _a : false;
280
276
  };
281
277
  const logout = async () => {
278
+ console.log("Called logout()");
282
279
  await auth_api.logout();
283
280
  set_user(null);
284
281
  return true;
285
282
  };
286
- const auth_flow = async ({ code }) => {
283
+ const auth_flow2 = async ({ code }) => {
284
+ console.log("Called auth_flow() with code:", code);
287
285
  set_auth_flow_loading(true);
288
286
  try {
289
287
  const data = await auth_api.auth_flow({
@@ -302,6 +300,7 @@ var auth_provider = ({
302
300
  }
303
301
  };
304
302
  const get_safe_user = async () => {
303
+ console.log("Called get_safe_user()");
305
304
  set_safe_loading(true);
306
305
  try {
307
306
  if (user) {
@@ -329,7 +328,7 @@ var auth_provider = ({
329
328
  auth_flow_loading,
330
329
  refresh,
331
330
  logout,
332
- auth_flow,
331
+ auth_flow: auth_flow2,
333
332
  get_safe_user,
334
333
  get access_token() {
335
334
  return auth_api.get_access_token();
@@ -362,11 +361,42 @@ var auth_guard = ({
362
361
  return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
363
362
  }
364
363
  if (!user && !safe_loading) {
365
- return null;
364
+ return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
366
365
  }
367
366
  return /* @__PURE__ */ jsx2(Fragment, { children });
368
367
  };
368
+
369
+ // src/components/auth_flow.tsx
370
+ import { useEffect as use_effect2 } from "react";
371
+ import { jsx as jsx3 } from "react/jsx-runtime";
372
+ var auth_flow = ({
373
+ code,
374
+ fallback,
375
+ redirect
376
+ }) => {
377
+ const { auth_flow: auth_flow2, auth_flow_loading } = use_auth();
378
+ use_effect2(() => {
379
+ const flow = async () => {
380
+ if (!code) return;
381
+ const success = await auth_flow2({
382
+ code
383
+ });
384
+ if (success) {
385
+ window.location.replace(redirect);
386
+ }
387
+ };
388
+ flow();
389
+ }, [code]);
390
+ if (fallback) {
391
+ return fallback;
392
+ }
393
+ if (auth_flow_loading) {
394
+ return /* @__PURE__ */ jsx3("div", { children: /* @__PURE__ */ jsx3("span", { children: "Logging you in . . . " }) });
395
+ }
396
+ return /* @__PURE__ */ jsx3("div", { children: "Login done or stopped" });
397
+ };
369
398
  export {
399
+ auth_flow as FluoceAuthFlow,
370
400
  auth_guard as FluoceAuthGuard,
371
401
  auth_provider as FluoceAuthProvider,
372
402
  use_auth as useFluoceAuth
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 [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"]}
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","../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 console.log(\"Fluoce Auth Provider mounted\");\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 console.log(\"Called refresh()\");\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 console.log(\"Called logout()\");\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 console.log(\"Called auth_flow() with code:\", code);\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 console.log(\"Called get_safe_user()\");\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 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_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(\"FLUOCE_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 default:\r\n break;\r\n }\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 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 const data = await func_try_catch<response_type<user_response_type> | null>(\r\n {\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 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 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 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 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 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 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 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 logout() {\r\n this.delete_cookie();\r\n 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 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 <>{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": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "React SDK for Fluoce Auth",
5
5
  "license": "MIT",
6
6
  "type": "module",