@kendevelops/auth-flow-kit 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,30 +1,261 @@
1
- # Auth Flow Kit
1
+ # @kendevelops/auth-flow-kit
2
2
 
3
- A lightweight authentication toolkit for **React** and **Next.js 13–16 (App Router)**, built with TypeScript.
3
+ A lightweight authentication toolkit for **React** and **Next.js 13–16 (App Router)** that extends beyond tools like **ReduxToolkit** and **Zustand** style global state management for authentication, as it also comes with prebuilt UI screens and a globally accessible `useAuth()` hook.
4
4
 
5
- Provides:
5
+ ## ⭐ What This Library Really Is
6
6
 
7
- - 🔐 AuthProvider global auth context
8
- - 🔑 login / signup / logout helpers
9
- - 🧬 Protected – gated routes/pages
10
- - 🧩 Built-in LoginScreen & SignupScreen
11
- - 📡 Works with any backend API
12
- - ⚡ Simple drop-in integration
13
- - 🪶 Very lightweight bundle
7
+ **auth-flow-kit** is not a traditional backend-driven auth framework:
14
8
 
15
- Built and maintained by **Kenneth Nnabuife (Ken Develops)**.
9
+ - Authentication state is global
10
+ - User + token are stored in localStorage
11
+ - State is restored automatically when the user refreshes the page
12
+ - No extra network calls are needed to reload the session
13
+ - You can access auth from _any component_:
14
+
15
+ ```tsx
16
+ const { user, login, logout, getToken } = useAuth();
17
+ ```
18
+
19
+ Plus, you get **prebuilt UI screens**:
20
+
21
+ - `<LoginScreen />`
22
+ - `<SignupScreen />`
23
+ - `<PasswordResetScreen />`
24
+
25
+ And a simple `<Protected>` wrapper to guard pages.
16
26
 
17
27
  ---
18
28
 
19
- ## 🚀 Installation
29
+ ## 📦 Installation
20
30
 
21
- **npm**
31
+ ```
22
32
  npm install @kendevelops/auth-flow-kit
33
+ ```
23
34
 
24
- bun
35
+ or
25
36
 
37
+ ```
26
38
  bun add @kendevelops/auth-flow-kit
39
+ ```
40
+
41
+ ---
42
+
43
+ # 🚀 Usage (Next.js App Router)
44
+
45
+ Next.js layouts are server components, so we wrap the provider in a small client component.
46
+
47
+ ## 1. Create `app/AuthProviderClient.tsx`
48
+
49
+ ```tsx
50
+ "use client";
51
+
52
+ import { AuthProvider } from "@kendevelops/auth-flow-kit";
53
+
54
+ export default function AuthProviderClient({
55
+ children,
56
+ }: {
57
+ children: React.ReactNode;
58
+ }) {
59
+ return (
60
+ <AuthProvider
61
+ config={{
62
+ baseURL: "http://localhost:4000",
63
+ endpoints: {
64
+ login: "/auth/login",
65
+ signup: "/auth/signup",
66
+ forgot: "/auth/forgot",
67
+ },
68
+ onLoginSuccess: () => (window.location.href = "/dashboard"),
69
+ onLogout: () => (window.location.href = "/login"),
70
+ }}
71
+ >
72
+ {children}
73
+ </AuthProvider>
74
+ );
75
+ }
76
+ ```
77
+
78
+ ---
79
+
80
+ ## 2. Wrap your app in `app/layout.tsx`
81
+
82
+ ```tsx
83
+ import AuthProviderClient from "./AuthProviderClient";
84
+ import "./globals.css";
85
+
86
+ export default function RootLayout({
87
+ children,
88
+ }: {
89
+ children: React.ReactNode;
90
+ }) {
91
+ return (
92
+ <html lang="en">
93
+ <body>
94
+ <AuthProviderClient>{children}</AuthProviderClient>
95
+ </body>
96
+ </html>
97
+ );
98
+ }
99
+ ```
27
100
 
28
- yarn
101
+ ---
102
+
103
+ ## 3. Login Page
104
+
105
+ ```tsx
106
+ "use client";
107
+ import { LoginScreen } from "@kendevelops/auth-flow-kit";
108
+
109
+ export default function LoginPage() {
110
+ return <LoginScreen />;
111
+ }
112
+ ```
113
+
114
+ ---
115
+
116
+ ## 4. Signup Page
117
+
118
+ ```tsx
119
+ "use client";
120
+ import { SignupScreen } from "@kendevelops/auth-flow-kit";
121
+
122
+ export default function SignupPage() {
123
+ return <SignupScreen />;
124
+ }
125
+ ```
29
126
 
30
- yarn add @kendevelops/auth-flow-kit
127
+ ---
128
+
129
+ ## 5. Protected Dashboard Page
130
+
131
+ ```tsx
132
+ "use client";
133
+ import { Protected, useAuth } from "@kendevelops/auth-flow-kit";
134
+
135
+ export default function DashboardPage() {
136
+ return (
137
+ <Protected>
138
+ <Dashboard />
139
+ </Protected>
140
+ );
141
+ }
142
+
143
+ function Dashboard() {
144
+ const { user, logout } = useAuth();
145
+
146
+ return (
147
+ <div style={{ padding: 20 }}>
148
+ <h1>Dashboard</h1>
149
+ {user ? (
150
+ <>
151
+ <p>Logged in as {user.name}</p>
152
+ <button onClick={logout}>Logout</button>
153
+ </>
154
+ ) : (
155
+ <p>No user loaded.</p>
156
+ )}
157
+ </div>
158
+ );
159
+ }
160
+ ```
161
+
162
+ ---
163
+
164
+ # 🧠 Developer Experience (DX)
165
+
166
+ Because auth behaves like a global store, you can access it anywhere:
167
+
168
+ ```tsx
169
+ const { user, login, logout, getToken, loading } = useAuth();
170
+ ```
171
+
172
+ This means:
173
+
174
+ ### ✔ Global state, just like Redux or Zustand
175
+
176
+ ### ✔ No need for reducers, slices, or stores
177
+
178
+ ### ✔ No extra setup
179
+
180
+ ### ✔ No API calls on refresh — state is restored instantly
181
+
182
+ Your UI automatically updates when the user logs in, signs up, or logs out.
183
+
184
+ ---
185
+
186
+ # 🔒 Protecting Routes and Components
187
+
188
+ ```tsx
189
+ <Protected>
190
+ <SecretSection />
191
+ </Protected>
192
+ ```
193
+
194
+ If the user is not authenticated, they are redirected to `/login`.
195
+
196
+ ---
197
+
198
+ # 📄 Using `useAuth()` in any component
199
+
200
+ ```tsx
201
+ "use client";
202
+ import { useAuth } from "@kendevelops/auth-flow-kit";
203
+
204
+ export default function NavBar() {
205
+ const { user, logout } = useAuth();
206
+
207
+ return (
208
+ <nav>
209
+ {user ? (
210
+ <>
211
+ <span>Hi {user.name}</span>
212
+ <button onClick={logout}>Logout</button>
213
+ </>
214
+ ) : (
215
+ <a href="/login">Login</a>
216
+ )}
217
+ </nav>
218
+ );
219
+ }
220
+ ```
221
+
222
+ ---
223
+
224
+ # 🌐 React (Non-Next.js) Usage
225
+
226
+ ```tsx
227
+ import { AuthProvider, LoginScreen } from "@kendevelops/auth-flow-kit";
228
+
229
+ export default function App() {
230
+ return (
231
+ <AuthProvider
232
+ config={{
233
+ baseURL: "http://localhost:4000",
234
+ endpoints: {
235
+ login: "/auth/login",
236
+ signup: "/auth/signup",
237
+ forgot: "/auth/forgot",
238
+ },
239
+ }}
240
+ >
241
+ <LoginScreen />
242
+ </AuthProvider>
243
+ );
244
+ }
245
+ ```
246
+
247
+ ---
248
+
249
+ # 🎉 Summary
250
+
251
+ **auth-flow-kit** provides:
252
+
253
+ - Global auth state (Redux/Zustand style)
254
+ - Prebuilt auth UI (Login, Signup, Reset)
255
+ - Easy `useAuth()` hook access
256
+ - Simple endpoint requirements
257
+ - Works in both Next.js and React
258
+
259
+ A clean, modern solution for developers who want authentication without complexity.
260
+
261
+ ---
package/dist/index.cjs CHANGED
@@ -68,22 +68,6 @@ async function httpJSON(url, opts = {}, withAuth = false) {
68
68
  }
