@githat/nextjs 0.2.4 → 0.2.6
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 +113 -1
- package/dist/index.d.ts +113 -1
- package/dist/index.js +512 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +508 -31
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -22,8 +22,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
22
22
|
var src_exports = {};
|
|
23
23
|
__export(src_exports, {
|
|
24
24
|
ChangePasswordForm: () => ChangePasswordForm,
|
|
25
|
+
CognitoButton: () => CognitoButton,
|
|
26
|
+
CognitoCallback: () => CognitoCallback,
|
|
25
27
|
ForgotPasswordForm: () => ForgotPasswordForm,
|
|
26
28
|
GitHatProvider: () => GitHatProvider,
|
|
29
|
+
GitHubButton: () => GitHubButton,
|
|
30
|
+
GitHubCallback: () => GitHubCallback,
|
|
27
31
|
OrgSwitcher: () => OrgSwitcher,
|
|
28
32
|
ProtectedRoute: () => ProtectedRoute,
|
|
29
33
|
ResetPasswordForm: () => ResetPasswordForm,
|
|
@@ -424,33 +428,23 @@ function useGitHat() {
|
|
|
424
428
|
);
|
|
425
429
|
const forgotPassword = (0, import_react2.useCallback)(
|
|
426
430
|
async (email) => {
|
|
427
|
-
|
|
431
|
+
await client.fetchApi("/auth/forgot-password", {
|
|
428
432
|
method: "POST",
|
|
429
|
-
headers: { "Content-Type": "application/json" },
|
|
430
433
|
body: JSON.stringify({ email })
|
|
431
434
|
});
|
|
432
|
-
if (!response.ok) {
|
|
433
|
-
const error = await response.json().catch(() => ({}));
|
|
434
|
-
throw new Error(error.message || "Failed to send reset email");
|
|
435
|
-
}
|
|
436
435
|
return { success: true };
|
|
437
436
|
},
|
|
438
|
-
[
|
|
437
|
+
[client]
|
|
439
438
|
);
|
|
440
439
|
const resetPassword = (0, import_react2.useCallback)(
|
|
441
440
|
async (token, newPassword) => {
|
|
442
|
-
|
|
441
|
+
await client.fetchApi("/auth/reset-password", {
|
|
443
442
|
method: "POST",
|
|
444
|
-
headers: { "Content-Type": "application/json" },
|
|
445
443
|
body: JSON.stringify({ token, password: newPassword })
|
|
446
444
|
});
|
|
447
|
-
if (!response.ok) {
|
|
448
|
-
const error = await response.json().catch(() => ({}));
|
|
449
|
-
throw new Error(error.message || "Failed to reset password");
|
|
450
|
-
}
|
|
451
445
|
return { success: true };
|
|
452
446
|
},
|
|
453
|
-
[
|
|
447
|
+
[client]
|
|
454
448
|
);
|
|
455
449
|
const changePassword = (0, import_react2.useCallback)(
|
|
456
450
|
async (currentPassword, newPassword) => {
|
|
@@ -464,33 +458,90 @@ function useGitHat() {
|
|
|
464
458
|
);
|
|
465
459
|
const verifyEmail = (0, import_react2.useCallback)(
|
|
466
460
|
async (token) => {
|
|
467
|
-
|
|
461
|
+
await client.fetchApi("/auth/verify-email", {
|
|
468
462
|
method: "POST",
|
|
469
|
-
headers: { "Content-Type": "application/json" },
|
|
470
463
|
body: JSON.stringify({ token })
|
|
471
464
|
});
|
|
472
|
-
if (!response.ok) {
|
|
473
|
-
const error = await response.json().catch(() => ({}));
|
|
474
|
-
throw new Error(error.message || "Failed to verify email");
|
|
475
|
-
}
|
|
476
465
|
return { success: true };
|
|
477
466
|
},
|
|
478
|
-
[
|
|
467
|
+
[client]
|
|
479
468
|
);
|
|
480
469
|
const resendVerificationEmail = (0, import_react2.useCallback)(
|
|
481
470
|
async (email) => {
|
|
482
|
-
|
|
471
|
+
await client.fetchApi("/auth/resend-verification", {
|
|
483
472
|
method: "POST",
|
|
484
|
-
headers: { "Content-Type": "application/json" },
|
|
485
473
|
body: JSON.stringify({ email })
|
|
486
474
|
});
|
|
487
|
-
if (!response.ok) {
|
|
488
|
-
const error = await response.json().catch(() => ({}));
|
|
489
|
-
throw new Error(error.message || "Failed to resend verification email");
|
|
490
|
-
}
|
|
491
475
|
return { success: true };
|
|
492
476
|
},
|
|
493
|
-
[
|
|
477
|
+
[client]
|
|
478
|
+
);
|
|
479
|
+
const getGitHubOAuthUrl = (0, import_react2.useCallback)(
|
|
480
|
+
async (options) => {
|
|
481
|
+
const params = new URLSearchParams();
|
|
482
|
+
if (options?.redirectUri) params.append("redirectUri", options.redirectUri);
|
|
483
|
+
if (options?.state) params.append("state", options.state);
|
|
484
|
+
const queryString = params.toString();
|
|
485
|
+
const path = queryString ? `/auth/oauth/github/url?${queryString}` : "/auth/oauth/github/url";
|
|
486
|
+
return client.fetchApi(path);
|
|
487
|
+
},
|
|
488
|
+
[client]
|
|
489
|
+
);
|
|
490
|
+
const signInWithGitHub = (0, import_react2.useCallback)(
|
|
491
|
+
async (code, options) => {
|
|
492
|
+
const response = await client.fetchApi("/auth/oauth/github", {
|
|
493
|
+
method: "POST",
|
|
494
|
+
body: JSON.stringify({
|
|
495
|
+
code,
|
|
496
|
+
redirectUri: options?.redirectUri
|
|
497
|
+
})
|
|
498
|
+
});
|
|
499
|
+
if (response.accessToken) {
|
|
500
|
+
window.dispatchEvent(new CustomEvent("githat:auth-changed", {
|
|
501
|
+
detail: { user: response.user, org: response.org, signedIn: true }
|
|
502
|
+
}));
|
|
503
|
+
}
|
|
504
|
+
return {
|
|
505
|
+
user: response.user,
|
|
506
|
+
org: response.org,
|
|
507
|
+
isNewUser: response.isNewUser
|
|
508
|
+
};
|
|
509
|
+
},
|
|
510
|
+
[client]
|
|
511
|
+
);
|
|
512
|
+
const getCognitoOAuthUrl = (0, import_react2.useCallback)(
|
|
513
|
+
async (options) => {
|
|
514
|
+
const params = new URLSearchParams();
|
|
515
|
+
if (options?.redirectUri) params.append("redirectUri", options.redirectUri);
|
|
516
|
+
if (options?.state) params.append("state", options.state);
|
|
517
|
+
if (options?.identityProvider) params.append("identityProvider", options.identityProvider);
|
|
518
|
+
const queryString = params.toString();
|
|
519
|
+
const path = queryString ? `/auth/oauth/cognito/url?${queryString}` : "/auth/oauth/cognito/url";
|
|
520
|
+
return client.fetchApi(path);
|
|
521
|
+
},
|
|
522
|
+
[client]
|
|
523
|
+
);
|
|
524
|
+
const signInWithCognito = (0, import_react2.useCallback)(
|
|
525
|
+
async (code, options) => {
|
|
526
|
+
const response = await client.fetchApi("/auth/oauth/cognito", {
|
|
527
|
+
method: "POST",
|
|
528
|
+
body: JSON.stringify({
|
|
529
|
+
code,
|
|
530
|
+
redirectUri: options?.redirectUri
|
|
531
|
+
})
|
|
532
|
+
});
|
|
533
|
+
if (response.accessToken) {
|
|
534
|
+
window.dispatchEvent(new CustomEvent("githat:auth-changed", {
|
|
535
|
+
detail: { user: response.user, org: response.org, signedIn: true }
|
|
536
|
+
}));
|
|
537
|
+
}
|
|
538
|
+
return {
|
|
539
|
+
user: response.user,
|
|
540
|
+
org: response.org,
|
|
541
|
+
isNewUser: response.isNewUser
|
|
542
|
+
};
|
|
543
|
+
},
|
|
544
|
+
[client]
|
|
494
545
|
);
|
|
495
546
|
return {
|
|
496
547
|
fetch: client.fetchApi,
|
|
@@ -505,7 +556,12 @@ function useGitHat() {
|
|
|
505
556
|
changePassword,
|
|
506
557
|
// Email verification
|
|
507
558
|
verifyEmail,
|
|
508
|
-
resendVerificationEmail
|
|
559
|
+
resendVerificationEmail,
|
|
560
|
+
// OAuth (Web2)
|
|
561
|
+
getGitHubOAuthUrl,
|
|
562
|
+
signInWithGitHub,
|
|
563
|
+
getCognitoOAuthUrl,
|
|
564
|
+
signInWithCognito
|
|
509
565
|
};
|
|
510
566
|
}
|
|
511
567
|
|
|
@@ -614,7 +670,7 @@ function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }) {
|
|
|
614
670
|
window.location.href = params.get("redirect_url") || config.afterSignInUrl;
|
|
615
671
|
}
|
|
616
672
|
} catch (err) {
|
|
617
|
-
setError(err.message
|
|
673
|
+
setError(err instanceof Error ? err.message : "Sign in failed");
|
|
618
674
|
} finally {
|
|
619
675
|
setLoading(false);
|
|
620
676
|
}
|
|
@@ -712,7 +768,7 @@ function SignUpForm({ onSuccess, signInUrl }) {
|
|
|
712
768
|
window.location.href = config.afterSignInUrl;
|
|
713
769
|
}
|
|
714
770
|
} catch (err) {
|
|
715
|
-
setError(err.message
|
|
771
|
+
setError(err instanceof Error ? err.message : "Sign up failed");
|
|
716
772
|
} finally {
|
|
717
773
|
setLoading(false);
|
|
718
774
|
}
|
|
@@ -1337,11 +1393,436 @@ function ChangePasswordForm({
|
|
|
1337
1393
|
] })
|
|
1338
1394
|
] });
|
|
1339
1395
|
}
|
|
1396
|
+
|
|
1397
|
+
// src/components/GitHubButton.tsx
|
|
1398
|
+
var import_react15 = require("react");
|
|
1399
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
1400
|
+
var GitHubIcon = () => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("path", { d: "M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z" }) });
|
|
1401
|
+
function GitHubButton({
|
|
1402
|
+
children = "Continue with GitHub",
|
|
1403
|
+
redirectUri,
|
|
1404
|
+
onSuccess,
|
|
1405
|
+
onError,
|
|
1406
|
+
className = "",
|
|
1407
|
+
variant = "default",
|
|
1408
|
+
disabled = false
|
|
1409
|
+
}) {
|
|
1410
|
+
const { getGitHubOAuthUrl } = useGitHat();
|
|
1411
|
+
const [isLoading, setIsLoading] = (0, import_react15.useState)(false);
|
|
1412
|
+
const handleClick = (0, import_react15.useCallback)(async () => {
|
|
1413
|
+
if (isLoading || disabled) return;
|
|
1414
|
+
setIsLoading(true);
|
|
1415
|
+
try {
|
|
1416
|
+
const state = crypto.randomUUID();
|
|
1417
|
+
sessionStorage.setItem("githat_oauth_state", state);
|
|
1418
|
+
const { url } = await getGitHubOAuthUrl({ redirectUri, state });
|
|
1419
|
+
window.location.href = url;
|
|
1420
|
+
} catch (error) {
|
|
1421
|
+
setIsLoading(false);
|
|
1422
|
+
if (onError) {
|
|
1423
|
+
onError(error instanceof Error ? error : new Error("Failed to start GitHub OAuth"));
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
}, [getGitHubOAuthUrl, redirectUri, onError, isLoading, disabled]);
|
|
1427
|
+
const baseStyles = "githat-github-button";
|
|
1428
|
+
const variantStyles = variant === "outline" ? "githat-github-button-outline" : "";
|
|
1429
|
+
const disabledStyles = disabled || isLoading ? "githat-github-button-disabled" : "";
|
|
1430
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1431
|
+
"button",
|
|
1432
|
+
{
|
|
1433
|
+
type: "button",
|
|
1434
|
+
onClick: handleClick,
|
|
1435
|
+
disabled: disabled || isLoading,
|
|
1436
|
+
className: `${baseStyles} ${variantStyles} ${disabledStyles} ${className}`.trim(),
|
|
1437
|
+
children: [
|
|
1438
|
+
isLoading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "githat-github-spinner" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(GitHubIcon, {}),
|
|
1439
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children })
|
|
1440
|
+
]
|
|
1441
|
+
}
|
|
1442
|
+
);
|
|
1443
|
+
}
|
|
1444
|
+
if (typeof document !== "undefined") {
|
|
1445
|
+
const styleId = "githat-github-button-styles";
|
|
1446
|
+
if (!document.getElementById(styleId)) {
|
|
1447
|
+
const style = document.createElement("style");
|
|
1448
|
+
style.id = styleId;
|
|
1449
|
+
style.textContent = `
|
|
1450
|
+
.githat-github-button {
|
|
1451
|
+
display: inline-flex;
|
|
1452
|
+
align-items: center;
|
|
1453
|
+
justify-content: center;
|
|
1454
|
+
gap: 0.5rem;
|
|
1455
|
+
padding: 0.625rem 1rem;
|
|
1456
|
+
font-size: 0.875rem;
|
|
1457
|
+
font-weight: 500;
|
|
1458
|
+
border-radius: 0.375rem;
|
|
1459
|
+
border: none;
|
|
1460
|
+
cursor: pointer;
|
|
1461
|
+
transition: all 0.15s ease;
|
|
1462
|
+
background-color: #24292f;
|
|
1463
|
+
color: #ffffff;
|
|
1464
|
+
width: 100%;
|
|
1465
|
+
}
|
|
1466
|
+
.githat-github-button:hover:not(:disabled) {
|
|
1467
|
+
background-color: #32383f;
|
|
1468
|
+
}
|
|
1469
|
+
.githat-github-button-outline {
|
|
1470
|
+
background-color: transparent;
|
|
1471
|
+
color: #24292f;
|
|
1472
|
+
border: 1px solid #d0d7de;
|
|
1473
|
+
}
|
|
1474
|
+
.githat-github-button-outline:hover:not(:disabled) {
|
|
1475
|
+
background-color: #f6f8fa;
|
|
1476
|
+
border-color: #24292f;
|
|
1477
|
+
}
|
|
1478
|
+
.githat-github-button-disabled {
|
|
1479
|
+
opacity: 0.5;
|
|
1480
|
+
cursor: not-allowed;
|
|
1481
|
+
}
|
|
1482
|
+
.githat-github-spinner {
|
|
1483
|
+
width: 1rem;
|
|
1484
|
+
height: 1rem;
|
|
1485
|
+
border: 2px solid currentColor;
|
|
1486
|
+
border-top-color: transparent;
|
|
1487
|
+
border-radius: 50%;
|
|
1488
|
+
animation: githat-spin 0.6s linear infinite;
|
|
1489
|
+
}
|
|
1490
|
+
@keyframes githat-spin {
|
|
1491
|
+
to { transform: rotate(360deg); }
|
|
1492
|
+
}
|
|
1493
|
+
`;
|
|
1494
|
+
document.head.appendChild(style);
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
// src/components/GitHubCallback.tsx
|
|
1499
|
+
var import_react16 = require("react");
|
|
1500
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
1501
|
+
function GitHubCallback({
|
|
1502
|
+
redirectUrl = "/dashboard",
|
|
1503
|
+
newUserRedirectUrl,
|
|
1504
|
+
onSuccess,
|
|
1505
|
+
onError,
|
|
1506
|
+
loadingComponent,
|
|
1507
|
+
errorComponent
|
|
1508
|
+
}) {
|
|
1509
|
+
const { signInWithGitHub } = useGitHat();
|
|
1510
|
+
const { config } = useAuth();
|
|
1511
|
+
const [error, setError] = (0, import_react16.useState)(null);
|
|
1512
|
+
const [isProcessing, setIsProcessing] = (0, import_react16.useState)(true);
|
|
1513
|
+
(0, import_react16.useEffect)(() => {
|
|
1514
|
+
const handleCallback = async () => {
|
|
1515
|
+
const params = new URLSearchParams(window.location.search);
|
|
1516
|
+
const code = params.get("code");
|
|
1517
|
+
const state = params.get("state");
|
|
1518
|
+
const errorParam = params.get("error");
|
|
1519
|
+
const errorDescription = params.get("error_description");
|
|
1520
|
+
if (errorParam) {
|
|
1521
|
+
const errorMsg = errorDescription || errorParam;
|
|
1522
|
+
setError(errorMsg);
|
|
1523
|
+
setIsProcessing(false);
|
|
1524
|
+
if (onError) {
|
|
1525
|
+
onError(new Error(errorMsg));
|
|
1526
|
+
}
|
|
1527
|
+
return;
|
|
1528
|
+
}
|
|
1529
|
+
if (!code) {
|
|
1530
|
+
const errorMsg = "No authorization code received";
|
|
1531
|
+
setError(errorMsg);
|
|
1532
|
+
setIsProcessing(false);
|
|
1533
|
+
if (onError) {
|
|
1534
|
+
onError(new Error(errorMsg));
|
|
1535
|
+
}
|
|
1536
|
+
return;
|
|
1537
|
+
}
|
|
1538
|
+
const savedState = sessionStorage.getItem("githat_oauth_state");
|
|
1539
|
+
if (savedState && state !== savedState) {
|
|
1540
|
+
const errorMsg = "Invalid state parameter";
|
|
1541
|
+
setError(errorMsg);
|
|
1542
|
+
setIsProcessing(false);
|
|
1543
|
+
if (onError) {
|
|
1544
|
+
onError(new Error(errorMsg));
|
|
1545
|
+
}
|
|
1546
|
+
return;
|
|
1547
|
+
}
|
|
1548
|
+
sessionStorage.removeItem("githat_oauth_state");
|
|
1549
|
+
try {
|
|
1550
|
+
const result = await signInWithGitHub(code);
|
|
1551
|
+
if (onSuccess) {
|
|
1552
|
+
onSuccess(result);
|
|
1553
|
+
}
|
|
1554
|
+
const targetUrl = result.isNewUser && newUserRedirectUrl ? newUserRedirectUrl : redirectUrl || config.afterSignInUrl || "/dashboard";
|
|
1555
|
+
window.location.href = targetUrl;
|
|
1556
|
+
} catch (err) {
|
|
1557
|
+
const errorMsg = err instanceof Error ? err.message : "Authentication failed";
|
|
1558
|
+
setError(errorMsg);
|
|
1559
|
+
setIsProcessing(false);
|
|
1560
|
+
if (onError) {
|
|
1561
|
+
onError(err instanceof Error ? err : new Error(errorMsg));
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
};
|
|
1565
|
+
handleCallback();
|
|
1566
|
+
}, [signInWithGitHub, redirectUrl, newUserRedirectUrl, config.afterSignInUrl, onSuccess, onError]);
|
|
1567
|
+
if (error) {
|
|
1568
|
+
if (errorComponent) {
|
|
1569
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: errorComponent(error) });
|
|
1570
|
+
}
|
|
1571
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "githat-callback-error", children: [
|
|
1572
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h2", { children: "Authentication Failed" }),
|
|
1573
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children: error }),
|
|
1574
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: "/sign-in", children: "Back to Sign In" })
|
|
1575
|
+
] });
|
|
1576
|
+
}
|
|
1577
|
+
if (loadingComponent) {
|
|
1578
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: loadingComponent });
|
|
1579
|
+
}
|
|
1580
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "githat-callback-loading", children: [
|
|
1581
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "githat-callback-spinner" }),
|
|
1582
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children: "Completing sign in with GitHub..." })
|
|
1583
|
+
] });
|
|
1584
|
+
}
|
|
1585
|
+
if (typeof document !== "undefined") {
|
|
1586
|
+
const styleId = "githat-callback-styles";
|
|
1587
|
+
if (!document.getElementById(styleId)) {
|
|
1588
|
+
const style = document.createElement("style");
|
|
1589
|
+
style.id = styleId;
|
|
1590
|
+
style.textContent = `
|
|
1591
|
+
.githat-callback-loading,
|
|
1592
|
+
.githat-callback-error {
|
|
1593
|
+
display: flex;
|
|
1594
|
+
flex-direction: column;
|
|
1595
|
+
align-items: center;
|
|
1596
|
+
justify-content: center;
|
|
1597
|
+
min-height: 200px;
|
|
1598
|
+
padding: 2rem;
|
|
1599
|
+
text-align: center;
|
|
1600
|
+
}
|
|
1601
|
+
.githat-callback-spinner {
|
|
1602
|
+
width: 2rem;
|
|
1603
|
+
height: 2rem;
|
|
1604
|
+
border: 3px solid #e5e7eb;
|
|
1605
|
+
border-top-color: #3b82f6;
|
|
1606
|
+
border-radius: 50%;
|
|
1607
|
+
animation: githat-spin 0.8s linear infinite;
|
|
1608
|
+
margin-bottom: 1rem;
|
|
1609
|
+
}
|
|
1610
|
+
.githat-callback-error h2 {
|
|
1611
|
+
color: #dc2626;
|
|
1612
|
+
margin-bottom: 0.5rem;
|
|
1613
|
+
}
|
|
1614
|
+
.githat-callback-error p {
|
|
1615
|
+
color: #6b7280;
|
|
1616
|
+
margin-bottom: 1rem;
|
|
1617
|
+
}
|
|
1618
|
+
.githat-callback-error a {
|
|
1619
|
+
color: #3b82f6;
|
|
1620
|
+
text-decoration: underline;
|
|
1621
|
+
}
|
|
1622
|
+
@keyframes githat-spin {
|
|
1623
|
+
to { transform: rotate(360deg); }
|
|
1624
|
+
}
|
|
1625
|
+
`;
|
|
1626
|
+
document.head.appendChild(style);
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
// src/components/CognitoButton.tsx
|
|
1631
|
+
var import_react17 = require("react");
|
|
1632
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1633
|
+
var AWSIcon = () => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { d: "M6.763 10.036c0 .296.032.535.088.71.064.176.144.368.256.576.04.063.056.127.056.183 0 .08-.048.16-.152.24l-.503.335a.383.383 0 0 1-.208.072c-.08 0-.16-.04-.239-.112a2.47 2.47 0 0 1-.287-.375 6.18 6.18 0 0 1-.248-.471c-.622.734-1.405 1.101-2.347 1.101-.67 0-1.205-.191-1.596-.574-.391-.384-.59-.894-.59-1.533 0-.678.239-1.23.726-1.644.487-.415 1.133-.623 1.955-.623.272 0 .551.024.846.064.296.04.6.104.918.176v-.583c0-.607-.127-1.03-.375-1.277-.255-.248-.686-.367-1.3-.367-.28 0-.568.031-.863.103-.295.072-.583.16-.862.272a2.287 2.287 0 0 1-.28.104.488.488 0 0 1-.127.023c-.112 0-.168-.08-.168-.247v-.391c0-.128.016-.224.056-.28a.597.597 0 0 1 .224-.167c.279-.144.614-.264 1.005-.36a4.84 4.84 0 0 1 1.246-.151c.95 0 1.644.216 2.091.647.439.43.662 1.085.662 1.963v2.586zm-3.24 1.214c.263 0 .534-.048.822-.144.287-.096.543-.271.758-.51.128-.152.224-.32.272-.512.047-.191.08-.423.08-.694v-.335a6.66 6.66 0 0 0-.735-.136 6.02 6.02 0 0 0-.75-.048c-.535 0-.926.104-1.19.32-.263.215-.39.518-.39.917 0 .375.095.655.295.846.191.2.47.296.838.296zm6.41.862c-.144 0-.24-.024-.304-.08-.064-.048-.12-.16-.168-.311L7.586 5.55a1.398 1.398 0 0 1-.072-.32c0-.128.064-.2.191-.2h.783c.151 0 .255.025.31.08.065.048.113.16.16.312l1.342 5.284 1.245-5.284c.04-.16.088-.264.151-.312a.549.549 0 0 1 .32-.08h.638c.152 0 .256.025.32.08.063.048.12.16.151.312l1.261 5.348 1.381-5.348c.048-.16.104-.264.16-.312a.52.52 0 0 1 .311-.08h.743c.127 0 .2.065.2.2 0 .04-.009.08-.017.128a1.137 1.137 0 0 1-.056.2l-1.923 6.17c-.048.16-.104.264-.168.312a.51.51 0 0 1-.303.08h-.687c-.151 0-.255-.024-.32-.08-.063-.056-.119-.16-.15-.32l-1.238-5.148-1.23 5.14c-.04.16-.087.264-.15.32-.065.056-.177.08-.32.08zm10.256.215c-.415 0-.83-.048-1.229-.143-.399-.096-.71-.2-.918-.32-.128-.071-.215-.151-.247-.223a.563.563 0 0 1-.048-.224v-.407c0-.167.064-.247.183-.247.048 0 .096.008.144.024.048.016.12.048.2.08.271.12.566.215.878.279.319.064.63.096.95.096.502 0 .894-.088 1.165-.264a.86.86 0 0 0 .415-.758.777.777 0 0 0-.215-.559c-.144-.151-.415-.287-.806-.415l-1.157-.36c-.583-.183-1.014-.454-1.277-.813a1.902 1.902 0 0 1-.4-1.158c0-.335.073-.63.216-.886.144-.255.336-.479.575-.654.24-.184.51-.32.83-.415.32-.096.655-.136 1.006-.136.176 0 .359.008.535.032.183.024.35.056.518.088.16.04.312.08.455.127.144.048.256.096.336.144a.69.69 0 0 1 .24.2.43.43 0 0 1 .071.263v.375c0 .168-.064.256-.184.256a.83.83 0 0 1-.303-.096 3.652 3.652 0 0 0-1.532-.311c-.455 0-.815.071-1.062.223-.248.152-.375.383-.375.71 0 .224.08.416.24.567.159.152.454.304.877.44l1.134.358c.574.184.99.44 1.237.767.247.327.367.702.367 1.117 0 .343-.072.655-.207.926-.144.272-.336.511-.583.703-.248.2-.543.343-.886.447-.36.111-.734.167-1.142.167z" }) });
|
|
1634
|
+
function CognitoButton({
|
|
1635
|
+
children = "Continue with AWS",
|
|
1636
|
+
redirectUri,
|
|
1637
|
+
identityProvider,
|
|
1638
|
+
onError,
|
|
1639
|
+
className = "",
|
|
1640
|
+
variant = "default",
|
|
1641
|
+
disabled = false
|
|
1642
|
+
}) {
|
|
1643
|
+
const { getCognitoOAuthUrl } = useGitHat();
|
|
1644
|
+
const [isLoading, setIsLoading] = (0, import_react17.useState)(false);
|
|
1645
|
+
const handleClick = (0, import_react17.useCallback)(async () => {
|
|
1646
|
+
if (isLoading || disabled) return;
|
|
1647
|
+
setIsLoading(true);
|
|
1648
|
+
try {
|
|
1649
|
+
const state = crypto.randomUUID();
|
|
1650
|
+
sessionStorage.setItem("githat_cognito_oauth_state", state);
|
|
1651
|
+
const { url } = await getCognitoOAuthUrl({ redirectUri, state, identityProvider });
|
|
1652
|
+
window.location.href = url;
|
|
1653
|
+
} catch (error) {
|
|
1654
|
+
setIsLoading(false);
|
|
1655
|
+
if (onError) {
|
|
1656
|
+
onError(error instanceof Error ? error : new Error("Failed to start Cognito OAuth"));
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
}, [getCognitoOAuthUrl, redirectUri, identityProvider, onError, isLoading, disabled]);
|
|
1660
|
+
const baseStyles = "githat-cognito-button";
|
|
1661
|
+
const variantStyles = variant === "outline" ? "githat-cognito-button-outline" : "";
|
|
1662
|
+
const disabledStyles = disabled || isLoading ? "githat-cognito-button-disabled" : "";
|
|
1663
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
1664
|
+
"button",
|
|
1665
|
+
{
|
|
1666
|
+
type: "button",
|
|
1667
|
+
onClick: handleClick,
|
|
1668
|
+
disabled: disabled || isLoading,
|
|
1669
|
+
className: `${baseStyles} ${variantStyles} ${disabledStyles} ${className}`.trim(),
|
|
1670
|
+
children: [
|
|
1671
|
+
isLoading ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "githat-cognito-spinner" }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(AWSIcon, {}),
|
|
1672
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children })
|
|
1673
|
+
]
|
|
1674
|
+
}
|
|
1675
|
+
);
|
|
1676
|
+
}
|
|
1677
|
+
if (typeof document !== "undefined") {
|
|
1678
|
+
const styleId = "githat-cognito-button-styles";
|
|
1679
|
+
if (!document.getElementById(styleId)) {
|
|
1680
|
+
const style = document.createElement("style");
|
|
1681
|
+
style.id = styleId;
|
|
1682
|
+
style.textContent = `
|
|
1683
|
+
.githat-cognito-button {
|
|
1684
|
+
display: inline-flex;
|
|
1685
|
+
align-items: center;
|
|
1686
|
+
justify-content: center;
|
|
1687
|
+
gap: 0.5rem;
|
|
1688
|
+
padding: 0.625rem 1rem;
|
|
1689
|
+
font-size: 0.875rem;
|
|
1690
|
+
font-weight: 500;
|
|
1691
|
+
border-radius: 0.375rem;
|
|
1692
|
+
border: none;
|
|
1693
|
+
cursor: pointer;
|
|
1694
|
+
transition: all 0.15s ease;
|
|
1695
|
+
background-color: #ff9900;
|
|
1696
|
+
color: #232f3e;
|
|
1697
|
+
width: 100%;
|
|
1698
|
+
}
|
|
1699
|
+
.githat-cognito-button:hover:not(:disabled) {
|
|
1700
|
+
background-color: #ec7211;
|
|
1701
|
+
}
|
|
1702
|
+
.githat-cognito-button-outline {
|
|
1703
|
+
background-color: transparent;
|
|
1704
|
+
color: #ff9900;
|
|
1705
|
+
border: 1px solid #ff9900;
|
|
1706
|
+
}
|
|
1707
|
+
.githat-cognito-button-outline:hover:not(:disabled) {
|
|
1708
|
+
background-color: rgba(255, 153, 0, 0.1);
|
|
1709
|
+
}
|
|
1710
|
+
.githat-cognito-button-disabled {
|
|
1711
|
+
opacity: 0.5;
|
|
1712
|
+
cursor: not-allowed;
|
|
1713
|
+
}
|
|
1714
|
+
.githat-cognito-spinner {
|
|
1715
|
+
width: 1rem;
|
|
1716
|
+
height: 1rem;
|
|
1717
|
+
border: 2px solid currentColor;
|
|
1718
|
+
border-top-color: transparent;
|
|
1719
|
+
border-radius: 50%;
|
|
1720
|
+
animation: githat-cognito-spin 0.6s linear infinite;
|
|
1721
|
+
}
|
|
1722
|
+
@keyframes githat-cognito-spin {
|
|
1723
|
+
to { transform: rotate(360deg); }
|
|
1724
|
+
}
|
|
1725
|
+
`;
|
|
1726
|
+
document.head.appendChild(style);
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
// src/components/CognitoCallback.tsx
|
|
1731
|
+
var import_react18 = require("react");
|
|
1732
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
1733
|
+
function CognitoCallback({
|
|
1734
|
+
redirectUrl = "/dashboard",
|
|
1735
|
+
newUserRedirectUrl,
|
|
1736
|
+
onSuccess,
|
|
1737
|
+
onError,
|
|
1738
|
+
loadingComponent,
|
|
1739
|
+
errorComponent
|
|
1740
|
+
}) {
|
|
1741
|
+
const { signInWithCognito } = useGitHat();
|
|
1742
|
+
const { config } = useAuth();
|
|
1743
|
+
const [error, setError] = (0, import_react18.useState)(null);
|
|
1744
|
+
const [isProcessing, setIsProcessing] = (0, import_react18.useState)(true);
|
|
1745
|
+
(0, import_react18.useEffect)(() => {
|
|
1746
|
+
const handleCallback = async () => {
|
|
1747
|
+
const params = new URLSearchParams(window.location.search);
|
|
1748
|
+
const code = params.get("code");
|
|
1749
|
+
const state = params.get("state");
|
|
1750
|
+
const errorParam = params.get("error");
|
|
1751
|
+
const errorDescription = params.get("error_description");
|
|
1752
|
+
if (errorParam) {
|
|
1753
|
+
const errorMsg = errorDescription || errorParam;
|
|
1754
|
+
setError(errorMsg);
|
|
1755
|
+
setIsProcessing(false);
|
|
1756
|
+
if (onError) {
|
|
1757
|
+
onError(new Error(errorMsg));
|
|
1758
|
+
}
|
|
1759
|
+
return;
|
|
1760
|
+
}
|
|
1761
|
+
if (!code) {
|
|
1762
|
+
const errorMsg = "No authorization code received";
|
|
1763
|
+
setError(errorMsg);
|
|
1764
|
+
setIsProcessing(false);
|
|
1765
|
+
if (onError) {
|
|
1766
|
+
onError(new Error(errorMsg));
|
|
1767
|
+
}
|
|
1768
|
+
return;
|
|
1769
|
+
}
|
|
1770
|
+
const savedState = sessionStorage.getItem("githat_cognito_oauth_state");
|
|
1771
|
+
if (savedState && state !== savedState) {
|
|
1772
|
+
const errorMsg = "Invalid state parameter";
|
|
1773
|
+
setError(errorMsg);
|
|
1774
|
+
setIsProcessing(false);
|
|
1775
|
+
if (onError) {
|
|
1776
|
+
onError(new Error(errorMsg));
|
|
1777
|
+
}
|
|
1778
|
+
return;
|
|
1779
|
+
}
|
|
1780
|
+
sessionStorage.removeItem("githat_cognito_oauth_state");
|
|
1781
|
+
try {
|
|
1782
|
+
const result = await signInWithCognito(code);
|
|
1783
|
+
if (onSuccess) {
|
|
1784
|
+
onSuccess(result);
|
|
1785
|
+
}
|
|
1786
|
+
const targetUrl = result.isNewUser && newUserRedirectUrl ? newUserRedirectUrl : redirectUrl || config.afterSignInUrl || "/dashboard";
|
|
1787
|
+
window.location.href = targetUrl;
|
|
1788
|
+
} catch (err) {
|
|
1789
|
+
const errorMsg = err instanceof Error ? err.message : "Authentication failed";
|
|
1790
|
+
setError(errorMsg);
|
|
1791
|
+
setIsProcessing(false);
|
|
1792
|
+
if (onError) {
|
|
1793
|
+
onError(err instanceof Error ? err : new Error(errorMsg));
|
|
1794
|
+
}
|
|
1795
|
+
}
|
|
1796
|
+
};
|
|
1797
|
+
handleCallback();
|
|
1798
|
+
}, [signInWithCognito, redirectUrl, newUserRedirectUrl, config.afterSignInUrl, onSuccess, onError]);
|
|
1799
|
+
if (error) {
|
|
1800
|
+
if (errorComponent) {
|
|
1801
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: errorComponent(error) });
|
|
1802
|
+
}
|
|
1803
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "githat-callback-error", children: [
|
|
1804
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h2", { children: "Authentication Failed" }),
|
|
1805
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: error }),
|
|
1806
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("a", { href: "/sign-in", children: "Back to Sign In" })
|
|
1807
|
+
] });
|
|
1808
|
+
}
|
|
1809
|
+
if (loadingComponent) {
|
|
1810
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: loadingComponent });
|
|
1811
|
+
}
|
|
1812
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "githat-callback-loading", children: [
|
|
1813
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "githat-callback-spinner" }),
|
|
1814
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: "Completing sign in with AWS Cognito..." })
|
|
1815
|
+
] });
|
|
1816
|
+
}
|
|
1340
1817
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1341
1818
|
0 && (module.exports = {
|
|
1342
1819
|
ChangePasswordForm,
|
|
1820
|
+
CognitoButton,
|
|
1821
|
+
CognitoCallback,
|
|
1343
1822
|
ForgotPasswordForm,
|
|
1344
1823
|
GitHatProvider,
|
|
1824
|
+
GitHubButton,
|
|
1825
|
+
GitHubCallback,
|
|
1345
1826
|
OrgSwitcher,
|
|
1346
1827
|
ProtectedRoute,
|
|
1347
1828
|
ResetPasswordForm,
|