@a-tech.jo/auth-sdk 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.js ADDED
@@ -0,0 +1,767 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AuthClient: () => AuthClient,
24
+ AuthProvider: () => AuthProvider,
25
+ DEFAULT_ENDPOINTS: () => DEFAULT_ENDPOINTS,
26
+ DEFAULT_ENVIRONMENT_URLS: () => DEFAULT_ENVIRONMENT_URLS,
27
+ DEFAULT_SDK_CONFIG: () => DEFAULT_SDK_CONFIG,
28
+ DEFAULT_STORAGE_KEYS: () => DEFAULT_STORAGE_KEYS,
29
+ DEFAULT_THEME: () => DEFAULT_THEME,
30
+ SDKAuthContainer: () => SDKAuthContainer,
31
+ getSDKConfig: () => getSDKConfig,
32
+ useAuth: () => useAuth
33
+ });
34
+ module.exports = __toCommonJS(index_exports);
35
+
36
+ // src/config.ts
37
+ var DEFAULT_ENVIRONMENT_URLS = {
38
+ production: "https://auth.atech-workspace.com",
39
+ stage: "https://stage.auth.atech-workspace.com",
40
+ local: "http://localhost:3000"
41
+ };
42
+ var DEFAULT_ENDPOINTS = {
43
+ login: "/api/auth/login",
44
+ register: "/api/auth/signup",
45
+ forgotPassword: "/api/auth/forgot-password",
46
+ resetPassword: "/api/auth/reset-password",
47
+ refreshToken: "/api/auth/refresh-token",
48
+ me: "/api/auth/me"
49
+ };
50
+ var DEFAULT_STORAGE_KEYS = {
51
+ accessToken: "atech_access_token",
52
+ refreshToken: "atech_refresh_token"
53
+ };
54
+ var DEFAULT_THEME = {
55
+ primary: "#7c3aed",
56
+ // Purple
57
+ navy: "#0f172a",
58
+ // Dark Slate/Navy
59
+ pink: "#ec4899",
60
+ // Pink Accent
61
+ bg: "#ffffff"
62
+ // White Card
63
+ };
64
+ var DEFAULT_SDK_CONFIG = {
65
+ environment: "production",
66
+ environmentUrls: DEFAULT_ENVIRONMENT_URLS,
67
+ endpoints: DEFAULT_ENDPOINTS,
68
+ storageKeys: DEFAULT_STORAGE_KEYS,
69
+ theme: DEFAULT_THEME,
70
+ brand: {
71
+ logoUrl: "/images/logo.png",
72
+ companyName: "A-Tech"
73
+ }
74
+ };
75
+ function getSDKConfig(options = {}) {
76
+ const environment = options.environment || DEFAULT_SDK_CONFIG.environment;
77
+ const baseUrl = (options.customBaseUrl || options.environmentUrls?.[environment] || DEFAULT_ENVIRONMENT_URLS[environment]).replace(/\/$/, "");
78
+ return {
79
+ environment,
80
+ baseUrl,
81
+ endpoints: {
82
+ ...DEFAULT_ENDPOINTS,
83
+ ...options.endpoints
84
+ },
85
+ storageKeys: {
86
+ ...DEFAULT_STORAGE_KEYS,
87
+ ...options.storageKeys
88
+ },
89
+ theme: {
90
+ ...DEFAULT_THEME,
91
+ ...options.theme
92
+ },
93
+ brand: {
94
+ ...DEFAULT_SDK_CONFIG.brand,
95
+ ...options.brand
96
+ },
97
+ onSuccess: options.onSuccess,
98
+ onError: options.onError
99
+ };
100
+ }
101
+
102
+ // src/client.ts
103
+ var AuthClient = class {
104
+ constructor(options = {}) {
105
+ this.config = getSDKConfig(options);
106
+ }
107
+ async request(endpoint, data) {
108
+ const url = `${this.config.baseUrl}${endpoint}`;
109
+ const response = await fetch(url, {
110
+ method: "POST",
111
+ headers: { "Content-Type": "application/json" },
112
+ body: JSON.stringify(data)
113
+ });
114
+ const result = await response.json();
115
+ if (!response.ok) {
116
+ throw new Error(result.error || result.message || "Authentication request failed");
117
+ }
118
+ return result;
119
+ }
120
+ async login(payload) {
121
+ return this.request(this.config.endpoints.login, payload);
122
+ }
123
+ async register(payload) {
124
+ return this.request(this.config.endpoints.register, payload);
125
+ }
126
+ async forgotPassword(payload) {
127
+ return this.request(this.config.endpoints.forgotPassword, payload);
128
+ }
129
+ async resetPassword(payload) {
130
+ return this.request(this.config.endpoints.resetPassword, payload);
131
+ }
132
+ };
133
+
134
+ // src/AuthContext.tsx
135
+ var import_react = require("react");
136
+ var import_jsx_runtime = require("react/jsx-runtime");
137
+ var AuthContext = (0, import_react.createContext)(null);
138
+ function isTokenExpired(token) {
139
+ if (!token) return true;
140
+ try {
141
+ const base64Url = token.split(".")[1];
142
+ if (!base64Url) return true;
143
+ const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
144
+ const jsonPayload = decodeURIComponent(
145
+ window.atob(base64).split("").map((c) => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join("")
146
+ );
147
+ const { exp } = JSON.parse(jsonPayload);
148
+ if (!exp) return false;
149
+ return Date.now() >= exp * 1e3;
150
+ } catch {
151
+ return true;
152
+ }
153
+ }
154
+ var AuthProvider = ({ config = {}, children }) => {
155
+ const [client] = (0, import_react.useState)(() => new AuthClient(config));
156
+ const [token, setToken] = (0, import_react.useState)(null);
157
+ const [user, setUser] = (0, import_react.useState)(null);
158
+ (0, import_react.useEffect)(() => {
159
+ if (typeof window !== "undefined") {
160
+ const savedToken = localStorage.getItem("auth_token");
161
+ if (savedToken) setToken(savedToken);
162
+ }
163
+ }, []);
164
+ const saveSession = (res) => {
165
+ if (res.token) {
166
+ setToken(res.token);
167
+ if (typeof window !== "undefined") {
168
+ localStorage.setItem("auth_token", res.token);
169
+ if (res.refreshToken) {
170
+ localStorage.setItem("auth_refresh_token", res.refreshToken);
171
+ }
172
+ }
173
+ }
174
+ if (res.user) setUser(res.user);
175
+ if (config.onSuccess) config.onSuccess(res);
176
+ };
177
+ const login = async (payload) => {
178
+ try {
179
+ const res = await client.login(payload);
180
+ saveSession(res);
181
+ return res;
182
+ } catch (err) {
183
+ if (config.onError) config.onError(err);
184
+ throw err;
185
+ }
186
+ };
187
+ const register = async (payload) => {
188
+ try {
189
+ const res = await client.register(payload);
190
+ saveSession(res);
191
+ return res;
192
+ } catch (err) {
193
+ if (config.onError) config.onError(err);
194
+ throw err;
195
+ }
196
+ };
197
+ const logout = () => {
198
+ setToken(null);
199
+ setUser(null);
200
+ if (typeof window !== "undefined") {
201
+ localStorage.removeItem("auth_token");
202
+ localStorage.removeItem("auth_refresh_token");
203
+ }
204
+ };
205
+ const isExpired = (0, import_react.useMemo)(() => isTokenExpired(token), [token]);
206
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
207
+ AuthContext.Provider,
208
+ {
209
+ value: {
210
+ client,
211
+ token,
212
+ user,
213
+ login,
214
+ register,
215
+ logout,
216
+ isAuthenticated: !!token && !isExpired,
217
+ isExpired
218
+ },
219
+ children
220
+ }
221
+ );
222
+ };
223
+ var useAuth = () => {
224
+ const context = (0, import_react.useContext)(AuthContext);
225
+ if (!context) {
226
+ throw new Error("useAuth must be used within an <AuthProvider />");
227
+ }
228
+ return context;
229
+ };
230
+
231
+ // src/components/AuthContainer.tsx
232
+ var import_react5 = require("react");
233
+
234
+ // src/components/LoginForm.tsx
235
+ var import_react2 = require("react");
236
+
237
+ // src/assets/images/logo.png
238
+ var logo_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAADuCAMAAAAa9KE8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFbgnMaArEIRBhHhFd6NH7cgnSqYbS6+H2dAnUZAq+KBBrFRFRagrGeAjaXgu2RA2R8eD+pIbMYUuV3NHrYwq8jgb4fgjiOQ6CTwyhiAfwbQnKjQf2VAyohAfqu4TrGBFVmIe7WAuufQjg9fD6Og6EYAu5egjcWguwdwnYcAnPJhBoiXiwSg2bcDqySA2YigfzUAyiUgymUi6R3cL1Pg6KEhJNhgfuXAu0ZUubDRJFJBBmonbTvKTbZwrCw6TllC7pZgrBLw90gwfp1cLqrkT/Qg2PgAjlChJBtYXjRg2VYQu6GhFYXEyOMA92kAb7dgnXcQnQdynGQA2NTAydkAb6yMTYgQjmhUjGwYP0Kg9uNg5+48H+TAyc2rL7VwusoCn8w7TaLA9xXAuy1qL+bArJy7PlfUm70sLmMg95hgfsgDjJxYP5p5bGEBJKnIfBPQ6IqWXlVgyqPA6HyYP/mGfOiwf0l3fEmBb8HBFaypP3umP8tZTaRw2WQg2OfWmoWxuohVi9LQ9ynmbWMg94IhBkDhJInEbmZBq1AxM45eHuUgykVgurBhM8a1uapUXysIXcKSBkSwyc8vD3BBM62MLvz8PhraXFplXri1fGNw6AvoTwhhfku5TioYbH////oUbtFBFPc0quakqhPB5+cxnJvHT1nZe5CBM/zaLytKXPjoiumlbajEfQkwb/SB2OubXNSDWBvbTTbBnAUxyexJPvfBjVjgb3tVT/e1mvrpXQimi6Sx2S0LLtqEX3YiqpkVfOPx6CMx9xawrIYgq7UQykewjecgnRfAjfQQ2OWwuydQnWaArDSA2XWAutZQq/jAf1Lg9zhQfsMQ94QA6Mkgb+Pg6JggjnFxFTTgyfbwnNVQypeAjZggjojwb5fwjjXQu1kgb9bQnLKw9vRQ2TXwu3NA97iQfxhwfveQjbUwynaQrFYwq9NQ59fQjhkwb+CxJDPw6LcwnTIBBfWQuvSQ2ZwnP/0JL/9/D+uITobArKXDuXr1X3LSBogRfdqXXdAAAAHWn4xgAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAACUvSURBVHja7J17eFTVucajYGKxIpBSULHgSQALUuUiWKAECCAS0EbkIEQuFrkYEImhJAKHICIMRYxGQFEYwVuBQ61FLUKFtqK2gFDEokBVqtwsUovFGuX0ON0zmcu+rPV939p77T179t6f9I8+j848w/z4ePOutd83KxJMJDJo0PbofOc7n376LWX2KNNbmR8ps+ucc845efLkt5V5TZnbb7/9kksu+eijLGUOHjz4fWV+rMybb5533ufKnH/++TuVuVGZK6644i9/ufDCT5Rpo8wbyvxBmf/6+9+/q8yHygwYMOC/lXn33fff79u372XKvK1MV2VOnDhxsTLHlbnqqqt+qsyflLn00kt/3bRp0w+UufmG6Pz1r3/+859/EUxisvzO8dGjrZUZlMD50yTOveM479oVo1mPc5xmPc7ngzjHaE7hPCCFc18tzidSOF+Vwlmh+dKmdTjX0RzD+bOA4gDmSKShMkePGnA2LGctzrrlnMD5TQXnz7U4x2lO4Kxazn9PLecBqeWcwPmOFM7HUzj/KYWzejkHOAcwR7odVkaF8yBca5xka42DRq1xvnY5X0jVGn0pWoOBcwCyn2He0U0ZLc0srbEH1hofOaU1dDgHWiOAOYWyMj+poxnCGdYatzO0xo+NWkOH8xtanD9U48zTGmzpHGiNAOZIpK0yfJz5WmOXnVpjgFFriErnAGbfoXxGmQTO3bQ4t8alsyyt8YZWawQ2XQCz+OzefbmaZoLW+BZfa7xmVmsENl0As/UZPVqhmYDzdvM23Y+NNt2NDtp0Acw+mbLFo0cbce5mxHmQG44EA5sugJk/h8rKFutxTixn6zZdVhpsukBr+BXmQ4cUmtnL2Rabjn0kKNGmC44EfQtzixaHYjgvFsDZzTZdoDX8C/Pf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";
239
+
240
+ // src/components/LoginForm.tsx
241
+ var import_jsx_runtime2 = require("react/jsx-runtime");
242
+ var SDKLoginForm = ({
243
+ onSuccess,
244
+ onForgotPasswordClick,
245
+ onRegisterClick,
246
+ className = ""
247
+ }) => {
248
+ const { login, client } = useAuth();
249
+ const [email, setEmail] = (0, import_react2.useState)("");
250
+ const [password, setPassword] = (0, import_react2.useState)("");
251
+ const [loading, setLoading] = (0, import_react2.useState)(false);
252
+ const [error, setError] = (0, import_react2.useState)(null);
253
+ const colors = client?.config?.theme || {
254
+ primary: "#7c3aed",
255
+ navy: "#0f172a",
256
+ pink: "#ec4899",
257
+ bg: "#ffffff"
258
+ };
259
+ const dynamicThemeVars = {
260
+ "--atech-primary": colors.primary,
261
+ "--atech-navy": colors.navy,
262
+ "--atech-pink": colors.pink,
263
+ "--atech-bg": colors.bg
264
+ };
265
+ const logoSrc = client?.config?.brand?.logoUrl || logo_default;
266
+ const handleSubmit = async (e) => {
267
+ e.preventDefault();
268
+ setLoading(true);
269
+ setError(null);
270
+ try {
271
+ await login({ email, password });
272
+ if (onSuccess) onSuccess();
273
+ } catch (err) {
274
+ setError(err.message || "Invalid credentials provided.");
275
+ } finally {
276
+ setLoading(false);
277
+ }
278
+ };
279
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: `atech-card ${className}`, style: dynamicThemeVars, children: [
280
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "atech-header", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
281
+ "img",
282
+ {
283
+ src: logoSrc,
284
+ alt: client?.config?.brand?.companyName || "Logo",
285
+ className: "atech-logo"
286
+ }
287
+ ) }),
288
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { className: "atech-title", children: "Sign In" }),
289
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "atech-error", children: error }),
290
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("form", { onSubmit: handleSubmit, className: "atech-form", children: [
291
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "atech-field", children: [
292
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "atech-label", children: "Email Address" }),
293
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
294
+ "input",
295
+ {
296
+ type: "email",
297
+ required: true,
298
+ placeholder: "john@example.com",
299
+ value: email,
300
+ onChange: (e) => setEmail(e.target.value),
301
+ className: "atech-input"
302
+ }
303
+ )
304
+ ] }),
305
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "atech-field", children: [
306
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "atech-label", children: "Password" }),
307
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
308
+ "input",
309
+ {
310
+ type: "password",
311
+ required: true,
312
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
313
+ value: password,
314
+ onChange: (e) => setPassword(e.target.value),
315
+ className: "atech-input"
316
+ }
317
+ )
318
+ ] }),
319
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "submit", disabled: loading, className: "atech-button", children: loading ? "Signing in..." : "Sign In" })
320
+ ] }),
321
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "atech-footer", children: [
322
+ onForgotPasswordClick ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: onForgotPasswordClick, className: "atech-link", children: "Forgot Password?" }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", {}),
323
+ onRegisterClick && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: onRegisterClick, className: "atech-link", children: "Create Account" })
324
+ ] })
325
+ ] });
326
+ };
327
+
328
+ // src/components/RegisterForm.tsx
329
+ var import_react3 = require("react");
330
+ var import_jsx_runtime3 = require("react/jsx-runtime");
331
+ var SDKRegisterForm = ({
332
+ onSuccess,
333
+ onLoginClick,
334
+ className = ""
335
+ }) => {
336
+ const { register, client } = useAuth();
337
+ const [firstName, setFirstName] = (0, import_react3.useState)("");
338
+ const [lastName, setLastName] = (0, import_react3.useState)("");
339
+ const [email, setEmail] = (0, import_react3.useState)("");
340
+ const [phoneNumber, setPhoneNumber] = (0, import_react3.useState)("");
341
+ const [password, setPassword] = (0, import_react3.useState)("");
342
+ const [loading, setLoading] = (0, import_react3.useState)(false);
343
+ const [error, setError] = (0, import_react3.useState)(null);
344
+ const [countries, setCountries] = (0, import_react3.useState)([]);
345
+ const [selectedCountry, setSelectedCountry] = (0, import_react3.useState)({
346
+ id: 0,
347
+ name: "United States",
348
+ phoneCode: "+1",
349
+ nameIso2: "US"
350
+ });
351
+ const [isDropdownOpen, setIsDropdownOpen] = (0, import_react3.useState)(false);
352
+ const [searchQuery, setSearchQuery] = (0, import_react3.useState)("");
353
+ const dropdownRef = (0, import_react3.useRef)(null);
354
+ const colors = client?.config?.theme || {
355
+ primary: "#7c3aed",
356
+ navy: "#0f172a",
357
+ pink: "#ec4899",
358
+ bg: "#ffffff"
359
+ };
360
+ const dynamicThemeVars = {
361
+ "--atech-primary": colors.primary,
362
+ "--atech-navy": colors.navy,
363
+ "--atech-pink": colors.pink,
364
+ "--atech-bg": colors.bg
365
+ };
366
+ const logoSrc = client?.config?.brand?.logoUrl || logo_default;
367
+ (0, import_react3.useEffect)(() => {
368
+ if (client && typeof client.searchCountries === "function") {
369
+ client.searchCountries("").then((res) => {
370
+ if (res?.data && Array.isArray(res.data) && res.data.length > 0) {
371
+ setCountries(res.data);
372
+ const defaultC = res.data.find((c) => c.phoneCode);
373
+ if (defaultC) setSelectedCountry(defaultC);
374
+ }
375
+ }).catch(() => fallbackCountries());
376
+ } else {
377
+ fallbackCountries();
378
+ }
379
+ }, [client]);
380
+ const fallbackCountries = () => {
381
+ setCountries([
382
+ { id: 1, name: "United States", phoneCode: "+1", nameIso2: "US" },
383
+ { id: 2, name: "Jordan", phoneCode: "+962", nameIso2: "JO" },
384
+ { id: 3, name: "United Kingdom", phoneCode: "+44", nameIso2: "GB" },
385
+ { id: 4, name: "Germany", phoneCode: "+49", nameIso2: "DE" },
386
+ { id: 5, name: "Canada", phoneCode: "+1", nameIso2: "CA" }
387
+ ]);
388
+ };
389
+ (0, import_react3.useEffect)(() => {
390
+ const handleClickOutside = (event) => {
391
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
392
+ setIsDropdownOpen(false);
393
+ }
394
+ };
395
+ document.addEventListener("mousedown", handleClickOutside);
396
+ return () => document.removeEventListener("mousedown", handleClickOutside);
397
+ }, []);
398
+ const getFlagEmoji = (isoCode) => {
399
+ if (!isoCode || isoCode.length !== 2) return "\u{1F310}";
400
+ const codePoints = isoCode.toUpperCase().split("").map((char) => 127397 + char.charCodeAt(0));
401
+ return String.fromCodePoint(...codePoints);
402
+ };
403
+ const filteredCountries = countries.filter((c) => {
404
+ const q = searchQuery.toLowerCase();
405
+ return c.name.toLowerCase().includes(q) || c.nameIso2 && c.nameIso2.toLowerCase().includes(q) || c.phoneCode && c.phoneCode.includes(q);
406
+ });
407
+ const handleSubmit = async (e) => {
408
+ e.preventDefault();
409
+ setLoading(true);
410
+ setError(null);
411
+ try {
412
+ const code = selectedCountry.phoneCode ? selectedCountry.phoneCode.startsWith("+") ? selectedCountry.phoneCode : `+${selectedCountry.phoneCode}` : "+1";
413
+ const rawPhone = phoneNumber ? phoneNumber.trim().replace(/^\+/, "") : "";
414
+ const formattedPhoneNumber = rawPhone ? `${code} ${rawPhone}` : "";
415
+ const payload = {
416
+ firstName,
417
+ lastName,
418
+ email,
419
+ phoneNumber: formattedPhoneNumber,
420
+ password
421
+ };
422
+ await register(payload);
423
+ if (onSuccess) onSuccess();
424
+ } catch (err) {
425
+ setError(err.message || "Registration failed. Please try again.");
426
+ } finally {
427
+ setLoading(false);
428
+ }
429
+ };
430
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: `atech-card ${className}`, style: dynamicThemeVars, children: [
431
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "atech-header", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
432
+ "img",
433
+ {
434
+ src: logoSrc,
435
+ alt: client?.config?.brand?.companyName || "Logo",
436
+ className: "atech-logo"
437
+ }
438
+ ) }),
439
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: "atech-title", children: "Create Account" }),
440
+ error && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "atech-error", children: error }),
441
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("form", { onSubmit: handleSubmit, className: "atech-form", children: [
442
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.75rem" }, children: [
443
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "atech-field", children: [
444
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { className: "atech-label", children: "First Name" }),
445
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
446
+ "input",
447
+ {
448
+ type: "text",
449
+ required: true,
450
+ placeholder: "John",
451
+ value: firstName,
452
+ onChange: (e) => setFirstName(e.target.value),
453
+ className: "atech-input"
454
+ }
455
+ )
456
+ ] }),
457
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "atech-field", children: [
458
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { className: "atech-label", children: "Last Name" }),
459
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
460
+ "input",
461
+ {
462
+ type: "text",
463
+ required: true,
464
+ placeholder: "Doe",
465
+ value: lastName,
466
+ onChange: (e) => setLastName(e.target.value),
467
+ className: "atech-input"
468
+ }
469
+ )
470
+ ] })
471
+ ] }),
472
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "atech-field", children: [
473
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { className: "atech-label", children: "Email Address" }),
474
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
475
+ "input",
476
+ {
477
+ type: "email",
478
+ required: true,
479
+ placeholder: "john@example.com",
480
+ value: email,
481
+ onChange: (e) => setEmail(e.target.value),
482
+ className: "atech-input"
483
+ }
484
+ )
485
+ ] }),
486
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "atech-field", children: [
487
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { className: "atech-label", children: "Phone Number" }),
488
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: "0.5rem", position: "relative" }, ref: dropdownRef, children: [
489
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
490
+ "button",
491
+ {
492
+ type: "button",
493
+ onClick: () => setIsDropdownOpen(!isDropdownOpen),
494
+ className: "atech-country-trigger",
495
+ children: [
496
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: getFlagEmoji(selectedCountry.nameIso2) }),
497
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontWeight: 600 }, children: selectedCountry.phoneCode ? selectedCountry.phoneCode.startsWith("+") ? selectedCountry.phoneCode : `+${selectedCountry.phoneCode}` : "+1" }),
498
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: "0.75rem", opacity: 0.6 }, children: "\u25BC" })
499
+ ]
500
+ }
501
+ ),
502
+ isDropdownOpen && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "atech-country-popover", children: [
503
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
504
+ "input",
505
+ {
506
+ type: "text",
507
+ autoFocus: true,
508
+ placeholder: "Search country or code...",
509
+ value: searchQuery,
510
+ onChange: (e) => setSearchQuery(e.target.value),
511
+ className: "atech-input",
512
+ style: { padding: "0.375rem 0.5rem", fontSize: "0.75rem", marginBottom: "0.5rem" }
513
+ }
514
+ ),
515
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "atech-country-list", children: filteredCountries.length > 0 ? filteredCountries.map((c) => {
516
+ const code = c.phoneCode ? c.phoneCode.startsWith("+") ? c.phoneCode : `+${c.phoneCode}` : "+1";
517
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
518
+ "button",
519
+ {
520
+ type: "button",
521
+ onClick: () => {
522
+ setSelectedCountry(c);
523
+ setIsDropdownOpen(false);
524
+ setSearchQuery("");
525
+ },
526
+ className: "atech-country-option",
527
+ children: [
528
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { display: "flex", alignItems: "center", gap: "0.5rem", overflow: "hidden" }, children: [
529
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: getFlagEmoji(c.nameIso2) }),
530
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: c.name })
531
+ ] }),
532
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontFamily: "monospace", color: "#64748b", fontWeight: 600 }, children: code })
533
+ ]
534
+ },
535
+ c.id
536
+ );
537
+ }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { padding: "0.5rem", fontSize: "0.75rem", color: "#94a3b8", textAlign: "center" }, children: "No countries found" }) })
538
+ ] }),
539
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
540
+ "input",
541
+ {
542
+ type: "tel",
543
+ placeholder: "(555) 000-0000",
544
+ value: phoneNumber,
545
+ onChange: (e) => setPhoneNumber(e.target.value),
546
+ className: "atech-input",
547
+ style: { flex: 1 }
548
+ }
549
+ )
550
+ ] })
551
+ ] }),
552
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "atech-field", children: [
553
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("label", { className: "atech-label", children: "Password" }),
554
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
555
+ "input",
556
+ {
557
+ type: "password",
558
+ required: true,
559
+ placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
560
+ value: password,
561
+ onChange: (e) => setPassword(e.target.value),
562
+ className: "atech-input"
563
+ }
564
+ )
565
+ ] }),
566
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "submit", disabled: loading, className: "atech-button", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
567
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
568
+ "svg",
569
+ {
570
+ className: "atech-spinner",
571
+ xmlns: "http://www.w3.org/2000/svg",
572
+ fill: "none",
573
+ viewBox: "0 0 24 24",
574
+ children: [
575
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
576
+ "circle",
577
+ {
578
+ style: { opacity: 0.25 },
579
+ cx: "12",
580
+ cy: "12",
581
+ r: "10",
582
+ stroke: "currentColor",
583
+ strokeWidth: "4"
584
+ }
585
+ ),
586
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
587
+ "path",
588
+ {
589
+ style: { opacity: 0.75 },
590
+ fill: "currentColor",
591
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
592
+ }
593
+ )
594
+ ]
595
+ }
596
+ ),
597
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: "Creating Account..." })
598
+ ] }) : "Register" })
599
+ ] }),
600
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "atech-footer", style: { justifyContent: "center" }, children: onLoginClick && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", onClick: onLoginClick, className: "atech-link", children: "Already have an account? Sign In" }) })
601
+ ] });
602
+ };
603
+
604
+ // src/components/ForgotPasswordForm.tsx
605
+ var import_react4 = require("react");
606
+ var import_jsx_runtime4 = require("react/jsx-runtime");
607
+ var SDKForgotPasswordForm = ({
608
+ onSuccess,
609
+ onLoginClick,
610
+ className = ""
611
+ }) => {
612
+ const { client } = useAuth();
613
+ const [email, setEmail] = (0, import_react4.useState)("");
614
+ const [loading, setLoading] = (0, import_react4.useState)(false);
615
+ const [submitted, setSubmitted] = (0, import_react4.useState)(false);
616
+ const [error, setError] = (0, import_react4.useState)(null);
617
+ const colors = client?.config?.theme || {
618
+ primary: "#7c3aed",
619
+ navy: "#0f172a",
620
+ pink: "#ec4899",
621
+ bg: "#ffffff"
622
+ };
623
+ const dynamicThemeVars = {
624
+ "--atech-primary": colors.primary,
625
+ "--atech-navy": colors.navy,
626
+ "--atech-pink": colors.pink,
627
+ "--atech-bg": colors.bg
628
+ };
629
+ const logoSrc = client?.config?.brand?.logoUrl || logo_default;
630
+ const handleSubmit = async (e) => {
631
+ e.preventDefault();
632
+ setLoading(true);
633
+ setError(null);
634
+ try {
635
+ await client.forgotPassword({ email });
636
+ setSubmitted(true);
637
+ if (onSuccess) onSuccess();
638
+ } catch (err) {
639
+ setError(err.message || "Failed to send reset email. Please try again.");
640
+ } finally {
641
+ setLoading(false);
642
+ }
643
+ };
644
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: `atech-card ${className}`, style: dynamicThemeVars, children: [
645
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "atech-header", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
646
+ "img",
647
+ {
648
+ src: logoSrc,
649
+ alt: client?.config?.brand?.companyName || "Logo",
650
+ className: "atech-logo"
651
+ }
652
+ ) }),
653
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h1", { className: "atech-title", children: "Reset Password" }),
654
+ submitted ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { textAlign: "center" }, children: [
655
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("p", { style: { fontSize: "0.875rem", color: "#334155", marginBottom: "1.5rem" }, children: [
656
+ "If an account exists for ",
657
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: email }),
658
+ ", a password reset link has been sent."
659
+ ] }),
660
+ onLoginClick && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", onClick: onLoginClick, className: "atech-button", children: "Return to Sign In" })
661
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
662
+ error && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "atech-error", children: error }),
663
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("form", { onSubmit: handleSubmit, className: "atech-form", children: [
664
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "atech-field", children: [
665
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("label", { className: "atech-label", children: "Email Address" }),
666
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
667
+ "input",
668
+ {
669
+ type: "email",
670
+ required: true,
671
+ placeholder: "john@example.com",
672
+ value: email,
673
+ onChange: (e) => setEmail(e.target.value),
674
+ className: "atech-input"
675
+ }
676
+ )
677
+ ] }),
678
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "submit", disabled: loading, className: "atech-button", children: loading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
679
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
680
+ "svg",
681
+ {
682
+ className: "atech-spinner",
683
+ xmlns: "http://www.w3.org/2000/svg",
684
+ fill: "none",
685
+ viewBox: "0 0 24 24",
686
+ children: [
687
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
688
+ "circle",
689
+ {
690
+ style: { opacity: 0.25 },
691
+ cx: "12",
692
+ cy: "12",
693
+ r: "10",
694
+ stroke: "currentColor",
695
+ strokeWidth: "4"
696
+ }
697
+ ),
698
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
699
+ "path",
700
+ {
701
+ style: { opacity: 0.75 },
702
+ fill: "currentColor",
703
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
704
+ }
705
+ )
706
+ ]
707
+ }
708
+ ),
709
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Sending Reset Link..." })
710
+ ] }) : "Send Reset Link" })
711
+ ] }),
712
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "atech-footer", style: { justifyContent: "center" }, children: onLoginClick && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", onClick: onLoginClick, className: "atech-link", children: "Back to Sign In" }) })
713
+ ] })
714
+ ] });
715
+ };
716
+
717
+ // src/components/AuthContainer.tsx
718
+ var import_jsx_runtime5 = require("react/jsx-runtime");
719
+ var SDKAuthContainer = ({
720
+ initialMode = "login",
721
+ onSuccess,
722
+ className = "",
723
+ ssoMessage = "A-Tech Single Sign-On"
724
+ }) => {
725
+ const [mode, setMode] = (0, import_react5.useState)(initialMode);
726
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: `atech-auth-wrapper ${className}`, children: [
727
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "atech-sso-badge", children: [
728
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "atech-sso-pulse" }),
729
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "atech-sso-text", children: ssoMessage })
730
+ ] }),
731
+ mode === "login" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
732
+ SDKLoginForm,
733
+ {
734
+ onSuccess,
735
+ onRegisterClick: () => setMode("register"),
736
+ onForgotPasswordClick: () => setMode("forgot-password")
737
+ }
738
+ ),
739
+ mode === "register" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
740
+ SDKRegisterForm,
741
+ {
742
+ onSuccess,
743
+ onLoginClick: () => setMode("login")
744
+ }
745
+ ),
746
+ mode === "forgot-password" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
747
+ SDKForgotPasswordForm,
748
+ {
749
+ onSuccess,
750
+ onLoginClick: () => setMode("login")
751
+ }
752
+ )
753
+ ] });
754
+ };
755
+ // Annotate the CommonJS export names for ESM import in node:
756
+ 0 && (module.exports = {
757
+ AuthClient,
758
+ AuthProvider,
759
+ DEFAULT_ENDPOINTS,
760
+ DEFAULT_ENVIRONMENT_URLS,
761
+ DEFAULT_SDK_CONFIG,
762
+ DEFAULT_STORAGE_KEYS,
763
+ DEFAULT_THEME,
764
+ SDKAuthContainer,
765
+ getSDKConfig,
766
+ useAuth
767
+ });