@githat/nextjs 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +94 -1
- package/dist/index.d.ts +94 -1
- package/dist/index.js +110 -30
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +79 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -70,6 +70,99 @@ declare function useGitHat(): {
|
|
|
70
70
|
}>;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
+
interface DataItem {
|
|
74
|
+
id: string;
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
_createdAt?: string;
|
|
77
|
+
_updatedAt?: string;
|
|
78
|
+
}
|
|
79
|
+
interface QueryOptions {
|
|
80
|
+
limit?: number;
|
|
81
|
+
cursor?: string;
|
|
82
|
+
filter?: Record<string, unknown>;
|
|
83
|
+
}
|
|
84
|
+
interface QueryResult<T = DataItem> {
|
|
85
|
+
items: T[];
|
|
86
|
+
collection: string;
|
|
87
|
+
nextCursor: string | null;
|
|
88
|
+
count: number;
|
|
89
|
+
}
|
|
90
|
+
interface PutResult<T = DataItem> {
|
|
91
|
+
item: T;
|
|
92
|
+
collection: string;
|
|
93
|
+
created: boolean;
|
|
94
|
+
}
|
|
95
|
+
interface DeleteResult {
|
|
96
|
+
deleted: boolean;
|
|
97
|
+
id: string;
|
|
98
|
+
collection: string;
|
|
99
|
+
}
|
|
100
|
+
interface BatchOperation {
|
|
101
|
+
type: 'put' | 'delete';
|
|
102
|
+
id: string;
|
|
103
|
+
data?: Record<string, unknown>;
|
|
104
|
+
}
|
|
105
|
+
interface BatchResult {
|
|
106
|
+
processed: number;
|
|
107
|
+
put: number;
|
|
108
|
+
deleted: number;
|
|
109
|
+
collection: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Hook for interacting with GitHat's Customer Data API.
|
|
113
|
+
* Provides CRUD operations for storing app data in GitHat's managed DynamoDB.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```tsx
|
|
117
|
+
* const { put, get, query, remove, batch } = useData();
|
|
118
|
+
*
|
|
119
|
+
* // Store data
|
|
120
|
+
* await put('orders', { id: 'order_123', amount: 99.99, status: 'pending' });
|
|
121
|
+
*
|
|
122
|
+
* // Get single item
|
|
123
|
+
* const order = await get('orders', 'order_123');
|
|
124
|
+
*
|
|
125
|
+
* // Query collection
|
|
126
|
+
* const { items } = await query('orders', { filter: { status: 'pending' } });
|
|
127
|
+
*
|
|
128
|
+
* // Delete item
|
|
129
|
+
* await remove('orders', 'order_123');
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
declare function useData(): {
|
|
133
|
+
/**
|
|
134
|
+
* Store an item in a collection. If the item exists, it will be updated.
|
|
135
|
+
* @param collection - Collection name (e.g., 'orders', 'users')
|
|
136
|
+
* @param data - Data object with required `id` field
|
|
137
|
+
*/
|
|
138
|
+
put: <T extends DataItem>(collection: string, data: T) => Promise<PutResult<T>>;
|
|
139
|
+
/**
|
|
140
|
+
* Get a single item from a collection.
|
|
141
|
+
* @param collection - Collection name
|
|
142
|
+
* @param id - Item ID
|
|
143
|
+
*/
|
|
144
|
+
get: <T extends DataItem>(collection: string, id: string) => Promise<T | null>;
|
|
145
|
+
/**
|
|
146
|
+
* Query items from a collection with optional filters and pagination.
|
|
147
|
+
* @param collection - Collection name
|
|
148
|
+
* @param options - Query options (limit, cursor, filter)
|
|
149
|
+
*/
|
|
150
|
+
query: <T extends DataItem>(collection: string, options?: QueryOptions) => Promise<QueryResult<T>>;
|
|
151
|
+
/**
|
|
152
|
+
* Delete an item from a collection.
|
|
153
|
+
* @param collection - Collection name
|
|
154
|
+
* @param id - Item ID
|
|
155
|
+
*/
|
|
156
|
+
remove: (collection: string, id: string) => Promise<DeleteResult>;
|
|
157
|
+
/**
|
|
158
|
+
* Batch operations (put/delete) on a collection.
|
|
159
|
+
* Maximum 100 operations per request.
|
|
160
|
+
* @param collection - Collection name
|
|
161
|
+
* @param operations - Array of operations
|
|
162
|
+
*/
|
|
163
|
+
batch: (collection: string, operations: BatchOperation[]) => Promise<BatchResult>;
|
|
164
|
+
};
|
|
165
|
+
|
|
73
166
|
interface SignInFormProps {
|
|
74
167
|
onSuccess?: () => void;
|
|
75
168
|
signUpUrl?: string;
|
|
@@ -117,4 +210,4 @@ interface ProtectedRouteProps {
|
|
|
117
210
|
}
|
|
118
211
|
declare function ProtectedRoute({ children, fallback }: ProtectedRouteProps): react_jsx_runtime.JSX.Element | null;
|
|
119
212
|
|
|
120
|
-
export { type AuthActions, type AuthState, type GitHatConfig, type GitHatContextValue, type GitHatOrg, GitHatProvider, type GitHatUser, OrgSwitcher, ProtectedRoute, SignInButton, SignInForm, SignUpButton, type SignUpData, SignUpForm, type SignUpResult, UserButton, VerifiedBadge, useAuth, useGitHat };
|
|
213
|
+
export { type AuthActions, type AuthState, type BatchOperation, type BatchResult, type DataItem, type DeleteResult, type GitHatConfig, type GitHatContextValue, type GitHatOrg, GitHatProvider, type GitHatUser, OrgSwitcher, ProtectedRoute, type PutResult, type QueryOptions, type QueryResult, SignInButton, SignInForm, SignUpButton, type SignUpData, SignUpForm, type SignUpResult, UserButton, VerifiedBadge, useAuth, useData, useGitHat };
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,99 @@ declare function useGitHat(): {
|
|
|
70
70
|
}>;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
+
interface DataItem {
|
|
74
|
+
id: string;
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
_createdAt?: string;
|
|
77
|
+
_updatedAt?: string;
|
|
78
|
+
}
|
|
79
|
+
interface QueryOptions {
|
|
80
|
+
limit?: number;
|
|
81
|
+
cursor?: string;
|
|
82
|
+
filter?: Record<string, unknown>;
|
|
83
|
+
}
|
|
84
|
+
interface QueryResult<T = DataItem> {
|
|
85
|
+
items: T[];
|
|
86
|
+
collection: string;
|
|
87
|
+
nextCursor: string | null;
|
|
88
|
+
count: number;
|
|
89
|
+
}
|
|
90
|
+
interface PutResult<T = DataItem> {
|
|
91
|
+
item: T;
|
|
92
|
+
collection: string;
|
|
93
|
+
created: boolean;
|
|
94
|
+
}
|
|
95
|
+
interface DeleteResult {
|
|
96
|
+
deleted: boolean;
|
|
97
|
+
id: string;
|
|
98
|
+
collection: string;
|
|
99
|
+
}
|
|
100
|
+
interface BatchOperation {
|
|
101
|
+
type: 'put' | 'delete';
|
|
102
|
+
id: string;
|
|
103
|
+
data?: Record<string, unknown>;
|
|
104
|
+
}
|
|
105
|
+
interface BatchResult {
|
|
106
|
+
processed: number;
|
|
107
|
+
put: number;
|
|
108
|
+
deleted: number;
|
|
109
|
+
collection: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Hook for interacting with GitHat's Customer Data API.
|
|
113
|
+
* Provides CRUD operations for storing app data in GitHat's managed DynamoDB.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```tsx
|
|
117
|
+
* const { put, get, query, remove, batch } = useData();
|
|
118
|
+
*
|
|
119
|
+
* // Store data
|
|
120
|
+
* await put('orders', { id: 'order_123', amount: 99.99, status: 'pending' });
|
|
121
|
+
*
|
|
122
|
+
* // Get single item
|
|
123
|
+
* const order = await get('orders', 'order_123');
|
|
124
|
+
*
|
|
125
|
+
* // Query collection
|
|
126
|
+
* const { items } = await query('orders', { filter: { status: 'pending' } });
|
|
127
|
+
*
|
|
128
|
+
* // Delete item
|
|
129
|
+
* await remove('orders', 'order_123');
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
declare function useData(): {
|
|
133
|
+
/**
|
|
134
|
+
* Store an item in a collection. If the item exists, it will be updated.
|
|
135
|
+
* @param collection - Collection name (e.g., 'orders', 'users')
|
|
136
|
+
* @param data - Data object with required `id` field
|
|
137
|
+
*/
|
|
138
|
+
put: <T extends DataItem>(collection: string, data: T) => Promise<PutResult<T>>;
|
|
139
|
+
/**
|
|
140
|
+
* Get a single item from a collection.
|
|
141
|
+
* @param collection - Collection name
|
|
142
|
+
* @param id - Item ID
|
|
143
|
+
*/
|
|
144
|
+
get: <T extends DataItem>(collection: string, id: string) => Promise<T | null>;
|
|
145
|
+
/**
|
|
146
|
+
* Query items from a collection with optional filters and pagination.
|
|
147
|
+
* @param collection - Collection name
|
|
148
|
+
* @param options - Query options (limit, cursor, filter)
|
|
149
|
+
*/
|
|
150
|
+
query: <T extends DataItem>(collection: string, options?: QueryOptions) => Promise<QueryResult<T>>;
|
|
151
|
+
/**
|
|
152
|
+
* Delete an item from a collection.
|
|
153
|
+
* @param collection - Collection name
|
|
154
|
+
* @param id - Item ID
|
|
155
|
+
*/
|
|
156
|
+
remove: (collection: string, id: string) => Promise<DeleteResult>;
|
|
157
|
+
/**
|
|
158
|
+
* Batch operations (put/delete) on a collection.
|
|
159
|
+
* Maximum 100 operations per request.
|
|
160
|
+
* @param collection - Collection name
|
|
161
|
+
* @param operations - Array of operations
|
|
162
|
+
*/
|
|
163
|
+
batch: (collection: string, operations: BatchOperation[]) => Promise<BatchResult>;
|
|
164
|
+
};
|
|
165
|
+
|
|
73
166
|
interface SignInFormProps {
|
|
74
167
|
onSuccess?: () => void;
|
|
75
168
|
signUpUrl?: string;
|
|
@@ -117,4 +210,4 @@ interface ProtectedRouteProps {
|
|
|
117
210
|
}
|
|
118
211
|
declare function ProtectedRoute({ children, fallback }: ProtectedRouteProps): react_jsx_runtime.JSX.Element | null;
|
|
119
212
|
|
|
120
|
-
export { type AuthActions, type AuthState, type GitHatConfig, type GitHatContextValue, type GitHatOrg, GitHatProvider, type GitHatUser, OrgSwitcher, ProtectedRoute, SignInButton, SignInForm, SignUpButton, type SignUpData, SignUpForm, type SignUpResult, UserButton, VerifiedBadge, useAuth, useGitHat };
|
|
213
|
+
export { type AuthActions, type AuthState, type BatchOperation, type BatchResult, type DataItem, type DeleteResult, type GitHatConfig, type GitHatContextValue, type GitHatOrg, GitHatProvider, type GitHatUser, OrgSwitcher, ProtectedRoute, type PutResult, type QueryOptions, type QueryResult, SignInButton, SignInForm, SignUpButton, type SignUpData, SignUpForm, type SignUpResult, UserButton, VerifiedBadge, useAuth, useData, useGitHat };
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,7 @@ __export(src_exports, {
|
|
|
31
31
|
UserButton: () => UserButton,
|
|
32
32
|
VerifiedBadge: () => VerifiedBadge,
|
|
33
33
|
useAuth: () => useAuth,
|
|
34
|
+
useData: () => useData,
|
|
34
35
|
useGitHat: () => useGitHat
|
|
35
36
|
});
|
|
36
37
|
module.exports = __toCommonJS(src_exports);
|
|
@@ -302,15 +303,93 @@ function useGitHat() {
|
|
|
302
303
|
};
|
|
303
304
|
}
|
|
304
305
|
|
|
305
|
-
// src/
|
|
306
|
+
// src/data.ts
|
|
306
307
|
var import_react3 = require("react");
|
|
308
|
+
function useData() {
|
|
309
|
+
const ctx = useAuth();
|
|
310
|
+
const client = (0, import_react3.useMemo)(
|
|
311
|
+
() => createClient(ctx.config.apiUrl, ctx.config.publishableKey),
|
|
312
|
+
[ctx.config.apiUrl, ctx.config.publishableKey]
|
|
313
|
+
);
|
|
314
|
+
return (0, import_react3.useMemo)(() => ({
|
|
315
|
+
/**
|
|
316
|
+
* Store an item in a collection. If the item exists, it will be updated.
|
|
317
|
+
* @param collection - Collection name (e.g., 'orders', 'users')
|
|
318
|
+
* @param data - Data object with required `id` field
|
|
319
|
+
*/
|
|
320
|
+
put: async (collection, data) => {
|
|
321
|
+
if (!data.id) {
|
|
322
|
+
throw new Error('Data must include an "id" field');
|
|
323
|
+
}
|
|
324
|
+
return client.fetchApi(`/data/${collection}/${data.id}`, {
|
|
325
|
+
method: "PUT",
|
|
326
|
+
body: JSON.stringify(data)
|
|
327
|
+
});
|
|
328
|
+
},
|
|
329
|
+
/**
|
|
330
|
+
* Get a single item from a collection.
|
|
331
|
+
* @param collection - Collection name
|
|
332
|
+
* @param id - Item ID
|
|
333
|
+
*/
|
|
334
|
+
get: async (collection, id) => {
|
|
335
|
+
try {
|
|
336
|
+
const result = await client.fetchApi(`/data/${collection}/${id}`);
|
|
337
|
+
return result.item;
|
|
338
|
+
} catch (err) {
|
|
339
|
+
if (err instanceof Error && err.message === "Item not found") {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
throw err;
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
/**
|
|
346
|
+
* Query items from a collection with optional filters and pagination.
|
|
347
|
+
* @param collection - Collection name
|
|
348
|
+
* @param options - Query options (limit, cursor, filter)
|
|
349
|
+
*/
|
|
350
|
+
query: async (collection, options = {}) => {
|
|
351
|
+
const params = new URLSearchParams();
|
|
352
|
+
if (options.limit) params.set("limit", options.limit.toString());
|
|
353
|
+
if (options.cursor) params.set("cursor", options.cursor);
|
|
354
|
+
if (options.filter) params.set("filter", JSON.stringify(options.filter));
|
|
355
|
+
const queryString = params.toString();
|
|
356
|
+
const url = `/data/${collection}${queryString ? `?${queryString}` : ""}`;
|
|
357
|
+
return client.fetchApi(url);
|
|
358
|
+
},
|
|
359
|
+
/**
|
|
360
|
+
* Delete an item from a collection.
|
|
361
|
+
* @param collection - Collection name
|
|
362
|
+
* @param id - Item ID
|
|
363
|
+
*/
|
|
364
|
+
remove: async (collection, id) => {
|
|
365
|
+
return client.fetchApi(`/data/${collection}/${id}`, {
|
|
366
|
+
method: "DELETE"
|
|
367
|
+
});
|
|
368
|
+
},
|
|
369
|
+
/**
|
|
370
|
+
* Batch operations (put/delete) on a collection.
|
|
371
|
+
* Maximum 100 operations per request.
|
|
372
|
+
* @param collection - Collection name
|
|
373
|
+
* @param operations - Array of operations
|
|
374
|
+
*/
|
|
375
|
+
batch: async (collection, operations) => {
|
|
376
|
+
return client.fetchApi(`/data/${collection}/batch`, {
|
|
377
|
+
method: "POST",
|
|
378
|
+
body: JSON.stringify({ operations })
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}), [client]);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// src/components/SignInForm.tsx
|
|
385
|
+
var import_react4 = require("react");
|
|
307
386
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
308
387
|
function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }) {
|
|
309
388
|
const { signIn, config } = useAuth();
|
|
310
|
-
const [email, setEmail] = (0,
|
|
311
|
-
const [password, setPassword] = (0,
|
|
312
|
-
const [error, setError] = (0,
|
|
313
|
-
const [loading, setLoading] = (0,
|
|
389
|
+
const [email, setEmail] = (0, import_react4.useState)("");
|
|
390
|
+
const [password, setPassword] = (0, import_react4.useState)("");
|
|
391
|
+
const [error, setError] = (0, import_react4.useState)("");
|
|
392
|
+
const [loading, setLoading] = (0, import_react4.useState)(false);
|
|
314
393
|
const emailValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
|
315
394
|
const handleSubmit = async (e) => {
|
|
316
395
|
e.preventDefault();
|
|
@@ -396,15 +475,15 @@ function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }) {
|
|
|
396
475
|
}
|
|
397
476
|
|
|
398
477
|
// src/components/SignUpForm.tsx
|
|
399
|
-
var
|
|
478
|
+
var import_react5 = require("react");
|
|
400
479
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
401
480
|
function SignUpForm({ onSuccess, signInUrl }) {
|
|
402
481
|
const { signUp, config } = useAuth();
|
|
403
|
-
const [name, setName] = (0,
|
|
404
|
-
const [email, setEmail] = (0,
|
|
405
|
-
const [password, setPassword] = (0,
|
|
406
|
-
const [error, setError] = (0,
|
|
407
|
-
const [loading, setLoading] = (0,
|
|
482
|
+
const [name, setName] = (0, import_react5.useState)("");
|
|
483
|
+
const [email, setEmail] = (0, import_react5.useState)("");
|
|
484
|
+
const [password, setPassword] = (0, import_react5.useState)("");
|
|
485
|
+
const [error, setError] = (0, import_react5.useState)("");
|
|
486
|
+
const [loading, setLoading] = (0, import_react5.useState)(false);
|
|
408
487
|
const emailValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
|
409
488
|
const passwordValid = password.length >= 8 && /[A-Z]/.test(password) && /[a-z]/.test(password) && /\d/.test(password);
|
|
410
489
|
const handleSubmit = async (e) => {
|
|
@@ -510,31 +589,31 @@ function SignUpForm({ onSuccess, signInUrl }) {
|
|
|
510
589
|
}
|
|
511
590
|
|
|
512
591
|
// src/components/SignInButton.tsx
|
|
513
|
-
var
|
|
592
|
+
var import_react6 = require("react");
|
|
514
593
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
515
594
|
function SignInButton({ className, children, href }) {
|
|
516
|
-
const ctx = (0,
|
|
595
|
+
const ctx = (0, import_react6.useContext)(GitHatContext);
|
|
517
596
|
const url = href || ctx?.config.signInUrl || "/sign-in";
|
|
518
597
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("a", { href: url, className: className || "githat-button githat-button-primary", "aria-label": "Sign in", children: children || "Sign in" });
|
|
519
598
|
}
|
|
520
599
|
|
|
521
600
|
// src/components/SignUpButton.tsx
|
|
522
|
-
var
|
|
601
|
+
var import_react7 = require("react");
|
|
523
602
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
524
603
|
function SignUpButton({ className, children, href }) {
|
|
525
|
-
const ctx = (0,
|
|
604
|
+
const ctx = (0, import_react7.useContext)(GitHatContext);
|
|
526
605
|
const url = href || ctx?.config.signUpUrl || "/sign-up";
|
|
527
606
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("a", { href: url, className: className || "githat-button githat-button-outline", "aria-label": "Sign up", children: children || "Sign up" });
|
|
528
607
|
}
|
|
529
608
|
|
|
530
609
|
// src/components/UserButton.tsx
|
|
531
|
-
var
|
|
610
|
+
var import_react8 = require("react");
|
|
532
611
|
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
533
612
|
function UserButton() {
|
|
534
613
|
const { user, org, isSignedIn, signOut } = useAuth();
|
|
535
|
-
const [open, setOpen] = (0,
|
|
536
|
-
const ref = (0,
|
|
537
|
-
(0,
|
|
614
|
+
const [open, setOpen] = (0, import_react8.useState)(false);
|
|
615
|
+
const ref = (0, import_react8.useRef)(null);
|
|
616
|
+
(0, import_react8.useEffect)(() => {
|
|
538
617
|
const handleClickOutside = (e) => {
|
|
539
618
|
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
|
540
619
|
};
|
|
@@ -561,23 +640,23 @@ function UserButton() {
|
|
|
561
640
|
}
|
|
562
641
|
|
|
563
642
|
// src/components/OrgSwitcher.tsx
|
|
564
|
-
var
|
|
643
|
+
var import_react9 = require("react");
|
|
565
644
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
566
645
|
function OrgSwitcher() {
|
|
567
646
|
const { org, isSignedIn, switchOrg } = useAuth();
|
|
568
647
|
const githat = useGitHat();
|
|
569
|
-
const [orgs, setOrgs] = (0,
|
|
570
|
-
const [orgsLoading, setOrgsLoading] = (0,
|
|
571
|
-
const [open, setOpen] = (0,
|
|
572
|
-
const ref = (0,
|
|
573
|
-
(0,
|
|
648
|
+
const [orgs, setOrgs] = (0, import_react9.useState)([]);
|
|
649
|
+
const [orgsLoading, setOrgsLoading] = (0, import_react9.useState)(false);
|
|
650
|
+
const [open, setOpen] = (0, import_react9.useState)(false);
|
|
651
|
+
const ref = (0, import_react9.useRef)(null);
|
|
652
|
+
(0, import_react9.useEffect)(() => {
|
|
574
653
|
if (isSignedIn) {
|
|
575
654
|
setOrgsLoading(true);
|
|
576
655
|
githat.getUserOrgs().then((data) => setOrgs(data.orgs || [])).catch(() => {
|
|
577
656
|
}).finally(() => setOrgsLoading(false));
|
|
578
657
|
}
|
|
579
658
|
}, [isSignedIn]);
|
|
580
|
-
(0,
|
|
659
|
+
(0, import_react9.useEffect)(() => {
|
|
581
660
|
const handleClickOutside = (e) => {
|
|
582
661
|
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
|
583
662
|
};
|
|
@@ -611,15 +690,15 @@ function OrgSwitcher() {
|
|
|
611
690
|
}
|
|
612
691
|
|
|
613
692
|
// src/components/VerifiedBadge.tsx
|
|
614
|
-
var
|
|
693
|
+
var import_react10 = require("react");
|
|
615
694
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
616
695
|
var CACHE_TTL = 5 * 60 * 1e3;
|
|
617
696
|
var cache = /* @__PURE__ */ new Map();
|
|
618
697
|
function VerifiedBadge({ type, identifier, label }) {
|
|
619
698
|
const githat = useGitHat();
|
|
620
|
-
const [verified, setVerified] = (0,
|
|
621
|
-
const mounted = (0,
|
|
622
|
-
(0,
|
|
699
|
+
const [verified, setVerified] = (0, import_react10.useState)(null);
|
|
700
|
+
const mounted = (0, import_react10.useRef)(true);
|
|
701
|
+
(0, import_react10.useEffect)(() => {
|
|
623
702
|
mounted.current = true;
|
|
624
703
|
const key = `${type}:${identifier}`;
|
|
625
704
|
const cached = cache.get(key);
|
|
@@ -675,6 +754,7 @@ function ProtectedRoute({ children, fallback }) {
|
|
|
675
754
|
UserButton,
|
|
676
755
|
VerifiedBadge,
|
|
677
756
|
useAuth,
|
|
757
|
+
useData,
|
|
678
758
|
useGitHat
|
|
679
759
|
});
|
|
680
760
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/config.ts","../src/client.ts","../src/hooks.ts","../src/components/SignInForm.tsx","../src/components/SignUpForm.tsx","../src/components/SignInButton.tsx","../src/components/SignUpButton.tsx","../src/components/UserButton.tsx","../src/components/OrgSwitcher.tsx","../src/components/VerifiedBadge.tsx","../src/components/ProtectedRoute.tsx"],"sourcesContent":["// Provider\nexport { GitHatProvider } from './provider';\n\n// Hooks\nexport { useAuth, useGitHat } from './hooks';\n\n// Components\nexport { SignInForm } from './components/SignInForm';\nexport { SignUpForm } from './components/SignUpForm';\nexport { SignInButton } from './components/SignInButton';\nexport { SignUpButton } from './components/SignUpButton';\nexport { UserButton } from './components/UserButton';\nexport { OrgSwitcher } from './components/OrgSwitcher';\nexport { VerifiedBadge } from './components/VerifiedBadge';\nexport { ProtectedRoute } from './components/ProtectedRoute';\n\n// Types\nexport type {\n GitHatUser,\n GitHatOrg,\n GitHatConfig,\n AuthState,\n AuthActions,\n SignUpData,\n SignUpResult,\n GitHatContextValue,\n} from './types';\n","'use client';\n\nimport React, { createContext, useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { GitHatConfig, GitHatContextValue, GitHatUser, GitHatOrg, SignUpData, SignUpResult } from './types';\nimport { TOKEN_KEYS, resolveConfig } from './config';\nimport { createClient } from './client';\n\nexport const GitHatContext = createContext<GitHatContextValue | null>(null);\n\ninterface GitHatProviderProps {\n config: GitHatConfig;\n children: React.ReactNode;\n}\n\nexport function GitHatProvider({ config: rawConfig, children }: GitHatProviderProps) {\n const config = useMemo(() => resolveConfig(rawConfig), [rawConfig]);\n const clientRef = useRef(createClient(config.apiUrl, config.publishableKey));\n\n const [user, setUser] = useState<GitHatUser | null>(null);\n const [org, setOrg] = useState<GitHatOrg | null>(null);\n const [isSignedIn, setIsSignedIn] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [authError, setAuthError] = useState<string | null>(null);\n\n // Validate stored token on mount\n useEffect(() => {\n const token = localStorage.getItem(TOKEN_KEYS.accessToken);\n const storedUser = localStorage.getItem(TOKEN_KEYS.user);\n\n if (token && storedUser) {\n clientRef.current.fetchApi<{ user: GitHatUser; currentOrg: GitHatOrg }>('/auth/me')\n .then((data) => {\n const u = data.user || JSON.parse(storedUser);\n setUser(u);\n const storedOrg = localStorage.getItem(TOKEN_KEYS.org);\n setOrg(data.currentOrg || (storedOrg ? JSON.parse(storedOrg) : null));\n setIsSignedIn(true);\n setAuthError(null);\n })\n .catch((err) => {\n if (err.message === 'Session expired') {\n clientRef.current.clearAuth();\n } else {\n // Network error — keep stored auth, surface error\n try { setUser(JSON.parse(storedUser)); } catch {}\n setAuthError(err.message || 'Failed to verify session');\n }\n })\n .finally(() => setIsLoading(false));\n } else {\n setIsLoading(false);\n }\n }, []);\n\n // Listen for auth-changed events\n useEffect(() => {\n const handleAuthChanged = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (detail?.signedIn === false) {\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n } else if (detail?.signedIn === true && detail?.user) {\n setUser(detail.user);\n setIsSignedIn(true);\n if (detail.org) setOrg(detail.org);\n }\n };\n window.addEventListener('githat:auth-changed', handleAuthChanged);\n return () => window.removeEventListener('githat:auth-changed', handleAuthChanged);\n }, []);\n\n const signIn = useCallback(async (email: string, password: string) => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/login', {\n method: 'POST',\n body: JSON.stringify({ email, password }),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n }, []);\n\n const signUp = useCallback(async (signUpData: SignUpData): Promise<SignUpResult> => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/register', {\n method: 'POST',\n body: JSON.stringify(signUpData),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n\n return { requiresVerification: !data.user.emailVerified, email: signUpData.email };\n }, []);\n\n const signOut = useCallback(async () => {\n try {\n await clientRef.current.fetchApi('/auth/logout', { method: 'POST' });\n } catch {}\n clientRef.current.clearAuth();\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n if (typeof window !== 'undefined' && config.afterSignOutUrl) {\n window.location.href = config.afterSignOutUrl;\n }\n }, [config.afterSignOutUrl]);\n\n const switchOrg = useCallback(async (orgId: string) => {\n try {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n org: GitHatOrg;\n }>(`/user/orgs/${orgId}/switch`, { method: 'POST' });\n\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n const orgData = data.org;\n localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(orgData));\n setOrg(orgData);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user, org: orgData, signedIn: true },\n }));\n } catch (e) {\n console.error('Org switch failed:', e);\n }\n }, [user]);\n\n const value = useMemo<GitHatContextValue>(() => ({\n user, org, isSignedIn, isLoading, authError, config,\n signIn, signUp, signOut, switchOrg,\n }), [user, org, isSignedIn, isLoading, authError, config, signIn, signUp, signOut, switchOrg]);\n\n return (\n <GitHatContext.Provider value={value}>\n {children}\n </GitHatContext.Provider>\n );\n}\n","import type { GitHatConfig } from './types';\n\nexport const DEFAULT_API_URL = 'https://api.githat.io';\n\nexport const TOKEN_KEYS = {\n accessToken: 'githat_access_token',\n refreshToken: 'githat_refresh_token',\n user: 'githat_user',\n org: 'githat_org',\n} as const;\n\nexport function resolveConfig(config: GitHatConfig): Required<GitHatConfig> {\n return {\n publishableKey: config.publishableKey,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n signInUrl: config.signInUrl || '/sign-in',\n signUpUrl: config.signUpUrl || '/sign-up',\n afterSignInUrl: config.afterSignInUrl || '/dashboard',\n afterSignOutUrl: config.afterSignOutUrl || '/',\n };\n}\n","import { TOKEN_KEYS } from './config';\n\nlet _refreshPromise: Promise<boolean> | null = null;\n\nasync function refreshTokens(apiUrl: string, appKey: string): Promise<boolean> {\n const refreshToken = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.refreshToken) : null;\n if (!refreshToken) return false;\n\n let orgId: string | null = null;\n try {\n const orgStr = localStorage.getItem(TOKEN_KEYS.org);\n if (orgStr) orgId = JSON.parse(orgStr).id;\n } catch {}\n\n try {\n const res = await fetch(`${apiUrl}/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n },\n body: JSON.stringify({ refreshToken, orgId }),\n });\n if (!res.ok) return false;\n\n const data = await res.json();\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction clearAuth() {\n if (typeof window === 'undefined') return;\n Object.values(TOKEN_KEYS).forEach(key => localStorage.removeItem(key));\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: null, org: null, signedIn: false },\n }));\n}\n\nexport function createClient(apiUrl: string, appKey: string) {\n async function fetchApi<T = any>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${apiUrl}${endpoint}`;\n const token = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.accessToken) : null;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n ...(token && { Authorization: `Bearer ${token}` }),\n ...(options.headers as Record<string, string>),\n };\n\n let response: Response;\n try {\n response = await fetch(url, { ...options, headers });\n } catch (networkError: unknown) {\n // Network errors (CORS blocked, offline, DNS failure) throw TypeError\n if (networkError instanceof TypeError) {\n const isMissingKey = !appKey || !appKey.startsWith('pk_live_');\n const isLocalhost = typeof window !== 'undefined' &&\n (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');\n\n if (isMissingKey && !isLocalhost) {\n throw new Error(\n 'Missing GitHat API key. Add NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY to .env.local'\n );\n }\n throw new Error(\n 'Unable to connect to GitHat API. Check your network connection.'\n );\n }\n throw networkError;\n }\n\n if (response.status === 401) {\n // Queue all 401 retries behind a single refresh promise\n if (!_refreshPromise) {\n _refreshPromise = refreshTokens(apiUrl, appKey).finally(() => {\n _refreshPromise = null;\n });\n }\n\n const refreshed = await _refreshPromise;\n\n if (refreshed) {\n const newToken = localStorage.getItem(TOKEN_KEYS.accessToken);\n const retryResponse = await fetch(url, {\n ...options,\n headers: {\n ...headers,\n ...(newToken && { Authorization: `Bearer ${newToken}` }),\n },\n });\n const retryData = await retryResponse.json();\n if (!retryResponse.ok) throw new Error(retryData.error || 'Request failed');\n return retryData as T;\n }\n\n clearAuth();\n throw new Error('Session expired');\n }\n\n const data = await response.json();\n if (!response.ok) throw new Error(data.error || 'Request failed');\n return data as T;\n }\n\n return { fetchApi, clearAuth };\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\nimport { GitHatContext } from './provider';\nimport { createClient } from './client';\nimport type { GitHatContextValue, GitHatOrg } from './types';\n\nexport function useAuth(): GitHatContextValue {\n const ctx = useContext(GitHatContext);\n if (!ctx) throw new Error('useAuth must be used within a <GitHatProvider>');\n return ctx;\n}\n\nexport function useGitHat() {\n const ctx = useAuth();\n const client = useMemo(\n () => createClient(ctx.config.apiUrl!, ctx.config.publishableKey),\n [ctx.config.apiUrl, ctx.config.publishableKey]\n );\n\n return {\n fetch: client.fetchApi,\n getUserOrgs: () => client.fetchApi<{ orgs: GitHatOrg[] }>('/user/orgs'),\n verifyMCP: (domain: string) => client.fetchApi<{ verified: boolean }>(`/verify/mcp/${domain}`),\n verifyAgent: (wallet: string) => client.fetchApi<{ verified: boolean }>(`/verify/agent/${wallet}`),\n };\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignInFormProps {\n onSuccess?: () => void;\n signUpUrl?: string;\n forgotPasswordUrl?: string;\n}\n\nexport function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }: SignInFormProps) {\n const { signIn, config } = useAuth();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n setError('');\n setLoading(true);\n try {\n await signIn(email, password);\n if (onSuccess) {\n onSuccess();\n } else if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n window.location.href = params.get('redirect_url') || config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign in failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Sign in</h2>\n <p className=\"githat-form-subtitle\">Welcome back to GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign in form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-email\">Email</label>\n <input\n id=\"githat-signin-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-password\">Password</label>\n <input\n id=\"githat-signin-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n autoComplete=\"current-password\"\n required\n />\n </div>\n {forgotPasswordUrl && (\n <a href={forgotPasswordUrl} className=\"githat-link githat-forgot-link\">Forgot password?</a>\n )}\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || (email.length > 0 && !emailValid)}\n >\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n {signUpUrl && (\n <p className=\"githat-form-footer\">\n Don't have an account? <a href={signUpUrl} className=\"githat-link\">Sign up</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignUpFormProps {\n onSuccess?: (result: { requiresVerification: boolean; email: string }) => void;\n signInUrl?: string;\n}\n\nexport function SignUpForm({ onSuccess, signInUrl }: SignUpFormProps) {\n const { signUp, config } = useAuth();\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n const passwordValid = password.length >= 8\n && /[A-Z]/.test(password)\n && /[a-z]/.test(password)\n && /\\d/.test(password);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n if (!passwordValid) {\n setError('Password must be 8+ characters with uppercase, lowercase, number, and special character');\n return;\n }\n setError('');\n setLoading(true);\n try {\n const result = await signUp({ email, password, name });\n if (onSuccess) {\n onSuccess(result);\n } else if (typeof window !== 'undefined') {\n window.location.href = config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign up failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Create an account</h2>\n <p className=\"githat-form-subtitle\">Get started with GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign up form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-name\">Full name</label>\n <input\n id=\"githat-signup-name\"\n className=\"githat-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-email\">Email</label>\n <input\n id=\"githat-signup-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-password\">Password</label>\n <input\n id=\"githat-signup-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n autoComplete=\"new-password\"\n required\n />\n {password && !passwordValid && (\n <p className=\"githat-field-error\">\n Must be 8+ characters with uppercase, lowercase, and number\n </p>\n )}\n </div>\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || !name || !emailValid}\n >\n {loading ? 'Creating account...' : 'Sign up'}\n </button>\n </form>\n {signInUrl && (\n <p className=\"githat-form-footer\">\n Already have an account? <a href={signInUrl} className=\"githat-link\">Sign in</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignInButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignInButton({ className, children, href }: SignInButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signInUrl || '/sign-in';\n return (\n <a href={url} className={className || 'githat-button githat-button-primary'} aria-label=\"Sign in\">\n {children || 'Sign in'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignUpButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignUpButton({ className, children, href }: SignUpButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signUpUrl || '/sign-up';\n return (\n <a href={url} className={className || 'githat-button githat-button-outline'} aria-label=\"Sign up\">\n {children || 'Sign up'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useAuth } from '../hooks';\n\nexport function UserButton() {\n const { user, org, isSignedIn, signOut } = useAuth();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !user) return null;\n\n const initials = user.name\n ? user.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)\n : user.email[0].toUpperCase();\n\n return (\n <div className=\"githat-user-button\" ref={ref}>\n <button className=\"githat-avatar-trigger\" onClick={() => setOpen(!open)} aria-label=\"User menu\" aria-expanded={open} aria-haspopup=\"true\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt={user.name || 'User avatar'} className=\"githat-avatar-img\" />\n ) : (\n <span className=\"githat-avatar-initials\">{initials}</span>\n )}\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n <div className=\"githat-dropdown-header\">\n <p className=\"githat-dropdown-name\">{user.name}</p>\n <p className=\"githat-dropdown-email\">{user.email}</p>\n {org && <p className=\"githat-dropdown-org\">{org.name}</p>}\n </div>\n <div className=\"githat-dropdown-divider\" />\n <button className=\"githat-dropdown-item\" role=\"menuitem\" onClick={() => { signOut(); setOpen(false); }}>\n Sign out\n </button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useAuth, useGitHat } from '../hooks';\nimport type { GitHatOrg } from '../types';\n\nexport function OrgSwitcher() {\n const { org, isSignedIn, switchOrg } = useAuth();\n const githat = useGitHat();\n const [orgs, setOrgs] = useState<GitHatOrg[]>([]);\n const [orgsLoading, setOrgsLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isSignedIn) {\n setOrgsLoading(true);\n githat.getUserOrgs()\n .then(data => setOrgs(data.orgs || []))\n .catch(() => {})\n .finally(() => setOrgsLoading(false));\n }\n }, [isSignedIn]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !org || (orgs.length < 2 && !orgsLoading)) return null;\n\n return (\n <div className=\"githat-org-switcher\" ref={ref}>\n <button className=\"githat-org-trigger\" onClick={() => setOpen(!open)} aria-label=\"Switch organization\" aria-expanded={open} aria-haspopup=\"true\">\n <span className=\"githat-org-name\">{org.name}</span>\n <span className=\"githat-chevron\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n {orgsLoading ? (\n <div className=\"githat-dropdown-item\" aria-busy=\"true\">Loading...</div>\n ) : orgs.map(o => (\n <button\n key={o.id}\n className={`githat-dropdown-item ${o.id === org.id ? 'githat-dropdown-item-active' : ''}`}\n role=\"menuitem\"\n aria-current={o.id === org.id ? 'true' : undefined}\n onClick={() => { switchOrg(o.id); setOpen(false); }}\n >\n {o.name}\n {o.id === org.id && <span className=\"githat-check\">{'\\u2713'}</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useGitHat } from '../hooks';\n\ninterface VerifiedBadgeProps {\n type: 'mcp' | 'agent';\n identifier: string;\n label?: string;\n}\n\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\nconst cache = new Map<string, { verified: boolean; ts: number }>();\n\nexport function VerifiedBadge({ type, identifier, label }: VerifiedBadgeProps) {\n const githat = useGitHat();\n const [verified, setVerified] = useState<boolean | null>(null);\n const mounted = useRef(true);\n\n useEffect(() => {\n mounted.current = true;\n const key = `${type}:${identifier}`;\n const cached = cache.get(key);\n if (cached && Date.now() - cached.ts < CACHE_TTL) {\n setVerified(cached.verified);\n return;\n }\n\n const verify = type === 'mcp' ? githat.verifyMCP : githat.verifyAgent;\n verify(identifier)\n .then(data => {\n if (mounted.current) {\n setVerified(data.verified);\n cache.set(key, { verified: data.verified, ts: Date.now() });\n }\n })\n .catch(() => { if (mounted.current) setVerified(false); });\n\n return () => { mounted.current = false; };\n }, [type, identifier]);\n\n if (verified === null) return null;\n\n return (\n <span className={`githat-badge ${verified ? 'githat-badge-verified' : 'githat-badge-unverified'}`}>\n {verified ? '\\u2713' : '\\u2717'} {label || (verified ? 'Verified' : 'Unverified')}\n </span>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { useAuth } from '../hooks';\n\ninterface ProtectedRouteProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\nexport function ProtectedRoute({ children, fallback }: ProtectedRouteProps) {\n const { isSignedIn, isLoading, config } = useAuth();\n\n if (isLoading) {\n return <>{fallback || <div className=\"githat-loading\">Loading...</div>}</>;\n }\n\n if (!isSignedIn) {\n if (typeof window !== 'undefined') {\n window.location.href = config.signInUrl!;\n }\n return null;\n }\n\n return <>{children}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAAwF;;;ACAjF,IAAM,kBAAkB;AAExB,IAAM,aAAa;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,MAAM;AAAA,EACN,KAAK;AACP;AAEO,SAAS,cAAc,QAA8C;AAC1E,SAAO;AAAA,IACL,gBAAgB,OAAO;AAAA,IACvB,QAAQ,OAAO,UAAU;AAAA,IACzB,WAAW,OAAO,aAAa;AAAA,IAC/B,WAAW,OAAO,aAAa;AAAA,IAC/B,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,iBAAiB,OAAO,mBAAmB;AAAA,EAC7C;AACF;;;AClBA,IAAI,kBAA2C;AAE/C,eAAe,cAAc,QAAgB,QAAkC;AAC7E,QAAM,eAAe,OAAO,WAAW,cAAc,aAAa,QAAQ,WAAW,YAAY,IAAI;AACrG,MAAI,CAAC,aAAc,QAAO;AAE1B,MAAI,QAAuB;AAC3B,MAAI;AACF,UAAM,SAAS,aAAa,QAAQ,WAAW,GAAG;AAClD,QAAI,OAAQ,SAAQ,KAAK,MAAM,MAAM,EAAE;AAAA,EACzC,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,MAAM,iBAAiB;AAAA,MAChD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,MACtB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,cAAc,MAAM,CAAC;AAAA,IAC9C,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AAEpB,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,KAAK,YAAa,cAAa,QAAQ,WAAW,aAAa,KAAK,WAAW;AACnF,QAAI,KAAK,aAAc,cAAa,QAAQ,WAAW,cAAc,KAAK,YAAY;AACtF,QAAI,KAAK,IAAK,cAAa,QAAQ,WAAW,KAAK,KAAK,UAAU,KAAK,GAAG,CAAC;AAC3E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY;AACnB,MAAI,OAAO,WAAW,YAAa;AACnC,SAAO,OAAO,UAAU,EAAE,QAAQ,SAAO,aAAa,WAAW,GAAG,CAAC;AACrE,SAAO,cAAc,IAAI,YAAY,uBAAuB;AAAA,IAC1D,QAAQ,EAAE,MAAM,MAAM,KAAK,MAAM,UAAU,MAAM;AAAA,EACnD,CAAC,CAAC;AACJ;AAEO,SAAS,aAAa,QAAgB,QAAgB;AAC3D,iBAAe,SAAkB,UAAkB,UAAuB,CAAC,GAAe;AACxF,UAAM,MAAM,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,QAAQ,OAAO,WAAW,cAAc,aAAa,QAAQ,WAAW,WAAW,IAAI;AAE7F,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,GAAI,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,MAChD,GAAI,QAAQ;AAAA,IACd;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK,EAAE,GAAG,SAAS,QAAQ,CAAC;AAAA,IACrD,SAAS,cAAuB;AAE9B,UAAI,wBAAwB,WAAW;AACrC,cAAM,eAAe,CAAC,UAAU,CAAC,OAAO,WAAW,UAAU;AAC7D,cAAM,cAAc,OAAO,WAAW,gBACnC,OAAO,SAAS,aAAa,eAAe,OAAO,SAAS,aAAa;AAE5E,YAAI,gBAAgB,CAAC,aAAa;AAChC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,KAAK;AAE3B,UAAI,CAAC,iBAAiB;AACpB,0BAAkB,cAAc,QAAQ,MAAM,EAAE,QAAQ,MAAM;AAC5D,4BAAkB;AAAA,QACpB,CAAC;AAAA,MACH;AAEA,YAAM,YAAY,MAAM;AAExB,UAAI,WAAW;AACb,cAAM,WAAW,aAAa,QAAQ,WAAW,WAAW;AAC5D,cAAM,gBAAgB,MAAM,MAAM,KAAK;AAAA,UACrC,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAG;AAAA,YACH,GAAI,YAAY,EAAE,eAAe,UAAU,QAAQ,GAAG;AAAA,UACxD;AAAA,QACF,CAAC;AACD,cAAM,YAAY,MAAM,cAAc,KAAK;AAC3C,YAAI,CAAC,cAAc,GAAI,OAAM,IAAI,MAAM,UAAU,SAAS,gBAAgB;AAC1E,eAAO;AAAA,MACT;AAEA,gBAAU;AACV,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,gBAAgB;AAChE,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,UAAU,UAAU;AAC/B;;;AFsDI;AA9JG,IAAM,oBAAgB,4BAAyC,IAAI;AAOnE,SAAS,eAAe,EAAE,QAAQ,WAAW,SAAS,GAAwB;AACnF,QAAM,aAAS,sBAAQ,MAAM,cAAc,SAAS,GAAG,CAAC,SAAS,CAAC;AAClE,QAAM,gBAAY,qBAAO,aAAa,OAAO,QAAQ,OAAO,cAAc,CAAC;AAE3E,QAAM,CAAC,MAAM,OAAO,QAAI,uBAA4B,IAAI;AACxD,QAAM,CAAC,KAAK,MAAM,QAAI,uBAA2B,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAwB,IAAI;AAG9D,8BAAU,MAAM;AACd,UAAM,QAAQ,aAAa,QAAQ,WAAW,WAAW;AACzD,UAAM,aAAa,aAAa,QAAQ,WAAW,IAAI;AAEvD,QAAI,SAAS,YAAY;AACvB,gBAAU,QAAQ,SAAsD,UAAU,EAC/E,KAAK,CAAC,SAAS;AACd,cAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,UAAU;AAC5C,gBAAQ,CAAC;AACT,cAAM,YAAY,aAAa,QAAQ,WAAW,GAAG;AACrD,eAAO,KAAK,eAAe,YAAY,KAAK,MAAM,SAAS,IAAI,KAAK;AACpE,sBAAc,IAAI;AAClB,qBAAa,IAAI;AAAA,MACnB,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAI,IAAI,YAAY,mBAAmB;AACrC,oBAAU,QAAQ,UAAU;AAAA,QAC9B,OAAO;AAEL,cAAI;AAAE,oBAAQ,KAAK,MAAM,UAAU,CAAC;AAAA,UAAG,QAAQ;AAAA,UAAC;AAChD,uBAAa,IAAI,WAAW,0BAA0B;AAAA,QACxD;AAAA,MACF,CAAC,EACA,QAAQ,MAAM,aAAa,KAAK,CAAC;AAAA,IACtC,OAAO;AACL,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,8BAAU,MAAM;AACd,UAAM,oBAAoB,CAAC,MAAa;AACtC,YAAM,SAAU,EAAkB;AAClC,UAAI,QAAQ,aAAa,OAAO;AAC9B,sBAAc,KAAK;AACnB,gBAAQ,IAAI;AACZ,eAAO,IAAI;AAAA,MACb,WAAW,QAAQ,aAAa,QAAQ,QAAQ,MAAM;AACpD,gBAAQ,OAAO,IAAI;AACnB,sBAAc,IAAI;AAClB,YAAI,OAAO,IAAK,QAAO,OAAO,GAAG;AAAA,MACnC;AAAA,IACF;AACA,WAAO,iBAAiB,uBAAuB,iBAAiB;AAChE,WAAO,MAAM,OAAO,oBAAoB,uBAAuB,iBAAiB;AAAA,EAClF,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,0BAAY,OAAO,OAAe,aAAqB;AACpE,UAAM,OAAO,MAAM,UAAU,QAAQ,SAKlC,eAAe;AAAA,MAChB,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,CAAC;AAAA,IAC1C,CAAC;AAED,iBAAa,QAAQ,WAAW,aAAa,KAAK,WAAW;AAC7D,iBAAa,QAAQ,WAAW,cAAc,KAAK,YAAY;AAC/D,iBAAa,QAAQ,WAAW,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC;AAC/D,QAAI,KAAK,IAAK,cAAa,QAAQ,WAAW,KAAK,KAAK,UAAU,KAAK,GAAG,CAAC;AAE3E,YAAQ,KAAK,IAAI;AACjB,WAAO,KAAK,OAAO,IAAI;AACvB,kBAAc,IAAI;AAElB,WAAO,cAAc,IAAI,YAAY,uBAAuB;AAAA,MAC1D,QAAQ,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK,KAAK,UAAU,KAAK;AAAA,IAC3D,CAAC,CAAC;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,0BAAY,OAAO,eAAkD;AAClF,UAAM,OAAO,MAAM,UAAU,QAAQ,SAKlC,kBAAkB;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,UAAU;AAAA,IACjC,CAAC;AAED,iBAAa,QAAQ,WAAW,aAAa,KAAK,WAAW;AAC7D,iBAAa,QAAQ,WAAW,cAAc,KAAK,YAAY;AAC/D,iBAAa,QAAQ,WAAW,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC;AAC/D,QAAI,KAAK,IAAK,cAAa,QAAQ,WAAW,KAAK,KAAK,UAAU,KAAK,GAAG,CAAC;AAE3E,YAAQ,KAAK,IAAI;AACjB,WAAO,KAAK,OAAO,IAAI;AACvB,kBAAc,IAAI;AAElB,WAAO,cAAc,IAAI,YAAY,uBAAuB;AAAA,MAC1D,QAAQ,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK,KAAK,UAAU,KAAK;AAAA,IAC3D,CAAC,CAAC;AAEF,WAAO,EAAE,sBAAsB,CAAC,KAAK,KAAK,eAAe,OAAO,WAAW,MAAM;AAAA,EACnF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAU,0BAAY,YAAY;AACtC,QAAI;AACF,YAAM,UAAU,QAAQ,SAAS,gBAAgB,EAAE,QAAQ,OAAO,CAAC;AAAA,IACrE,QAAQ;AAAA,IAAC;AACT,cAAU,QAAQ,UAAU;AAC5B,kBAAc,KAAK;AACnB,YAAQ,IAAI;AACZ,WAAO,IAAI;AACX,QAAI,OAAO,WAAW,eAAe,OAAO,iBAAiB;AAC3D,aAAO,SAAS,OAAO,OAAO;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,OAAO,eAAe,CAAC;AAE3B,QAAM,gBAAY,0BAAY,OAAO,UAAkB;AACrD,QAAI;AACF,YAAM,OAAO,MAAM,UAAU,QAAQ,SAIlC,cAAc,KAAK,WAAW,EAAE,QAAQ,OAAO,CAAC;AAEnD,UAAI,KAAK,YAAa,cAAa,QAAQ,WAAW,aAAa,KAAK,WAAW;AACnF,UAAI,KAAK,aAAc,cAAa,QAAQ,WAAW,cAAc,KAAK,YAAY;AACtF,YAAM,UAAU,KAAK;AACrB,mBAAa,QAAQ,WAAW,KAAK,KAAK,UAAU,OAAO,CAAC;AAC5D,aAAO,OAAO;AAEd,aAAO,cAAc,IAAI,YAAY,uBAAuB;AAAA,QAC1D,QAAQ,EAAE,MAAM,KAAK,SAAS,UAAU,KAAK;AAAA,MAC/C,CAAC,CAAC;AAAA,IACJ,SAAS,GAAG;AACV,cAAQ,MAAM,sBAAsB,CAAC;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,YAAQ,sBAA4B,OAAO;AAAA,IAC/C;AAAA,IAAM;AAAA,IAAK;AAAA,IAAY;AAAA,IAAW;AAAA,IAAW;AAAA,IAC7C;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,EAC3B,IAAI,CAAC,MAAM,KAAK,YAAY,WAAW,WAAW,QAAQ,QAAQ,QAAQ,SAAS,SAAS,CAAC;AAE7F,SACE,4CAAC,cAAc,UAAd,EAAuB,OACrB,UACH;AAEJ;;;AGvKA,IAAAA,gBAAoC;AAK7B,SAAS,UAA8B;AAC5C,QAAM,UAAM,0BAAW,aAAa;AACpC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gDAAgD;AAC1E,SAAO;AACT;AAEO,SAAS,YAAY;AAC1B,QAAM,MAAM,QAAQ;AACpB,QAAM,aAAS;AAAA,IACb,MAAM,aAAa,IAAI,OAAO,QAAS,IAAI,OAAO,cAAc;AAAA,IAChE,CAAC,IAAI,OAAO,QAAQ,IAAI,OAAO,cAAc;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,aAAa,MAAM,OAAO,SAAgC,YAAY;AAAA,IACtE,WAAW,CAAC,WAAmB,OAAO,SAAgC,eAAe,MAAM,EAAE;AAAA,IAC7F,aAAa,CAAC,WAAmB,OAAO,SAAgC,iBAAiB,MAAM,EAAE;AAAA,EACnG;AACF;;;ACxBA,IAAAC,gBAA2C;AA2CrC,IAAAC,sBAAA;AAlCC,SAAS,WAAW,EAAE,WAAW,WAAW,kBAAkB,GAAoB;AACvF,QAAM,EAAE,QAAQ,OAAO,IAAI,QAAQ;AACnC,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,EAAE;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,aAAa,6BAA6B,KAAK,KAAK;AAE1D,QAAM,eAAe,OAAO,MAAiB;AAC3C,MAAE,eAAe;AACjB,QAAI,CAAC,YAAY;AACf,eAAS,oCAAoC;AAC7C;AAAA,IACF;AACA,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,OAAO,OAAO,QAAQ;AAC5B,UAAI,WAAW;AACb,kBAAU;AAAA,MACZ,WAAW,OAAO,WAAW,aAAa;AACxC,cAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,eAAO,SAAS,OAAO,OAAO,IAAI,cAAc,KAAK,OAAO;AAAA,MAC9D;AAAA,IACF,SAAS,KAAU;AACjB,eAAS,IAAI,WAAW,gBAAgB;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAU,yBACb;AAAA,kDAAC,SAAI,WAAU,sBACb;AAAA,mDAAC,QAAG,WAAU,qBAAoB,qBAAO;AAAA,MACzC,6CAAC,OAAE,WAAU,wBAAuB,oCAAsB;AAAA,OAC5D;AAAA,IACC,SAAS,6CAAC,SAAI,WAAU,mCAAkC,MAAK,SAAQ,aAAU,UAAU,iBAAM;AAAA,IAClG,8CAAC,UAAK,UAAU,cAAc,WAAU,eAAc,cAAW,gBAC/D;AAAA,oDAAC,SAAI,WAAU,gBACb;AAAA,qDAAC,WAAM,WAAU,gBAAe,SAAQ,uBAAsB,mBAAK;AAAA,QACnE;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,8CAAC,SAAI,WAAU,gBACb;AAAA,qDAAC,WAAM,WAAU,gBAAe,SAAQ,0BAAyB,sBAAQ;AAAA,QACzE;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACC,qBACC,6CAAC,OAAE,MAAM,mBAAmB,WAAU,kCAAiC,8BAAgB;AAAA,MAEzF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,WAAW,CAAC,SAAS,CAAC,YAAa,MAAM,SAAS,KAAK,CAAC;AAAA,UAEjE,oBAAU,kBAAkB;AAAA;AAAA,MAC/B;AAAA,OACF;AAAA,IACC,aACC,8CAAC,OAAE,WAAU,sBAAqB;AAAA;AAAA,MACT,6CAAC,OAAE,MAAM,WAAW,WAAU,eAAc,qBAAO;AAAA,OAC5E;AAAA,IAEF,8CAAC,OAAE,WAAU,qBAAoB;AAAA;AAAA,MAAW,6CAAC,YAAO,oBAAM;AAAA,OAAS;AAAA,KACrE;AAEJ;;;AC9FA,IAAAC,gBAA2C;AAkDrC,IAAAC,sBAAA;AA1CC,SAAS,WAAW,EAAE,WAAW,UAAU,GAAoB;AACpE,QAAM,EAAE,QAAQ,OAAO,IAAI,QAAQ;AACnC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,EAAE;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,aAAa,6BAA6B,KAAK,KAAK;AAC1D,QAAM,gBAAgB,SAAS,UAAU,KACpC,QAAQ,KAAK,QAAQ,KACrB,QAAQ,KAAK,QAAQ,KACrB,KAAK,KAAK,QAAQ;AAEvB,QAAM,eAAe,OAAO,MAAiB;AAC3C,MAAE,eAAe;AACjB,QAAI,CAAC,YAAY;AACf,eAAS,oCAAoC;AAC7C;AAAA,IACF;AACA,QAAI,CAAC,eAAe;AAClB,eAAS,yFAAyF;AAClG;AAAA,IACF;AACA,aAAS,EAAE;AACX,eAAW,IAAI;AACf,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,EAAE,OAAO,UAAU,KAAK,CAAC;AACrD,UAAI,WAAW;AACb,kBAAU,MAAM;AAAA,MAClB,WAAW,OAAO,WAAW,aAAa;AACxC,eAAO,SAAS,OAAO,OAAO;AAAA,MAChC;AAAA,IACF,SAAS,KAAU;AACjB,eAAS,IAAI,WAAW,gBAAgB;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAU,yBACb;AAAA,kDAAC,SAAI,WAAU,sBACb;AAAA,mDAAC,QAAG,WAAU,qBAAoB,+BAAiB;AAAA,MACnD,6CAAC,OAAE,WAAU,wBAAuB,qCAAuB;AAAA,OAC7D;AAAA,IACC,SAAS,6CAAC,SAAI,WAAU,mCAAkC,MAAK,SAAQ,aAAU,UAAU,iBAAM;AAAA,IAClG,8CAAC,UAAK,UAAU,cAAc,WAAU,eAAc,cAAW,gBAC/D;AAAA,oDAAC,SAAI,WAAU,gBACb;AAAA,qDAAC,WAAM,WAAU,gBAAe,SAAQ,sBAAqB,uBAAS;AAAA,QACtE;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,YACvC,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,8CAAC,SAAI,WAAU,gBACb;AAAA,qDAAC,WAAM,WAAU,gBAAe,SAAQ,uBAAsB,mBAAK;AAAA,QACnE;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,8CAAC,SAAI,WAAU,gBACb;AAAA,qDAAC,WAAM,WAAU,gBAAe,SAAQ,0BAAyB,sBAAQ;AAAA,QACzE;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,aAAY;AAAA,YACZ,cAAa;AAAA,YACb,UAAQ;AAAA;AAAA,QACV;AAAA,QACC,YAAY,CAAC,iBACZ,6CAAC,OAAE,WAAU,sBAAqB,yEAElC;AAAA,SAEJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;AAAA,UAErD,oBAAU,wBAAwB;AAAA;AAAA,MACrC;AAAA,OACF;AAAA,IACC,aACC,8CAAC,OAAE,WAAU,sBAAqB;AAAA;AAAA,MACP,6CAAC,OAAE,MAAM,WAAW,WAAU,eAAc,qBAAO;AAAA,OAC9E;AAAA,IAEF,8CAAC,OAAE,WAAU,qBAAoB;AAAA;AAAA,MAAW,6CAAC,YAAO,oBAAM;AAAA,OAAS;AAAA,KACrE;AAEJ;;;ACpHA,IAAAC,gBAAkC;AAa9B,IAAAC,sBAAA;AAJG,SAAS,aAAa,EAAE,WAAW,UAAU,KAAK,GAAsB;AAC7E,QAAM,UAAM,0BAAW,aAAa;AACpC,QAAM,MAAM,QAAQ,KAAK,OAAO,aAAa;AAC7C,SACE,6CAAC,OAAE,MAAM,KAAK,WAAW,aAAa,uCAAuC,cAAW,WACrF,sBAAY,WACf;AAEJ;;;ACjBA,IAAAC,gBAAkC;AAa9B,IAAAC,sBAAA;AAJG,SAAS,aAAa,EAAE,WAAW,UAAU,KAAK,GAAsB;AAC7E,QAAM,UAAM,0BAAW,aAAa;AACpC,QAAM,MAAM,QAAQ,KAAK,OAAO,aAAa;AAC7C,SACE,6CAAC,OAAE,MAAM,KAAK,WAAW,aAAa,uCAAuC,cAAW,WACrF,sBAAY,WACf;AAEJ;;;ACjBA,IAAAC,gBAAmD;AA0BzC,IAAAC,sBAAA;AAvBH,SAAS,aAAa;AAC3B,QAAM,EAAE,MAAM,KAAK,YAAY,QAAQ,IAAI,QAAQ;AACnD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,UAAM,sBAAuB,IAAI;AAEvC,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAc,EAAG,SAAQ,KAAK;AAAA,IAC3E;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,cAAc,CAAC,KAAM,QAAO;AAEjC,QAAM,WAAW,KAAK,OAClB,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC,IACrE,KAAK,MAAM,CAAC,EAAE,YAAY;AAE9B,SACE,8CAAC,SAAI,WAAU,sBAAqB,KAClC;AAAA,iDAAC,YAAO,WAAU,yBAAwB,SAAS,MAAM,QAAQ,CAAC,IAAI,GAAG,cAAW,aAAY,iBAAe,MAAM,iBAAc,QAChI,eAAK,YACJ,6CAAC,SAAI,KAAK,KAAK,WAAW,KAAK,KAAK,QAAQ,eAAe,WAAU,qBAAoB,IAEzF,6CAAC,UAAK,WAAU,0BAA0B,oBAAS,GAEvD;AAAA,IACC,QACC,8CAAC,SAAI,WAAU,mBAAkB,MAAK,QACpC;AAAA,oDAAC,SAAI,WAAU,0BACb;AAAA,qDAAC,OAAE,WAAU,wBAAwB,eAAK,MAAK;AAAA,QAC/C,6CAAC,OAAE,WAAU,yBAAyB,eAAK,OAAM;AAAA,QAChD,OAAO,6CAAC,OAAE,WAAU,uBAAuB,cAAI,MAAK;AAAA,SACvD;AAAA,MACA,6CAAC,SAAI,WAAU,2BAA0B;AAAA,MACzC,6CAAC,YAAO,WAAU,wBAAuB,MAAK,YAAW,SAAS,MAAM;AAAE,gBAAQ;AAAG,gBAAQ,KAAK;AAAA,MAAG,GAAG,sBAExG;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AC9CA,IAAAC,gBAAmD;AAkC7C,IAAAC,sBAAA;AA9BC,SAAS,cAAc;AAC5B,QAAM,EAAE,KAAK,YAAY,UAAU,IAAI,QAAQ;AAC/C,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAsB,CAAC,CAAC;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,UAAM,sBAAuB,IAAI;AAEvC,+BAAU,MAAM;AACd,QAAI,YAAY;AACd,qBAAe,IAAI;AACnB,aAAO,YAAY,EAChB,KAAK,UAAQ,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EACrC,MAAM,MAAM;AAAA,MAAC,CAAC,EACd,QAAQ,MAAM,eAAe,KAAK,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAc,EAAG,SAAQ,KAAK;AAAA,IAC3E;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,cAAc,CAAC,OAAQ,KAAK,SAAS,KAAK,CAAC,YAAc,QAAO;AAErE,SACE,8CAAC,SAAI,WAAU,uBAAsB,KACnC;AAAA,kDAAC,YAAO,WAAU,sBAAqB,SAAS,MAAM,QAAQ,CAAC,IAAI,GAAG,cAAW,uBAAsB,iBAAe,MAAM,iBAAc,QACxI;AAAA,mDAAC,UAAK,WAAU,mBAAmB,cAAI,MAAK;AAAA,MAC5C,6CAAC,UAAK,WAAU,kBAAkB,iBAAO,WAAW,UAAS;AAAA,OAC/D;AAAA,IACC,QACC,6CAAC,SAAI,WAAU,mBAAkB,MAAK,QACnC,wBACC,6CAAC,SAAI,WAAU,wBAAuB,aAAU,QAAO,wBAAU,IAC/D,KAAK,IAAI,OACX;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,wBAAwB,EAAE,OAAO,IAAI,KAAK,gCAAgC,EAAE;AAAA,QACvF,MAAK;AAAA,QACL,gBAAc,EAAE,OAAO,IAAI,KAAK,SAAS;AAAA,QACzC,SAAS,MAAM;AAAE,oBAAU,EAAE,EAAE;AAAG,kBAAQ,KAAK;AAAA,QAAG;AAAA,QAEjD;AAAA,YAAE;AAAA,UACF,EAAE,OAAO,IAAI,MAAM,6CAAC,UAAK,WAAU,gBAAgB,oBAAS;AAAA;AAAA;AAAA,MAPxD,EAAE;AAAA,IAQT,CACD,GACH;AAAA,KAEJ;AAEJ;;;AC1DA,IAAAC,gBAAmD;AA0C/C,IAAAC,sBAAA;AAjCJ,IAAM,YAAY,IAAI,KAAK;AAC3B,IAAM,QAAQ,oBAAI,IAA+C;AAE1D,SAAS,cAAc,EAAE,MAAM,YAAY,MAAM,GAAuB;AAC7E,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAyB,IAAI;AAC7D,QAAM,cAAU,sBAAO,IAAI;AAE3B,+BAAU,MAAM;AACd,YAAQ,UAAU;AAClB,UAAM,MAAM,GAAG,IAAI,IAAI,UAAU;AACjC,UAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,QAAI,UAAU,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW;AAChD,kBAAY,OAAO,QAAQ;AAC3B;AAAA,IACF;AAEA,UAAM,SAAS,SAAS,QAAQ,OAAO,YAAY,OAAO;AAC1D,WAAO,UAAU,EACd,KAAK,UAAQ;AACZ,UAAI,QAAQ,SAAS;AACnB,oBAAY,KAAK,QAAQ;AACzB,cAAM,IAAI,KAAK,EAAE,UAAU,KAAK,UAAU,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC,EACA,MAAM,MAAM;AAAE,UAAI,QAAQ,QAAS,aAAY,KAAK;AAAA,IAAG,CAAC;AAE3D,WAAO,MAAM;AAAE,cAAQ,UAAU;AAAA,IAAO;AAAA,EAC1C,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,MAAI,aAAa,KAAM,QAAO;AAE9B,SACE,8CAAC,UAAK,WAAW,gBAAgB,WAAW,0BAA0B,yBAAyB,IAC5F;AAAA,eAAW,WAAW;AAAA,IAAS;AAAA,IAAE,UAAU,WAAW,aAAa;AAAA,KACtE;AAEJ;;;AClCW,IAAAC,sBAAA;AAJJ,SAAS,eAAe,EAAE,UAAU,SAAS,GAAwB;AAC1E,QAAM,EAAE,YAAY,WAAW,OAAO,IAAI,QAAQ;AAElD,MAAI,WAAW;AACb,WAAO,6EAAG,sBAAY,6CAAC,SAAI,WAAU,kBAAiB,wBAAU,GAAO;AAAA,EACzE;AAEA,MAAI,CAAC,YAAY;AACf,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,SAAS,OAAO,OAAO;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,6EAAG,UAAS;AACrB;","names":["import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/config.ts","../src/client.ts","../src/hooks.ts","../src/data.ts","../src/components/SignInForm.tsx","../src/components/SignUpForm.tsx","../src/components/SignInButton.tsx","../src/components/SignUpButton.tsx","../src/components/UserButton.tsx","../src/components/OrgSwitcher.tsx","../src/components/VerifiedBadge.tsx","../src/components/ProtectedRoute.tsx"],"sourcesContent":["// Provider\nexport { GitHatProvider } from './provider';\n\n// Hooks\nexport { useAuth, useGitHat } from './hooks';\nexport { useData } from './data';\n\n// Components\nexport { SignInForm } from './components/SignInForm';\nexport { SignUpForm } from './components/SignUpForm';\nexport { SignInButton } from './components/SignInButton';\nexport { SignUpButton } from './components/SignUpButton';\nexport { UserButton } from './components/UserButton';\nexport { OrgSwitcher } from './components/OrgSwitcher';\nexport { VerifiedBadge } from './components/VerifiedBadge';\nexport { ProtectedRoute } from './components/ProtectedRoute';\n\n// Types\nexport type {\n GitHatUser,\n GitHatOrg,\n GitHatConfig,\n AuthState,\n AuthActions,\n SignUpData,\n SignUpResult,\n GitHatContextValue,\n} from './types';\n\nexport type {\n DataItem,\n QueryOptions,\n QueryResult,\n PutResult,\n DeleteResult,\n BatchOperation,\n BatchResult,\n} from './data';\n","'use client';\n\nimport React, { createContext, useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { GitHatConfig, GitHatContextValue, GitHatUser, GitHatOrg, SignUpData, SignUpResult } from './types';\nimport { TOKEN_KEYS, resolveConfig } from './config';\nimport { createClient } from './client';\n\nexport const GitHatContext = createContext<GitHatContextValue | null>(null);\n\ninterface GitHatProviderProps {\n config: GitHatConfig;\n children: React.ReactNode;\n}\n\nexport function GitHatProvider({ config: rawConfig, children }: GitHatProviderProps) {\n const config = useMemo(() => resolveConfig(rawConfig), [rawConfig]);\n const clientRef = useRef(createClient(config.apiUrl, config.publishableKey));\n\n const [user, setUser] = useState<GitHatUser | null>(null);\n const [org, setOrg] = useState<GitHatOrg | null>(null);\n const [isSignedIn, setIsSignedIn] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [authError, setAuthError] = useState<string | null>(null);\n\n // Validate stored token on mount\n useEffect(() => {\n const token = localStorage.getItem(TOKEN_KEYS.accessToken);\n const storedUser = localStorage.getItem(TOKEN_KEYS.user);\n\n if (token && storedUser) {\n clientRef.current.fetchApi<{ user: GitHatUser; currentOrg: GitHatOrg }>('/auth/me')\n .then((data) => {\n const u = data.user || JSON.parse(storedUser);\n setUser(u);\n const storedOrg = localStorage.getItem(TOKEN_KEYS.org);\n setOrg(data.currentOrg || (storedOrg ? JSON.parse(storedOrg) : null));\n setIsSignedIn(true);\n setAuthError(null);\n })\n .catch((err) => {\n if (err.message === 'Session expired') {\n clientRef.current.clearAuth();\n } else {\n // Network error — keep stored auth, surface error\n try { setUser(JSON.parse(storedUser)); } catch {}\n setAuthError(err.message || 'Failed to verify session');\n }\n })\n .finally(() => setIsLoading(false));\n } else {\n setIsLoading(false);\n }\n }, []);\n\n // Listen for auth-changed events\n useEffect(() => {\n const handleAuthChanged = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (detail?.signedIn === false) {\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n } else if (detail?.signedIn === true && detail?.user) {\n setUser(detail.user);\n setIsSignedIn(true);\n if (detail.org) setOrg(detail.org);\n }\n };\n window.addEventListener('githat:auth-changed', handleAuthChanged);\n return () => window.removeEventListener('githat:auth-changed', handleAuthChanged);\n }, []);\n\n const signIn = useCallback(async (email: string, password: string) => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/login', {\n method: 'POST',\n body: JSON.stringify({ email, password }),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n }, []);\n\n const signUp = useCallback(async (signUpData: SignUpData): Promise<SignUpResult> => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/register', {\n method: 'POST',\n body: JSON.stringify(signUpData),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n\n return { requiresVerification: !data.user.emailVerified, email: signUpData.email };\n }, []);\n\n const signOut = useCallback(async () => {\n try {\n await clientRef.current.fetchApi('/auth/logout', { method: 'POST' });\n } catch {}\n clientRef.current.clearAuth();\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n if (typeof window !== 'undefined' && config.afterSignOutUrl) {\n window.location.href = config.afterSignOutUrl;\n }\n }, [config.afterSignOutUrl]);\n\n const switchOrg = useCallback(async (orgId: string) => {\n try {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n org: GitHatOrg;\n }>(`/user/orgs/${orgId}/switch`, { method: 'POST' });\n\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n const orgData = data.org;\n localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(orgData));\n setOrg(orgData);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user, org: orgData, signedIn: true },\n }));\n } catch (e) {\n console.error('Org switch failed:', e);\n }\n }, [user]);\n\n const value = useMemo<GitHatContextValue>(() => ({\n user, org, isSignedIn, isLoading, authError, config,\n signIn, signUp, signOut, switchOrg,\n }), [user, org, isSignedIn, isLoading, authError, config, signIn, signUp, signOut, switchOrg]);\n\n return (\n <GitHatContext.Provider value={value}>\n {children}\n </GitHatContext.Provider>\n );\n}\n","import type { GitHatConfig } from './types';\n\nexport const DEFAULT_API_URL = 'https://api.githat.io';\n\nexport const TOKEN_KEYS = {\n accessToken: 'githat_access_token',\n refreshToken: 'githat_refresh_token',\n user: 'githat_user',\n org: 'githat_org',\n} as const;\n\nexport function resolveConfig(config: GitHatConfig): Required<GitHatConfig> {\n return {\n publishableKey: config.publishableKey,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n signInUrl: config.signInUrl || '/sign-in',\n signUpUrl: config.signUpUrl || '/sign-up',\n afterSignInUrl: config.afterSignInUrl || '/dashboard',\n afterSignOutUrl: config.afterSignOutUrl || '/',\n };\n}\n","import { TOKEN_KEYS } from './config';\n\nlet _refreshPromise: Promise<boolean> | null = null;\n\nasync function refreshTokens(apiUrl: string, appKey: string): Promise<boolean> {\n const refreshToken = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.refreshToken) : null;\n if (!refreshToken) return false;\n\n let orgId: string | null = null;\n try {\n const orgStr = localStorage.getItem(TOKEN_KEYS.org);\n if (orgStr) orgId = JSON.parse(orgStr).id;\n } catch {}\n\n try {\n const res = await fetch(`${apiUrl}/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n },\n body: JSON.stringify({ refreshToken, orgId }),\n });\n if (!res.ok) return false;\n\n const data = await res.json();\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction clearAuth() {\n if (typeof window === 'undefined') return;\n Object.values(TOKEN_KEYS).forEach(key => localStorage.removeItem(key));\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: null, org: null, signedIn: false },\n }));\n}\n\nexport function createClient(apiUrl: string, appKey: string) {\n async function fetchApi<T = any>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${apiUrl}${endpoint}`;\n const token = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.accessToken) : null;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n ...(token && { Authorization: `Bearer ${token}` }),\n ...(options.headers as Record<string, string>),\n };\n\n let response: Response;\n try {\n response = await fetch(url, { ...options, headers });\n } catch (networkError: unknown) {\n // Network errors (CORS blocked, offline, DNS failure) throw TypeError\n if (networkError instanceof TypeError) {\n const isMissingKey = !appKey || !appKey.startsWith('pk_live_');\n const isLocalhost = typeof window !== 'undefined' &&\n (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');\n\n if (isMissingKey && !isLocalhost) {\n throw new Error(\n 'Missing GitHat API key. Add NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY to .env.local'\n );\n }\n throw new Error(\n 'Unable to connect to GitHat API. Check your network connection.'\n );\n }\n throw networkError;\n }\n\n if (response.status === 401) {\n // Queue all 401 retries behind a single refresh promise\n if (!_refreshPromise) {\n _refreshPromise = refreshTokens(apiUrl, appKey).finally(() => {\n _refreshPromise = null;\n });\n }\n\n const refreshed = await _refreshPromise;\n\n if (refreshed) {\n const newToken = localStorage.getItem(TOKEN_KEYS.accessToken);\n const retryResponse = await fetch(url, {\n ...options,\n headers: {\n ...headers,\n ...(newToken && { Authorization: `Bearer ${newToken}` }),\n },\n });\n const retryData = await retryResponse.json();\n if (!retryResponse.ok) throw new Error(retryData.error || 'Request failed');\n return retryData as T;\n }\n\n clearAuth();\n throw new Error('Session expired');\n }\n\n const data = await response.json();\n if (!response.ok) throw new Error(data.error || 'Request failed');\n return data as T;\n }\n\n return { fetchApi, clearAuth };\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\nimport { GitHatContext } from './provider';\nimport { createClient } from './client';\nimport type { GitHatContextValue, GitHatOrg } from './types';\n\nexport function useAuth(): GitHatContextValue {\n const ctx = useContext(GitHatContext);\n if (!ctx) throw new Error('useAuth must be used within a <GitHatProvider>');\n return ctx;\n}\n\nexport function useGitHat() {\n const ctx = useAuth();\n const client = useMemo(\n () => createClient(ctx.config.apiUrl!, ctx.config.publishableKey),\n [ctx.config.apiUrl, ctx.config.publishableKey]\n );\n\n return {\n fetch: client.fetchApi,\n getUserOrgs: () => client.fetchApi<{ orgs: GitHatOrg[] }>('/user/orgs'),\n verifyMCP: (domain: string) => client.fetchApi<{ verified: boolean }>(`/verify/mcp/${domain}`),\n verifyAgent: (wallet: string) => client.fetchApi<{ verified: boolean }>(`/verify/agent/${wallet}`),\n };\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useAuth } from './hooks';\nimport { createClient } from './client';\n\nexport interface DataItem {\n id: string;\n [key: string]: unknown;\n _createdAt?: string;\n _updatedAt?: string;\n}\n\nexport interface QueryOptions {\n limit?: number;\n cursor?: string;\n filter?: Record<string, unknown>;\n}\n\nexport interface QueryResult<T = DataItem> {\n items: T[];\n collection: string;\n nextCursor: string | null;\n count: number;\n}\n\nexport interface PutResult<T = DataItem> {\n item: T;\n collection: string;\n created: boolean;\n}\n\nexport interface DeleteResult {\n deleted: boolean;\n id: string;\n collection: string;\n}\n\nexport interface BatchOperation {\n type: 'put' | 'delete';\n id: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BatchResult {\n processed: number;\n put: number;\n deleted: number;\n collection: string;\n}\n\n/**\n * Hook for interacting with GitHat's Customer Data API.\n * Provides CRUD operations for storing app data in GitHat's managed DynamoDB.\n *\n * @example\n * ```tsx\n * const { put, get, query, remove, batch } = useData();\n *\n * // Store data\n * await put('orders', { id: 'order_123', amount: 99.99, status: 'pending' });\n *\n * // Get single item\n * const order = await get('orders', 'order_123');\n *\n * // Query collection\n * const { items } = await query('orders', { filter: { status: 'pending' } });\n *\n * // Delete item\n * await remove('orders', 'order_123');\n * ```\n */\nexport function useData() {\n const ctx = useAuth();\n const client = useMemo(\n () => createClient(ctx.config.apiUrl!, ctx.config.publishableKey),\n [ctx.config.apiUrl, ctx.config.publishableKey]\n );\n\n return useMemo(() => ({\n /**\n * Store an item in a collection. If the item exists, it will be updated.\n * @param collection - Collection name (e.g., 'orders', 'users')\n * @param data - Data object with required `id` field\n */\n put: async <T extends DataItem>(collection: string, data: T): Promise<PutResult<T>> => {\n if (!data.id) {\n throw new Error('Data must include an \"id\" field');\n }\n return client.fetchApi<PutResult<T>>(`/data/${collection}/${data.id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * Get a single item from a collection.\n * @param collection - Collection name\n * @param id - Item ID\n */\n get: async <T extends DataItem>(collection: string, id: string): Promise<T | null> => {\n try {\n const result = await client.fetchApi<{ item: T }>(`/data/${collection}/${id}`);\n return result.item;\n } catch (err: unknown) {\n if (err instanceof Error && err.message === 'Item not found') {\n return null;\n }\n throw err;\n }\n },\n\n /**\n * Query items from a collection with optional filters and pagination.\n * @param collection - Collection name\n * @param options - Query options (limit, cursor, filter)\n */\n query: async <T extends DataItem>(\n collection: string,\n options: QueryOptions = {}\n ): Promise<QueryResult<T>> => {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', options.limit.toString());\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.filter) params.set('filter', JSON.stringify(options.filter));\n\n const queryString = params.toString();\n const url = `/data/${collection}${queryString ? `?${queryString}` : ''}`;\n\n return client.fetchApi<QueryResult<T>>(url);\n },\n\n /**\n * Delete an item from a collection.\n * @param collection - Collection name\n * @param id - Item ID\n */\n remove: async (collection: string, id: string): Promise<DeleteResult> => {\n return client.fetchApi<DeleteResult>(`/data/${collection}/${id}`, {\n method: 'DELETE',\n });\n },\n\n /**\n * Batch operations (put/delete) on a collection.\n * Maximum 100 operations per request.\n * @param collection - Collection name\n * @param operations - Array of operations\n */\n batch: async (collection: string, operations: BatchOperation[]): Promise<BatchResult> => {\n return client.fetchApi<BatchResult>(`/data/${collection}/batch`, {\n method: 'POST',\n body: JSON.stringify({ operations }),\n });\n },\n }), [client]);\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignInFormProps {\n onSuccess?: () => void;\n signUpUrl?: string;\n forgotPasswordUrl?: string;\n}\n\nexport function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }: SignInFormProps) {\n const { signIn, config } = useAuth();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n setError('');\n setLoading(true);\n try {\n await signIn(email, password);\n if (onSuccess) {\n onSuccess();\n } else if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n window.location.href = params.get('redirect_url') || config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign in failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Sign in</h2>\n <p className=\"githat-form-subtitle\">Welcome back to GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign in form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-email\">Email</label>\n <input\n id=\"githat-signin-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-password\">Password</label>\n <input\n id=\"githat-signin-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n autoComplete=\"current-password\"\n required\n />\n </div>\n {forgotPasswordUrl && (\n <a href={forgotPasswordUrl} className=\"githat-link githat-forgot-link\">Forgot password?</a>\n )}\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || (email.length > 0 && !emailValid)}\n >\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n {signUpUrl && (\n <p className=\"githat-form-footer\">\n Don't have an account? <a href={signUpUrl} className=\"githat-link\">Sign up</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignUpFormProps {\n onSuccess?: (result: { requiresVerification: boolean; email: string }) => void;\n signInUrl?: string;\n}\n\nexport function SignUpForm({ onSuccess, signInUrl }: SignUpFormProps) {\n const { signUp, config } = useAuth();\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n const passwordValid = password.length >= 8\n && /[A-Z]/.test(password)\n && /[a-z]/.test(password)\n && /\\d/.test(password);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n if (!passwordValid) {\n setError('Password must be 8+ characters with uppercase, lowercase, number, and special character');\n return;\n }\n setError('');\n setLoading(true);\n try {\n const result = await signUp({ email, password, name });\n if (onSuccess) {\n onSuccess(result);\n } else if (typeof window !== 'undefined') {\n window.location.href = config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign up failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Create an account</h2>\n <p className=\"githat-form-subtitle\">Get started with GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign up form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-name\">Full name</label>\n <input\n id=\"githat-signup-name\"\n className=\"githat-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-email\">Email</label>\n <input\n id=\"githat-signup-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-password\">Password</label>\n <input\n id=\"githat-signup-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n autoComplete=\"new-password\"\n required\n />\n {password && !passwordValid && (\n <p className=\"githat-field-error\">\n Must be 8+ characters with uppercase, lowercase, and number\n </p>\n )}\n </div>\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || !name || !emailValid}\n >\n {loading ? 'Creating account...' : 'Sign up'}\n </button>\n </form>\n {signInUrl && (\n <p className=\"githat-form-footer\">\n Already have an account? <a href={signInUrl} className=\"githat-link\">Sign in</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignInButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignInButton({ className, children, href }: SignInButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signInUrl || '/sign-in';\n return (\n <a href={url} className={className || 'githat-button githat-button-primary'} aria-label=\"Sign in\">\n {children || 'Sign in'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignUpButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignUpButton({ className, children, href }: SignUpButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signUpUrl || '/sign-up';\n return (\n <a href={url} className={className || 'githat-button githat-button-outline'} aria-label=\"Sign up\">\n {children || 'Sign up'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useAuth } from '../hooks';\n\nexport function UserButton() {\n const { user, org, isSignedIn, signOut } = useAuth();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !user) return null;\n\n const initials = user.name\n ? user.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)\n : user.email[0].toUpperCase();\n\n return (\n <div className=\"githat-user-button\" ref={ref}>\n <button className=\"githat-avatar-trigger\" onClick={() => setOpen(!open)} aria-label=\"User menu\" aria-expanded={open} aria-haspopup=\"true\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt={user.name || 'User avatar'} className=\"githat-avatar-img\" />\n ) : (\n <span className=\"githat-avatar-initials\">{initials}</span>\n )}\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n <div className=\"githat-dropdown-header\">\n <p className=\"githat-dropdown-name\">{user.name}</p>\n <p className=\"githat-dropdown-email\">{user.email}</p>\n {org && <p className=\"githat-dropdown-org\">{org.name}</p>}\n </div>\n <div className=\"githat-dropdown-divider\" />\n <button className=\"githat-dropdown-item\" role=\"menuitem\" onClick={() => { signOut(); setOpen(false); }}>\n Sign out\n </button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useAuth, useGitHat } from '../hooks';\nimport type { GitHatOrg } from '../types';\n\nexport function OrgSwitcher() {\n const { org, isSignedIn, switchOrg } = useAuth();\n const githat = useGitHat();\n const [orgs, setOrgs] = useState<GitHatOrg[]>([]);\n const [orgsLoading, setOrgsLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isSignedIn) {\n setOrgsLoading(true);\n githat.getUserOrgs()\n .then(data => setOrgs(data.orgs || []))\n .catch(() => {})\n .finally(() => setOrgsLoading(false));\n }\n }, [isSignedIn]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !org || (orgs.length < 2 && !orgsLoading)) return null;\n\n return (\n <div className=\"githat-org-switcher\" ref={ref}>\n <button className=\"githat-org-trigger\" onClick={() => setOpen(!open)} aria-label=\"Switch organization\" aria-expanded={open} aria-haspopup=\"true\">\n <span className=\"githat-org-name\">{org.name}</span>\n <span className=\"githat-chevron\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n {orgsLoading ? (\n <div className=\"githat-dropdown-item\" aria-busy=\"true\">Loading...</div>\n ) : orgs.map(o => (\n <button\n key={o.id}\n className={`githat-dropdown-item ${o.id === org.id ? 'githat-dropdown-item-active' : ''}`}\n role=\"menuitem\"\n aria-current={o.id === org.id ? 'true' : undefined}\n onClick={() => { switchOrg(o.id); setOpen(false); }}\n >\n {o.name}\n {o.id === org.id && <span className=\"githat-check\">{'\\u2713'}</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useGitHat } from '../hooks';\n\ninterface VerifiedBadgeProps {\n type: 'mcp' | 'agent';\n identifier: string;\n label?: string;\n}\n\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\nconst cache = new Map<string, { verified: boolean; ts: number }>();\n\nexport function VerifiedBadge({ type, identifier, label }: VerifiedBadgeProps) {\n const githat = useGitHat();\n const [verified, setVerified] = useState<boolean | null>(null);\n const mounted = useRef(true);\n\n useEffect(() => {\n mounted.current = true;\n const key = `${type}:${identifier}`;\n const cached = cache.get(key);\n if (cached && Date.now() - cached.ts < CACHE_TTL) {\n setVerified(cached.verified);\n return;\n }\n\n const verify = type === 'mcp' ? githat.verifyMCP : githat.verifyAgent;\n verify(identifier)\n .then(data => {\n if (mounted.current) {\n setVerified(data.verified);\n cache.set(key, { verified: data.verified, ts: Date.now() });\n }\n })\n .catch(() => { if (mounted.current) setVerified(false); });\n\n return () => { mounted.current = false; };\n }, [type, identifier]);\n\n if (verified === null) return null;\n\n return (\n <span className={`githat-badge ${verified ? 'githat-badge-verified' : 'githat-badge-unverified'}`}>\n {verified ? '\\u2713' : '\\u2717'} {label || (verified ? 'Verified' : 'Unverified')}\n </span>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { useAuth } from '../hooks';\n\ninterface ProtectedRouteProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\nexport function ProtectedRoute({ children, fallback }: ProtectedRouteProps) {\n const { isSignedIn, isLoading, config } = useAuth();\n\n if (isLoading) {\n return <>{fallback || <div className=\"githat-loading\">Loading...</div>}</>;\n }\n\n if (!isSignedIn) {\n if (typeof window !== 'undefined') {\n window.location.href = config.signInUrl!;\n }\n return null;\n }\n\n return <>{children}</>;\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -267,6 +267,84 @@ function useGitHat() {
|
|
|
267
267
|
};
|
|
268
268
|
}
|
|
269
269
|
|
|
270
|
+
// src/data.ts
|
|
271
|
+
import { useMemo as useMemo3 } from "react";
|
|
272
|
+
function useData() {
|
|
273
|
+
const ctx = useAuth();
|
|
274
|
+
const client = useMemo3(
|
|
275
|
+
() => createClient(ctx.config.apiUrl, ctx.config.publishableKey),
|
|
276
|
+
[ctx.config.apiUrl, ctx.config.publishableKey]
|
|
277
|
+
);
|
|
278
|
+
return useMemo3(() => ({
|
|
279
|
+
/**
|
|
280
|
+
* Store an item in a collection. If the item exists, it will be updated.
|
|
281
|
+
* @param collection - Collection name (e.g., 'orders', 'users')
|
|
282
|
+
* @param data - Data object with required `id` field
|
|
283
|
+
*/
|
|
284
|
+
put: async (collection, data) => {
|
|
285
|
+
if (!data.id) {
|
|
286
|
+
throw new Error('Data must include an "id" field');
|
|
287
|
+
}
|
|
288
|
+
return client.fetchApi(`/data/${collection}/${data.id}`, {
|
|
289
|
+
method: "PUT",
|
|
290
|
+
body: JSON.stringify(data)
|
|
291
|
+
});
|
|
292
|
+
},
|
|
293
|
+
/**
|
|
294
|
+
* Get a single item from a collection.
|
|
295
|
+
* @param collection - Collection name
|
|
296
|
+
* @param id - Item ID
|
|
297
|
+
*/
|
|
298
|
+
get: async (collection, id) => {
|
|
299
|
+
try {
|
|
300
|
+
const result = await client.fetchApi(`/data/${collection}/${id}`);
|
|
301
|
+
return result.item;
|
|
302
|
+
} catch (err) {
|
|
303
|
+
if (err instanceof Error && err.message === "Item not found") {
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
throw err;
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
/**
|
|
310
|
+
* Query items from a collection with optional filters and pagination.
|
|
311
|
+
* @param collection - Collection name
|
|
312
|
+
* @param options - Query options (limit, cursor, filter)
|
|
313
|
+
*/
|
|
314
|
+
query: async (collection, options = {}) => {
|
|
315
|
+
const params = new URLSearchParams();
|
|
316
|
+
if (options.limit) params.set("limit", options.limit.toString());
|
|
317
|
+
if (options.cursor) params.set("cursor", options.cursor);
|
|
318
|
+
if (options.filter) params.set("filter", JSON.stringify(options.filter));
|
|
319
|
+
const queryString = params.toString();
|
|
320
|
+
const url = `/data/${collection}${queryString ? `?${queryString}` : ""}`;
|
|
321
|
+
return client.fetchApi(url);
|
|
322
|
+
},
|
|
323
|
+
/**
|
|
324
|
+
* Delete an item from a collection.
|
|
325
|
+
* @param collection - Collection name
|
|
326
|
+
* @param id - Item ID
|
|
327
|
+
*/
|
|
328
|
+
remove: async (collection, id) => {
|
|
329
|
+
return client.fetchApi(`/data/${collection}/${id}`, {
|
|
330
|
+
method: "DELETE"
|
|
331
|
+
});
|
|
332
|
+
},
|
|
333
|
+
/**
|
|
334
|
+
* Batch operations (put/delete) on a collection.
|
|
335
|
+
* Maximum 100 operations per request.
|
|
336
|
+
* @param collection - Collection name
|
|
337
|
+
* @param operations - Array of operations
|
|
338
|
+
*/
|
|
339
|
+
batch: async (collection, operations) => {
|
|
340
|
+
return client.fetchApi(`/data/${collection}/batch`, {
|
|
341
|
+
method: "POST",
|
|
342
|
+
body: JSON.stringify({ operations })
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}), [client]);
|
|
346
|
+
}
|
|
347
|
+
|
|
270
348
|
// src/components/SignInForm.tsx
|
|
271
349
|
import { useState as useState2 } from "react";
|
|
272
350
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
@@ -639,6 +717,7 @@ export {
|
|
|
639
717
|
UserButton,
|
|
640
718
|
VerifiedBadge,
|
|
641
719
|
useAuth,
|
|
720
|
+
useData,
|
|
642
721
|
useGitHat
|
|
643
722
|
};
|
|
644
723
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/config.ts","../src/client.ts","../src/hooks.ts","../src/components/SignInForm.tsx","../src/components/SignUpForm.tsx","../src/components/SignInButton.tsx","../src/components/SignUpButton.tsx","../src/components/UserButton.tsx","../src/components/OrgSwitcher.tsx","../src/components/VerifiedBadge.tsx","../src/components/ProtectedRoute.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { GitHatConfig, GitHatContextValue, GitHatUser, GitHatOrg, SignUpData, SignUpResult } from './types';\nimport { TOKEN_KEYS, resolveConfig } from './config';\nimport { createClient } from './client';\n\nexport const GitHatContext = createContext<GitHatContextValue | null>(null);\n\ninterface GitHatProviderProps {\n config: GitHatConfig;\n children: React.ReactNode;\n}\n\nexport function GitHatProvider({ config: rawConfig, children }: GitHatProviderProps) {\n const config = useMemo(() => resolveConfig(rawConfig), [rawConfig]);\n const clientRef = useRef(createClient(config.apiUrl, config.publishableKey));\n\n const [user, setUser] = useState<GitHatUser | null>(null);\n const [org, setOrg] = useState<GitHatOrg | null>(null);\n const [isSignedIn, setIsSignedIn] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [authError, setAuthError] = useState<string | null>(null);\n\n // Validate stored token on mount\n useEffect(() => {\n const token = localStorage.getItem(TOKEN_KEYS.accessToken);\n const storedUser = localStorage.getItem(TOKEN_KEYS.user);\n\n if (token && storedUser) {\n clientRef.current.fetchApi<{ user: GitHatUser; currentOrg: GitHatOrg }>('/auth/me')\n .then((data) => {\n const u = data.user || JSON.parse(storedUser);\n setUser(u);\n const storedOrg = localStorage.getItem(TOKEN_KEYS.org);\n setOrg(data.currentOrg || (storedOrg ? JSON.parse(storedOrg) : null));\n setIsSignedIn(true);\n setAuthError(null);\n })\n .catch((err) => {\n if (err.message === 'Session expired') {\n clientRef.current.clearAuth();\n } else {\n // Network error — keep stored auth, surface error\n try { setUser(JSON.parse(storedUser)); } catch {}\n setAuthError(err.message || 'Failed to verify session');\n }\n })\n .finally(() => setIsLoading(false));\n } else {\n setIsLoading(false);\n }\n }, []);\n\n // Listen for auth-changed events\n useEffect(() => {\n const handleAuthChanged = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (detail?.signedIn === false) {\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n } else if (detail?.signedIn === true && detail?.user) {\n setUser(detail.user);\n setIsSignedIn(true);\n if (detail.org) setOrg(detail.org);\n }\n };\n window.addEventListener('githat:auth-changed', handleAuthChanged);\n return () => window.removeEventListener('githat:auth-changed', handleAuthChanged);\n }, []);\n\n const signIn = useCallback(async (email: string, password: string) => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/login', {\n method: 'POST',\n body: JSON.stringify({ email, password }),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n }, []);\n\n const signUp = useCallback(async (signUpData: SignUpData): Promise<SignUpResult> => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/register', {\n method: 'POST',\n body: JSON.stringify(signUpData),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n\n return { requiresVerification: !data.user.emailVerified, email: signUpData.email };\n }, []);\n\n const signOut = useCallback(async () => {\n try {\n await clientRef.current.fetchApi('/auth/logout', { method: 'POST' });\n } catch {}\n clientRef.current.clearAuth();\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n if (typeof window !== 'undefined' && config.afterSignOutUrl) {\n window.location.href = config.afterSignOutUrl;\n }\n }, [config.afterSignOutUrl]);\n\n const switchOrg = useCallback(async (orgId: string) => {\n try {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n org: GitHatOrg;\n }>(`/user/orgs/${orgId}/switch`, { method: 'POST' });\n\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n const orgData = data.org;\n localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(orgData));\n setOrg(orgData);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user, org: orgData, signedIn: true },\n }));\n } catch (e) {\n console.error('Org switch failed:', e);\n }\n }, [user]);\n\n const value = useMemo<GitHatContextValue>(() => ({\n user, org, isSignedIn, isLoading, authError, config,\n signIn, signUp, signOut, switchOrg,\n }), [user, org, isSignedIn, isLoading, authError, config, signIn, signUp, signOut, switchOrg]);\n\n return (\n <GitHatContext.Provider value={value}>\n {children}\n </GitHatContext.Provider>\n );\n}\n","import type { GitHatConfig } from './types';\n\nexport const DEFAULT_API_URL = 'https://api.githat.io';\n\nexport const TOKEN_KEYS = {\n accessToken: 'githat_access_token',\n refreshToken: 'githat_refresh_token',\n user: 'githat_user',\n org: 'githat_org',\n} as const;\n\nexport function resolveConfig(config: GitHatConfig): Required<GitHatConfig> {\n return {\n publishableKey: config.publishableKey,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n signInUrl: config.signInUrl || '/sign-in',\n signUpUrl: config.signUpUrl || '/sign-up',\n afterSignInUrl: config.afterSignInUrl || '/dashboard',\n afterSignOutUrl: config.afterSignOutUrl || '/',\n };\n}\n","import { TOKEN_KEYS } from './config';\n\nlet _refreshPromise: Promise<boolean> | null = null;\n\nasync function refreshTokens(apiUrl: string, appKey: string): Promise<boolean> {\n const refreshToken = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.refreshToken) : null;\n if (!refreshToken) return false;\n\n let orgId: string | null = null;\n try {\n const orgStr = localStorage.getItem(TOKEN_KEYS.org);\n if (orgStr) orgId = JSON.parse(orgStr).id;\n } catch {}\n\n try {\n const res = await fetch(`${apiUrl}/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n },\n body: JSON.stringify({ refreshToken, orgId }),\n });\n if (!res.ok) return false;\n\n const data = await res.json();\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction clearAuth() {\n if (typeof window === 'undefined') return;\n Object.values(TOKEN_KEYS).forEach(key => localStorage.removeItem(key));\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: null, org: null, signedIn: false },\n }));\n}\n\nexport function createClient(apiUrl: string, appKey: string) {\n async function fetchApi<T = any>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${apiUrl}${endpoint}`;\n const token = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.accessToken) : null;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n ...(token && { Authorization: `Bearer ${token}` }),\n ...(options.headers as Record<string, string>),\n };\n\n let response: Response;\n try {\n response = await fetch(url, { ...options, headers });\n } catch (networkError: unknown) {\n // Network errors (CORS blocked, offline, DNS failure) throw TypeError\n if (networkError instanceof TypeError) {\n const isMissingKey = !appKey || !appKey.startsWith('pk_live_');\n const isLocalhost = typeof window !== 'undefined' &&\n (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');\n\n if (isMissingKey && !isLocalhost) {\n throw new Error(\n 'Missing GitHat API key. Add NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY to .env.local'\n );\n }\n throw new Error(\n 'Unable to connect to GitHat API. Check your network connection.'\n );\n }\n throw networkError;\n }\n\n if (response.status === 401) {\n // Queue all 401 retries behind a single refresh promise\n if (!_refreshPromise) {\n _refreshPromise = refreshTokens(apiUrl, appKey).finally(() => {\n _refreshPromise = null;\n });\n }\n\n const refreshed = await _refreshPromise;\n\n if (refreshed) {\n const newToken = localStorage.getItem(TOKEN_KEYS.accessToken);\n const retryResponse = await fetch(url, {\n ...options,\n headers: {\n ...headers,\n ...(newToken && { Authorization: `Bearer ${newToken}` }),\n },\n });\n const retryData = await retryResponse.json();\n if (!retryResponse.ok) throw new Error(retryData.error || 'Request failed');\n return retryData as T;\n }\n\n clearAuth();\n throw new Error('Session expired');\n }\n\n const data = await response.json();\n if (!response.ok) throw new Error(data.error || 'Request failed');\n return data as T;\n }\n\n return { fetchApi, clearAuth };\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\nimport { GitHatContext } from './provider';\nimport { createClient } from './client';\nimport type { GitHatContextValue, GitHatOrg } from './types';\n\nexport function useAuth(): GitHatContextValue {\n const ctx = useContext(GitHatContext);\n if (!ctx) throw new Error('useAuth must be used within a <GitHatProvider>');\n return ctx;\n}\n\nexport function useGitHat() {\n const ctx = useAuth();\n const client = useMemo(\n () => createClient(ctx.config.apiUrl!, ctx.config.publishableKey),\n [ctx.config.apiUrl, ctx.config.publishableKey]\n );\n\n return {\n fetch: client.fetchApi,\n getUserOrgs: () => client.fetchApi<{ orgs: GitHatOrg[] }>('/user/orgs'),\n verifyMCP: (domain: string) => client.fetchApi<{ verified: boolean }>(`/verify/mcp/${domain}`),\n verifyAgent: (wallet: string) => client.fetchApi<{ verified: boolean }>(`/verify/agent/${wallet}`),\n };\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignInFormProps {\n onSuccess?: () => void;\n signUpUrl?: string;\n forgotPasswordUrl?: string;\n}\n\nexport function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }: SignInFormProps) {\n const { signIn, config } = useAuth();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n setError('');\n setLoading(true);\n try {\n await signIn(email, password);\n if (onSuccess) {\n onSuccess();\n } else if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n window.location.href = params.get('redirect_url') || config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign in failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Sign in</h2>\n <p className=\"githat-form-subtitle\">Welcome back to GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign in form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-email\">Email</label>\n <input\n id=\"githat-signin-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-password\">Password</label>\n <input\n id=\"githat-signin-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n autoComplete=\"current-password\"\n required\n />\n </div>\n {forgotPasswordUrl && (\n <a href={forgotPasswordUrl} className=\"githat-link githat-forgot-link\">Forgot password?</a>\n )}\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || (email.length > 0 && !emailValid)}\n >\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n {signUpUrl && (\n <p className=\"githat-form-footer\">\n Don't have an account? <a href={signUpUrl} className=\"githat-link\">Sign up</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignUpFormProps {\n onSuccess?: (result: { requiresVerification: boolean; email: string }) => void;\n signInUrl?: string;\n}\n\nexport function SignUpForm({ onSuccess, signInUrl }: SignUpFormProps) {\n const { signUp, config } = useAuth();\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n const passwordValid = password.length >= 8\n && /[A-Z]/.test(password)\n && /[a-z]/.test(password)\n && /\\d/.test(password);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n if (!passwordValid) {\n setError('Password must be 8+ characters with uppercase, lowercase, number, and special character');\n return;\n }\n setError('');\n setLoading(true);\n try {\n const result = await signUp({ email, password, name });\n if (onSuccess) {\n onSuccess(result);\n } else if (typeof window !== 'undefined') {\n window.location.href = config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign up failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Create an account</h2>\n <p className=\"githat-form-subtitle\">Get started with GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign up form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-name\">Full name</label>\n <input\n id=\"githat-signup-name\"\n className=\"githat-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-email\">Email</label>\n <input\n id=\"githat-signup-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-password\">Password</label>\n <input\n id=\"githat-signup-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n autoComplete=\"new-password\"\n required\n />\n {password && !passwordValid && (\n <p className=\"githat-field-error\">\n Must be 8+ characters with uppercase, lowercase, and number\n </p>\n )}\n </div>\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || !name || !emailValid}\n >\n {loading ? 'Creating account...' : 'Sign up'}\n </button>\n </form>\n {signInUrl && (\n <p className=\"githat-form-footer\">\n Already have an account? <a href={signInUrl} className=\"githat-link\">Sign in</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignInButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignInButton({ className, children, href }: SignInButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signInUrl || '/sign-in';\n return (\n <a href={url} className={className || 'githat-button githat-button-primary'} aria-label=\"Sign in\">\n {children || 'Sign in'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignUpButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignUpButton({ className, children, href }: SignUpButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signUpUrl || '/sign-up';\n return (\n <a href={url} className={className || 'githat-button githat-button-outline'} aria-label=\"Sign up\">\n {children || 'Sign up'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useAuth } from '../hooks';\n\nexport function UserButton() {\n const { user, org, isSignedIn, signOut } = useAuth();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !user) return null;\n\n const initials = user.name\n ? user.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)\n : user.email[0].toUpperCase();\n\n return (\n <div className=\"githat-user-button\" ref={ref}>\n <button className=\"githat-avatar-trigger\" onClick={() => setOpen(!open)} aria-label=\"User menu\" aria-expanded={open} aria-haspopup=\"true\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt={user.name || 'User avatar'} className=\"githat-avatar-img\" />\n ) : (\n <span className=\"githat-avatar-initials\">{initials}</span>\n )}\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n <div className=\"githat-dropdown-header\">\n <p className=\"githat-dropdown-name\">{user.name}</p>\n <p className=\"githat-dropdown-email\">{user.email}</p>\n {org && <p className=\"githat-dropdown-org\">{org.name}</p>}\n </div>\n <div className=\"githat-dropdown-divider\" />\n <button className=\"githat-dropdown-item\" role=\"menuitem\" onClick={() => { signOut(); setOpen(false); }}>\n Sign out\n </button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useAuth, useGitHat } from '../hooks';\nimport type { GitHatOrg } from '../types';\n\nexport function OrgSwitcher() {\n const { org, isSignedIn, switchOrg } = useAuth();\n const githat = useGitHat();\n const [orgs, setOrgs] = useState<GitHatOrg[]>([]);\n const [orgsLoading, setOrgsLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isSignedIn) {\n setOrgsLoading(true);\n githat.getUserOrgs()\n .then(data => setOrgs(data.orgs || []))\n .catch(() => {})\n .finally(() => setOrgsLoading(false));\n }\n }, [isSignedIn]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !org || (orgs.length < 2 && !orgsLoading)) return null;\n\n return (\n <div className=\"githat-org-switcher\" ref={ref}>\n <button className=\"githat-org-trigger\" onClick={() => setOpen(!open)} aria-label=\"Switch organization\" aria-expanded={open} aria-haspopup=\"true\">\n <span className=\"githat-org-name\">{org.name}</span>\n <span className=\"githat-chevron\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n {orgsLoading ? (\n <div className=\"githat-dropdown-item\" aria-busy=\"true\">Loading...</div>\n ) : orgs.map(o => (\n <button\n key={o.id}\n className={`githat-dropdown-item ${o.id === org.id ? 'githat-dropdown-item-active' : ''}`}\n role=\"menuitem\"\n aria-current={o.id === org.id ? 'true' : undefined}\n onClick={() => { switchOrg(o.id); setOpen(false); }}\n >\n {o.name}\n {o.id === org.id && <span className=\"githat-check\">{'\\u2713'}</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useGitHat } from '../hooks';\n\ninterface VerifiedBadgeProps {\n type: 'mcp' | 'agent';\n identifier: string;\n label?: string;\n}\n\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\nconst cache = new Map<string, { verified: boolean; ts: number }>();\n\nexport function VerifiedBadge({ type, identifier, label }: VerifiedBadgeProps) {\n const githat = useGitHat();\n const [verified, setVerified] = useState<boolean | null>(null);\n const mounted = useRef(true);\n\n useEffect(() => {\n mounted.current = true;\n const key = `${type}:${identifier}`;\n const cached = cache.get(key);\n if (cached && Date.now() - cached.ts < CACHE_TTL) {\n setVerified(cached.verified);\n return;\n }\n\n const verify = type === 'mcp' ? githat.verifyMCP : githat.verifyAgent;\n verify(identifier)\n .then(data => {\n if (mounted.current) {\n setVerified(data.verified);\n cache.set(key, { verified: data.verified, ts: Date.now() });\n }\n })\n .catch(() => { if (mounted.current) setVerified(false); });\n\n return () => { mounted.current = false; };\n }, [type, identifier]);\n\n if (verified === null) return null;\n\n return (\n <span className={`githat-badge ${verified ? 'githat-badge-verified' : 'githat-badge-unverified'}`}>\n {verified ? '\\u2713' : '\\u2717'} {label || (verified ? 'Verified' : 'Unverified')}\n </span>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { useAuth } from '../hooks';\n\ninterface ProtectedRouteProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\nexport function ProtectedRoute({ children, fallback }: ProtectedRouteProps) {\n const { isSignedIn, isLoading, config } = useAuth();\n\n if (isLoading) {\n return <>{fallback || <div className=\"githat-loading\">Loading...</div>}</>;\n }\n\n if (!isSignedIn) {\n if (typeof window !== 'undefined') {\n window.location.href = config.signInUrl!;\n }\n return null;\n }\n\n return <>{children}</>;\n}\n"],"mappings":"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","names":["useMemo","useMemo","useState","jsx","useState","useState","jsx","jsxs","useState","useContext","jsx","useContext","useContext","jsx","useContext","useState","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","jsxs","useState","useRef","useEffect","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/config.ts","../src/client.ts","../src/hooks.ts","../src/data.ts","../src/components/SignInForm.tsx","../src/components/SignUpForm.tsx","../src/components/SignInButton.tsx","../src/components/SignUpButton.tsx","../src/components/UserButton.tsx","../src/components/OrgSwitcher.tsx","../src/components/VerifiedBadge.tsx","../src/components/ProtectedRoute.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { GitHatConfig, GitHatContextValue, GitHatUser, GitHatOrg, SignUpData, SignUpResult } from './types';\nimport { TOKEN_KEYS, resolveConfig } from './config';\nimport { createClient } from './client';\n\nexport const GitHatContext = createContext<GitHatContextValue | null>(null);\n\ninterface GitHatProviderProps {\n config: GitHatConfig;\n children: React.ReactNode;\n}\n\nexport function GitHatProvider({ config: rawConfig, children }: GitHatProviderProps) {\n const config = useMemo(() => resolveConfig(rawConfig), [rawConfig]);\n const clientRef = useRef(createClient(config.apiUrl, config.publishableKey));\n\n const [user, setUser] = useState<GitHatUser | null>(null);\n const [org, setOrg] = useState<GitHatOrg | null>(null);\n const [isSignedIn, setIsSignedIn] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [authError, setAuthError] = useState<string | null>(null);\n\n // Validate stored token on mount\n useEffect(() => {\n const token = localStorage.getItem(TOKEN_KEYS.accessToken);\n const storedUser = localStorage.getItem(TOKEN_KEYS.user);\n\n if (token && storedUser) {\n clientRef.current.fetchApi<{ user: GitHatUser; currentOrg: GitHatOrg }>('/auth/me')\n .then((data) => {\n const u = data.user || JSON.parse(storedUser);\n setUser(u);\n const storedOrg = localStorage.getItem(TOKEN_KEYS.org);\n setOrg(data.currentOrg || (storedOrg ? JSON.parse(storedOrg) : null));\n setIsSignedIn(true);\n setAuthError(null);\n })\n .catch((err) => {\n if (err.message === 'Session expired') {\n clientRef.current.clearAuth();\n } else {\n // Network error — keep stored auth, surface error\n try { setUser(JSON.parse(storedUser)); } catch {}\n setAuthError(err.message || 'Failed to verify session');\n }\n })\n .finally(() => setIsLoading(false));\n } else {\n setIsLoading(false);\n }\n }, []);\n\n // Listen for auth-changed events\n useEffect(() => {\n const handleAuthChanged = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (detail?.signedIn === false) {\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n } else if (detail?.signedIn === true && detail?.user) {\n setUser(detail.user);\n setIsSignedIn(true);\n if (detail.org) setOrg(detail.org);\n }\n };\n window.addEventListener('githat:auth-changed', handleAuthChanged);\n return () => window.removeEventListener('githat:auth-changed', handleAuthChanged);\n }, []);\n\n const signIn = useCallback(async (email: string, password: string) => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/login', {\n method: 'POST',\n body: JSON.stringify({ email, password }),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n }, []);\n\n const signUp = useCallback(async (signUpData: SignUpData): Promise<SignUpResult> => {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n user: GitHatUser;\n org: GitHatOrg;\n }>('/auth/register', {\n method: 'POST',\n body: JSON.stringify(signUpData),\n });\n\n localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n localStorage.setItem(TOKEN_KEYS.user, JSON.stringify(data.user));\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n\n setUser(data.user);\n setOrg(data.org || null);\n setIsSignedIn(true);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: data.user, org: data.org, signedIn: true },\n }));\n\n return { requiresVerification: !data.user.emailVerified, email: signUpData.email };\n }, []);\n\n const signOut = useCallback(async () => {\n try {\n await clientRef.current.fetchApi('/auth/logout', { method: 'POST' });\n } catch {}\n clientRef.current.clearAuth();\n setIsSignedIn(false);\n setUser(null);\n setOrg(null);\n if (typeof window !== 'undefined' && config.afterSignOutUrl) {\n window.location.href = config.afterSignOutUrl;\n }\n }, [config.afterSignOutUrl]);\n\n const switchOrg = useCallback(async (orgId: string) => {\n try {\n const data = await clientRef.current.fetchApi<{\n accessToken: string;\n refreshToken: string;\n org: GitHatOrg;\n }>(`/user/orgs/${orgId}/switch`, { method: 'POST' });\n\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n const orgData = data.org;\n localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(orgData));\n setOrg(orgData);\n\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user, org: orgData, signedIn: true },\n }));\n } catch (e) {\n console.error('Org switch failed:', e);\n }\n }, [user]);\n\n const value = useMemo<GitHatContextValue>(() => ({\n user, org, isSignedIn, isLoading, authError, config,\n signIn, signUp, signOut, switchOrg,\n }), [user, org, isSignedIn, isLoading, authError, config, signIn, signUp, signOut, switchOrg]);\n\n return (\n <GitHatContext.Provider value={value}>\n {children}\n </GitHatContext.Provider>\n );\n}\n","import type { GitHatConfig } from './types';\n\nexport const DEFAULT_API_URL = 'https://api.githat.io';\n\nexport const TOKEN_KEYS = {\n accessToken: 'githat_access_token',\n refreshToken: 'githat_refresh_token',\n user: 'githat_user',\n org: 'githat_org',\n} as const;\n\nexport function resolveConfig(config: GitHatConfig): Required<GitHatConfig> {\n return {\n publishableKey: config.publishableKey,\n apiUrl: config.apiUrl || DEFAULT_API_URL,\n signInUrl: config.signInUrl || '/sign-in',\n signUpUrl: config.signUpUrl || '/sign-up',\n afterSignInUrl: config.afterSignInUrl || '/dashboard',\n afterSignOutUrl: config.afterSignOutUrl || '/',\n };\n}\n","import { TOKEN_KEYS } from './config';\n\nlet _refreshPromise: Promise<boolean> | null = null;\n\nasync function refreshTokens(apiUrl: string, appKey: string): Promise<boolean> {\n const refreshToken = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.refreshToken) : null;\n if (!refreshToken) return false;\n\n let orgId: string | null = null;\n try {\n const orgStr = localStorage.getItem(TOKEN_KEYS.org);\n if (orgStr) orgId = JSON.parse(orgStr).id;\n } catch {}\n\n try {\n const res = await fetch(`${apiUrl}/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n },\n body: JSON.stringify({ refreshToken, orgId }),\n });\n if (!res.ok) return false;\n\n const data = await res.json();\n if (data.accessToken) localStorage.setItem(TOKEN_KEYS.accessToken, data.accessToken);\n if (data.refreshToken) localStorage.setItem(TOKEN_KEYS.refreshToken, data.refreshToken);\n if (data.org) localStorage.setItem(TOKEN_KEYS.org, JSON.stringify(data.org));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction clearAuth() {\n if (typeof window === 'undefined') return;\n Object.values(TOKEN_KEYS).forEach(key => localStorage.removeItem(key));\n window.dispatchEvent(new CustomEvent('githat:auth-changed', {\n detail: { user: null, org: null, signedIn: false },\n }));\n}\n\nexport function createClient(apiUrl: string, appKey: string) {\n async function fetchApi<T = any>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${apiUrl}${endpoint}`;\n const token = typeof window !== 'undefined' ? localStorage.getItem(TOKEN_KEYS.accessToken) : null;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-GitHat-App-Key': appKey,\n ...(token && { Authorization: `Bearer ${token}` }),\n ...(options.headers as Record<string, string>),\n };\n\n let response: Response;\n try {\n response = await fetch(url, { ...options, headers });\n } catch (networkError: unknown) {\n // Network errors (CORS blocked, offline, DNS failure) throw TypeError\n if (networkError instanceof TypeError) {\n const isMissingKey = !appKey || !appKey.startsWith('pk_live_');\n const isLocalhost = typeof window !== 'undefined' &&\n (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');\n\n if (isMissingKey && !isLocalhost) {\n throw new Error(\n 'Missing GitHat API key. Add NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY to .env.local'\n );\n }\n throw new Error(\n 'Unable to connect to GitHat API. Check your network connection.'\n );\n }\n throw networkError;\n }\n\n if (response.status === 401) {\n // Queue all 401 retries behind a single refresh promise\n if (!_refreshPromise) {\n _refreshPromise = refreshTokens(apiUrl, appKey).finally(() => {\n _refreshPromise = null;\n });\n }\n\n const refreshed = await _refreshPromise;\n\n if (refreshed) {\n const newToken = localStorage.getItem(TOKEN_KEYS.accessToken);\n const retryResponse = await fetch(url, {\n ...options,\n headers: {\n ...headers,\n ...(newToken && { Authorization: `Bearer ${newToken}` }),\n },\n });\n const retryData = await retryResponse.json();\n if (!retryResponse.ok) throw new Error(retryData.error || 'Request failed');\n return retryData as T;\n }\n\n clearAuth();\n throw new Error('Session expired');\n }\n\n const data = await response.json();\n if (!response.ok) throw new Error(data.error || 'Request failed');\n return data as T;\n }\n\n return { fetchApi, clearAuth };\n}\n","'use client';\n\nimport { useContext, useMemo } from 'react';\nimport { GitHatContext } from './provider';\nimport { createClient } from './client';\nimport type { GitHatContextValue, GitHatOrg } from './types';\n\nexport function useAuth(): GitHatContextValue {\n const ctx = useContext(GitHatContext);\n if (!ctx) throw new Error('useAuth must be used within a <GitHatProvider>');\n return ctx;\n}\n\nexport function useGitHat() {\n const ctx = useAuth();\n const client = useMemo(\n () => createClient(ctx.config.apiUrl!, ctx.config.publishableKey),\n [ctx.config.apiUrl, ctx.config.publishableKey]\n );\n\n return {\n fetch: client.fetchApi,\n getUserOrgs: () => client.fetchApi<{ orgs: GitHatOrg[] }>('/user/orgs'),\n verifyMCP: (domain: string) => client.fetchApi<{ verified: boolean }>(`/verify/mcp/${domain}`),\n verifyAgent: (wallet: string) => client.fetchApi<{ verified: boolean }>(`/verify/agent/${wallet}`),\n };\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useAuth } from './hooks';\nimport { createClient } from './client';\n\nexport interface DataItem {\n id: string;\n [key: string]: unknown;\n _createdAt?: string;\n _updatedAt?: string;\n}\n\nexport interface QueryOptions {\n limit?: number;\n cursor?: string;\n filter?: Record<string, unknown>;\n}\n\nexport interface QueryResult<T = DataItem> {\n items: T[];\n collection: string;\n nextCursor: string | null;\n count: number;\n}\n\nexport interface PutResult<T = DataItem> {\n item: T;\n collection: string;\n created: boolean;\n}\n\nexport interface DeleteResult {\n deleted: boolean;\n id: string;\n collection: string;\n}\n\nexport interface BatchOperation {\n type: 'put' | 'delete';\n id: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BatchResult {\n processed: number;\n put: number;\n deleted: number;\n collection: string;\n}\n\n/**\n * Hook for interacting with GitHat's Customer Data API.\n * Provides CRUD operations for storing app data in GitHat's managed DynamoDB.\n *\n * @example\n * ```tsx\n * const { put, get, query, remove, batch } = useData();\n *\n * // Store data\n * await put('orders', { id: 'order_123', amount: 99.99, status: 'pending' });\n *\n * // Get single item\n * const order = await get('orders', 'order_123');\n *\n * // Query collection\n * const { items } = await query('orders', { filter: { status: 'pending' } });\n *\n * // Delete item\n * await remove('orders', 'order_123');\n * ```\n */\nexport function useData() {\n const ctx = useAuth();\n const client = useMemo(\n () => createClient(ctx.config.apiUrl!, ctx.config.publishableKey),\n [ctx.config.apiUrl, ctx.config.publishableKey]\n );\n\n return useMemo(() => ({\n /**\n * Store an item in a collection. If the item exists, it will be updated.\n * @param collection - Collection name (e.g., 'orders', 'users')\n * @param data - Data object with required `id` field\n */\n put: async <T extends DataItem>(collection: string, data: T): Promise<PutResult<T>> => {\n if (!data.id) {\n throw new Error('Data must include an \"id\" field');\n }\n return client.fetchApi<PutResult<T>>(`/data/${collection}/${data.id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n },\n\n /**\n * Get a single item from a collection.\n * @param collection - Collection name\n * @param id - Item ID\n */\n get: async <T extends DataItem>(collection: string, id: string): Promise<T | null> => {\n try {\n const result = await client.fetchApi<{ item: T }>(`/data/${collection}/${id}`);\n return result.item;\n } catch (err: unknown) {\n if (err instanceof Error && err.message === 'Item not found') {\n return null;\n }\n throw err;\n }\n },\n\n /**\n * Query items from a collection with optional filters and pagination.\n * @param collection - Collection name\n * @param options - Query options (limit, cursor, filter)\n */\n query: async <T extends DataItem>(\n collection: string,\n options: QueryOptions = {}\n ): Promise<QueryResult<T>> => {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', options.limit.toString());\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.filter) params.set('filter', JSON.stringify(options.filter));\n\n const queryString = params.toString();\n const url = `/data/${collection}${queryString ? `?${queryString}` : ''}`;\n\n return client.fetchApi<QueryResult<T>>(url);\n },\n\n /**\n * Delete an item from a collection.\n * @param collection - Collection name\n * @param id - Item ID\n */\n remove: async (collection: string, id: string): Promise<DeleteResult> => {\n return client.fetchApi<DeleteResult>(`/data/${collection}/${id}`, {\n method: 'DELETE',\n });\n },\n\n /**\n * Batch operations (put/delete) on a collection.\n * Maximum 100 operations per request.\n * @param collection - Collection name\n * @param operations - Array of operations\n */\n batch: async (collection: string, operations: BatchOperation[]): Promise<BatchResult> => {\n return client.fetchApi<BatchResult>(`/data/${collection}/batch`, {\n method: 'POST',\n body: JSON.stringify({ operations }),\n });\n },\n }), [client]);\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignInFormProps {\n onSuccess?: () => void;\n signUpUrl?: string;\n forgotPasswordUrl?: string;\n}\n\nexport function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }: SignInFormProps) {\n const { signIn, config } = useAuth();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n setError('');\n setLoading(true);\n try {\n await signIn(email, password);\n if (onSuccess) {\n onSuccess();\n } else if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n window.location.href = params.get('redirect_url') || config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign in failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Sign in</h2>\n <p className=\"githat-form-subtitle\">Welcome back to GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign in form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-email\">Email</label>\n <input\n id=\"githat-signin-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signin-password\">Password</label>\n <input\n id=\"githat-signin-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n autoComplete=\"current-password\"\n required\n />\n </div>\n {forgotPasswordUrl && (\n <a href={forgotPasswordUrl} className=\"githat-link githat-forgot-link\">Forgot password?</a>\n )}\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || (email.length > 0 && !emailValid)}\n >\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n {signUpUrl && (\n <p className=\"githat-form-footer\">\n Don't have an account? <a href={signUpUrl} className=\"githat-link\">Sign up</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../hooks';\n\ninterface SignUpFormProps {\n onSuccess?: (result: { requiresVerification: boolean; email: string }) => void;\n signInUrl?: string;\n}\n\nexport function SignUpForm({ onSuccess, signInUrl }: SignUpFormProps) {\n const { signUp, config } = useAuth();\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const emailValid = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n const passwordValid = password.length >= 8\n && /[A-Z]/.test(password)\n && /[a-z]/.test(password)\n && /\\d/.test(password);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!emailValid) {\n setError('Please enter a valid email address');\n return;\n }\n if (!passwordValid) {\n setError('Password must be 8+ characters with uppercase, lowercase, number, and special character');\n return;\n }\n setError('');\n setLoading(true);\n try {\n const result = await signUp({ email, password, name });\n if (onSuccess) {\n onSuccess(result);\n } else if (typeof window !== 'undefined') {\n window.location.href = config.afterSignInUrl!;\n }\n } catch (err: any) {\n setError(err.message || 'Sign up failed');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"githat-form-container\">\n <div className=\"githat-form-header\">\n <h2 className=\"githat-form-title\">Create an account</h2>\n <p className=\"githat-form-subtitle\">Get started with GitHat</p>\n </div>\n {error && <div className=\"githat-alert githat-alert-error\" role=\"alert\" aria-live=\"polite\">{error}</div>}\n <form onSubmit={handleSubmit} className=\"githat-form\" aria-label=\"Sign up form\">\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-name\">Full name</label>\n <input\n id=\"githat-signup-name\"\n className=\"githat-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-email\">Email</label>\n <input\n id=\"githat-signup-email\"\n className=\"githat-input\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n />\n </div>\n <div className=\"githat-field\">\n <label className=\"githat-label\" htmlFor=\"githat-signup-password\">Password</label>\n <input\n id=\"githat-signup-password\"\n className=\"githat-input\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n autoComplete=\"new-password\"\n required\n />\n {password && !passwordValid && (\n <p className=\"githat-field-error\">\n Must be 8+ characters with uppercase, lowercase, and number\n </p>\n )}\n </div>\n <button\n type=\"submit\"\n className=\"githat-button githat-button-primary\"\n disabled={loading || !email || !password || !name || !emailValid}\n >\n {loading ? 'Creating account...' : 'Sign up'}\n </button>\n </form>\n {signInUrl && (\n <p className=\"githat-form-footer\">\n Already have an account? <a href={signInUrl} className=\"githat-link\">Sign in</a>\n </p>\n )}\n <p className=\"githat-powered-by\">Secured by <strong>GitHat</strong></p>\n </div>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignInButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignInButton({ className, children, href }: SignInButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signInUrl || '/sign-in';\n return (\n <a href={url} className={className || 'githat-button githat-button-primary'} aria-label=\"Sign in\">\n {children || 'Sign in'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useContext } from 'react';\nimport { GitHatContext } from '../provider';\n\ninterface SignUpButtonProps {\n className?: string;\n children?: React.ReactNode;\n href?: string;\n}\n\nexport function SignUpButton({ className, children, href }: SignUpButtonProps) {\n const ctx = useContext(GitHatContext);\n const url = href || ctx?.config.signUpUrl || '/sign-up';\n return (\n <a href={url} className={className || 'githat-button githat-button-outline'} aria-label=\"Sign up\">\n {children || 'Sign up'}\n </a>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useAuth } from '../hooks';\n\nexport function UserButton() {\n const { user, org, isSignedIn, signOut } = useAuth();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !user) return null;\n\n const initials = user.name\n ? user.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)\n : user.email[0].toUpperCase();\n\n return (\n <div className=\"githat-user-button\" ref={ref}>\n <button className=\"githat-avatar-trigger\" onClick={() => setOpen(!open)} aria-label=\"User menu\" aria-expanded={open} aria-haspopup=\"true\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt={user.name || 'User avatar'} className=\"githat-avatar-img\" />\n ) : (\n <span className=\"githat-avatar-initials\">{initials}</span>\n )}\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n <div className=\"githat-dropdown-header\">\n <p className=\"githat-dropdown-name\">{user.name}</p>\n <p className=\"githat-dropdown-email\">{user.email}</p>\n {org && <p className=\"githat-dropdown-org\">{org.name}</p>}\n </div>\n <div className=\"githat-dropdown-divider\" />\n <button className=\"githat-dropdown-item\" role=\"menuitem\" onClick={() => { signOut(); setOpen(false); }}>\n Sign out\n </button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useAuth, useGitHat } from '../hooks';\nimport type { GitHatOrg } from '../types';\n\nexport function OrgSwitcher() {\n const { org, isSignedIn, switchOrg } = useAuth();\n const githat = useGitHat();\n const [orgs, setOrgs] = useState<GitHatOrg[]>([]);\n const [orgsLoading, setOrgsLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isSignedIn) {\n setOrgsLoading(true);\n githat.getUserOrgs()\n .then(data => setOrgs(data.orgs || []))\n .catch(() => {})\n .finally(() => setOrgsLoading(false));\n }\n }, [isSignedIn]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!isSignedIn || !org || (orgs.length < 2 && !orgsLoading)) return null;\n\n return (\n <div className=\"githat-org-switcher\" ref={ref}>\n <button className=\"githat-org-trigger\" onClick={() => setOpen(!open)} aria-label=\"Switch organization\" aria-expanded={open} aria-haspopup=\"true\">\n <span className=\"githat-org-name\">{org.name}</span>\n <span className=\"githat-chevron\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </button>\n {open && (\n <div className=\"githat-dropdown\" role=\"menu\">\n {orgsLoading ? (\n <div className=\"githat-dropdown-item\" aria-busy=\"true\">Loading...</div>\n ) : orgs.map(o => (\n <button\n key={o.id}\n className={`githat-dropdown-item ${o.id === org.id ? 'githat-dropdown-item-active' : ''}`}\n role=\"menuitem\"\n aria-current={o.id === org.id ? 'true' : undefined}\n onClick={() => { switchOrg(o.id); setOpen(false); }}\n >\n {o.name}\n {o.id === org.id && <span className=\"githat-check\">{'\\u2713'}</span>}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useGitHat } from '../hooks';\n\ninterface VerifiedBadgeProps {\n type: 'mcp' | 'agent';\n identifier: string;\n label?: string;\n}\n\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\nconst cache = new Map<string, { verified: boolean; ts: number }>();\n\nexport function VerifiedBadge({ type, identifier, label }: VerifiedBadgeProps) {\n const githat = useGitHat();\n const [verified, setVerified] = useState<boolean | null>(null);\n const mounted = useRef(true);\n\n useEffect(() => {\n mounted.current = true;\n const key = `${type}:${identifier}`;\n const cached = cache.get(key);\n if (cached && Date.now() - cached.ts < CACHE_TTL) {\n setVerified(cached.verified);\n return;\n }\n\n const verify = type === 'mcp' ? githat.verifyMCP : githat.verifyAgent;\n verify(identifier)\n .then(data => {\n if (mounted.current) {\n setVerified(data.verified);\n cache.set(key, { verified: data.verified, ts: Date.now() });\n }\n })\n .catch(() => { if (mounted.current) setVerified(false); });\n\n return () => { mounted.current = false; };\n }, [type, identifier]);\n\n if (verified === null) return null;\n\n return (\n <span className={`githat-badge ${verified ? 'githat-badge-verified' : 'githat-badge-unverified'}`}>\n {verified ? '\\u2713' : '\\u2717'} {label || (verified ? 'Verified' : 'Unverified')}\n </span>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { useAuth } from '../hooks';\n\ninterface ProtectedRouteProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\nexport function ProtectedRoute({ children, fallback }: ProtectedRouteProps) {\n const { isSignedIn, isLoading, config } = useAuth();\n\n if (isLoading) {\n return <>{fallback || <div className=\"githat-loading\">Loading...</div>}</>;\n }\n\n if (!isSignedIn) {\n if (typeof window !== 'undefined') {\n window.location.href = config.signInUrl!;\n }\n return null;\n }\n\n return <>{children}</>;\n}\n"],"mappings":"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","names":["useMemo","useMemo","useMemo","useMemo","useState","jsx","useState","useState","jsx","jsxs","useState","useContext","jsx","useContext","useContext","jsx","useContext","useState","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","jsxs","useState","useRef","useEffect","jsx"]}
|