@fluoce/auth-react 0.2.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +46 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +46 -56
- 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,41 @@ 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
|
-
|
|
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
|
+
if (this.on_error) {
|
|
171
|
+
this.on_error(error);
|
|
172
172
|
}
|
|
173
|
+
throw error;
|
|
173
174
|
}
|
|
174
|
-
);
|
|
175
|
-
if (data == null ? void 0 : data.success) {
|
|
176
|
-
return data;
|
|
177
|
-
} else {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
175
|
+
});
|
|
180
176
|
}
|
|
181
177
|
async exchange({ code }) {
|
|
182
178
|
var _a, _b;
|
|
@@ -189,10 +185,10 @@ var Api_service = class {
|
|
|
189
185
|
},
|
|
190
186
|
body: JSON.stringify({ code })
|
|
191
187
|
});
|
|
192
|
-
return
|
|
188
|
+
return this.handle_response_parse(res);
|
|
193
189
|
},
|
|
194
|
-
onError: () => {
|
|
195
|
-
this.handle_error();
|
|
190
|
+
onError: (error) => {
|
|
191
|
+
this.handle_error(error);
|
|
196
192
|
}
|
|
197
193
|
});
|
|
198
194
|
const refreshToken = (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.refreshToken;
|
|
@@ -218,10 +214,10 @@ var Api_service = class {
|
|
|
218
214
|
Authorization: `Bearer ${this.get_refresh_token()}`
|
|
219
215
|
}
|
|
220
216
|
});
|
|
221
|
-
return
|
|
217
|
+
return this.handle_response_parse(res);
|
|
222
218
|
},
|
|
223
|
-
onError: () => {
|
|
224
|
-
this.handle_error();
|
|
219
|
+
onError: (error) => {
|
|
220
|
+
this.handle_error(error);
|
|
225
221
|
}
|
|
226
222
|
});
|
|
227
223
|
const refreshToken = (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.refreshToken;
|
|
@@ -237,7 +233,6 @@ var Api_service = class {
|
|
|
237
233
|
}
|
|
238
234
|
}
|
|
239
235
|
async logout() {
|
|
240
|
-
this.delete_cookie();
|
|
241
236
|
await func_try_catch({
|
|
242
237
|
fn: async () => {
|
|
243
238
|
const res = await fetch(this.base_url + this.api_endpoint.logout, {
|
|
@@ -249,10 +244,10 @@ var Api_service = class {
|
|
|
249
244
|
});
|
|
250
245
|
return await res.json();
|
|
251
246
|
},
|
|
252
|
-
onError: () => {
|
|
253
|
-
this.handle_error();
|
|
247
|
+
onError: (error) => {
|
|
248
|
+
this.handle_error(error);
|
|
254
249
|
}
|
|
255
|
-
});
|
|
250
|
+
}).finally(() => this.delete_cookie());
|
|
256
251
|
}
|
|
257
252
|
async auth_flow({ code }) {
|
|
258
253
|
var _a;
|
|
@@ -282,7 +277,6 @@ var auth_provider = ({
|
|
|
282
277
|
on_error,
|
|
283
278
|
on_unauthorized_redirect
|
|
284
279
|
}) => {
|
|
285
|
-
console.log("Fluoce Auth Provider mounted");
|
|
286
280
|
const auth_api = (0, import_react2.useMemo)(() => {
|
|
287
281
|
return new Api_service({
|
|
288
282
|
app_url,
|
|
@@ -295,18 +289,15 @@ var auth_provider = ({
|
|
|
295
289
|
const [auth_flow_loading, set_auth_flow_loading] = (0, import_react2.useState)(false);
|
|
296
290
|
const refresh = async () => {
|
|
297
291
|
var _a;
|
|
298
|
-
console.log("Called refresh()");
|
|
299
292
|
const response = await auth_api.refresh();
|
|
300
293
|
return (_a = response == null ? void 0 : response.success) != null ? _a : false;
|
|
301
294
|
};
|
|
302
295
|
const logout = async () => {
|
|
303
|
-
console.log("Called logout()");
|
|
304
296
|
await auth_api.logout();
|
|
305
297
|
set_user(null);
|
|
306
298
|
return true;
|
|
307
299
|
};
|
|
308
300
|
const auth_flow2 = async ({ code }) => {
|
|
309
|
-
console.log("Called auth_flow() with code:", code);
|
|
310
301
|
set_auth_flow_loading(true);
|
|
311
302
|
try {
|
|
312
303
|
const data = await auth_api.auth_flow({
|
|
@@ -325,7 +316,6 @@ var auth_provider = ({
|
|
|
325
316
|
}
|
|
326
317
|
};
|
|
327
318
|
const get_safe_user = async () => {
|
|
328
|
-
console.log("Called get_safe_user()");
|
|
329
319
|
set_safe_loading(true);
|
|
330
320
|
try {
|
|
331
321
|
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 if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async refresh() {\r\n const data = await func_try_catch<response_type<refresh_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.refresh, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async logout() {\r\n 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: (error) => {\r\n this.handle_error(error);\r\n },\r\n }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\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,41 @@ 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
|
-
|
|
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
|
+
if (this.on_error) {
|
|
146
|
+
this.on_error(error);
|
|
147
147
|
}
|
|
148
|
+
throw error;
|
|
148
149
|
}
|
|
149
|
-
);
|
|
150
|
-
if (data == null ? void 0 : data.success) {
|
|
151
|
-
return data;
|
|
152
|
-
} else {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
150
|
+
});
|
|
155
151
|
}
|
|
156
152
|
async exchange({ code }) {
|
|
157
153
|
var _a, _b;
|
|
@@ -164,10 +160,10 @@ var Api_service = class {
|
|
|
164
160
|
},
|
|
165
161
|
body: JSON.stringify({ code })
|
|
166
162
|
});
|
|
167
|
-
return
|
|
163
|
+
return this.handle_response_parse(res);
|
|
168
164
|
},
|
|
169
|
-
onError: () => {
|
|
170
|
-
this.handle_error();
|
|
165
|
+
onError: (error) => {
|
|
166
|
+
this.handle_error(error);
|
|
171
167
|
}
|
|
172
168
|
});
|
|
173
169
|
const refreshToken = (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.refreshToken;
|
|
@@ -193,10 +189,10 @@ var Api_service = class {
|
|
|
193
189
|
Authorization: `Bearer ${this.get_refresh_token()}`
|
|
194
190
|
}
|
|
195
191
|
});
|
|
196
|
-
return
|
|
192
|
+
return this.handle_response_parse(res);
|
|
197
193
|
},
|
|
198
|
-
onError: () => {
|
|
199
|
-
this.handle_error();
|
|
194
|
+
onError: (error) => {
|
|
195
|
+
this.handle_error(error);
|
|
200
196
|
}
|
|
201
197
|
});
|
|
202
198
|
const refreshToken = (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.refreshToken;
|
|
@@ -212,7 +208,6 @@ var Api_service = class {
|
|
|
212
208
|
}
|
|
213
209
|
}
|
|
214
210
|
async logout() {
|
|
215
|
-
this.delete_cookie();
|
|
216
211
|
await func_try_catch({
|
|
217
212
|
fn: async () => {
|
|
218
213
|
const res = await fetch(this.base_url + this.api_endpoint.logout, {
|
|
@@ -224,10 +219,10 @@ var Api_service = class {
|
|
|
224
219
|
});
|
|
225
220
|
return await res.json();
|
|
226
221
|
},
|
|
227
|
-
onError: () => {
|
|
228
|
-
this.handle_error();
|
|
222
|
+
onError: (error) => {
|
|
223
|
+
this.handle_error(error);
|
|
229
224
|
}
|
|
230
|
-
});
|
|
225
|
+
}).finally(() => this.delete_cookie());
|
|
231
226
|
}
|
|
232
227
|
async auth_flow({ code }) {
|
|
233
228
|
var _a;
|
|
@@ -257,7 +252,6 @@ var auth_provider = ({
|
|
|
257
252
|
on_error,
|
|
258
253
|
on_unauthorized_redirect
|
|
259
254
|
}) => {
|
|
260
|
-
console.log("Fluoce Auth Provider mounted");
|
|
261
255
|
const auth_api = use_memo(() => {
|
|
262
256
|
return new Api_service({
|
|
263
257
|
app_url,
|
|
@@ -270,18 +264,15 @@ var auth_provider = ({
|
|
|
270
264
|
const [auth_flow_loading, set_auth_flow_loading] = use_state(false);
|
|
271
265
|
const refresh = async () => {
|
|
272
266
|
var _a;
|
|
273
|
-
console.log("Called refresh()");
|
|
274
267
|
const response = await auth_api.refresh();
|
|
275
268
|
return (_a = response == null ? void 0 : response.success) != null ? _a : false;
|
|
276
269
|
};
|
|
277
270
|
const logout = async () => {
|
|
278
|
-
console.log("Called logout()");
|
|
279
271
|
await auth_api.logout();
|
|
280
272
|
set_user(null);
|
|
281
273
|
return true;
|
|
282
274
|
};
|
|
283
275
|
const auth_flow2 = async ({ code }) => {
|
|
284
|
-
console.log("Called auth_flow() with code:", code);
|
|
285
276
|
set_auth_flow_loading(true);
|
|
286
277
|
try {
|
|
287
278
|
const data = await auth_api.auth_flow({
|
|
@@ -300,7 +291,6 @@ var auth_provider = ({
|
|
|
300
291
|
}
|
|
301
292
|
};
|
|
302
293
|
const get_safe_user = async () => {
|
|
303
|
-
console.log("Called get_safe_user()");
|
|
304
294
|
set_safe_loading(true);
|
|
305
295
|
try {
|
|
306
296
|
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":";AAAA;AAAA,EACE,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,OACR;;;ACJA,IAAM,WAAW;AAEjB,IAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;;;ACPO,IAAM,QAAQ;AAAA,EACnB,aAAa,CAAC,QAAgB,oCAAoC,GAAG;AACvE;;;ACFO,SAAS,gBACd,MACA,OACA,MACM;AACN,QAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,EAAE,YAAY;AAChE,WAAS,SAAS,GAAG,IAAI,IAAI,mBAAmB,KAAK,CAAC,aAAa,OAAO;AAC5E;AAEO,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,UAAU,KAAK,QAAQ,0BAA0B,MAAM;AAC7D,QAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI,OAAO,aAAa,UAAU,UAAU;AAAA,EAC9C;AACA,SAAO,QAAQ,mBAAmB,MAAM,CAAC,CAAC,IAAI;AAChD;AAEO,SAAS,mBAAmB,MAAoB;AACrD,WAAS,SAAS,GAAG,IAAI;AAC3B;;;ACnBA,eAAsB,eAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAGsB;AACpB,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,OAAO;AACd,QAAI,SAAS;AACX,cAAQ,KAAK;AACb,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;;;ACCO,IAAM,cAAN,MAAmD;AAAA,EAqCxD,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AA5CH,SAAiB,WAAW;AAC5B,SAAiB,eAAe;AAGhC,SAAQ,WAA2B;AAAA,MACjC,MAAM;AAAA,IACR;AAEA,SAAiB,0BAA0B,CAAC,UAAmB;AAC7D,cAAQ,KAAK,eAAe,KAAK;AACjC,aAAO,SAAS,QAAQ,MAAM,YAAY,KAAK,OAAO,CAAC;AAAA,IACzD;AAEA,SAAiB,kBAAkB,CAAC,UAA0B;AA/BhE;AAgCI,eAAQ,UAAK,aAAL,mBAAe,MAAM;AAAA,QAC3B,KAAK;AACH,eAAK,wBAAwB,KAAK;AAClC;AAAA,QACF,KAAK;AACH,eAAK,SAAS,SAAS,KAAK;AAC5B;AAAA,QACF,KAAK;AACH;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAEA,SAAiB,eAAe,CAAC,UAA0B;AACzD,cAAQ,KAAK,eAAe,KAAK;AACjC,UAAI,KAAK,UAAU;AACjB,aAAK,SAAS,KAAK;AAAA,MACrB;AACA,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAkBA,SAAgB,mBAAmB,MAAqB;AACtD,aAAO,gBAAgB,aAAa;AAAA,IACtC;AAEA,SAAgB,oBAAoB,MAAqB;AACvD,aAAO,gBAAgB,cAAc;AAAA,IACvC;AAEA,SAAiB,gBAAgB,MAAM;AACrC,yBAAmB,aAAa;AAChC,yBAAmB,cAAc;AAAA,IACnC;AAlBE,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,QAAI,0BAA0B;AAC5B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAeA,MAAM,GAAG,EAAE,YAAY,GAA6B;AAClD,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,QACE,IAAI,YAAY;AACd,gBAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,YAC5D,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,YAC9E;AAAA,UACF,CAAC;AACD,iBAAO,MAAM,IAAI,KAAK;AAAA,QACxB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,eAAK,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,EAAE,YAAY,GAA6B;AACvD,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,QACE,IAAI,YAAY;AACd,gBAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,IAAI;AAAA,YAC5D,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,eAAe,UAAU,cAAc,cAAc,KAAK,iBAAiB,CAAC;AAAA,YAC9E;AAAA,UACF,CAAC;AACD,iBAAO,MAAM,IAAI,KAAK;AAAA,QACxB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,EAAE,KAAK,GAAqB;AAvI7C;AAwII,UAAM,OAAO,MAAM,eAAsD;AAAA,MACvE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,UAAU;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,QAC/B,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,aAAK,aAAa;AAAA,MACpB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,sBAAgB,gBAAgB,cAAc,EAAE;AAChD,sBAAgB,eAAe,aAAa,MAAM,KAAK,GAAG;AAAA,IAC5D;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AAvKlB;AAwKI,UAAM,OAAO,MAAM,eAAqD;AAAA,MACtE,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,SAAS;AAAA,UACjE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,aAAK,aAAa;AAAA,MACpB;AAAA,IACF,CAAC;AAED,UAAM,gBAAe,kCAAM,SAAN,mBAAY;AACjC,UAAM,eAAc,kCAAM,SAAN,mBAAY;AAEhC,QAAI,gBAAgB,aAAa;AAC/B,sBAAgB,gBAAgB,cAAc,EAAE;AAChD,sBAAgB,eAAe,aAAa,MAAM,KAAK,GAAG;AAAA,IAC5D;AAEA,QAAI,6BAAM,SAAS;AACjB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,SAAK,cAAc;AACnB,UAAM,eAAuC;AAAA,MAC3C,IAAI,YAAY;AACd,cAAM,MAAM,MAAM,MAAM,KAAK,WAAW,KAAK,aAAa,QAAQ;AAAA,UAChE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,KAAK,kBAAkB,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AACD,eAAO,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,aAAK,aAAa;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,EAAE,KAAK,GAAqB;AA1N9C;AA2NI,UAAM,gBAAgB,MAAM,KAAK,SAAS;AAAA,MACxC;AAAA,IACF,CAAC;AACD,QAAI,+CAAe,SAAS;AAC1B,YAAM,UAAU,MAAM,KAAK,GAAG;AAAA,QAC5B,cAAa,oDAAe,SAAf,mBAAqB;AAAA,MACpC,CAAC;AACD,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACvOA,SAAS,iBAAiB,sBAAsB;AAGzC,IAAM,eAAe,eAA8C,IAAI;;;ANwG1E;AAhGG,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,UAAQ,IAAI,8BAA8B;AAC1C,QAAM,WAAW,SAAS,MAAM;AAC9B,WAAO,IAAI,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,UAAU,wBAAwB,CAAC;AAEhD,QAAM,CAAC,MAAM,QAAQ,IAAI,UAA4B,IAAI;AAEzD,QAAM,CAAC,cAAc,gBAAgB,IAAI,UAAU,KAAK;AAExD,QAAM,CAAC,mBAAmB,qBAAqB,IAAI,UAAU,KAAK;AAElE,QAAM,UAAU,YAAY;AAhC9B;AAiCI,YAAQ,IAAI,kBAAkB;AAC9B,UAAM,WAAW,MAAM,SAAS,QAAQ;AACxC,YAAO,0CAAU,YAAV,YAAqB;AAAA,EAC9B;AAEA,QAAM,SAAS,YAAY;AACzB,YAAQ,IAAI,iBAAiB;AAC7B,UAAM,SAAS,OAAO;AACtB,aAAS,IAAI;AACb,WAAO;AAAA,EACT;AAEA,QAAMA,aAAY,OAAO,EAAE,KAAK,MAAwB;AACtD,YAAQ,IAAI,iCAAiC,IAAI;AACjD,0BAAsB,IAAI;AAC1B,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,UAAU;AAAA,QACpC;AAAA,MACF,CAAC;AACD,WAAI,6BAAM,aAAW,6BAAM,OAAM;AAC/B,iBAAS,6BAAM,IAAI;AACnB,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAChC,YAAQ,IAAI,wBAAwB;AACpC,qBAAiB,IAAI;AACrB,QAAI;AACF,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;AACtC,WAAI,6BAAM,aAAW,6BAAM,OAAM;AAC/B,iBAAS,6BAAM,IAAI;AACnB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,IACT,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,aAAW,MAAM;AACf,SAAK,cAAc;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAAA;AAAA,IACA;AAAA,IACA,IAAI,eAAe;AACjB,aAAO,SAAS,iBAAiB;AAAA,IACnC;AAAA,IACA,IAAI,gBAAgB;AAClB,aAAO,SAAS,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,SACE,oBAAC,aAAa,UAAb,EAAsB,OAAe,UAAS;AAEnD;;;AO7GA,SAAS,cAAc,mBAAmB;AAGnC,IAAM,WAAW,MAAM;AAC5B,QAAM,UAAU,YAAY,YAAY;AAExC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,SAAO;AACT;;;ACDW,0BAAAC,YAAA;AAPJ,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,WAAW;AACb,MAA4B;AAC1B,QAAM,EAAE,MAAM,aAAa,IAAI,SAAS;AAExC,MAAI,gBAAgB,CAAC,MAAM;AACzB,WAAO,gBAAAA,KAAA,YAAG,oBAAS;AAAA,EACrB;AAEA,MAAI,CAAC,QAAQ,CAAC,cAAc;AAC1B,WAAO,gBAAAA,KAAA,YAAG,oBAAS;AAAA,EACrB;AAEA,SAAO,gBAAAA,KAAA,YAAG,UAAS;AACrB;;;AClBA,SAAkC,aAAaC,mBAAkB;AAkCzD,gBAAAC,YAAA;AA/BD,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,EAAE,WAAAC,YAAW,kBAAkB,IAAI,SAAS;AAElD,EAAAC,YAAW,MAAM;AACf,UAAM,OAAO,YAAY;AACvB,UAAI,CAAC,KAAM;AACX,YAAM,UAAU,MAAMD,WAAU;AAAA,QAC9B;AAAA,MACF,CAAC;AACD,UAAI,SAAS;AACX,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,SAAK;AAAA,EACP,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB;AACrB,WACE,gBAAAD,KAAC,SACC,0BAAAA,KAAC,UAAK,mCAAqB,GAC7B;AAAA,EAEJ;AAEA,SAAO,gBAAAA,KAAC,SAAI,mCAAqB;AACnC;","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 if (this.on_error) {\r\n this.on_error(error);\r\n }\r\n throw error;\r\n },\r\n });\r\n }\r\n\r\n async exchange({ code }: { code: string }) {\r\n const data = await func_try_catch<response_type<exchange_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.exchange, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({ code }),\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async refresh() {\r\n const data = await func_try_catch<response_type<refresh_response_type>>({\r\n fn: async () => {\r\n const res = await fetch(this.base_url + this.api_endpoint.refresh, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.get_refresh_token()}`,\r\n },\r\n });\r\n return this.handle_response_parse(res);\r\n },\r\n onError: (error) => {\r\n this.handle_error(error);\r\n },\r\n });\r\n\r\n const refreshToken = data?.data?.refreshToken;\r\n const accessToken = data?.data?.accessToken;\r\n\r\n if (refreshToken && accessToken) {\r\n func_set_cookie(\"refreshToken\", refreshToken, 59);\r\n func_set_cookie(\"accessToken\", accessToken, 14 / (24 * 60));\r\n }\r\n\r\n if (data?.success) {\r\n return data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async logout() {\r\n 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: (error) => {\r\n this.handle_error(error);\r\n },\r\n }).finally(() => this.delete_cookie());\r\n }\r\n\r\n async auth_flow({ code }: { code: string }) {\r\n const exchange_data = await this.exchange({\r\n code,\r\n });\r\n if (exchange_data?.success) {\r\n const me_data = await this.me({\r\n accessToken: exchange_data?.data?.accessToken,\r\n });\r\n return me_data;\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { createContext as create_context } from \"react\";\r\nimport { auth_context_interface } from \"../types/auth_context_interface\";\r\n\r\nexport const auth_context = create_context<auth_context_interface | null>(null);\r\n","import { useContext as use_context } from \"react\";\r\nimport { auth_context } from \"../context/auth_context\";\r\n\r\nexport const use_auth = () => {\r\n const context = use_context(auth_context);\r\n\r\n if (!context) {\r\n throw new Error(\"use_auth must be used within an auth_provider\");\r\n }\r\n\r\n return context;\r\n};\r\n","import { use_auth } from \"../hook/use_auth\";\r\nimport { auth_guard_interface } from \"../types/auth_guard_interface\";\r\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"]}
|