@fluoce/auth-react 0.2.3 → 1.0.0
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 +38 -51
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -51
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -114,6 +114,13 @@ var Api_service = class {
|
|
|
114
114
|
}
|
|
115
115
|
this.handle_redirect(error);
|
|
116
116
|
};
|
|
117
|
+
this.handle_response_parse = async (res) => {
|
|
118
|
+
const json = await res.json().catch(() => null);
|
|
119
|
+
if (!res.ok) {
|
|
120
|
+
throw json != null ? json : new Error(`HTTP:${res.status}:${res.statusText}`);
|
|
121
|
+
}
|
|
122
|
+
return json;
|
|
123
|
+
};
|
|
117
124
|
this.get_access_token = () => {
|
|
118
125
|
return func_get_cookie("accessToken");
|
|
119
126
|
};
|
|
@@ -131,52 +138,38 @@ var Api_service = class {
|
|
|
131
138
|
}
|
|
132
139
|
}
|
|
133
140
|
async me({ accessToken }) {
|
|
134
|
-
|
|
135
|
-
{
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
this.handle_error(error);
|
|
148
|
-
}
|
|
141
|
+
return await func_try_catch({
|
|
142
|
+
fn: async () => {
|
|
143
|
+
const res = await fetch(this.base_url + this.api_endpoint.me, {
|
|
144
|
+
method: "GET",
|
|
145
|
+
headers: {
|
|
146
|
+
"Content-Type": "application/json",
|
|
147
|
+
Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
return this.handle_response_parse(res);
|
|
151
|
+
},
|
|
152
|
+
onError: (error) => {
|
|
153
|
+
this.handle_error(error);
|
|
149
154
|
}
|
|
150
|
-
);
|
|
151
|
-
if (data == null ? void 0 : data.success) {
|
|
152
|
-
return data;
|
|
153
|
-
} else {
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
155
|
+
});
|
|
156
156
|
}
|
|
157
157
|
async safe_me({ accessToken }) {
|
|
158
|
-
|
|
159
|
-
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
throw error;
|
|
172
|
-
}
|
|
158
|
+
return await func_try_catch({
|
|
159
|
+
fn: async () => {
|
|
160
|
+
const res = await fetch(this.base_url + this.api_endpoint.me, {
|
|
161
|
+
method: "GET",
|
|
162
|
+
headers: {
|
|
163
|
+
"Content-Type": "application/json",
|
|
164
|
+
Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return await res.json();
|
|
168
|
+
},
|
|
169
|
+
onError: (error) => {
|
|
170
|
+
throw error;
|
|
173
171
|
}
|
|
174
|
-
);
|
|
175
|
-
if (data == null ? void 0 : data.success) {
|
|
176
|
-
return data;
|
|
177
|
-
} else {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
172
|
+
});
|
|
180
173
|
}
|
|
181
174
|
async exchange({ code }) {
|
|
182
175
|
var _a, _b;
|
|
@@ -189,7 +182,7 @@ var Api_service = class {
|
|
|
189
182
|
},
|
|
190
183
|
body: JSON.stringify({ code })
|
|
191
184
|
});
|
|
192
|
-
return
|
|
185
|
+
return this.handle_response_parse(res);
|
|
193
186
|
},
|
|
194
187
|
onError: () => {
|
|
195
188
|
this.handle_error();
|
|
@@ -218,7 +211,7 @@ var Api_service = class {
|
|
|
218
211
|
Authorization: `Bearer ${this.get_refresh_token()}`
|
|
219
212
|
}
|
|
220
213
|
});
|
|
221
|
-
return
|
|
214
|
+
return this.handle_response_parse(res);
|
|
222
215
|
},
|
|
223
216
|
onError: () => {
|
|
224
217
|
this.handle_error();
|
|
@@ -237,7 +230,6 @@ var Api_service = class {
|
|
|
237
230
|
}
|
|
238
231
|
}
|
|
239
232
|
async logout() {
|
|
240
|
-
this.delete_cookie();
|
|
241
233
|
await func_try_catch({
|
|
242
234
|
fn: async () => {
|
|
243
235
|
const res = await fetch(this.base_url + this.api_endpoint.logout, {
|
|
@@ -252,7 +244,7 @@ var Api_service = class {
|
|
|
252
244
|
onError: () => {
|
|
253
245
|
this.handle_error();
|
|
254
246
|
}
|
|
255
|
-
});
|
|
247
|
+
}).finally(() => this.delete_cookie());
|
|
256
248
|
}
|
|
257
249
|
async auth_flow({ code }) {
|
|
258
250
|
var _a;
|
|
@@ -282,7 +274,6 @@ var auth_provider = ({
|
|
|
282
274
|
on_error,
|
|
283
275
|
on_unauthorized_redirect
|
|
284
276
|
}) => {
|
|
285
|
-
console.log("Fluoce Auth Provider mounted");
|
|
286
277
|
const auth_api = (0, import_react2.useMemo)(() => {
|
|
287
278
|
return new Api_service({
|
|
288
279
|
app_url,
|
|
@@ -295,18 +286,15 @@ var auth_provider = ({
|
|
|
295
286
|
const [auth_flow_loading, set_auth_flow_loading] = (0, import_react2.useState)(false);
|
|
296
287
|
const refresh = async () => {
|
|
297
288
|
var _a;
|
|
298
|
-
console.log("Called refresh()");
|
|
299
289
|
const response = await auth_api.refresh();
|
|
300
290
|
return (_a = response == null ? void 0 : response.success) != null ? _a : false;
|
|
301
291
|
};
|
|
302
292
|
const logout = async () => {
|
|
303
|
-
console.log("Called logout()");
|
|
304
293
|
await auth_api.logout();
|
|
305
294
|
set_user(null);
|
|
306
295
|
return true;
|
|
307
296
|
};
|
|
308
297
|
const auth_flow2 = async ({ code }) => {
|
|
309
|
-
console.log("Called auth_flow() with code:", code);
|
|
310
298
|
set_auth_flow_loading(true);
|
|
311
299
|
try {
|
|
312
300
|
const data = await auth_api.auth_flow({
|
|
@@ -325,7 +313,6 @@ var auth_provider = ({
|
|
|
325
313
|
}
|
|
326
314
|
};
|
|
327
315
|
const get_safe_user = async () => {
|
|
328
|
-
console.log("Called get_safe_user()");
|
|
329
316
|
set_safe_loading(true);
|
|
330
317
|
try {
|
|
331
318
|
if (user) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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","../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"]}
|
|
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 const auth_api = use_memo(() => {\r\n return new Api_service({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n });\r\n }, [app_url, on_error, on_unauthorized_redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [safe_loading, set_safe_loading] = use_state(false);\r\n\r\n const [auth_flow_loading, set_auth_flow_loading] = use_state(false);\r\n\r\n const refresh = async () => {\r\n const response = await auth_api.refresh();\r\n return response?.success ?? false;\r\n };\r\n\r\n const logout = async () => {\r\n await auth_api.logout();\r\n set_user(null);\r\n return true;\r\n };\r\n\r\n const auth_flow = async ({ code }: { code: string }) => {\r\n set_auth_flow_loading(true);\r\n try {\r\n const data = await auth_api.auth_flow({\r\n code,\r\n });\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n set_auth_flow_loading(false);\r\n }\r\n };\r\n\r\n const get_safe_user = async () => {\r\n set_safe_loading(true);\r\n try {\r\n if (user) {\r\n return user;\r\n }\r\n const data = await auth_api.safe_me({});\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return data.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n } finally {\r\n set_safe_loading(false);\r\n }\r\n };\r\n\r\n use_effect(() => {\r\n void get_safe_user();\r\n }, []);\r\n\r\n const value: auth_context_interface = {\r\n user,\r\n safe_loading,\r\n auth_flow_loading,\r\n 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 private readonly handle_response_parse = async (res: Response) => {\r\n const json = await res.json().catch(() => null);\r\n if (!res.ok) {\r\n throw json ?? new Error(`HTTP:${res.status}:${res.statusText}`);\r\n }\r\n return json;\r\n };\r\n\r\n constructor({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n on_unauthorized_redirect?: redirect_type;\r\n }) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (on_unauthorized_redirect) {\r\n this.redirect = on_unauthorized_redirect;\r\n }\r\n }\r\n\r\n public readonly get_access_token = (): string | null => {\r\n return func_get_cookie(\"accessToken\");\r\n };\r\n\r\n public readonly get_refresh_token = (): string | null => {\r\n return func_get_cookie(\"refreshToken\");\r\n };\r\n\r\n private readonly delete_cookie = () => {\r\n func_delete_cookie(\"accessToken\");\r\n func_delete_cookie(\"refreshToken\");\r\n };\r\n\r\n async me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n }\r\n\r\n async safe_me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return await res.json();\r\n },\r\n onError: (error) => {\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: () => {\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 this.handle_response_parse(res);\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 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 }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\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.js
CHANGED
|
@@ -89,6 +89,13 @@ var Api_service = class {
|
|
|
89
89
|
}
|
|
90
90
|
this.handle_redirect(error);
|
|
91
91
|
};
|
|
92
|
+
this.handle_response_parse = async (res) => {
|
|
93
|
+
const json = await res.json().catch(() => null);
|
|
94
|
+
if (!res.ok) {
|
|
95
|
+
throw json != null ? json : new Error(`HTTP:${res.status}:${res.statusText}`);
|
|
96
|
+
}
|
|
97
|
+
return json;
|
|
98
|
+
};
|
|
92
99
|
this.get_access_token = () => {
|
|
93
100
|
return func_get_cookie("accessToken");
|
|
94
101
|
};
|
|
@@ -106,52 +113,38 @@ var Api_service = class {
|
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
async me({ accessToken }) {
|
|
109
|
-
|
|
110
|
-
{
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
this.handle_error(error);
|
|
123
|
-
}
|
|
116
|
+
return await func_try_catch({
|
|
117
|
+
fn: async () => {
|
|
118
|
+
const res = await fetch(this.base_url + this.api_endpoint.me, {
|
|
119
|
+
method: "GET",
|
|
120
|
+
headers: {
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
return this.handle_response_parse(res);
|
|
126
|
+
},
|
|
127
|
+
onError: (error) => {
|
|
128
|
+
this.handle_error(error);
|
|
124
129
|
}
|
|
125
|
-
);
|
|
126
|
-
if (data == null ? void 0 : data.success) {
|
|
127
|
-
return data;
|
|
128
|
-
} else {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
130
|
+
});
|
|
131
131
|
}
|
|
132
132
|
async safe_me({ accessToken }) {
|
|
133
|
-
|
|
134
|
-
{
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
throw error;
|
|
147
|
-
}
|
|
133
|
+
return await func_try_catch({
|
|
134
|
+
fn: async () => {
|
|
135
|
+
const res = await fetch(this.base_url + this.api_endpoint.me, {
|
|
136
|
+
method: "GET",
|
|
137
|
+
headers: {
|
|
138
|
+
"Content-Type": "application/json",
|
|
139
|
+
Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return await res.json();
|
|
143
|
+
},
|
|
144
|
+
onError: (error) => {
|
|
145
|
+
throw error;
|
|
148
146
|
}
|
|
149
|
-
);
|
|
150
|
-
if (data == null ? void 0 : data.success) {
|
|
151
|
-
return data;
|
|
152
|
-
} else {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
147
|
+
});
|
|
155
148
|
}
|
|
156
149
|
async exchange({ code }) {
|
|
157
150
|
var _a, _b;
|
|
@@ -164,7 +157,7 @@ var Api_service = class {
|
|
|
164
157
|
},
|
|
165
158
|
body: JSON.stringify({ code })
|
|
166
159
|
});
|
|
167
|
-
return
|
|
160
|
+
return this.handle_response_parse(res);
|
|
168
161
|
},
|
|
169
162
|
onError: () => {
|
|
170
163
|
this.handle_error();
|
|
@@ -193,7 +186,7 @@ var Api_service = class {
|
|
|
193
186
|
Authorization: `Bearer ${this.get_refresh_token()}`
|
|
194
187
|
}
|
|
195
188
|
});
|
|
196
|
-
return
|
|
189
|
+
return this.handle_response_parse(res);
|
|
197
190
|
},
|
|
198
191
|
onError: () => {
|
|
199
192
|
this.handle_error();
|
|
@@ -212,7 +205,6 @@ var Api_service = class {
|
|
|
212
205
|
}
|
|
213
206
|
}
|
|
214
207
|
async logout() {
|
|
215
|
-
this.delete_cookie();
|
|
216
208
|
await func_try_catch({
|
|
217
209
|
fn: async () => {
|
|
218
210
|
const res = await fetch(this.base_url + this.api_endpoint.logout, {
|
|
@@ -227,7 +219,7 @@ var Api_service = class {
|
|
|
227
219
|
onError: () => {
|
|
228
220
|
this.handle_error();
|
|
229
221
|
}
|
|
230
|
-
});
|
|
222
|
+
}).finally(() => this.delete_cookie());
|
|
231
223
|
}
|
|
232
224
|
async auth_flow({ code }) {
|
|
233
225
|
var _a;
|
|
@@ -257,7 +249,6 @@ var auth_provider = ({
|
|
|
257
249
|
on_error,
|
|
258
250
|
on_unauthorized_redirect
|
|
259
251
|
}) => {
|
|
260
|
-
console.log("Fluoce Auth Provider mounted");
|
|
261
252
|
const auth_api = use_memo(() => {
|
|
262
253
|
return new Api_service({
|
|
263
254
|
app_url,
|
|
@@ -270,18 +261,15 @@ var auth_provider = ({
|
|
|
270
261
|
const [auth_flow_loading, set_auth_flow_loading] = use_state(false);
|
|
271
262
|
const refresh = async () => {
|
|
272
263
|
var _a;
|
|
273
|
-
console.log("Called refresh()");
|
|
274
264
|
const response = await auth_api.refresh();
|
|
275
265
|
return (_a = response == null ? void 0 : response.success) != null ? _a : false;
|
|
276
266
|
};
|
|
277
267
|
const logout = async () => {
|
|
278
|
-
console.log("Called logout()");
|
|
279
268
|
await auth_api.logout();
|
|
280
269
|
set_user(null);
|
|
281
270
|
return true;
|
|
282
271
|
};
|
|
283
272
|
const auth_flow2 = async ({ code }) => {
|
|
284
|
-
console.log("Called auth_flow() with code:", code);
|
|
285
273
|
set_auth_flow_loading(true);
|
|
286
274
|
try {
|
|
287
275
|
const data = await auth_api.auth_flow({
|
|
@@ -300,7 +288,6 @@ var auth_provider = ({
|
|
|
300
288
|
}
|
|
301
289
|
};
|
|
302
290
|
const get_safe_user = async () => {
|
|
303
|
-
console.log("Called get_safe_user()");
|
|
304
291
|
set_safe_loading(true);
|
|
305
292
|
try {
|
|
306
293
|
if (user) {
|
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","../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"]}
|
|
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 const auth_api = use_memo(() => {\r\n return new Api_service({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n });\r\n }, [app_url, on_error, on_unauthorized_redirect]);\r\n\r\n const [user, set_user] = use_state<user_type | null>(null);\r\n\r\n const [safe_loading, set_safe_loading] = use_state(false);\r\n\r\n const [auth_flow_loading, set_auth_flow_loading] = use_state(false);\r\n\r\n const refresh = async () => {\r\n const response = await auth_api.refresh();\r\n return response?.success ?? false;\r\n };\r\n\r\n const logout = async () => {\r\n await auth_api.logout();\r\n set_user(null);\r\n return true;\r\n };\r\n\r\n const auth_flow = async ({ code }: { code: string }) => {\r\n set_auth_flow_loading(true);\r\n try {\r\n const data = await auth_api.auth_flow({\r\n code,\r\n });\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n set_auth_flow_loading(false);\r\n }\r\n };\r\n\r\n const get_safe_user = async () => {\r\n set_safe_loading(true);\r\n try {\r\n if (user) {\r\n return user;\r\n }\r\n const data = await auth_api.safe_me({});\r\n if (data?.success && data?.data) {\r\n set_user(data?.data);\r\n return data.data;\r\n } else {\r\n return null;\r\n }\r\n } catch (error) {\r\n return null;\r\n } finally {\r\n set_safe_loading(false);\r\n }\r\n };\r\n\r\n use_effect(() => {\r\n void get_safe_user();\r\n }, []);\r\n\r\n const value: auth_context_interface = {\r\n user,\r\n safe_loading,\r\n auth_flow_loading,\r\n 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 private readonly handle_response_parse = async (res: Response) => {\r\n const json = await res.json().catch(() => null);\r\n if (!res.ok) {\r\n throw json ?? new Error(`HTTP:${res.status}:${res.statusText}`);\r\n }\r\n return json;\r\n };\r\n\r\n constructor({\r\n app_url,\r\n on_error,\r\n on_unauthorized_redirect,\r\n }: {\r\n app_url: string;\r\n on_error?: (error: unknown) => void;\r\n on_unauthorized_redirect?: redirect_type;\r\n }) {\r\n this.app_url = app_url;\r\n this.on_error = on_error;\r\n if (on_unauthorized_redirect) {\r\n this.redirect = on_unauthorized_redirect;\r\n }\r\n }\r\n\r\n public readonly get_access_token = (): string | null => {\r\n return func_get_cookie(\"accessToken\");\r\n };\r\n\r\n public readonly get_refresh_token = (): string | null => {\r\n return func_get_cookie(\"refreshToken\");\r\n };\r\n\r\n private readonly delete_cookie = () => {\r\n func_delete_cookie(\"accessToken\");\r\n func_delete_cookie(\"refreshToken\");\r\n };\r\n\r\n async me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n }\r\n\r\n async safe_me({ accessToken }: { accessToken?: string }) {\r\n return await func_try_catch<response_type<user_response_type> | null>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.me, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken ? accessToken : this.get_access_token()}`,\r\n },\r\n });\r\n return await res.json();\r\n },\r\n onError: (error) => {\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: () => {\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 this.handle_response_parse(res);\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 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 }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\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"]}
|