69
69
  return res.json();
70
70
  }
71
- async function tryRefreshToken(baseURL, endpoints) {
72
- if (!endpoints.refresh) return null;
73
- const refreshToken = localStorage.getItem("afk_refresh_token");
74
- if (!refreshToken) return null;
75
- try {
76
- const url = makeURL(baseURL, endpoints.refresh);
77
- const next = await httpJSON(url, {
78
- method: "POST",
79
- body: JSON.stringify({ refreshToken })
80
- });
81
- setStoredAccessToken(next.accessToken);
82
- return next.accessToken;
83
- } catch {
84
- return null;
85
- }
86
- }
87
71
 
88
72
  // src/AuthContext.tsx
89
73
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -102,40 +86,11 @@ function AuthProvider({
102
86
  const [loading, setLoading] = (0, import_react.useState)(true);
103
87
  const getToken = () => getStoredAccessToken();
104
88
  (0, import_react.useEffect)(() => {
105
- const init = async () => {
106
- setLoading(true);
107
- const token = getStoredAccessToken();
108
- if (!token) {
109
- setUser(null);
110
- setLoading(false);
111
- return;
112
- }
113
- try {
114
- const meURL = makeURL(baseURL, endpoints.me);
115
- const profile = await httpJSON(meURL, {}, true);
116
- setUser(profile);
117
- } catch (err) {
118
- const refreshed = await tryRefreshToken(baseURL, endpoints);
119
- if (refreshed) {
120
- try {
121
- const meURL = makeURL(baseURL, endpoints.me);
122
- const profile = await httpJSON(meURL, {}, true);
123
- setUser(profile);
124
- } catch {
125
- setStoredAccessToken(null);
126
- localStorage.removeItem("afk_refresh_token");
127
- setUser(null);
128
- }
129
- } else {
130
- setStoredAccessToken(null);
131
- localStorage.removeItem("afk_refresh_token");
132
- setUser(null);
133
- }
134
- } finally {
135
- setLoading(false);
136
- }
137
- };
138
- void init();
89
+ const savedUser = localStorage.getItem("afk_user");
90
+ if (savedUser) {
91
+ setUser(JSON.parse(savedUser));
92
+ }
93
+ setLoading(false);
139
94
  }, []);
140
95
  const login = async (email, password) => {
141
96
  const url = makeURL(baseURL, endpoints.login);
@@ -144,8 +99,7 @@ function AuthProvider({
144
99
  body: JSON.stringify({ email, password })
145
100
  });
146
101
  setStoredAccessToken(res.accessToken);
147
- if (res.refreshToken)
148
- localStorage.setItem("afk_refresh_token", res.refreshToken);
102
+ localStorage.setItem("afk_user", JSON.stringify(res.user));
149
103
  setUser(res.user);
150
104
  if (onLoginSuccess) onLoginSuccess();
151
105
  };
@@ -156,20 +110,27 @@ function AuthProvider({
156
110
  body: JSON.stringify(payload)
157
111
  });
158
112
  setStoredAccessToken(res.accessToken);
159
- if (res.refreshToken)
160
- localStorage.setItem("afk_refresh_token", res.refreshToken);
113
+ localStorage.setItem("afk_user", JSON.stringify(res.user));
161
114
  setUser(res.user);
162
115
  if (onLoginSuccess) onLoginSuccess();
163
116
  };
164
117
  const logout = () => {
165
118
  setStoredAccessToken(null);
166
- localStorage.removeItem("afk_refresh_token");
119
+ localStorage.removeItem("afk_user");
167
120
  setUser(null);
168
121
  if (onLogout) onLogout();
169
122
  };
170
123
  const value = (0, import_react.useMemo)(
171
- () => ({ user, loading, login, signup, logout, getToken }),
172
- [user, loading]
124
+ () => ({
125
+ user,
126
+ loading,
127
+ login,
128
+ signup,
129
+ logout,
130
+ getToken,
131
+ config
132
+ }),
133
+ [user, loading, config]
173
134
  );
174
135
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AuthContext.Provider, { value, children });
175
136
  }
@@ -196,7 +157,6 @@ var import_react4 = require("react");
196
157
  var import_react3 = require("react");
197
158
  var import_jsx_runtime3 = require("react/jsx-runtime");
198
159
  function PasswordResetScreen() {
199
- const { getToken } = useAuth();
200
160
  const [email, setEmail] = (0, import_react3.useState)("");
201
161
  const [sent, setSent] = (0, import_react3.useState)(false);
202
162
  const [error, setError] = (0, import_react3.useState)(null);
@@ -204,8 +164,8 @@ function PasswordResetScreen() {
204
164
  e.preventDefault();
205
165
  setError(null);
206
166
  try {
207
- const baseURL = window.__AFK_BASE__ || "";
208
- const url = makeURL(baseURL, "/auth/forgot");
167
+ const { config } = useAuth();
168
+ const url = makeURL(config.baseURL, config.endpoints.forgot);
209
169
  await httpJSON(url, {
210
170
  method: "POST",
211
171
  body: JSON.stringify({ email })
@@ -404,7 +364,6 @@ function LoginScreen() {
404
364
  padding: 32,
405
365
  borderRadius: 20,
406
366
  fontFamily: "Inter, sans-serif",
407
- // GLASS EFFECT
408
367
  background: "rgba(255, 255, 255, 0.25)",
409
368
  backdropFilter: "blur(14px)",
410
369
  WebkitBackdropFilter: "blur(14px)",
@@ -540,7 +499,6 @@ function LoginScreen() {
540
499
  width: "100%",
541
500
  padding: "14px 20px",
542
501
  borderRadius: 12,
543
- // 🔥 GRADIENT BUTTON
544
502
  background: submitting ? "linear-gradient(90deg, #b2bdfd, #8da0ff)" : "linear-gradient(90deg, #5353aaff, #060f22ff)",
545
503
  color: "white",
546
504
  border: "none",
@@ -778,7 +736,6 @@ function SignupScreen() {
778
736
  width: "100%",
779
737
  padding: "14px 20px",
780
738
  borderRadius: 12,
781
- // SAME GRADIENT AS LOGIN
782
739
  background: submitting ? "linear-gradient(90deg, #b2bdfd, #8da0ff)" : "linear-gradient(90deg, #5353aaff, #060f22ff)",
783
740
  color: "white",
784
741
  border: "none",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/AuthContext.tsx","../src/http.ts","../src/Protected.tsx","../src/screens/LoginScreen.tsx","../src/screens/PasswordResetScreen.tsx","../src/screens/SignupScreen.tsx"],"sourcesContent":["export { AuthProvider, useAuth } from \"./AuthContext\";\r\nexport { default as Protected } from \"./Protected\";\r\n\r\n// Screens\r\nexport { default as LoginScreen } from \"./screens/LoginScreen\";\r\nexport { default as SignupScreen } from \"./screens/SignupScreen\";\r\nexport { default as PasswordResetScreen } from \"./screens/PasswordResetScreen\";\r\n\r\n// Types\r\nexport * from \"./types\";\r\n","import React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n AuthContextType,\r\n AuthProviderConfig,\r\n StandardAuthResponse,\r\n User,\r\n} from \"./types\";\r\nimport {\r\n httpJSON,\r\n makeURL,\r\n setStoredAccessToken,\r\n getStoredAccessToken,\r\n tryRefreshToken,\r\n} from \"./http\";\r\n\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\r\n\r\nexport function useAuth(): AuthContextType {\r\n const ctx = useContext(AuthContext);\r\n if (!ctx) throw new Error(\"useAuth must be used inside AuthProvider\");\r\n return ctx;\r\n}\r\n\r\nexport function AuthProvider({\r\n config,\r\n children,\r\n}: React.PropsWithChildren<{ config: AuthProviderConfig }>) {\r\n const { baseURL, endpoints, onLoginSuccess, onLogout } = config;\r\n\r\n const [user, setUser] = useState<User | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const getToken = () => getStoredAccessToken();\r\n\r\n // Load session on mount\r\n useEffect(() => {\r\n const init = async () => {\r\n setLoading(true);\r\n const token = getStoredAccessToken();\r\n if (!token) {\r\n setUser(null);\r\n setLoading(false);\r\n return;\r\n }\r\n try {\r\n const meURL = makeURL(baseURL, endpoints.me);\r\n const profile = await httpJSON<User>(meURL, {}, true);\r\n setUser(profile);\r\n } catch (err) {\r\n // try refresh if available\r\n const refreshed = await tryRefreshToken(baseURL, endpoints);\r\n if (refreshed) {\r\n try {\r\n const meURL = makeURL(baseURL, endpoints.me);\r\n const profile = await httpJSON<User>(meURL, {}, true);\r\n setUser(profile);\r\n } catch {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_refresh_token\");\r\n setUser(null);\r\n }\r\n } else {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_refresh_token\");\r\n setUser(null);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n void init();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const login: AuthContextType[\"login\"] = async (email, password) => {\r\n const url = makeURL(baseURL, endpoints.login);\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email, password }),\r\n });\r\n\r\n // store tokens\r\n setStoredAccessToken(res.accessToken);\r\n if (res.refreshToken)\r\n localStorage.setItem(\"afk_refresh_token\", res.refreshToken);\r\n\r\n // set user\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n const signup: AuthContextType[\"signup\"] = async (payload) => {\r\n const url = makeURL(baseURL, endpoints.signup);\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n setStoredAccessToken(res.accessToken);\r\n if (res.refreshToken)\r\n localStorage.setItem(\"afk_refresh_token\", res.refreshToken);\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n const logout = () => {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_refresh_token\");\r\n setUser(null);\r\n if (onLogout) onLogout();\r\n };\r\n\r\n const value = useMemo<AuthContextType>(\r\n () => ({ user, loading, login, signup, logout, getToken }),\r\n [user, loading]\r\n );\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\r\n}\r\n","import { EndpointsConfig } from \"./types\";\r\n\r\nexport function makeURL(baseURL: string, path: string) {\r\n return `${baseURL.replace(/\\/$/, \"\")}${\r\n path.startsWith(\"/\") ? path : `/${path}`\r\n }`;\r\n}\r\n\r\nexport function getStoredAccessToken(): string | null {\r\n try {\r\n return localStorage.getItem(\"afk_access_token\");\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function setStoredAccessToken(token: string | null) {\r\n try {\r\n if (token) localStorage.setItem(\"afk_access_token\", token);\r\n else localStorage.removeItem(\"afk_access_token\");\r\n } catch {\r\n // ignore storage errors\r\n }\r\n}\r\n\r\nexport async function httpJSON<T>(\r\n url: string,\r\n opts: RequestInit = {},\r\n withAuth = false\r\n): Promise<T> {\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n if (withAuth) {\r\n const tok = getStoredAccessToken();\r\n if (tok) headers[\"Authorization\"] = `Bearer ${tok}`;\r\n }\r\n const res = await fetch(url, {\r\n ...opts,\r\n headers: { ...headers, ...(opts.headers || {}) },\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(text || `HTTP ${res.status}`);\r\n }\r\n return res.json() as Promise<T>;\r\n}\r\n\r\nexport async function tryRefreshToken(\r\n baseURL: string,\r\n endpoints: EndpointsConfig\r\n): Promise<string | null> {\r\n if (!endpoints.refresh) return null;\r\n const refreshToken = localStorage.getItem(\"afk_refresh_token\");\r\n if (!refreshToken) return null;\r\n\r\n try {\r\n const url = makeURL(baseURL, endpoints.refresh);\r\n const next = await httpJSON<{ accessToken: string }>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ refreshToken }),\r\n });\r\n setStoredAccessToken(next.accessToken);\r\n return next.accessToken;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","\"use client\";\r\nimport React, { useEffect } from \"react\";\r\nimport { useAuth } from \"./AuthContext\";\r\n\r\nexport default function Protected({ children }: { children: React.ReactNode }) {\r\n const { user, loading } = useAuth();\r\n\r\n useEffect(() => {\r\n if (!loading && !user) {\r\n // Simple client redirect\r\n window.location.href = \"/login\";\r\n }\r\n }, [loading, user]);\r\n\r\n if (loading) return <div>Loading...</div>;\r\n if (!user) return null; // will redirect\r\n\r\n return <>{children}</>;\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport PasswordResetScreen from \"./PasswordResetScreen\";\r\n\r\nexport default function LoginScreen() {\r\n const { login } = useAuth();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showReset, setShowReset] = useState(false);\r\n\r\n // Show Reset Form\r\n if (showReset) {\r\n return (\r\n <div style={{ animation: \"fade .2s\" }}>\r\n <PasswordResetScreen />\r\n <p\r\n onClick={() => setShowReset(false)}\r\n style={{\r\n marginTop: 16,\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n }}\r\n >\r\n Back to login\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Submit\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n // 🔥 PRE CHECK — STOP EVERYTHING IF TRIM FAILS\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return; // ❗ STOP FUNCTION BEFORE LOGIN() TRIGGERS\r\n }\r\n\r\n try {\r\n await login(trimmedEmail, trimmedPassword);\r\n } catch (err: any) {\r\n setError(err?.message || \"Login failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Welcome Back 👋\r\n </h2>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* PASSWORD FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 10 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* FORGOT PASSWORD */}\r\n <p\r\n onClick={() => setShowReset(true)}\r\n style={{\r\n textAlign: \"right\",\r\n fontSize: 13,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n marginBottom: 24,\r\n }}\r\n >\r\n Forgot password?\r\n </p>\r\n\r\n {/* BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // 🔥 GRADIENT BUTTON\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Signing in...\" : \"Sign in\"}\r\n </button>\r\n\r\n {/* ERROR */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport { httpJSON, makeURL } from \"../http\";\r\n\r\nexport default function PasswordResetScreen() {\r\n const { getToken } = useAuth();\r\n const [email, setEmail] = useState(\"\");\r\n const [sent, setSent] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const requestReset = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n try {\r\n const baseURL = (window as any).__AFK_BASE__ || \"\";\r\n const url = makeURL(baseURL, \"/auth/forgot\");\r\n\r\n await httpJSON(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email }),\r\n });\r\n\r\n setSent(true);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to request reset\");\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={requestReset}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.25s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Reset Password 🔑\r\n </h2>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: sent ? \"-18px\" : \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"90%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* BUTTON */}\r\n <button\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // PREMIUM GRADIENT\r\n background: sent\r\n ? \"linear-gradient(90deg, #7aff9d, #34c759)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.3s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {sent ? \"Link Sent ✔\" : \"Send reset link\"}\r\n </button>\r\n\r\n {/* SENT MESSAGE */}\r\n {sent && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"#2ecc71\",\r\n textAlign: \"center\",\r\n fontSize: 15,\r\n fontWeight: 600,\r\n }}\r\n >\r\n Check your email for reset instructions.\r\n </p>\r\n )}\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\n\r\nexport default function SignupScreen() {\r\n const { signup } = useAuth();\r\n const [name, setName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n // 🔥 PRE CHECK — STOP EVERYTHING IF TRIM FAILS\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n const trimmedName = name.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword || !trimmedName) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return; // ❗ STOP FUNCTION BEFORE LOGIN() TRIGGERS\r\n }\r\n\r\n try {\r\n await signup({ name, email, password });\r\n } catch (err: any) {\r\n setError(err?.message || \"Signup failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Create Account ✨\r\n </h2>\r\n\r\n {/* NAME FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Name\r\n </label>\r\n\r\n <input\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n placeholder=\"Your name\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* PASSWORD FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* SUBMIT BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // SAME GRADIENT AS LOGIN\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Creating...\" : \"Create account\"}\r\n </button>\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/AuthContext.tsx","../src/http.ts","../src/Protected.tsx","../src/screens/LoginScreen.tsx","../src/screens/PasswordResetScreen.tsx","../src/screens/SignupScreen.tsx"],"sourcesContent":["export { AuthProvider, useAuth } from \"./AuthContext\";\r\nexport { default as Protected } from \"./Protected\";\r\n\r\n// Screens\r\nexport { default as LoginScreen } from \"./screens/LoginScreen\";\r\nexport { default as SignupScreen } from \"./screens/SignupScreen\";\r\nexport { default as PasswordResetScreen } from \"./screens/PasswordResetScreen\";\r\n\r\n// Types\r\nexport * from \"./types\";\r\n","/* \r\nDevelopers using this library should wrap their app with:\r\n <AuthProvider config={...}>\r\n <App />\r\n </AuthProvider>\r\n \r\n Then they can access auth anywhere with:\r\n const { user, login, logout, getToken } = useAuth();\r\n*/\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\n\r\nimport {\r\n AuthContextType,\r\n AuthProviderConfig,\r\n StandardAuthResponse,\r\n User,\r\n} from \"./types\";\r\n\r\nimport {\r\n httpJSON,\r\n makeURL,\r\n setStoredAccessToken,\r\n getStoredAccessToken,\r\n} from \"./http\";\r\n\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\r\n\r\nexport function useAuth(): AuthContextType {\r\n const ctx = useContext(AuthContext);\r\n if (!ctx) throw new Error(\"useAuth must be used inside AuthProvider\");\r\n return ctx;\r\n}\r\n\r\nexport function AuthProvider({\r\n config,\r\n children,\r\n}: React.PropsWithChildren<{ config: AuthProviderConfig }>) {\r\n const { baseURL, endpoints, onLoginSuccess, onLogout } = config;\r\n\r\n const [user, setUser] = useState<User | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const getToken = () => getStoredAccessToken();\r\n\r\n // Restore user from localStorage on app load\r\n useEffect(() => {\r\n const savedUser = localStorage.getItem(\"afk_user\");\r\n if (savedUser) {\r\n setUser(JSON.parse(savedUser));\r\n }\r\n setLoading(false);\r\n }, []);\r\n\r\n // LOGIN\r\n const login: AuthContextType[\"login\"] = async (email, password) => {\r\n const url = makeURL(baseURL, endpoints.login);\r\n\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email, password }),\r\n });\r\n\r\n // store token + user\r\n setStoredAccessToken(res.accessToken);\r\n localStorage.setItem(\"afk_user\", JSON.stringify(res.user));\r\n\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n // SIGNUP\r\n const signup: AuthContextType[\"signup\"] = async (payload) => {\r\n const url = makeURL(baseURL, endpoints.signup);\r\n\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n setStoredAccessToken(res.accessToken);\r\n localStorage.setItem(\"afk_user\", JSON.stringify(res.user));\r\n\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n // LOGOUT\r\n const logout = () => {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_user\");\r\n setUser(null);\r\n\r\n if (onLogout) onLogout();\r\n };\r\n\r\n const value = useMemo<AuthContextType>(\r\n () => ({\r\n user,\r\n loading,\r\n login,\r\n signup,\r\n logout,\r\n getToken,\r\n config,\r\n }),\r\n [user, loading, config]\r\n );\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\r\n}\r\n","/*\r\n This file contains the low-level HTTP utilities used internally by\r\n auth-flow-kit to communicate with the backend.\r\n \r\n It provides:\r\n - makeURL: safely joins baseURL + endpoint path\r\n - getStoredAccessToken: reads the JWT from localStorage\r\n - setStoredAccessToken: stores/removes the JWT\r\n - httpJSON: wrapper around fetch with JSON + optional auth header\r\n \r\n NOTES FOR DEVELOPERS USING THE LIBRARY:\r\n You do NOT need to import or modify anything in this file.\r\n It is an internal helper used by the AuthProvider and auth screens.\r\n \r\n This keeps the library lightweight, predictable,\r\n and familiar to developers used to Redux Toolkit-style authentication.\r\n \r\n */\r\n\r\nexport function makeURL(baseURL: string, path: string) {\r\n return `${baseURL.replace(/\\/$/, \"\")}${\r\n path.startsWith(\"/\") ? path : `/${path}`\r\n }`;\r\n}\r\n\r\nexport function getStoredAccessToken(): string | null {\r\n try {\r\n return localStorage.getItem(\"afk_access_token\");\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function setStoredAccessToken(token: string | null) {\r\n try {\r\n if (token) localStorage.setItem(\"afk_access_token\", token);\r\n else localStorage.removeItem(\"afk_access_token\");\r\n } catch {\r\n // ignore storage errors (Safari private mode, etc.)\r\n }\r\n}\r\n\r\nexport async function httpJSON<T>(\r\n url: string,\r\n opts: RequestInit = {},\r\n withAuth = false\r\n): Promise<T> {\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n // Add Authorization header only if requested\r\n if (withAuth) {\r\n const tok = getStoredAccessToken();\r\n if (tok) headers[\"Authorization\"] = `Bearer ${tok}`;\r\n }\r\n\r\n const res = await fetch(url, {\r\n ...opts,\r\n headers: { ...headers, ...(opts.headers || {}) },\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(text || `HTTP ${res.status}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n}\r\n","\"use client\";\r\nimport React, { useEffect } from \"react\";\r\nimport { useAuth } from \"./AuthContext\";\r\n\r\nexport default function Protected({ children }: { children: React.ReactNode }) {\r\n const { user, loading } = useAuth();\r\n\r\n useEffect(() => {\r\n if (!loading && !user) {\r\n window.location.href = \"/login\";\r\n }\r\n }, [loading, user]);\r\n\r\n if (loading) return <div>Loading...</div>;\r\n if (!user) return null;\r\n\r\n return <>{children}</>;\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport PasswordResetScreen from \"./PasswordResetScreen\";\r\n\r\nexport default function LoginScreen() {\r\n const { login } = useAuth();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showReset, setShowReset] = useState(false);\r\n\r\n if (showReset) {\r\n return (\r\n <div style={{ animation: \"fade .2s\" }}>\r\n <PasswordResetScreen />\r\n <p\r\n onClick={() => setShowReset(false)}\r\n style={{\r\n marginTop: 16,\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n }}\r\n >\r\n Back to login\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Submit\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n try {\r\n await login(trimmedEmail, trimmedPassword);\r\n } catch (err: any) {\r\n setError(err?.message || \"Login failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Welcome Back 👋\r\n </h2>\r\n\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n <div style={{ position: \"relative\", marginBottom: 10 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n <p\r\n onClick={() => setShowReset(true)}\r\n style={{\r\n textAlign: \"right\",\r\n fontSize: 13,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n marginBottom: 24,\r\n }}\r\n >\r\n Forgot password?\r\n </p>\r\n\r\n {/* BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Signing in...\" : \"Sign in\"}\r\n </button>\r\n\r\n {/* ERROR */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport { httpJSON, makeURL } from \"../http\";\r\n\r\nexport default function PasswordResetScreen() {\r\n const [email, setEmail] = useState(\"\");\r\n const [sent, setSent] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const requestReset = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n try {\r\n // read from AuthProvider config\r\n const { config } = useAuth();\r\n\r\n const url = makeURL(config.baseURL, config.endpoints.forgot);\r\n\r\n await httpJSON(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email }),\r\n });\r\n\r\n setSent(true);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to request reset\");\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={requestReset}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.25s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Reset Password 🔑\r\n </h2>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: sent ? \"-18px\" : \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"90%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* BUTTON */}\r\n <button\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // PREMIUM GRADIENT\r\n background: sent\r\n ? \"linear-gradient(90deg, #7aff9d, #34c759)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.3s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {sent ? \"Link Sent ✔\" : \"Send reset link\"}\r\n </button>\r\n\r\n {/* SENT MESSAGE */}\r\n {sent && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"#2ecc71\",\r\n textAlign: \"center\",\r\n fontSize: 15,\r\n fontWeight: 600,\r\n }}\r\n >\r\n Check your email for reset instructions.\r\n </p>\r\n )}\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\n\r\nexport default function SignupScreen() {\r\n const { signup } = useAuth();\r\n const [name, setName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n const trimmedName = name.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword || !trimmedName) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n try {\r\n await signup({ name, email, password });\r\n } catch (err: any) {\r\n setError(err?.message || \"Signup failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Create Account ✨\r\n </h2>\r\n\r\n {/* NAME FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Name\r\n </label>\r\n\r\n <input\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n placeholder=\"Your name\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* PASSWORD FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* SUBMIT BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Creating...\" : \"Create account\"}\r\n </button>\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -15,8 +15,7 @@ type StandardAuthResponse = {
15
15
  type EndpointsConfig = {
16
16
  login: string;
17
17
  signup: string;
18
- me: string;
19
- refresh?: string;
18
+ forgot: string;
20
19
  };
21
20
  type AuthProviderConfig = {
22
21
  baseURL: string;
@@ -35,6 +34,7 @@ type AuthContextType = {
35
34
  }) => Promise<void>;
36
35
  logout: () => void;
37
36
  getToken: () => string | null;
37
+ config: AuthProviderConfig;
38
38
  };
39
39
 
40
40
  declare function useAuth(): AuthContextType;
package/dist/index.d.ts CHANGED
@@ -15,8 +15,7 @@ type StandardAuthResponse = {
15
15
  type EndpointsConfig = {
16
16
  login: string;
17
17
  signup: string;
18
- me: string;
19
- refresh?: string;
18
+ forgot: string;
20
19
  };
21
20
  type AuthProviderConfig = {
22
21
  baseURL: string;
@@ -35,6 +34,7 @@ type AuthContextType = {
35
34
  }) => Promise<void>;
36
35
  logout: () => void;
37
36
  getToken: () => string | null;
37
+ config: AuthProviderConfig;
38
38
  };
39
39
 
40
40
  declare function useAuth(): AuthContextType;
package/dist/index.js CHANGED
@@ -43,22 +43,6 @@ async function httpJSON(url, opts = {}, withAuth = false) {
43
43
  }
44
44
  return res.json();
45
45
  }
46
- async function tryRefreshToken(baseURL, endpoints) {
47
- if (!endpoints.refresh) return null;
48
- const refreshToken = localStorage.getItem("afk_refresh_token");
49
- if (!refreshToken) return null;
50
- try {
51
- const url = makeURL(baseURL, endpoints.refresh);
52
- const next = await httpJSON(url, {
53
- method: "POST",
54
- body: JSON.stringify({ refreshToken })
55
- });
56
- setStoredAccessToken(next.accessToken);
57
- return next.accessToken;
58
- } catch {
59
- return null;
60
- }
61
- }
62
46
 
63
47
  // src/AuthContext.tsx
64
48
  import { jsx } from "react/jsx-runtime";
@@ -77,40 +61,11 @@ function AuthProvider({
77
61
  const [loading, setLoading] = useState(true);
78
62
  const getToken = () => getStoredAccessToken();
79
63
  useEffect(() => {
80
- const init = async () => {
81
- setLoading(true);
82
- const token = getStoredAccessToken();
83
- if (!token) {
84
- setUser(null);
85
- setLoading(false);
86
- return;
87
- }
88
- try {
89
- const meURL = makeURL(baseURL, endpoints.me);
90
- const profile = await httpJSON(meURL, {}, true);
91
- setUser(profile);
92
- } catch (err) {
93
- const refreshed = await tryRefreshToken(baseURL, endpoints);
94
- if (refreshed) {
95
- try {
96
- const meURL = makeURL(baseURL, endpoints.me);
97
- const profile = await httpJSON(meURL, {}, true);
98
- setUser(profile);
99
- } catch {
100
- setStoredAccessToken(null);
101
- localStorage.removeItem("afk_refresh_token");
102
- setUser(null);
103
- }
104
- } else {
105
- setStoredAccessToken(null);
106
- localStorage.removeItem("afk_refresh_token");
107
- setUser(null);
108
- }
109
- } finally {
110
- setLoading(false);
111
- }
112
- };
113
- void init();
64
+ const savedUser = localStorage.getItem("afk_user");
65
+ if (savedUser) {
66
+ setUser(JSON.parse(savedUser));
67
+ }
68
+ setLoading(false);
114
69
  }, []);
115
70
  const login = async (email, password) => {
116
71
  const url = makeURL(baseURL, endpoints.login);
@@ -119,8 +74,7 @@ function AuthProvider({
119
74
  body: JSON.stringify({ email, password })
120
75
  });
121
76
  setStoredAccessToken(res.accessToken);
122
- if (res.refreshToken)
123
- localStorage.setItem("afk_refresh_token", res.refreshToken);
77
+ localStorage.setItem("afk_user", JSON.stringify(res.user));
124
78
  setUser(res.user);
125
79
  if (onLoginSuccess) onLoginSuccess();
126
80
  };
@@ -131,20 +85,27 @@ function AuthProvider({
131
85
  body: JSON.stringify(payload)
132
86
  });
133
87
  setStoredAccessToken(res.accessToken);
134
- if (res.refreshToken)
135
- localStorage.setItem("afk_refresh_token", res.refreshToken);
88
+ localStorage.setItem("afk_user", JSON.stringify(res.user));
136
89
  setUser(res.user);
137
90
  if (onLoginSuccess) onLoginSuccess();
138
91
  };
139
92
  const logout = () => {
140
93
  setStoredAccessToken(null);
141
- localStorage.removeItem("afk_refresh_token");
94
+ localStorage.removeItem("afk_user");
142
95
  setUser(null);
143
96
  if (onLogout) onLogout();
144
97
  };
145
98
  const value = useMemo(
146
- () => ({ user, loading, login, signup, logout, getToken }),
147
- [user, loading]
99
+ () => ({
100
+ user,
101
+ loading,
102
+ login,
103
+ signup,
104
+ logout,
105
+ getToken,
106
+ config
107
+ }),
108
+ [user, loading, config]
148
109
  );
149
110
  return /* @__PURE__ */ jsx(AuthContext.Provider, { value, children });
150
111
  }
@@ -171,7 +132,6 @@ import { useState as useState3 } from "react";
171
132
  import { useState as useState2 } from "react";
172
133
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
173
134
  function PasswordResetScreen() {
174
- const { getToken } = useAuth();
175
135
  const [email, setEmail] = useState2("");
176
136
  const [sent, setSent] = useState2(false);
177
137
  const [error, setError] = useState2(null);
@@ -179,8 +139,8 @@ function PasswordResetScreen() {
179
139
  e.preventDefault();
180
140
  setError(null);
181
141
  try {
182
- const baseURL = window.__AFK_BASE__ || "";
183
- const url = makeURL(baseURL, "/auth/forgot");
142
+ const { config } = useAuth();
143
+ const url = makeURL(config.baseURL, config.endpoints.forgot);
184
144
  await httpJSON(url, {
185
145
  method: "POST",
186
146
  body: JSON.stringify({ email })
@@ -379,7 +339,6 @@ function LoginScreen() {
379
339
  padding: 32,
380
340
  borderRadius: 20,
381
341
  fontFamily: "Inter, sans-serif",
382
- // GLASS EFFECT
383
342
  background: "rgba(255, 255, 255, 0.25)",
384
343
  backdropFilter: "blur(14px)",
385
344
  WebkitBackdropFilter: "blur(14px)",
@@ -515,7 +474,6 @@ function LoginScreen() {
515
474
  width: "100%",
516
475
  padding: "14px 20px",
517
476
  borderRadius: 12,
518
- // 🔥 GRADIENT BUTTON
519
477
  background: submitting ? "linear-gradient(90deg, #b2bdfd, #8da0ff)" : "linear-gradient(90deg, #5353aaff, #060f22ff)",
520
478
  color: "white",
521
479
  border: "none",
@@ -753,7 +711,6 @@ function SignupScreen() {
753
711
  width: "100%",
754
712
  padding: "14px 20px",
755
713
  borderRadius: 12,
756
- // SAME GRADIENT AS LOGIN
757
714
  background: submitting ? "linear-gradient(90deg, #b2bdfd, #8da0ff)" : "linear-gradient(90deg, #5353aaff, #060f22ff)",
758
715
  color: "white",
759
716
  border: "none",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AuthContext.tsx","../src/http.ts","../src/Protected.tsx","../src/screens/LoginScreen.tsx","../src/screens/PasswordResetScreen.tsx","../src/screens/SignupScreen.tsx"],"sourcesContent":["import React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n AuthContextType,\r\n AuthProviderConfig,\r\n StandardAuthResponse,\r\n User,\r\n} from \"./types\";\r\nimport {\r\n httpJSON,\r\n makeURL,\r\n setStoredAccessToken,\r\n getStoredAccessToken,\r\n tryRefreshToken,\r\n} from \"./http\";\r\n\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\r\n\r\nexport function useAuth(): AuthContextType {\r\n const ctx = useContext(AuthContext);\r\n if (!ctx) throw new Error(\"useAuth must be used inside AuthProvider\");\r\n return ctx;\r\n}\r\n\r\nexport function AuthProvider({\r\n config,\r\n children,\r\n}: React.PropsWithChildren<{ config: AuthProviderConfig }>) {\r\n const { baseURL, endpoints, onLoginSuccess, onLogout } = config;\r\n\r\n const [user, setUser] = useState<User | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const getToken = () => getStoredAccessToken();\r\n\r\n // Load session on mount\r\n useEffect(() => {\r\n const init = async () => {\r\n setLoading(true);\r\n const token = getStoredAccessToken();\r\n if (!token) {\r\n setUser(null);\r\n setLoading(false);\r\n return;\r\n }\r\n try {\r\n const meURL = makeURL(baseURL, endpoints.me);\r\n const profile = await httpJSON<User>(meURL, {}, true);\r\n setUser(profile);\r\n } catch (err) {\r\n // try refresh if available\r\n const refreshed = await tryRefreshToken(baseURL, endpoints);\r\n if (refreshed) {\r\n try {\r\n const meURL = makeURL(baseURL, endpoints.me);\r\n const profile = await httpJSON<User>(meURL, {}, true);\r\n setUser(profile);\r\n } catch {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_refresh_token\");\r\n setUser(null);\r\n }\r\n } else {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_refresh_token\");\r\n setUser(null);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n void init();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const login: AuthContextType[\"login\"] = async (email, password) => {\r\n const url = makeURL(baseURL, endpoints.login);\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email, password }),\r\n });\r\n\r\n // store tokens\r\n setStoredAccessToken(res.accessToken);\r\n if (res.refreshToken)\r\n localStorage.setItem(\"afk_refresh_token\", res.refreshToken);\r\n\r\n // set user\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n const signup: AuthContextType[\"signup\"] = async (payload) => {\r\n const url = makeURL(baseURL, endpoints.signup);\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n setStoredAccessToken(res.accessToken);\r\n if (res.refreshToken)\r\n localStorage.setItem(\"afk_refresh_token\", res.refreshToken);\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n const logout = () => {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_refresh_token\");\r\n setUser(null);\r\n if (onLogout) onLogout();\r\n };\r\n\r\n const value = useMemo<AuthContextType>(\r\n () => ({ user, loading, login, signup, logout, getToken }),\r\n [user, loading]\r\n );\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\r\n}\r\n","import { EndpointsConfig } from \"./types\";\r\n\r\nexport function makeURL(baseURL: string, path: string) {\r\n return `${baseURL.replace(/\\/$/, \"\")}${\r\n path.startsWith(\"/\") ? path : `/${path}`\r\n }`;\r\n}\r\n\r\nexport function getStoredAccessToken(): string | null {\r\n try {\r\n return localStorage.getItem(\"afk_access_token\");\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function setStoredAccessToken(token: string | null) {\r\n try {\r\n if (token) localStorage.setItem(\"afk_access_token\", token);\r\n else localStorage.removeItem(\"afk_access_token\");\r\n } catch {\r\n // ignore storage errors\r\n }\r\n}\r\n\r\nexport async function httpJSON<T>(\r\n url: string,\r\n opts: RequestInit = {},\r\n withAuth = false\r\n): Promise<T> {\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n if (withAuth) {\r\n const tok = getStoredAccessToken();\r\n if (tok) headers[\"Authorization\"] = `Bearer ${tok}`;\r\n }\r\n const res = await fetch(url, {\r\n ...opts,\r\n headers: { ...headers, ...(opts.headers || {}) },\r\n });\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(text || `HTTP ${res.status}`);\r\n }\r\n return res.json() as Promise<T>;\r\n}\r\n\r\nexport async function tryRefreshToken(\r\n baseURL: string,\r\n endpoints: EndpointsConfig\r\n): Promise<string | null> {\r\n if (!endpoints.refresh) return null;\r\n const refreshToken = localStorage.getItem(\"afk_refresh_token\");\r\n if (!refreshToken) return null;\r\n\r\n try {\r\n const url = makeURL(baseURL, endpoints.refresh);\r\n const next = await httpJSON<{ accessToken: string }>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ refreshToken }),\r\n });\r\n setStoredAccessToken(next.accessToken);\r\n return next.accessToken;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","\"use client\";\r\nimport React, { useEffect } from \"react\";\r\nimport { useAuth } from \"./AuthContext\";\r\n\r\nexport default function Protected({ children }: { children: React.ReactNode }) {\r\n const { user, loading } = useAuth();\r\n\r\n useEffect(() => {\r\n if (!loading && !user) {\r\n // Simple client redirect\r\n window.location.href = \"/login\";\r\n }\r\n }, [loading, user]);\r\n\r\n if (loading) return <div>Loading...</div>;\r\n if (!user) return null; // will redirect\r\n\r\n return <>{children}</>;\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport PasswordResetScreen from \"./PasswordResetScreen\";\r\n\r\nexport default function LoginScreen() {\r\n const { login } = useAuth();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showReset, setShowReset] = useState(false);\r\n\r\n // Show Reset Form\r\n if (showReset) {\r\n return (\r\n <div style={{ animation: \"fade .2s\" }}>\r\n <PasswordResetScreen />\r\n <p\r\n onClick={() => setShowReset(false)}\r\n style={{\r\n marginTop: 16,\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n }}\r\n >\r\n Back to login\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Submit\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n // 🔥 PRE CHECK — STOP EVERYTHING IF TRIM FAILS\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return; // ❗ STOP FUNCTION BEFORE LOGIN() TRIGGERS\r\n }\r\n\r\n try {\r\n await login(trimmedEmail, trimmedPassword);\r\n } catch (err: any) {\r\n setError(err?.message || \"Login failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Welcome Back 👋\r\n </h2>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* PASSWORD FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 10 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* FORGOT PASSWORD */}\r\n <p\r\n onClick={() => setShowReset(true)}\r\n style={{\r\n textAlign: \"right\",\r\n fontSize: 13,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n marginBottom: 24,\r\n }}\r\n >\r\n Forgot password?\r\n </p>\r\n\r\n {/* BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // 🔥 GRADIENT BUTTON\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Signing in...\" : \"Sign in\"}\r\n </button>\r\n\r\n {/* ERROR */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport { httpJSON, makeURL } from \"../http\";\r\n\r\nexport default function PasswordResetScreen() {\r\n const { getToken } = useAuth();\r\n const [email, setEmail] = useState(\"\");\r\n const [sent, setSent] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const requestReset = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n try {\r\n const baseURL = (window as any).__AFK_BASE__ || \"\";\r\n const url = makeURL(baseURL, \"/auth/forgot\");\r\n\r\n await httpJSON(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email }),\r\n });\r\n\r\n setSent(true);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to request reset\");\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={requestReset}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.25s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Reset Password 🔑\r\n </h2>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: sent ? \"-18px\" : \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"90%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* BUTTON */}\r\n <button\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // PREMIUM GRADIENT\r\n background: sent\r\n ? \"linear-gradient(90deg, #7aff9d, #34c759)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.3s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {sent ? \"Link Sent ✔\" : \"Send reset link\"}\r\n </button>\r\n\r\n {/* SENT MESSAGE */}\r\n {sent && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"#2ecc71\",\r\n textAlign: \"center\",\r\n fontSize: 15,\r\n fontWeight: 600,\r\n }}\r\n >\r\n Check your email for reset instructions.\r\n </p>\r\n )}\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\n\r\nexport default function SignupScreen() {\r\n const { signup } = useAuth();\r\n const [name, setName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n // 🔥 PRE CHECK — STOP EVERYTHING IF TRIM FAILS\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n const trimmedName = name.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword || !trimmedName) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return; // ❗ STOP FUNCTION BEFORE LOGIN() TRIGGERS\r\n }\r\n\r\n try {\r\n await signup({ name, email, password });\r\n } catch (err: any) {\r\n setError(err?.message || \"Signup failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Create Account ✨\r\n </h2>\r\n\r\n {/* NAME FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Name\r\n </label>\r\n\r\n <input\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n placeholder=\"Your name\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* PASSWORD FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* SUBMIT BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // SAME GRADIENT AS LOGIN\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Creating...\" : \"Create account\"}\r\n </button>\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n"],"mappings":"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","names":["useEffect","jsx","useEffect","useState","useState","jsx","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState"]}
1
+ {"version":3,"sources":["../src/AuthContext.tsx","../src/http.ts","../src/Protected.tsx","../src/screens/LoginScreen.tsx","../src/screens/PasswordResetScreen.tsx","../src/screens/SignupScreen.tsx"],"sourcesContent":["/* \r\nDevelopers using this library should wrap their app with:\r\n <AuthProvider config={...}>\r\n <App />\r\n </AuthProvider>\r\n \r\n Then they can access auth anywhere with:\r\n const { user, login, logout, getToken } = useAuth();\r\n*/\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\n\r\nimport {\r\n AuthContextType,\r\n AuthProviderConfig,\r\n StandardAuthResponse,\r\n User,\r\n} from \"./types\";\r\n\r\nimport {\r\n httpJSON,\r\n makeURL,\r\n setStoredAccessToken,\r\n getStoredAccessToken,\r\n} from \"./http\";\r\n\r\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\r\n\r\nexport function useAuth(): AuthContextType {\r\n const ctx = useContext(AuthContext);\r\n if (!ctx) throw new Error(\"useAuth must be used inside AuthProvider\");\r\n return ctx;\r\n}\r\n\r\nexport function AuthProvider({\r\n config,\r\n children,\r\n}: React.PropsWithChildren<{ config: AuthProviderConfig }>) {\r\n const { baseURL, endpoints, onLoginSuccess, onLogout } = config;\r\n\r\n const [user, setUser] = useState<User | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const getToken = () => getStoredAccessToken();\r\n\r\n // Restore user from localStorage on app load\r\n useEffect(() => {\r\n const savedUser = localStorage.getItem(\"afk_user\");\r\n if (savedUser) {\r\n setUser(JSON.parse(savedUser));\r\n }\r\n setLoading(false);\r\n }, []);\r\n\r\n // LOGIN\r\n const login: AuthContextType[\"login\"] = async (email, password) => {\r\n const url = makeURL(baseURL, endpoints.login);\r\n\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email, password }),\r\n });\r\n\r\n // store token + user\r\n setStoredAccessToken(res.accessToken);\r\n localStorage.setItem(\"afk_user\", JSON.stringify(res.user));\r\n\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n // SIGNUP\r\n const signup: AuthContextType[\"signup\"] = async (payload) => {\r\n const url = makeURL(baseURL, endpoints.signup);\r\n\r\n const res = await httpJSON<StandardAuthResponse>(url, {\r\n method: \"POST\",\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n setStoredAccessToken(res.accessToken);\r\n localStorage.setItem(\"afk_user\", JSON.stringify(res.user));\r\n\r\n setUser(res.user);\r\n\r\n if (onLoginSuccess) onLoginSuccess();\r\n };\r\n\r\n // LOGOUT\r\n const logout = () => {\r\n setStoredAccessToken(null);\r\n localStorage.removeItem(\"afk_user\");\r\n setUser(null);\r\n\r\n if (onLogout) onLogout();\r\n };\r\n\r\n const value = useMemo<AuthContextType>(\r\n () => ({\r\n user,\r\n loading,\r\n login,\r\n signup,\r\n logout,\r\n getToken,\r\n config,\r\n }),\r\n [user, loading, config]\r\n );\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\r\n}\r\n","/*\r\n This file contains the low-level HTTP utilities used internally by\r\n auth-flow-kit to communicate with the backend.\r\n \r\n It provides:\r\n - makeURL: safely joins baseURL + endpoint path\r\n - getStoredAccessToken: reads the JWT from localStorage\r\n - setStoredAccessToken: stores/removes the JWT\r\n - httpJSON: wrapper around fetch with JSON + optional auth header\r\n \r\n NOTES FOR DEVELOPERS USING THE LIBRARY:\r\n You do NOT need to import or modify anything in this file.\r\n It is an internal helper used by the AuthProvider and auth screens.\r\n \r\n This keeps the library lightweight, predictable,\r\n and familiar to developers used to Redux Toolkit-style authentication.\r\n \r\n */\r\n\r\nexport function makeURL(baseURL: string, path: string) {\r\n return `${baseURL.replace(/\\/$/, \"\")}${\r\n path.startsWith(\"/\") ? path : `/${path}`\r\n }`;\r\n}\r\n\r\nexport function getStoredAccessToken(): string | null {\r\n try {\r\n return localStorage.getItem(\"afk_access_token\");\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function setStoredAccessToken(token: string | null) {\r\n try {\r\n if (token) localStorage.setItem(\"afk_access_token\", token);\r\n else localStorage.removeItem(\"afk_access_token\");\r\n } catch {\r\n // ignore storage errors (Safari private mode, etc.)\r\n }\r\n}\r\n\r\nexport async function httpJSON<T>(\r\n url: string,\r\n opts: RequestInit = {},\r\n withAuth = false\r\n): Promise<T> {\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n // Add Authorization header only if requested\r\n if (withAuth) {\r\n const tok = getStoredAccessToken();\r\n if (tok) headers[\"Authorization\"] = `Bearer ${tok}`;\r\n }\r\n\r\n const res = await fetch(url, {\r\n ...opts,\r\n headers: { ...headers, ...(opts.headers || {}) },\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text().catch(() => \"\");\r\n throw new Error(text || `HTTP ${res.status}`);\r\n }\r\n\r\n return res.json() as Promise<T>;\r\n}\r\n","\"use client\";\r\nimport React, { useEffect } from \"react\";\r\nimport { useAuth } from \"./AuthContext\";\r\n\r\nexport default function Protected({ children }: { children: React.ReactNode }) {\r\n const { user, loading } = useAuth();\r\n\r\n useEffect(() => {\r\n if (!loading && !user) {\r\n window.location.href = \"/login\";\r\n }\r\n }, [loading, user]);\r\n\r\n if (loading) return <div>Loading...</div>;\r\n if (!user) return null;\r\n\r\n return <>{children}</>;\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport PasswordResetScreen from \"./PasswordResetScreen\";\r\n\r\nexport default function LoginScreen() {\r\n const { login } = useAuth();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showReset, setShowReset] = useState(false);\r\n\r\n if (showReset) {\r\n return (\r\n <div style={{ animation: \"fade .2s\" }}>\r\n <PasswordResetScreen />\r\n <p\r\n onClick={() => setShowReset(false)}\r\n style={{\r\n marginTop: 16,\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n }}\r\n >\r\n Back to login\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Submit\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n try {\r\n await login(trimmedEmail, trimmedPassword);\r\n } catch (err: any) {\r\n setError(err?.message || \"Login failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Welcome Back 👋\r\n </h2>\r\n\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n <div style={{ position: \"relative\", marginBottom: 10 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.8)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n <p\r\n onClick={() => setShowReset(true)}\r\n style={{\r\n textAlign: \"right\",\r\n fontSize: 13,\r\n color: \"#4b4bff\",\r\n cursor: \"pointer\",\r\n marginBottom: 24,\r\n }}\r\n >\r\n Forgot password?\r\n </p>\r\n\r\n {/* BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Signing in...\" : \"Sign in\"}\r\n </button>\r\n\r\n {/* ERROR */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\nimport { httpJSON, makeURL } from \"../http\";\r\n\r\nexport default function PasswordResetScreen() {\r\n const [email, setEmail] = useState(\"\");\r\n const [sent, setSent] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const requestReset = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n try {\r\n // read from AuthProvider config\r\n const { config } = useAuth();\r\n\r\n const url = makeURL(config.baseURL, config.endpoints.forgot);\r\n\r\n await httpJSON(url, {\r\n method: \"POST\",\r\n body: JSON.stringify({ email }),\r\n });\r\n\r\n setSent(true);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to request reset\");\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={requestReset}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.25s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Reset Password 🔑\r\n </h2>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: sent ? \"-18px\" : \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"90%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* BUTTON */}\r\n <button\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n\r\n // PREMIUM GRADIENT\r\n background: sent\r\n ? \"linear-gradient(90deg, #7aff9d, #34c759)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.3s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {sent ? \"Link Sent ✔\" : \"Send reset link\"}\r\n </button>\r\n\r\n {/* SENT MESSAGE */}\r\n {sent && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"#2ecc71\",\r\n textAlign: \"center\",\r\n fontSize: 15,\r\n fontWeight: 600,\r\n }}\r\n >\r\n Check your email for reset instructions.\r\n </p>\r\n )}\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 20,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useState } from \"react\";\r\nimport { useAuth } from \"../AuthContext\";\r\n\r\nexport default function SignupScreen() {\r\n const { signup } = useAuth();\r\n const [name, setName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const onSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n const trimmedEmail = email.trim();\r\n const trimmedPassword = password.trim();\r\n const trimmedName = name.trim();\r\n\r\n if (!trimmedEmail || !trimmedPassword || !trimmedName) {\r\n setError(\"Email and password cannot be empty.\");\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n try {\r\n await signup({ name, email, password });\r\n } catch (err: any) {\r\n setError(err?.message || \"Signup failed\");\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={onSubmit}\r\n style={{\r\n maxWidth: 400,\r\n margin: \"60px auto\",\r\n padding: 32,\r\n borderRadius: 20,\r\n fontFamily: \"Inter, sans-serif\",\r\n\r\n // GLASS EFFECT\r\n background: \"rgba(255, 255, 255, 0.25)\",\r\n backdropFilter: \"blur(14px)\",\r\n WebkitBackdropFilter: \"blur(14px)\",\r\n\r\n boxShadow: \"0 20px 40px rgba(0,0,0,0.15)\",\r\n border: \"1px solid rgba(255,255,255,0.4)\",\r\n animation: \"fadeIn 0.3s ease\",\r\n }}\r\n >\r\n <h2\r\n style={{\r\n marginBottom: 30,\r\n color: \"#060f22\",\r\n fontWeight: 700,\r\n fontSize: 30,\r\n textAlign: \"center\",\r\n letterSpacing: \"-0.5px\",\r\n }}\r\n >\r\n Create Account ✨\r\n </h2>\r\n\r\n {/* NAME FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Name\r\n </label>\r\n\r\n <input\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n placeholder=\"Your name\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* EMAIL FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Email\r\n </label>\r\n\r\n <input\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n type=\"email\"\r\n placeholder=\"you@example.com\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* PASSWORD FIELD */}\r\n <div style={{ position: \"relative\", marginBottom: 26 }}>\r\n <label\r\n style={{\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"14px\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n padding: \"0 6px\",\r\n fontSize: 13,\r\n color: \"#444\",\r\n borderRadius: 6,\r\n }}\r\n >\r\n Password\r\n </label>\r\n\r\n <input\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n type=\"password\"\r\n placeholder=\"••••••••\"\r\n style={{\r\n width: \"80%\",\r\n padding: \"14px 16px\",\r\n borderRadius: 12,\r\n border: \"1px solid #d2d2d2\",\r\n fontSize: 15,\r\n outline: \"none\",\r\n transition: \"0.25s\",\r\n background: \"rgba(255,255,255,0.85)\",\r\n }}\r\n onFocus={(e) => {\r\n e.currentTarget.style.border = \"1px solid #4b4bff\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(75,75,255,0.25)\";\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.border = \"1px solid #d2d2d2\";\r\n e.currentTarget.style.boxShadow = \"0 0 0 transparent\";\r\n }}\r\n />\r\n </div>\r\n\r\n {/* SUBMIT BUTTON */}\r\n <button\r\n disabled={submitting}\r\n type=\"submit\"\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 20px\",\r\n borderRadius: 12,\r\n background: submitting\r\n ? \"linear-gradient(90deg, #b2bdfd, #8da0ff)\"\r\n : \"linear-gradient(90deg, #5353aaff, #060f22ff)\",\r\n\r\n color: \"white\",\r\n border: \"none\",\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: \"0.3px\",\r\n cursor: \"pointer\",\r\n transition: \"0.25s\",\r\n boxShadow: \"0 8px 20px rgba(75,75,255,0.25)\",\r\n }}\r\n >\r\n {submitting ? \"Creating...\" : \"Create account\"}\r\n </button>\r\n\r\n {/* ERROR MESSAGE */}\r\n {error && (\r\n <p\r\n style={{\r\n marginTop: 18,\r\n color: \"crimson\",\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {error}\r\n </p>\r\n )}\r\n </form>\r\n );\r\n}\r\n"],"mappings":"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","names":["useEffect","jsx","useEffect","useState","useState","jsx","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kendevelops/auth-flow-kit",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",